Skip to content
All builds

SelahDaily Reflection Prompt

What it does for you

One public-domain verse a day, a humble prompt, and a private journal, with a tested guard that stops the AI from speaking for God.

Selah screenshot

Screenshots

Selah screenshot 1

In more detail

Selah shows one public-domain Bible verse a day with a gentle reflection prompt and one small practical question, and gives you a private place to write back. The journal stays in your browser. The footer says plainly that the verses are public-domain text and the prompts are only suggestions.

Honest limits

The 71 verses (KJV and WEB, marked per verse) were typed from memory of those texts and need a proofread against a printed source. Claude mode was never run against the live API; only its prompt builder and parser were tested. The guard catches the phrasings we wrote rules for, not every possible one.

How I built it

Built on the bulk one-shot night by Claude Code, about 0.4 hours, from the shared brief. I set the scope, the paper-and-ink look, the public-domain-only rule, and the one that mattered most: a humble voice. Faith-adjacent AI copy goes wrong in a specific way. It starts speaking for God or telling people what their calling is. I wanted to show that rule can be enforced in code and tested, not just hoped for in a prompt.

So the voice rule lives in three places, all tested. The local prompt set is audited against a 9-rule humility guard. The Claude system prompt carries the same rules in words. And the response parser refuses anything the guard flags and falls back to a curated prompt.

When I asked for "same verse for everyone, no repeats," Claude Code proposed seeded permutation cycles and wrote a three-year no-repeat test to prove it. It also drafted the curated prompts under my rule that every one is an invitation, then wrote the audit test so the set can't drift past the guard later.

What I learned

  • A content guard has to be tested against the legitimate text right next to it. My first "speaks in God's voice" rule flagged Psalm 46:10 and Jeremiah 29:11 themselves, because scripture quotes God. We narrowed it to invented speech ("the Lord says to you") and added a test that no verse in the library trips it.
  • A plain hash of the date is the wrong tool for a verse of the day. With 71 verses it repeats on back-to-back days about once every 71 days. Seeded permutation cycles give everyone the same verse with a no-repeat guarantee. The only edge is the cycle boundary.
  • A template combinator feels repetitive if you step through variants one at a time, since only the opener changes. Stepping by 7 across the 72 variants changes the body every click and still hits every combination once.

What carried forward

Same tested core as the rest of this batch, one reflect.js shared by the page and verify.mjs. The Claude setup (key in local storage, prompt builder and defensive parser tested without a network call) matches what #12 and #16 did that same night. Two Windows lessons came back: screenshots needed absolute Windows paths (first found on #7), and escaped em dashes got written into the source as literal characters, so they were swapped for String.fromCharCode(0x2014). #30 hit that same em dash problem the same night.

If I took it further

I'd load the full WEB text from a public-domain data file and have a second person check every verse. I'd also let the guard show its work in the UI, with the matched phrase highlighted, since showing a rejection builds more trust than hiding it.

#015 Built with Claude Code September 19, 2026 151 automated checks

Want one like this?