What we’ve shipped

Every change to Selah, newest first, written for the people who use it rather than the people who built it. Last shipped .

v0.49.7.0 → v0.49.8.0

Heartbeat and daily-devotional chats no longer crowd the companion list forever.

Fixed

  • Heartbeat and daily-devotional chats no longer crowd the companion list forever.

    Unanswered ambient nudges soft-archive about an hour after they land, so you still have time to reply in the same thread. The transcript and anything Selah already learned stay; Restore brings the sitting back.

  • Word study opens even when a highlight panel is open.

    Tapping a word for Strong's no longer waits for you to dismiss the highlight UI first.

  • Companion status language is consistent.

    Menus say Open / Done / Archived — never “Closed” — with Mark as done, Archive, and a delete confirm that keeps learned memory while removing the transcript. The Stream companion session drawer has the same status controls.

Changed

  • Filtering your notes is simpler.

    Status filters (All, Exploring, On hold, Resolved) are now quick-tap chips at the top of your notes list. A single Filter button handles folder and kind in one place — no more separate dropdowns.

v0.49.5.2 → v0.49.6.0

A word that reads the same in two translations now connects between them.

Fixed

  • A word that reads the same in two translations now connects between them.

    In CSB John 1:26 "answered" is the same word KJV uses, but tapping it opened the KJV fallback instead of going straight to the Greek. Words in a quote that a translation moves — "'I baptize with water,' John answered them" versus "John answered them, saying, 'I baptize with water'" — now match.

  • Production build for Primary/Compare translation slots.

    The note column referenced a translation that was never passed into the editor, so Vercel typecheck failed and selah.so stayed on the previous release.

  • On phone and tablet, reader pane tabs name the translation

    (e.g. "John 1 · WEB") so two panes of the same chapter are easy to tell apart.

Changed

  • Translation picker header is one row.

    "Pick translation" sits on the left; the settings gear sits on the right. The old empty footer is gone.

Added

  • Primary and Compare Bible translations.

    Set two favourites in Settings (web and iOS). The reader opens the first pane in your Primary edition, and a second column uses Compare instead of guessing.

  • Cold-load and Telegram scripture links honour your Primary translation

    when the link does not already name one.

  • The translation picker marks your Primary and Compare favourites

    with quiet P / S labels, and a gear opens Study settings on the web.

August 2, 2026

v0.49.4.0

Whole passages were missing from CSB, NASB and NLT.

Fixed

  • Whole passages were missing from CSB, NASB and NLT.

    Nehemiah 7 showed 33 of its 73 verses; Ezra 2, Nehemiah 12, and the 1 Chronicles genealogies were cut the same way, with no error and nothing to indicate anything was absent. Every one of those chapters now reads in full.

  • The book of Nahum was entirely unavailable

    in those three translations — every chapter failed to load.

  • Word study and cross-translation highlights now work in CSB, NASB and NLT.

    Tap a word and get the Greek or Hebrew; a highlight made in KJV shows the matching words. Previously both were blank in every licensed translation.

  • Some Old Testament verses were numbered wrong, and a handful of chapters wouldn't open at all.

    Jonah briefly gained a phantom verse 17 that doesn't exist in any English Bible, and chapters like Malachi 4 failed to load outright. Both are fixed.

  • Stray `#` characters and missing spaces in CSB, NASB and NLT text.

    Psalm 23:4 rendered as "I fear no danger,for you are with me; your rod and your staff #— #they comfort me." Both artifacts are gone.

v0.49.3.3 → v0.49.3.0

Reader errors from the Bible text provider really are filtered now.

Fixed

  • Reader errors from the Bible text provider really are filtered now.

    Yesterday's filter did not match the real error and 31 more were recorded across two readers before the morning check caught it.

  • Product docs at `/docs` look like docs again.

    Sidebar, search, and the page layout were rendering as bare unstyled content after a midsummer CSS cleanup; the Fumadocs theme is restored.

  • The prayer detail drawer is quieter about status and tighter around the title.

    Opening a prayer no longer repeats “Active” in the header and footer; status lives in Overview, where you can still move it. Short titles sit closer to the folder chip instead of leaving a blank second line.

  • The Reader pull-up sheet on phone and iPad is quieter around the title.

    Reading plan (and the other tool sheets) no longer sit under a tall empty band above the name; Catch up rows are tighter; Mark read shares the line with today’s passage; and the help control sits beside the progress line instead of claiming a whole empty row.

  • The sheet no longer slides under the sidebar on iPad

    , and you can open the translation picker while a tool sheet is up — chapter previous/next stay next to the passage control instead of stranded across the spacer.

  • The paywall for licensed translations on iPhone now shows the right message.

    Trying NASB or another Plus-only translation no longer shows a blank prompt.

Added

  • Tapping a card on the home feed now opens the right screen.

    Note cards go to the note, prayer cards land on that prayer in the prayer board, and reading-plan cards take you to your plans.

August 2, 2026

v0.49.0.1 → v0.49.2.0New

Daily messages over email and Telegram stay on a free translation

Fixed

  • Reader bottom chrome is back where it belongs.

    Collapsing the sidebar no longer shoves the book scrubber off-center, stacks Vocabulary on top of Highlight, or glues Reading plan day labels to their references. Notes opens as one column again, dock tabs stay short pills, and the companion “New conversation” control is the same chat-bubble everywhere.

  • Disclosure chevrons respect "reduce motion" again.

    Opening a Word Study section animated a rotation for people who have asked their device for no motion. The section still opens, just without the spin.

  • Reader errors from the Bible text provider no longer flood error tracking.

    A required third-party script was reporting its own failures as if they were ours; anything that actually reaches Selah's code is still reported.

  • A highlight made in BSB or WEB no longer shades the whole verse when you switch to KJV.

    It shows the matching words, the same as every other direction already did. This affected 57 existing highlights in the translation people read most.

  • Editing a highlight's span now moves it correctly in other translations.

    Adjusting the selection updated the highlight where you made it but left the cross-translation position pointing at the old words.

  • Renaming a note now updates its passages.

    Since titles carry references ("Comfort. My People (Isaiah 40)"), naming a draft after its passage links it immediately instead of waiting for the next content edit.

  • Large maps open grouped and stay smooth.

    A library past ~400 beliefs now opens in the grouped view by default (your own choice always wins once made), and past ~800 the map settles fully before appearing instead of animating — measured at the largest real library, the animated settle could not hold a frame. Group names on the map are darker so they can actually be read.

  • The Reader's quick note no longer pins itself to the open chapter.

    What a note is about comes from what you write in it, not where you happened to be standing — and the anchor it used to send was malformed anyway.

  • A highlight you made in one translation now shows the same words in another.

    Highlight "He that believeth on him is not condemned" in KJV, switch to BSB, and you used to get the whole verse shaded with an "adjusted" tag. Now you get "Whoever believes in Him is not condemned" — the matching words. No more nudging highlights back into place by hand.

  • Daily messages over email and Telegram stay on a free translation

    even if your preferred Bible is NASB, NLT, or CSB. Those surfaces cannot report licensed reading the way the app can, so they use BSB (or another public-domain edition) instead.

  • On iOS, choosing a Plus-only translation when you are on Free shows a clear upgrade note

    rather than a vague "couldn't load" message — and it no longer also pops the global paywall on every chapter turn.

Changed

  • The grouped map shows one "Beliefs" neighbourhood instead of separate Doctrine and Themes ones.

    The doctrine/theme label is a coin flip in the data — the same idea lands on either side depending on the day it was read — so showing two clusters drew a boundary that wasn't really there. People, places, events and books keep their own neighbourhoods.

  • The "adjusted" tag and the manual re-anchor bar are gone.

    They existed to let you correct the old guesswork. There's nothing to correct now, so there's nothing to click. A highlight that can't be placed precisely still shades the whole verse, which is honest rather than approximate.

  • Preferred translation settings copy

    now says the preference applies when reading in Selah; email and Telegram devotionals stay public-domain.

  • Public scripture surfaces stay on free translations only.

    Signed-out lookup and the anonymous chapter route no longer expose paid editions.

Added

  • NASB, NLT, and CSB are available in the reader for Selah Plus.

    Pick any of them in the translation picker the same way you pick KJV or BSB. Copyright stays on the passage so the publisher notice is always visible.

  • The same licensed translations work in the iOS app when you are online.

    Chapters load through the signed-in chapter route; Plus still gates access.

August 1, 2026

v0.46.11.1 → v0.48.1.0New

Group your Belief Map by kind.

Fixed

  • Opening a devotional from your timeline no longer says "Couldn't open this conversation."

    Tapping a devotional session in the stream tried to load it as a companion chat, which it isn't, so it failed every time. Devotionals now open properly.

  • Sermons and notes you imported now know which passages they are about.

    Selah only ever looked for scripture references when you edited a note, so anything brought in through Import had none — and because Selah uses those references to judge how well-rooted a belief is, a whole imported library could look thin when it was not. One library here went from 1 note with references to 90, and from 14 beliefs with any scripture behind them to 774. It also reads the title now, since a sermon called "Comfort. My People (Isaiah 40)" often never writes the reference out in the text.

  • Two beliefs that are different are less likely to be treated as one.

    The check that stops Selah merging different kinds of things only worked between people, places, books and events. It now also covers the line between those and ideas — the case that had quietly folded a teaching about apostleship into the apostles themselves.

  • The map was only ever showing you 200 beliefs.

    Whatever the size of your library, the map drew the 200 best-connected beliefs and said nothing about the rest. On the largest library here that is 200 out of 1,877. It now draws everything, and the beliefs it used to hide were exactly the ones you have studied once and not written about yet — the ones you are most likely looking for.

  • The map sometimes opened far too zoomed in

    , with a handful of labels filling the screen. It now frames itself once the layout has settled rather than while it is still moving.

  • Archive and Delete work again in Companion.

    Opening the ⋯ menu and tapping either option actually archives or deletes the conversation. On phones the menu used to close before the tap registered, so nothing happened. The sessions list also shows the ⋯ button on touch, and the timestamp no longer sits under it.

  • Journal and Companion no longer bury the last thing you wrote under the bottom bar.

    On Journal, the capture box sits above the conversation strip with a clear gap, and you can scroll the feed so the last card clears both. On Companion, the “Latest” chip sits above the real composer height (including slash hints), so it no longer overlaps the input.

  • Bigger tap targets on the bottom chrome.

    Send, slash hints, conversation pills, and “+ New” meet the 44px touch minimum on phones.

  • Pill close and composer scrollbars on touch.

    Close controls on conversation pills no longer depend on hover, and the strip / composer no longer show a phantom vertical scrollbar from horizontal overflow rules.

  • Google Analytics was being blocked in the browser, so none of it was reaching us.

    The site's security policy lists every service the page is allowed to talk to, and Google Analytics was missing from it. Analytics loaded, built each event, and then the browser refused to send it. Nothing looked broken, which is why it went unnoticed.

Added

  • Group your Belief Map by kind.

    A third map view sits beside the constellation and the ring. Same living map — doctrines, themes, people, places, events and books each settle into their own neighbourhood, with the name of each one floating beside it. Links still run between neighbourhoods, and you can still drag anything where you want it.

  • Companion conversations stay open as threads.

    You can keep several chats going at once. Each one lives as a pill in a bottom strip, the same way Reader tools do. Close a pill and the conversation stays in your history; it is not deleted.

  • A conversation switcher in the companion header.

    Jump between open chats or reopen a recent one without leaving the page you are on.

  • Expand opens the full companion.

    From a docked chat, open the full /companion surface for that sitting when you need more room.

Changed

  • Companion no longer takes over the right rail as a split pane.

    On wider screens it anchors above the strip; on phones it is a bottom sheet. Connections and companion can both stay open.

  • Detach / floating companion window is gone.

    Modes are strip-anchored, sheet, or the full companion page.

July 31, 2026

v0.46.10.2 → v0.46.11.0

Import now asks whose teaching you're bringing in.

Added

  • Import now asks whose teaching you're bringing in.

    Files you upload can be marked as your own or as someone else's, with the speaker's name and a kind. Until now everything imported was treated as your own conviction, so a commentary you uploaded could end up on your belief map as something you believe.

  • Your belief map can show just yours, just others', or all of it.

    A belief moves out of "Others" on its own the moment you write anything about it yourself.

  • A page showing what Selah is doing with your notes.

    Knowledge has a third view, Activity: a plain, day-by-day account of what has been read and what it found. While an import is running it sits at the top and tells you how far along it is. If something needed another look, it says so there rather than nowhere.

Fixed

  • Someone else's book no longer counts as your own study.

    The map's sense of how developed a belief is was counting notes you'd recorded from other people, so reading widely on a subject looked the same as having worked it out yourself.

  • Selah no longer assumes every note was written by a pastor.

    Most people using Selah are studying rather than preaching, and the assumption pushed it to read personal notes as though they were teaching.

  • The Kind chip no longer shows a date it has already thrown away.

    Repairing an orphaned note — one carrying a date with nobody attached — through an unrelated Kind edit cleared the stored date but left it sitting in the date field. Name an originator without closing the popover and the field came back holding that ghost; closing then quietly discarded what you could still see.

  • A note can no longer be dated with nobody attached to it.

    In the Kind chip, opening "From someone else" and setting a date without naming who it came from saved that date on its own. The note then showed a bare date with no context, and Selah had no speaker to attribute the teaching to. The date field now waits until you have named someone, and says so.

July 28, 2026

v0.46.10.0

Notes fit beside Scripture on a tablet now.

Fixed

  • Notes fit beside Scripture on a tablet now.

    In portrait the reader refused to show a note next to the passage at all, and the chapter scrubber floated at about half width instead of lining up under the text. Both work.

  • You can drag the divider on a touch screen.

    Resizing was mouse-only, so even in landscape — with both columns visible and room to spare — the handle did nothing.

Changed

  • Opening a note collapses the sidebar to make room

    , instead of asking you to do it. It is one tap to bring back and the collapsed state persists.

  • The passage gives up its side margins before it gives up the second column.

    Wide margins when the passage is alone; narrower when a note is sharing the row. The 620px reading measure itself never changes.

July 31, 2026

v0.46.6.0 → v0.46.9.0

The "What's new" note now covers the belief-map work.

Changed

  • The "What's new" note now covers the belief-map work.

    Everyone who joined before today gets one pass through what changed: that long documents are read to the end, and that a belief you hold under two names is one entry again. It says plainly that nothing you wrote was altered, and links straight to your map so you can check it yourself.

  • The belief-map repair now recognises far more of what is genuinely the same.

    Testing against the largest affected map showed the previous safeguard was too blunt: built to stop two different ideas being fused into one entry, it was also refusing plainly identical names that happen to contain "and", like "Law and Prophets" beside "Law and the Prophets". The repair now settles simple naming differences on its own, first: plurals, small words like "the", and reversed orderings such as "Works and Faith" beside "Faith and Works". The safeguard itself now blocks only the genuinely dangerous shape, a single idea being folded into a two-idea entry. The repair also runs until it stops finding anything, picks the better-established name as the survivor every time, and a congregation at a city is no longer treated as the city itself.

Fixed

  • Repeated repair rounds keep every folded entry pointing at a live one.

    When the repair runs more than once, a later round can fold away an entry that an earlier round had already folded others into, leaving those earlier pointers aimed at a dead entry. Everything a user sees was unaffected, but the trail used to undo a fold could dangle. Pointers now follow through to the surviving entry automatically.

  • Four more pairs of beliefs stay apart.

    Reviewing the repair's proposals surfaced merges that would have flattened real distinctions: the Second Death of Revelation 20 into death generally, salvation by faith into salvation, glory into the glory of God, and God's wisdom into wisdom. The underlying rule is now stated both ways round: a broad theme and a specific form of it are different entries no matter which one Selah met first.

  • The repair reports honestly.

    A merge that turned out to be already done was being counted as a failure; it is now reported as skipped, so a failure count of zero means zero things actually went wrong.

July 30, 2026

v0.46.3.0 → v0.46.5.0

Two ideas that happen to appear together no longer become one entry.

Fixed

  • Two ideas that happen to appear together no longer become one entry.

    Selah was creating single entries like "Light and Darkness" for what are plainly two separate things, which meant neither could be followed on its own. It now keeps them separate, while still recognising that some names genuinely contain "and" and belong together, such as "Faith and Works" or "Sodom and Gomorrah".

  • A broad theme is no longer folded into a specific instance of it.

    Tribulation, which believers endure now, was being combined with the Great Tribulation, which is one particular period. Those stay apart, along with the same shape elsewhere.

  • Folding two beliefs together no longer fails when both appear in the same note.

    If a note mentioned both of the entries being combined, the repair stopped partway. It now folds the two records into one, keeping the stronger confidence, the earlier date, and any human judgment over an automatic one.

  • The belief-map repair no longer proposes merges it should not.

    A dry run against a real map surfaced two faults before anything was changed: it could accept a match the model picked from further down the list, well past the point where two beliefs stop being the same thing, and it could chain merges so one belief pointed at another that had itself been folded away. Both are closed, and it now refuses to merge across kinds that can never be the same thing, such as a person and a book of the Bible.

July 31, 2026

v0.46.2.0

"Recently recorded" said "Read" next to a completed day

Fixed

  • "Recently recorded" said "Read" next to a completed day

    , which read like a button to open the passage again rather than a completed-state label. Now says "Done."

July 30, 2026

v0.42.0.0 → v0.46.1.0New

A repair pass for belief maps that were split apart.

Added

  • You can mark a past day of your reading plan read.

    If you read the passage somewhere else, or just forgot to tap the button, the day sat there counting against you with no way to correct it. The reader's Reading plan panel now lists the days you haven't marked, and you can record any of them. The "days behind" line on Home takes you straight there.

  • Tick off passages one at a time.

    A plan day that bundles several readings no longer has to be all or nothing. Check off Psalm 8 today and Proverbs 8 tomorrow; each one strikes through as you go, and the day records itself once you've read all of it. Days with a single passage stay a single tap.

  • Anything you record can be undone.

    Every day you mark shows an undo beside it, and a Recently recorded list keeps the last few within reach long after the moment has passed. Marking a whole day and unticking one passage both work in either direction.

  • Catch up on several days at once.

    Mark everything outstanding as read, or set it all aside, in one action.

  • A repair pass for belief maps that were split apart.

    The bug fixed in 0.45.0.0 stopped new duplicates, but it could not undo the ones already there, and the worst-affected maps hold several entries for what is really one belief. There is now a pass that finds those and folds them back together. It reports what it intends to merge before it changes anything, it errs toward leaving two entries alone when they might be genuinely different, and a merge can be undone.

  • Selah now notices when it stops reading your notes properly.

    The step that turns your notes into your belief map used to fail quietly: every single failure looked like a normal, handled event, so a problem could run for weeks without anyone seeing it. There are now three health checks watching rates rather than individual events: one for work that fails outright, one for a step that reports success while quietly doing nothing useful, and one for the case where everything reports success but nothing is actually being learned.

  • Selah can edit a whole note, not just add to it.

    Ask it to clean a note up for sharing, restructure it, drop a section, or add a line under every heading, and it changes the note you are looking at. Before, it could only append to the end or replace one section at a time, so anything bigger had no way through — asked to tidy a note for public sharing, it would offer you a second, near-identical note instead of editing the one in front of you. A change that touches eight sections is now one edit: you approve it once, and one undo puts all of it back.

  • Duplicate a note.

    Reuse last week's outline as this week's starting point instead of selecting everything, copying, and pasting into a blank page. The copy keeps the title, the body, the kind, the status, the scripture references, and every folder the original was in. It does not inherit anything about sharing, and it does not arrive starred. You can duplicate from inside a note or straight from the list.

  • A menu on every note in the list.

    Duplicate, move to a folder, add to or remove from favourites, or delete, without opening the note first. Delete asks before it does anything.

  • Recordings are their own documents.

    A recording used to be a block buried inside a note. Now it has its own page: read the transcript, give it a title, rename the speakers. You can open it beside the note it belongs to, ask the companion about it directly, and attach an unlinked recording to any note you own.

  • A public roadmap.

    See what's waiting, what's planned, what's being built now, and what has already shipped. It comes straight from the tracker the work actually happens in, so it stays current instead of drifting into a wish list. Read it as a board or a plain list, and swipe between the columns on a phone.

  • Documentation.

    Nine pages covering reading Scripture, notes, the companion, reading plans, prayer, and billing. Two of them go further: how Selah remembers your study, and how your knowledge map is drawn from what you write.

  • How memory works, explained honestly.

    Selah keeps small individual things you appear to believe rather than a pile of old chat. Saying something twice makes it stronger; writing something different replaces the old view and retires it, so it can't resurface and contradict you later. Recall goes by what actually bears on your question, not by what you wrote most recently — which is why a note from four years ago about Romans 8 can beat yesterday's unrelated one.

  • Docs, guides, what's new, and the roadmap are reachable from inside Selah.

    The sidebar's Help button opens all four alongside the support panel. Until now there was no way to reach any of them without leaving the app.

Fixed

  • "Days behind · catch up" now goes where it says.

    It used to open today's reading, which was the one day you hadn't missed.

  • Marking a day read could silently fail to save.

    The tick appeared, the record didn't. You'd come back later still behind, with nothing having told you.

  • Finishing a plan is no longer swallowed.

    If you'd ever corrected a day on a finished plan, the celebration for genuinely finishing it later never arrived.

  • The second passage of a multi-passage upcoming day was unreachable.

    Tapping the row only ever opened the first one. Upcoming days now open out so you can reach any of them.

  • Reader tools opened from a link no longer lose the tool.

    A link straight to a reader panel dropped it and landed you on John 1 with the panel shut.

  • Merging two beliefs by hand now keeps everything attached to them.

    It moved the connections but quietly left behind the belief statements and the record of where a belief came up in your study, so merging could lose the very things that made the belief yours.

  • Engagement history is counted once per source again.

    A retry could record the same belief-and-note pairing repeatedly, which quietly skewed which beliefs Selah treats as central to your study.

  • Reading your notes is now bounded as well as structured.

    Selah asks for a limited amount back and now also enforces that limit before anything is saved, so a passage that produces more than expected can no longer quietly exceed what was planned for.

  • Selah stops creating duplicate beliefs.

    After reading a note, Selah checks whether each belief it found is one you already have, so "Grace" and "Grace of God" stay a single entry. That check had a size limit set too low and was failing quietly, and every time it failed, the whole batch was added again as new. The limit is raised and the check now asks for far less back, so it fits.

  • Scanned PDFs are now turned away at upload instead of becoming empty notes.

    A PDF made of photos or scans has no text in it to read, so importing one produced a note containing nothing but its filename — and Selah would then try to learn from the title alone. Those files are now declined as you upload them, with a note explaining why and what to do about it.

  • A single enormous file no longer runs up unbounded processing.

    Selah reads a long document in sections, and one file of nearly two million characters — a whole archive in a single upload — was read in over four hundred of them. Very long documents are now mapped up to a generous limit and marked as partly mapped, rather than processed without end. The document itself is still stored and searchable in full; splitting it into one file per teaching gets the whole thing mapped.

  • Selah no longer goes quiet in the middle of a long answer.

    Anything that took more than thirty seconds to write was cut off partway and never recovered — you saw it start working, then nothing, with no error and no explanation. Long answers now have the time they need, and short ones are unaffected. This was the reason a rewrite of a long note could never finish.

  • Selah remembers what it just said.

    Its previous reply was being dropped from the conversation on every turn, so it could not refer back to a draft it had written moments earlier, and you could not either — the reply simply disappeared from the chat. Replies now stay put unless you actually edit or regenerate them.

  • Edits that rewrite or remove text still ask first; edits that only add do not.

    Adding a line under a heading no longer interrupts you for permission, because it is undoable either way. Rewriting or deleting still stops and waits.

  • Long sermons now finish processing.

    Raising the size limit in 0.43.0.1 made each step slower, and the longest documents could no longer finish in the time allowed — so they restarted from the beginning, over and over, without ever completing. Processing now has the time it needs, and work is saved as it goes rather than only at the end, so a document that gets interrupted keeps everything it had already read.

  • Uploaded sermons now make it into your knowledge graph.

    Long documents are read in sections, and the step that pulls themes out of each section had a size limit set too low. On dense sermon material it ran out of room mid-sentence and threw the whole document away — silently, and permanently after three tries. Short notes stayed under the limit, so this only ever bit people who uploaded real teaching material. The limit is raised, and a section that still fails no longer discards the rest of the document with it.

  • A busy processing queue no longer stalls itself.

    Documents were being picked up faster than they could be finished, so the ones at the back of each batch were dropped and had to wait to be recovered. Work now stops cleanly and hands back whatever it could not get to.

  • Deleting a note now actually deletes it.

    What Selah had learned from a note could outlive the note itself, so a deleted note could still surface in search or come back in conversation. Everything derived from it is now torn down with it.

  • The footer at the bottom of the landing page is left-aligned again

    instead of centred.

Changed

  • Your belief map stops splitting one belief into many.

    When Selah found a belief in your notes, it checked whether you already had it by comparing against an arbitrary slice of your map, so past a few hundred beliefs most of your map was invisible to that check. "God's Grace", "Divine Grace" and "Divine Mercy and Grace" could all end up as separate entries. Selah now compares by meaning against the closest matches in your whole map, merges the ones that are plainly the same thing, and only asks the model about the genuinely uncertain ones. It stays deliberately cautious: two beliefs that are close but not the same, like baptism in general and believer's baptism in particular, are kept apart. Losing a distinction you care about is worse than an untidy duplicate.

  • Reading your notes into your belief map is now far harder to break.

    Selah used to ask for its answer as plain text and then try to interpret it, which failed whenever a passage was dense enough to run past the space allowed. It now asks for a structured answer the model fills in directly, and asks for a bounded amount of it, so the space needed can be worked out in advance instead of estimated. This is the underlying cause of the processing failures fixed over the last few releases, rather than another raised limit.

  • The notes list reads as a list again.

    Every row is now the same height instead of three different ones depending on how long the preview happened to be, and each note takes two lines rather than three. More notes fit on a screen, and the titles are what your eye lands on.

  • Status only shows when it means something.

    Nearly every note sits at Active, so the green Active label was on every row carrying no information. It now appears only once a note has moved somewhere else.

  • A note with nothing in it says so

    rather than showing an empty gap.

  • A duplicated note starts with memory off.

    Two identical notes would otherwise let repetition read as conviction, and the companion cannot tell a copy from a second conviction. The copy says this plainly when you open it, and turning memory on is one click. Until you do, the copy will not appear in search or come back in conversation.

  • The changelog page and the roadmap now match

    , and each links to the other, so what shipped and what's coming read as one pair rather than two unrelated pages.

  • An unread reply from support is easier to notice.

    The dot on the Help button is red now instead of a quiet green that blended into the sidebar.

  • Help buttons are big enough to tap.

    The Help menu and its rows now meet the standard touch size on phones and tablets.

July 29, 2026

v0.40.30.1 → v0.41.0.0New

The Companion now feels alive while it works.

Added

  • The Companion now feels alive while it works.

    Thinking appears immediately, safe work steps use distinct icons for memory, web, notes, prayer, Scripture, tasks, and other activities, and the answer arrives as smoothly formatted Markdown instead of snapping into shape at the end.

  • Live replies now behave consistently on web and mobile.

    New words receive a quiet entrance, completed text stays still, the active reply keeps a trailing caret, and readers who scroll upward can return with Jump to latest.

Changed

  • Companion approvals are clearer and safer.

    Related changes to the same note are grouped into one decision, each approval is recorded before the reply continues, and duplicate taps cannot start multiple continuations.

  • Interrupted replies recover without a refresh.

    Selah checks persisted messages after a disconnect and when the app returns online or to the foreground. Recovered, partial, and missing replies are reported honestly, while normal background synchronization stays silent.

Fixed

  • Single-chapter highlights stay in their chapter.

    A Genesis 1 highlight no longer appears while reading later chapters because a missing range end now correctly means the same chapter, not the rest of the book.

  • Finishing Markdown syntax on mobile no longer reanimates earlier words.

    Closing bold, link, or code formatting preserves the existing text and animates only genuinely new content.

July 28, 2026

v0.40.26.0 → v0.40.29.0

A correction to a Bible translation now actually reaches you.

Fixed

  • A correction to a Bible translation now actually reaches you.

    When we re-sourced the KJV and fixed 3,451 verses that had been silently cut short mid-sentence, the corrected text didn't appear for anyone already reading those chapters. The old text was cached with no expiry, so there was nothing to make the app look again. Chapters now refresh on their own within a day.

  • Already subscribed, still asked to subscribe again.

    If you started the trial-intent onboarding flow, checked out with Stripe, but didn't finish the wizard in one sitting, coming back later showed the "Start your 14-day Plus trial" screen again — every time you logged in — even though you'd already paid.

Added

  • Your notes now have a Kind, and the list is yours.

    Sermon, Study note, Devotional, Book, Podcast, Conversation — rename any of them, add your own, delete the ones you don't use. Nothing is locked.

  • Filter your notes by kind.

    /notes gains a kind filter alongside status and folder; combine all three.

  • A payment that didn't go through now gets your attention.

    If Selah Plus can't charge your card, you'll see it right away — not just buried on the billing settings page. A quiet banner appears across the app with a one-click way to update your card, and it stays out of the way once you've seen it. Your Plus access keeps working while Stripe retries; this just makes sure you actually notice.

Changed

  • You can finally call your own sermon a sermon.

    Setting a note's type used to require naming a person first — the type only existed to describe someone else's material, so your own work had nowhere to go. Kind now stands on its own: Sermon by itself means you wrote it, Sermon · Pastor Mike means you heard it. Saying who it came from is an optional second step, not a precondition.

  • Selah understands what a note is, not just whose it is.

    Ask it about your sermons or what you've been getting from podcasts and it can answer, because the kind now reaches it for every note rather than only for notes you'd credited to someone else.

July 26, 2026

v0.40.18.0 → v0.40.25.0

You can report a reply that gets it wrong.

Added

  • You can report a reply that gets it wrong.

    Every companion response now carries a Report action next to Copy and Retry. It goes straight to us — no form, no ticket, one click.

  • A plain note about what Selah is.

    A line under the composer says Selah can be wrong and isn't a substitute for professional or pastoral counseling. It quotes scripture and reflects on your journals and prayers, which is close enough to counsel that the boundary is worth naming out loud.

  • A quiet line under the note title telling you which section you're in

    , taken from the note's own headings, as you scroll. It appears only once you've scrolled into a section, and only in a note that has headings.

  • Your notes now sit beside the passage, and you can actually write in them.

    Reading and note-taking stopped being two places. Open a note next to the chapter you're in and it's the real editor — slash commands, scripture blocks, the lot — saving as you type, with the passage still on screen. Clicking a note from the reader used to throw away the chapter you were reading; it doesn't anymore.

  • A notes list that isn't limited to the chapter you're in.

    The column opens on your recent notes with a "This passage" filter beside it, so you can pull up something you wrote weeks ago about a different book without leaving the passage. The count is honest — if nothing here touches this chapter it says zero rather than hiding the tab.

  • Bible on the left, notes on the right — the way you teach.

    Notes take the right-hand column and scripture stays left. Tap a verse reference inside your own notes and the passage jumps there, with a back chip to return to where you were.

  • You can start recording when you start teaching.

    The record control lives in the note's header, so capturing a session doesn't mean leaving the notes you're teaching from.

  • A read view for delivery.

    Flip the note out of editing and the text steps up to reading size with no caret and nothing to accidentally type into — for when you're speaking from it, not writing it.

Fixed

  • The other way into writing a thought works now too.

    The previous release fixed the "Write a thought" button; clicking the thought area itself still went down the update path and reported "Couldn't update — this highlight has no thought yet." Both routes save.

  • Writing a thought on a highlight you already made now saves it.

    Selecting text and pressing Write worked; opening an existing highlight and pressing "Write a thought" did nothing at all — no message, nothing saved. Both paths save now.

  • When the reader can't start or save a thought, it now reports why.

    The last release surfaced a message to you but the diagnostic detail never reached us, so a report still couldn't be traced. It does now.

  • When a highlight can't be saved, the reader now says so.

    It used to roll the highlight back and stop — the highlight appeared, vanished, and the Write button did nothing, with no message. Whatever went wrong is now reported, both to you and to us.

  • Highlights kept their colour when you switch a note to read view.

    A highlight you made while writing turned bright yellow the moment you flipped to read it, and dividers changed shape too — both were falling back to the browser's own defaults instead of the app's.

  • Dividers have room to breathe in read view

    , scaled to the larger reading type rather than reused from the editor.

  • The reader tells you when it can't start a thought.

    Two failures used to do nothing at all — no message, no explanation — which is indistinguishable from a dead button. They now say what went wrong.

  • Tapping a verse inside your own note now works while you're reading it.

    In the read view — the one you use when you're teaching from a note rather than writing it — verse references did nothing. Only the editing view responded. Both work now, by click or keyboard.

  • A verse inside a full-passage quote is clickable too.

    Converting an inline reference to a full passage produced a block that looked interactive and wasn't — in either the editing or the reading view. Tapping its reference now moves the passage, and tapping a specific verse number goes to that verse.

  • Notes open as a column even when a tool is already open.

    With Word Study up, picking Notes used to tell you there wasn't room and suggest hiding the sidebar. The 360px in the way belonged to the panel Notes was replacing, so it now closes it and takes the space.

  • Notes were reporting "Saved" while saving nothing.

    In some conditions the editor showed "Saved · just now" for text that never reached the database. The save indicator was telling you the truth about its own state and nothing about your note. Fixed, and the tests that cover it now check storage rather than the indicator.

  • Selecting a verse stopped working once you clicked into your notes.

    Highlighting silently did nothing while the notes column had focus, with no error to explain it.

  • A note citing a range across two chapters only showed up under the first one.

    "Hebrews 4:12–5:2" filed itself under Hebrews 4 and was missing from Hebrews 5.

  • Note rows in the reader are readable again.

    The passage label on each row was sage-on-gold at 10px, which measured under the accessibility floor, and untitled notes were indistinguishable from each other. Rows now carry a one-line excerpt.

Changed

  • "Open as column" is gone — the column is just how notes open.

    Picking Notes goes straight to the column beside the passage instead of the narrow panel with a button in it offering to do that.

  • You can drag the note column wider or narrower

    , and it remembers the width on that screen. Arrow keys work on the handle too (hold Shift for bigger jumps, Home/End for the extremes). The passage keeps its reading width no matter how far you drag.

  • "Back to Hebrews 4" floats at the bottom of the screen

    now, the way it does on the phone, instead of appearing inside the passage and pushing the verses down while you were reading them. Tap it to go back, or dismiss it.

July 25, 2026

v0.40.13.1 → v0.40.17.0

A note you had open to yourself claimed it was "edited elsewhere", and the only way out threw your writing away.

Fixed

  • A note you had open to yourself claimed it was "edited elsewhere", and the only way out threw your writing away.

    Starring a note did it every time: star it, keep typing, and the next sentence never saved. Typing while a save was still in flight did it whenever the connection was slow. The warning was wrong — nobody else had touched the note — and the Refresh button it offered reloaded over the paragraph you were in the middle of.

  • Your writing survives Selah editing the same note.

    When the companion or Telegram adds to a note you have open, what you were typing used to be replaced without warning. Both now survive: Selah's addition goes on the end, your sentence stays where it was, and your cursor doesn't move.

  • When two edits really do collide, you choose.

    A note edited in a way that overlaps what you wrote now pauses saving and offers Keep mine or Use the latest, holding your unsaved work until you pick. Nothing is discarded on your behalf.

  • A save that fails no longer loses the edit that failed.

    Renaming a note while offline used to drop the rename silently as soon as any later save succeeded. Whatever didn't land now rides along with the next save.

  • Notes you imported, promoted from a capture, or saved out of a session couldn't be found.

    They saved and opened normally, but search returned nothing for them and Selah answered as though you had never written them. Every note is now indexed the moment it's created, and the notes already affected have been repaired.

  • Renaming a note left search looking for the old name.

    A note's title is part of how it gets matched, but a rename never reached the index — and editing a note's body used to drop its title out of the index entirely, so the longer you worked on a note the harder it was to find by name. Titles now stay current.

  • Search results are consistent from one note to the next.

    Notes were indexed three different ways depending on how they were created, so whether you could find a note by its title was effectively luck. Every note has been re-indexed the same way.

  • The source panel on a note had its fields crowded together.

    Labels, inputs, and the type choices sat almost on top of each other, so the three settings read as one dense block. The panel now has room to breathe and each setting reads as its own group.

Added

  • Write a verse the way you remember it, and Selah works out where it's written.

    Sometimes you know a verse but not its address. Select the words as you jotted them — "grace teaches us" — and convert the selection: Selah finds Titus 2:11-12 and puts the real passage in its place. Founder-only for now.

  • One way to add scripture.

    A scripture block takes either form in the same box: a reference like john 3:16-21, or the wording as you remember it. Typing a reference is instant and exact; a phrase is searched against the Bible text first, and only if those words appear nowhere does Selah work out what you meant.

Changed

  • Scripture is one thing with two looks now, not two things.

    A reference in a sentence and a full passage quote were separate blocks that happened to hold the same verse. They're one block. Show full passage opens the verse out; Shrink to reference folds it back. The wording carries across either way, so nothing reloads and nothing is lost.

  • The gold chip on inline references is gone.

    A reference in the middle of a sentence now reads as part of the sentence — quiet text with a soft underline — instead of a chip that interrupted it. It matches how references already looked in Stream, the reader, and shared notes, so scripture looks the same wherever you meet it. Full passages keep their gold edge: that's when the verse itself is the point.

  • Every scripture block can be changed or removed from one menu

    — refresh it in your current translation, pick a different verse, switch how it's shown, or take it out.

July 24, 2026

v0.40.10.1 → v0.40.13.0

Setting a note's source is one question at a time now.

Changed

  • Setting a note's source is one question at a time now.

    The source panel used to open with three fields where two were greyed out, which read as broken rather than "not yet". It now asks only who taught or wrote the note; the type and date appear once you've named someone, and the option to clear only shows when there's a source to clear.

  • You can see which kind of source is selected.

    The type choices (sermon, book, podcast, conversation) previously gave no indication of which one was set. The active one is now marked, tapping it again clears it, and a type you typed yourself comes back the way you left it.

  • Teachings you record stay out of your own beliefs.

    Content you've attributed to someone else no longer shows up in your Belief Map, and no longer shapes your daily devotional or proactive check-ins as if it were your own conviction.

Fixed

  • Proactive check-ins stop bringing up things you've moved on from.

    A note like "preparing a sermon on Romans for next Sunday" has a shelf life. Selah's check-ins were still reaching for those after they'd passed; now they only use what's still current, the same way the rest of the app already did.

  • What you told Selah when you signed up is findable again.

    Your answers about your role, your translation, your tradition, and what you're studying were saved but effectively invisible when Selah went looking for what it knows about you. They now surface like everything else it remembers.

  • Reading a note beside your draft now shows real formatted text.

    When you opened a related note in the Connections panel, the text appeared as an unstyled wall. It now renders with proper spacing, headings, and paragraph rhythm — the same as a normal note.

Added

  • Notes can now say whose teaching they hold.

    When you save notes from a sermon, a book, or a podcast, you can mark who taught or wrote the content — a pastor, an author, a host — and when they said it. Selah's companion then treats that content as someone else's teaching ("Pastor Mike taught…") instead of folding it into your own beliefs, so a sermon you wrote down never quietly becomes your position in a later conversation. Your own reflections in the same note still read as yours. Set it from the "+ Source" chip in a note's top row.

  • Recorded sermons fill in the source for you.

    When a recording's speaker is marked as someone other than you, turning it into a note now fills in who taught it and the date automatically. You can edit or clear it.

July 23, 2026

v0.40.10.0

Search finds notes and captures by meaning, not just matching words.

Added

  • Search finds notes and captures by meaning, not just matching words.

    Searching "undeserved kindness" can now surface a note about grace, not just entries that happen to contain those exact words. A search with no real connection to anything you've written comes back empty instead of showing the nearest-but-wrong results.

  • A Connections panel on every note shows what's related while you write.

    Open it from the note's top bar (or press ⌘\) to see the note's Scripture references, where it came from (a capture, a conversation, a recording), notes on a similar theme, and the concepts it touches. Tap a related note to read it beside the one you're writing, without losing your place.

Changed

  • The note page's less-common actions moved behind one menu.

    Export, clean up formatting, and delete now live under a single overflow menu next to the new Connections toggle, so the top bar reads cleaner.

  • The companion feels more aware of where you are.

    Its dock header and the "Focus" banner now name the page you're on ("Reading John 1 · KJV") when it isn't already anchored to something specific, and its quick suggestions change with the screen you're using.

July 22, 2026

v0.40.9.0

Free Bible study guides at [selah.so/guides](https://selah.so/guides).

Added

  • Free Bible study guides at [selah.so/guides](https://selah.so/guides).

    Two new articles walk through a five-step personal study rhythm and compare six common methods — inductive, SOAP, verse mapping, book study, thematic, and Lectio Divina — so you can pick one that fits your purpose.

  • New sections of the site for people exploring Selah.

    Pages at [selah.so/alternatives](https://selah.so/alternatives) compare Selah to Logos, YouVersion, e-Sword, and AI chat apps — honest about where each fits best. Pages at [selah.so/for](https://selah.so/for) describe what Selah looks like for pastors, small groups, and personal study.

July 21, 2026

v0.40.8.0

Replying to a "Need help" message no longer means leaving Selah.

Added

  • Replying to a "Need help" message no longer means leaving Selah.

    A new Support tab in the admin dashboard shows every message and its thread, and a reply reaches the person on Telegram or email right away instead of waiting for the next check-in.

Fixed

  • Facebook ad reporting was undercounting how signups and trial starts convert.

    Some of the conversion data sent to Meta was missing pieces Meta needs to attribute and value an event correctly, so registration and trial-start numbers in Ads Manager read less accurately than what actually happened. Ads should now report cleanly again.

July 20, 2026

v0.40.5.0 → v0.40.7.0

Sending a "Need help" message now tells you it went through.

Added

  • Sending a "Need help" message now tells you it went through.

    Your message appears right away, and a quiet confirmation lets you know it's on its way.

  • A reply no longer waits for you to remember to check.

    When we answer, you'll hear about it — a dot on the "Need help?" link, plus a Telegram message or email if you're not in the app.

  • A "Need help" link that actually reaches someone.

    The sidebar (and the mobile drawer) now has a support link right above Settings. It opens a panel where you can send a message directly — replies show up right there, no email needed.

  • A tour of the whole workspace, one page per feature.

    New pages under selah.so/features show what each part of Selah actually does — the reader, reading plans, journal, notes, library, knowledge map, prayer board, and companion — each demonstrated with the real interface, not a screenshot. A "Coming soon" section on the notes page previews recording a sermon, yours or someone else's, into a searchable note.

  • The "Features" link in the site header now opens a preview of all eight pages on hover, grouped the way the workspace actually works: Read, Organize, Pray, Ask.

Fixed

  • Some KJV verses were missing their last few words.

    About 1 in 9 verses (3,451 of them, across 45 of 66 books) were silently cut short — Esther 8:17 used to end mid-sentence, dropping "upon them." Every verse is now complete, re-sourced from the same provider already powering the Berean and World English translations.

July 17, 2026

v0.40.4.0

A free trial you can actually find.

Added

  • A free trial you can actually find.

    The homepage hero now offers "Start a 14-day free trial" right next to "Get started." Before, the only place to begin a trial was buried in the pricing card, so almost everyone landed on the free plan by default. Free is still the primary button; the trial is just a real choice now.

  • Your trial-ending email tells you what you built.

    The reminder before your trial converts now recaps what you did during the trial, your notes and your conversations with Selah, before it gets to the billing line. If you barely used it, that recap stays hidden rather than reminding you.

  • Billing settings now show the whole picture.

    Free members see what Plus adds, not just two prices. People on a trial see the exact date the trial ends and a simple timeline of when the reminder lands and when the card is charged, so nothing is a surprise.

  • A quiet nudge during your trial.

    People on a trial get one short, dismissible note on the home page pointing at the two things most worth trying, Telegram and the companion.

Fixed

  • The onboarding sample no longer shows an empty box.

    "Here's an example thought" now actually fills in the example so you can make it yours and save it. A timing bug was dropping the example before the editor was ready.

  • Cancel and pricing copy now match what actually happens.

    The cancel page has one optional question, not "no questions asked," and the price after the founding period reads $12/mo · $120/yr everywhere instead of an inconsistent figure.

July 16, 2026

v0.40.0.0 → v0.40.3.0New

Sharing Selah now starts with a person, not a promo code.

Fixed

  • Your daily devotional now shows up in your chat with Selah.

    Before, it went to Telegram and nowhere else, so anyone who hadn't linked Telegram never saw it unless they typed /devotional themselves. Now it's written into the same conversation you already have going with Selah, on every surface, and you can reply to it there. Telegram check-ins land in that conversation too.

  • Someone who resubscribes and later cancels again now gets the farewell emails for that new cancellation.

    Before, the win-back note was once per lifetime, so a returning member who left a second time heard nothing.

  • Every new signup now enters onboarding immediately, and incomplete onboarding can no longer be bypassed by opening Stream, Settings, or another authenticated app route.

    A pending guided Reader sample still resumes in the right place.

  • Choosing Plus after the guided sample now opens Stripe checkout.

    If checkout or onboarding completion cannot be saved, the current step stays open with a clear retry message instead of silently jumping to the final celebration.

Added

  • Former members now hear from Selah twice, quietly, then not again.

    The day a subscription ends, the existing "your study is still here" note goes out. Three weeks later, one more email shares two or three things that have genuinely changed since they left, with a single "See what's new" button. No drip, no pleading, and anyone who resubscribed or has been active recently is skipped automatically.

  • Canceling Plus now happens inside Selah, with an honest conversation first.

    Choosing "Cancel plan" in Billing asks the one reason that matters, then answers it directly: trial members worried about being charged see exactly when the reminder email arrives and when the trial ends; anyone who hasn't had time can add seven free days once; monthly members priced out can switch to annual (two months free) on the spot; and anything that didn't work can be told to the founder in a sentence, who reads every one. Canceling itself stays two clicks, always visible, never argued with.

  • After canceling, Billing shows one settled farewell: when access ends, that nothing renews, that your notes, prayers, and study stay yours, and a one-click way to resume before then.

    Trial members see it in writing: you will not be charged.

  • The reason survey never holds the door.

    "I'd rather not say, just cancel" skips it, and worried trial members see a small timeline of exactly how their trial ends: today (nothing charged), the reminder email, the last day. Anyone whose issue is something broken can write to the founder without canceling at all.

  • Sharing Selah now starts with a person, not a promo code.

    Referral invitations appear quietly after meaningful moments and ask who you talk about the Bible with. Friends get their first Plus month covered, trial members can earn seven more days, and paid members can earn $9 off.

  • Referral invitations can be sent through the device share sheet, WhatsApp, email, or a copied editable message.

    A Day 7 email offers the same invitation when no other lifecycle message is competing for attention.

Changed

  • The trial-ending reminder email now tells canceled trials the truth: your trial ends soon and you won't be charged, with a quiet one-click way to keep Plus.

    Before, everyone got "your card will be charged" even after canceling.

  • Referral invitations share one 14-day cooldown, so Selah never stacks asks across notes, devotional sessions, checkout, and email.

    Send one and the rest stop.

  • Referral reporting now follows the whole path: who clicked a link, who signed up from it, who started a trial, who paid, and which rewards were given, held, or failed.

    It survives ad blockers, so the numbers reflect what happened.

  • A friend's referral link now opens the Selah home page.

    Their invitation and note arrive as a card over it that closes on its own after ten seconds, so the introduction is a greeting rather than a separate page to get past.

  • Copying your invitation message from Settings no longer counts as sending it.

    Settings stays open as the place to grab your link any time, without quietly ending the invitations Selah offers you.

  • The guided Reader now keeps its instruction beside the highlighted verse on larger screens, while phones retain the bottom coach card.

July 15, 2026

v0.39.40.1 → v0.39.41.0

Knowledge extraction now fails safely instead of half-saving.

Fixed

  • Knowledge extraction now fails safely instead of half-saving.

    When Selah's background extraction gets unusable output from the model on one of your notes, it retries once, and if it still can't, it leaves your knowledge graph untouched rather than writing a partial record. The Knowledge "Sync" button now tells you when some notes couldn't be processed and offers a Retry, instead of silently showing a stale graph.

Changed

  • The onboarding "where did you hear about Selah?

    " question now offers Instagram and Facebook alongside Reddit, YouTube, a friend, and search, and dropped the em dash from its wording.

  • Onboarding is now plan-first and hands you the real product.

    Instead of ending on a pricing screen, new people choose a reading plan, then step straight into the real Reader for a guided first study: select a verse, highlight it, write a thought (an example is filled in if you're not sure what to say, or skip it), and finish on a quiet "that's the heart of it" screen. The plan you pick begins the next morning in your own timezone. The Plus offer shows once, after that first saved thought, and never blocks the Reader.

Added

  • If you don't connect Telegram during onboarding, a gentle reminder appears on your home screen the day your first reading becomes available.

July 14, 2026

v0.39.39.0

Voice recording playback was silently broken.

Fixed

  • Voice recording playback was silently broken.

    The player showed "Audio unavailable" for every recording because the browser blocked the private audio file's URL. Playback works again.

Added

  • A brief "Recording saved.

    Transcribing now." confirmation appears when you stop a recording, and the transcribing note shows a calm loading state instead of a bare "Transcribing…" line.

July 13, 2026

v0.39.35.1 → v0.39.38.0

Founding members.

Added

  • Founding members.

    The first 100 people to subscribe to Selah Plus get a permanent founding-member number and an invite to a private Telegram group to share feedback and talk directly with the team. A cancellation frees the slot for the next new subscriber.

Fixed

  • Voice recordings failed to transcribe.

    Every recording hit an error because of how keyword hints were sent to the transcription service. Recordings transcribe reliably again, with a fallback so a bad keyword can never sink a transcript.

  • Session banners on the recording screen no longer overlap the sidebar on wider screens.
  • Signup attribution now connects.

    The product-analytics funnel showed landing-page visitors but zero signups, even though people were signing up. Anonymous visitors were tracked with an in-memory id that vanished the moment they navigated through signup, so the anonymous visit and the finished signup looked like two different people. Visitors now carry a durable first-party analytics id, so a landing visit stitches to the account it becomes.

  • The landing page no longer greets first-time visitors with a stack of popups.

    The Google sign-in prompt used to fire on the marketing homepage on top of the cookie banner, before anyone showed any intent to sign in. It now appears only on the sign-in and sign-up pages.

Changed

  • Onboarding and lifecycle emails were trimmed.

    The welcome email now points to one clear next step instead of three. The six feature-education emails dropped their bullet lists and Bible verses for a couple of sentences and one button. A few subject lines that read as guilt-driven, over-personifying the AI, or confrontational were replaced with plainer ones. The trial-ending email now states the exact price and billing period you'll be charged instead of just "your card."

  • Landing page hero line broadened from a study-then-teach arc to "for those who love to study, read, pray, and teach.

    "

  • Marketing analytics now use a privacy-first, first-party cookie by default

    so we can measure how people find Selah. Accepting the cookie banner additionally turns on analytics and advertising cookies (Google, Meta, Reddit); Decline opts out entirely, and Global Privacy Control is still honored automatically. Banner copy and the privacy policy were updated to match.

  • The Selah vs Logos page now tells the truth about Greek and Hebrew.

    It used to concede original languages wholesale to Logos. It no longer does: Selah's word study — tap any word for its Hebrew or Greek, Strong's number, parsing, and lexicon entry from BDB, Abbott-Smith, or LSJ — is now a stated strength, next to a reading experience that feels natural and notes and highlights that are first-class rather than a sidebar. Logos's depth is reframed as weight (powerful, but heavy and years to learn), and the honest concession is narrowed to the one thing Logos genuinely owns and Selah doesn't: a library of books to buy. Two new comparison rows, a dedicated original-languages section, and two new FAQs.

July 8, 2026

v0.39.29.0 → v0.39.34.0

Sharpen this belief.

Added

  • Sharpen this belief.

    The Belief Map's promised follow-through: every belief card now carries a "Sharpen this belief" button (and the Companion a /sharpen command) that starts a Socratic challenge session on that belief — iron sharpens iron. Selah gathers what you actually hold — your own words, your scripture anchors, the places your own notes already wrestle — and presses with one challenging, scripture-anchored question at a time. It will never tell you the doctrine is right or wrong, never grade your reasons, and won't budge even if you ask it point-blank for a verdict: the belief is yours to own before God and the text. When the sharpening lands somewhere, it offers to save the whole arc as a study note.

  • Meta (Facebook/Instagram) ad measurement.

    Selah now reports signups, trial starts, and purchases back to Meta the same way it already does for Reddit — matched to the ad click server-side, so campaign performance stays measurable even though conversions finish days later in a Stripe webhook. The browser pixel is consent-gated (nothing loads until a visitor accepts) and only tracks page views; every conversion is sent server-side.

  • The Belief Map has a second shape: Circle.

    A layout toggle arranges every concept on an organized ring, grouped by kind — doctrine, themes, people, places — with quiet group labels and connection arcs through the middle. Tap a belief and its connections light up in sage across the circle. Freeform stays the default.

  • Find any concept instantly.

    A search control on the map flies the camera to a concept and opens its card — including concepts currently hidden by an active focus filter.

  • Arrange the map your way — it stays that way.

    Drag concepts where you want them in Freeform; your placements survive reloads, and new concepts settle naturally around them. A quiet "Reset arrangement" action brings back the organic layout.

  • Explore a belief with Selah without leaving the map.

    The belief card's new button opens the on-page Companion dock with a starter prompt already typed — edit and send. A draft you were already writing is never overwritten.

  • The map tells you where to look.

    A caption reads like "125 beliefs · 4 you're wrestling with · Jesus Christ is your most connected," with tap-throughs. Concepts added this week carry a gold tick; beliefs you're wrestling with carry a warm underline. One Focus menu replaces the old row of filter chips.

Fixed

  • Slash commands typed (or seeded) in the Companion dock no longer pick up page context that could confuse them — `/sharpen Grace` means exactly that.
  • The companion can now edit the note you're looking at.

    Asking Selah to rewrite or remove a section — from the dock or the companion screen — previously dead-ended with a request to paste the note's ID from the URL. The companion now knows which note it's reading and which notes a search returned, so edits just work. Section edits also got stricter: if Selah can't tell which note you mean, it asks instead of guessing — it never rewrites a section of a note you didn't name.

  • Menus opened by click could never actually open (a shared popover bug that the new Focus menu exposed first).
  • "New this week" now works on iPhone — concept timestamps are normalized so Safari can read them.

Changed

  • The map breathes now.

    Zoomed out, lesser labels rest as dots and fade in as you zoom — 200 concepts no longer collide into an unreadable pile, and labels cannot overlap at any zoom level. The map settles with a short exhale on load, flexes around your hand when you drag, and lights a concept's connections on hover. At rest it is perfectly still, and reduced-motion preferences are honored throughout.

  • Switching filters no longer scrambles the layout — the map keeps its shape and simply adds or removes concepts.
  • One companion brain.

    The legacy hand-rolled companion loop is gone. Every surface — web dock, the Companion screen, Telegram, and the admin test console — now runs exclusively on the AI SDK 7 engine that went GA in 0.39.28.0. Renaming a chat now rides the same v2 API as everything else.

  • Your reading plan stays in sync across the app.

    Mark today's reading done in the reader and the stream reflects it immediately, no reload — the two views now read from one shared source instead of tracking the day separately. Reopening the reader is also snappier: today's plan is cached, so it no longer re-fetches every time.

Internal

  • Deleted: `callClaudeWithTools` (~410 lines) + legacy-only debug capture, `companion-legacy-client.

    tsx, /api/companion/chat (GET/POST/PATCH; rename PATCH ported to /api/companion/v2 first), CORE_TOOL_SUBSET, dead normalizeCompanionHistory`. Net −2,604 lines.

  • Flags retired: `companion_v2` and `companion_v2_engine` reads removed everywhere; the v2 route and `/companion` page are unconditional (auth + entitlements still gate).

    A source-pin test now asserts the legacy symbols and flag strings stay gone.

  • `runEngineTurn` now populates the admin debug seam (`_debugState`: system prompt, messages sent, usage, estimated cost, latency), so `/companion-test` works on the engine path — previously an accepted gap.
  • `toolNames` is required on `runCompanionTurn`/`buildCompanionToolRegistry` (no silent-default tool surface).
  • Verified: tsc 0 errors; 192 test files, 2308 passed / 10 skipped (delta vs pre-cleanup: −7 tests, all from the deleted dead-code test file).

July 7, 2026

v0.39.27.2 → v0.39.28.0

The companion no longer repeats itself in long conversations.

Fixed

  • The companion no longer repeats itself in long conversations.

    When you chatted alongside a note, the note's full text was silently re-attached to every message you sent and stored that way, so the model saw the same note once per turn (and your own bubbles showed the pasted note on reload). Attachments now live in one deduplicated context block — each note appears exactly once per reply, re-read fresh so the companion always sees your latest edits — and your messages are stored clean. Telegram conversations benefit too: the replayed history is now capped, so week-long threads stop ballooning.

  • The companion now keeps hold of the text you selected.

    Highlight a line in a note (or a verse in the Reader), then click into the companion to type — your highlight used to vanish the instant you started writing, so "what does this mean?" arrived with nothing attached. The selection now stays put until you send, clear it, or move to another page, so your question lands on exactly what you were looking at.

Changed

  • The whole companion now runs on one engine.

    Web dock, the Companion screen, and Telegram all route through the AI SDK v7 engine (runCompanionTurn) with the full 27-tool surface — prayers, devotional pivots, heartbeat config, and reader grounding tools are now available on the engine path, with the same prep-mode and grounding gates as before. companion_v2 and companion_v2_engine default ON; both remain readable as per-user kill switches until the legacy loop is deleted.

Internal

  • Attachments: `unionAttachmentIds` + `buildAttachmentsBlock` (escaped `<attachments>` system-prompt block, per-item + aggregate token caps, priority-ordered under budget pressure); raw message persistence with attachment ids in `companion_messages.

    metadata`.

  • Transcript budget: `clampHistoryToBudget` (`HISTORY_MAX_TOKENS` = 24k, context-budget.

    ts) on both the legacy loop and the v2 route; never drops the current turn, never opens on an assistant row.

  • Engine adapter: buffered `runEngineTurn` in companion-service (tool-call parts drive step events / Telegram drafts, parts persisted for identical history replay, final-response guarantee + orphan-intent instrumentation ported).
  • `recordSessionToolSideEffects`: capturesCreated/prayersCreated session bookkeeping now also fires on the v2 route (it previously only ran in the legacy loop, starving session synthesis, the learning digest, and weekly arcs for engine-path turns).
  • Deps: bun.

    lock actually moved to ai@7.0.17 / @ai-sdk/anthropic@4.0.9 / @ai-sdk/react@4.0.18 (PR #567 had bumped package.json + package-lock only; bun installs were still resolving ai@6, which also explains the 23 phantom tsc errors and the provider 404). tsc is now clean. Verified: 2320 tests, companion-chat eval 100%, spike:ai-sdk GO (cache read 5769 tokens on turn 2).

July 5, 2026

v0.39.27.1

The companion button no longer blocks "Add to note" while selecting.

Fixed

  • The companion button no longer blocks "Add to note" while selecting.

    When you pick multiple items from your Stream, the floating companion button now steps aside so the selection bar's "Add to note" control is always reachable.

July 4, 2026

v0.39.26.0 → v0.39.27.0

Picking a reading plan is a browse, not a scroll.

Changed

  • Picking a reading plan is a browse, not a scroll.

    Plans now sit two to a row as cards, and "Build your own" — tell Selah a goal, get a plan drafted around it — leads the page instead of hiding below the catalog. The most-picked plan sits beside it with a quiet badge.

  • A generated plan you never started can be removed.

    Hover a card under "Your plans" (on a phone, the control is always visible) and a two-tap Remove clears it out. Plans you've actually read stay put — those are history, managed from settings.

  • Reading on your phone got the polish pass.

    Open a tool panel and it rises as a sheet; tap the passage behind it and it slides away, without that tap also selecting a verse or jumping you elsewhere. Type into a note or word-study field and the panel lifts clear of the keyboard so you can see what you're writing.

  • The book scrubber looks like the control it is.

    The bar at the foot of the reader is now a floating, color-coded card — each section of the Bible in its own hue — and pulling up opens a compact chapter strip that keeps your target chapter centered as you sweep. On a trackpad or mouse the whole book is one swipe away.

Added

  • Finishing a plan is acknowledged where you finished it.

    Marking the final day read brings a quiet gold moment — "You finished what you started." — with a link to the full story on your Stream. Before, the reading bar simply disappeared.

  • The daily Telegram message names what's waiting — gently.

    If earlier readings are unread, the message closes with "3 earlier readings are set aside — they will keep. Read at your own pace." Being behind is no longer invisible, and never shamed.

  • The companion travels with you.

    The collapsible companion panel now runs on the same engine as the full companion screen and knows what you're looking at: highlight a verse or open a note and your next message carries that context, so "what does this mean?" lands on the passage in front of you instead of starting cold.

Fixed

  • Custom plans built from one-chapter books no longer fail.

    Asking for Obadiah, Philemon, 2–3 John, or Jude used to error out after several silent retries — the generator kept inventing chapters those books don't have. It now corrects itself on the first try.

  • The reader opens faster when you're on a plan.

    Today's reading is remembered for a few minutes instead of re-fetched on every visit, and marking a day read anywhere clears it immediately — including the moment you switch accounts on a shared device.

July 2, 2026

v0.39.21.0 → v0.39.25.0

Selah asks before rewriting your note.

Added

  • Selah asks before rewriting your note.

    When the companion wants to replace a section of a note — the one edit that's hard to unwind — the conversation pauses with a small card: "Selah wants to rewrite the section 'Application' of your note." Allow lets it happen; Not now skips it and the conversation carries on. Saving thoughts, prayers, and additions never ask — only full rewrites do. The step trail records what you decided, and answering works even if you come back to the conversation later.

  • Scripture in Telegram reads like scripture.

    Verses Selah sends now arrive as set-apart quote blocks instead of italics, and a full chapter comes through collapsed with a "show more" — where before it was dropped and only the reference survived. Scripture references in Telegram messages also link straight to that chapter in your reader.

  • Find any passage with one gesture.

    The reader's book bar is now a true scrubber: press and slide to flip through the 66 books, color-coded by section — Law, History, Wisdom, Prophets, Gospels, Letters — then pull up to open a book and sweep through its chapters. Let go and you're there. On a phone, resting your thumb at the screen edge keeps a long book flowing past; with a mouse or trackpad the bar becomes a ruler for the whole book, so Psalm 119 is one sweep away instead of a dozen.

  • Tapped the wrong book? Take it back.

    A tap still jumps instantly — and a small "Back" button follows it for a few seconds, returning you to the exact chapter you were reading.

  • Send several captures into a note at once.

    Select multiple captures in your Journal and add them together, to a new note or an existing one, instead of one at a time.

  • Turn a conversation into a note.

    Any companion session can become a real note from the session's ⋯ menu — your words set apart as quotes, Selah's replies as prose, with the summary and captures included. The note opens beside the chat, joins your library, and Selah can find it in her memory right away.

  • Edit the living note without leaving the conversation.

    The note panel beside the chat now has an edit toggle: type directly, it saves as you go, and "Open in editor" is still there for the full page. If Selah edits the same note while you're typing, a calm banner lets you keep your version or take hers — nothing is lost either way.

  • Your first minutes in Selah now produce something real.

    Onboarding asks for one genuine thought — if you teach, about the passage you're teaching next — saves it as your first capture, and the companion responds to it with a single question in your own words. You arrive in the app with your Stream already started.

  • Send a capture into a note.

    Every capture now has "Add to note": start a new note, pick a recent one, or take one of Selah's suggestions based on what the capture says. The original stays in your Journal.

  • Bring your notes, see your Belief Map.

    Import three or more notes (Markdown, Word, PDF, Notion, Obsidian) and Selah maps the beliefs in them right away — you land on your Knowledge page and watch it fill in.

  • Export everything, anytime.

    Settings → Privacy now downloads a zip of your whole workspace as Markdown: every note, your journal by month, and your prayer board. Free tier included.

  • Print a teaching handout.

    Any note can become a clean one-page handout — scripture quoted in full, ready for print or save-as-PDF, with a small "Prepared with Selah" line you can turn off.

  • Shared notes look right in group chats.

    A shared note now previews with its title and passages, reads comfortably on a phone, and carries a quiet invitation at the end.

  • "This week's teaching" on your home page.

    Tell Selah which day you teach and a card keeps your current note, the days remaining, and this week's captures in one glance.

  • An honest home for Logos switchers.

    New pages compare Selah and Logos plainly — including where Logos is still the better tool — with walkthroughs for bringing your study over from Logos or Obsidian ([selah.so/selah-vs-logos](https://selah.so/selah-vs-logos)).

  • Two gentle emails, only when they help.

    A day-two note if you haven't captured anything yet, and a weekly digest of your study week for Plus members who aren't on Telegram. Both respect unsubscribe, both send at most once per window.

  • Selah asks how it's going.

    After a month of steady use, one quiet question — how disappointed would you be if Selah disappeared? — so the product grows from what real users say.

Fixed

  • Your weekly reflection no longer silently vanishes.

    An intermittent formatting quirk in the model's response could drop a week's reflection entirely — it ran hourly in production logs. Those responses now recover instead of being discarded.

  • Long Telegram replies always arrive.

    A long reply containing a quote could fail to send at all (you'd get a generic error); messages now split cleanly at any length.

  • A stuck tool or dropped connection now fails honestly

    — the companion gives up after a bounded wait instead of leaving you watching a spinner until the request dies on its own.

  • A failed save on your phone is no longer silent.

    If autosave can't reach the server, "Couldn't save — Retry" now shows on every screen size, not just desktop.

  • Notes that start with a list, quote, or scripture passage show a preview again

    on the notes list, instead of a blank row.

  • The "your note types are now folders" banner is retired.

    It kept reappearing after you dismissed it, and greeted new members about a change that predated them.

  • Steadier small moments.

    The gold glow after an AI edit no longer nudges your text while it settles, the slash-command menu stays on screen on phones, the sharing panel closes with Escape, and typing in it no longer loses focus mid-word when a background save finishes.

  • The chat fits your screen properly.

    The conversation column now uses the same comfortable reading width as Notes, small tablets no longer squeeze the chat behind the sessions rail, the message box sits clear of the iPhone home indicator, and phones get sensible margins.

  • Buttons on the companion screen respond to your press

    — the same gentle squeeze as everywhere else in the app, and it stays quiet if your device asks for reduced motion.

  • Search engines can finally read selah.so.

    The sitemap and robots file had been redirecting crawlers to the sign-in page since launch — Google could never index the site properly. Both are now public.

  • Companion-saved captures stay with their conversation.

    A thought the companion saved for you now files under that session in your Journal instead of appearing as a loose entry.

Changed

  • The companion offers to save an insight instead of following up with another question.

    When you share something meaningful, Selah now prioritizes offering to keep it over chasing a new thread.

  • Selah's first reply to your very first thought doesn't force an odd trailing question.

    A short mirror of your own words can stand on its own now, instead of every reply needing a question tacked onto the end.

  • Notes open instantly.

    Opening a note used to make three round-trips before anything appeared. Now the page arrives with your note already on it — one quiet loading moment, then your words. The browser tab shows the note's title, too.

  • The editor is ready before you need it.

    While you're on the notes list, Selah quietly fetches the editor in the background, so opening a note doesn't wait on the download.

  • The formatting toolbar works by touch and keyboard.

    On a phone it now appears below your selection — clear of the system copy/paste bubble — and wraps to fit small screens. Every button can be reached with Tab and Enter, and the AI clean-up sparkle explains itself when the selection is too short instead of doing nothing.

  • A tidier note screen on your phone.

    Sharing, handout export, and AI clean-up live in one "…" menu on small screens; deleting asks with properly sized Yes and Cancel; and one accent color marks your active filters.

  • Highlighting on your phone stays out of your way.

    Picking a highlight color no longer dims and blocks the page: a slim tray rises from the bottom, your verses stay visible and adjustable above it, and the tray quotes exactly what you've selected — updating live as you move the selection handles.

  • The reader feels lighter under your fingers.

    Selecting verses, tapping words for word studies, and resizing the study panels no longer make the page stutter. Panel drags glide, word taps respond instantly, and the page stays still while you work.

  • Easier to grab, easier to press.

    Panel handles, cross-reference markers, and footnote letters all have properly sized touch targets now; buttons give the same gentle press feedback as the rest of the app; and the reader respects reduced-motion settings and the iPhone home indicator.

  • The landing page now tells one story: from your morning reading to Sunday's teaching.

    New hero, a week-rhythm walkthrough (Tuesday capture, Thursday study, Sunday teach), a plain "who Selah is not for" answer, and the promise that your notes leave with you, stated up front.

  • The companion asks before it saves.

    When you say something worth keeping, it offers once — "Want me to save that to your notes?" — and a no means no. It won't offer during interviews or for small talk.

  • Empty pages now teach.

    A fresh Stream, Notes, Knowledge, or Prayer page tells you the one action that fills it, instead of just being empty.

July 1, 2026

v0.39.20.2

The week-one knowledge tip now links straight to your Knowledge page.

Fixed

  • The week-one knowledge tip now links straight to your Knowledge page.

    The Telegram nudge used to point to a Telegram command; it now takes you to [selah.so/knowledge](https://selah.so/knowledge) in one tap, and the opening line is friendlier.

June 30, 2026

v0.39.19.0 → v0.39.20.0

The Reddit Pixel now actually fires on the landing page, and conversion reporting talks to the live API.

Fixed

  • The Reddit Pixel now actually fires on the landing page, and conversion reporting talks to the live API.

    Same-day fixes that took the Reddit tracking from shipped-but-inert to working: the pixel loads on selah.so and reports a page visit once you accept cookies, and the server-side conversion reporting is wired to Reddit's current API.

  • Unsubscribing now stops the win-back email too.

    If you unsubscribed and later let a subscription lapse, Selah no longer sends the "come back" email. Your opt-out is honored everywhere marketing email goes.

  • The unsubscribe page reads cleanly in every state.

    Success, invalid link, and error each show their own clear message, and the page no longer flashes an error heading before settling. A bare visit explains how to unsubscribe instead of showing an error.

Added

  • Reddit Ads conversion tracking.

    Selah now reports ad performance to Reddit through both a browser pixel and a server-side Conversions API, the same two-sided setup it already runs for Google. The pixel counts page visits on the marketing pages (only after you accept the cookie banner); the server reports the real conversions — account signup, trial start, and first payment — straight from the webhooks, so they still land when a browser blocks the pixel. Dormant until the Reddit keys are set, so nothing changes for existing visitors until then.

Changed

  • Onboarding emails now arrive every third day instead of every other day.

    The feature-education series (Reader, Reading plans, Pray, Journal, Companion, Knowledge) sends on days 3, 6, 9, 12, 15, and 18 after you finish onboarding — a calmer, less frequent run-up. The admin "Emails to users" timeline shows the new schedule.

June 27, 2026

v0.39.16.2 → v0.39.18.0

Founder Telegram alerts for signups and plan changes.

Added

  • Founder Telegram alerts for signups and plan changes.

    Opt-in (set ADMIN_TELEGRAM_CHAT_ID to your private chat id): a new registration pings you with name/email/plan, and a Stripe plan transition (trial started, converted to Plus, canceled) pings you with the email and what changed. Dormant until the env var is set.

  • Scripture references in Telegram messages are now tappable.

    When Selah names a verse — in a nudge, a Scripture suggestion, or a chat reply — tapping it opens straight to that chapter and verse in the reader, instead of leaving you to find it.

Fixed

  • Security hardening.

    Routine patches to the framework and sign-in library, plus a fix so a note's title can't slip markup into its public share page. Nothing changes in how Selah looks or works, and there's nothing you need to do.

  • The homepage demo video now plays.

    It was showing a broken-tile icon (and the poster flashed as a broken image) because the site's security policy didn't allow the video host. Both now load correctly.

  • The email preview in the admin "Emails to users" screen now renders.

    It was showing "selah.so refused to connect" because the app blocks all iframing for security; the preview now loads the email's HTML and draws it inline, so you can see every email's body in light and dark.

  • Reading plan Telegram messages no longer include full chapter text.

    A verse or two inlines fine; anything longer sends the reference only and lets you open it in the app. Proverbs chapters (the daily reading in the proverbs-story-gospel plan) were the main casualty.

  • Multi-passage plan days now show all their readings in the Telegram header — not just the first one.

    The proverbs-story-gospel plan was only showing the Proverbs reference; the Genesis and Luke readings for that day were missing.

Changed

  • The homepage hero now plays a demo walkthrough instead of cycling product screenshots.

    A still frame of the app shows by default; tap the play button to watch the tour with sound. A short preview loop animates while the hero is on screen — on phones too, not just on hover — and stops when you scroll past.

June 26, 2026

v0.39.12.0 → v0.39.15.0

A welcome series that shows you what Selah can do.

Added

  • A welcome series that shows you what Selah can do.

    After you sign up, you get one email every couple of days for the first two weeks, each on a single feature: studying in the Reader (word studies, people and places, highlights that hold a thought), reading plans, keeping a prayer log and watching answers come, your journal and its weekly arc, the Companion, and your belief map. The subject lines ask a question worth opening — "Do you forget to pray?", "What do you actually believe?", "Did God answer?".

  • A single admin screen that shows every email Selah sends.

    The onboarding sequence reads as a timeline from signup; the rest group by when they fire. Tap any one to see its subject, preview text, audience, timing, a live render of the real email (light and dark), and its open and click rates.

  • A privacy choice on the public pages: a quiet bottom strip with equal Accept and Decline.

    An anonymous visit count runs either way; cookies and Google Analytics turn on only if you accept. It honors a browser's Global Privacy Control signal, and you can change your mind any time through "Privacy choices" in the footer.

  • A privacy choice now shows on the public pages (landing, plans, referral links).

    Analytics cookies stay off until you accept, and your choice is remembered.

  • Operator cockpit at `/admin/cockpit`

    (founder-only). One screen that answers "how's it doing, what's it burning, what needs attention": this-month AI cost with an 8-week trend, plan counts, a needs-attention panel, AI cost by feature and by top user, and a manual infra/ops expense list. Revenue and margin are gated until billing goes live, shown honestly as "awaiting billing launch" rather than confident zeros.

June 25, 2026

v0.39.10.3 → v0.39.11.0

Selah's proactive nudges now speak plainly as software — never as if they were praying for you or sitting with you.

Changed

  • Selah's proactive nudges now speak plainly as software — never as if they were praying for you or sitting with you.

    The heartbeat's voice was tightened so it points you toward Scripture and prayer without sounding like a person or a spiritual participant.

  • The Scripture suggestion can now surface a genuinely timely passage instead of going quiet for a full week.

    A perfect verse for something you wrote yesterday should reach you even if a suggestion went out earlier in the week.

  • Cards across the journal, notes, and prayer board now share one calm, bordered look.

    The heavy drop shadows are gone, replaced by a quiet border that deepens as you hover and a gentle press when you tap. The weekly reflection and an active session still lift off the page so they stay set apart.

  • Filing a note into folders is now a single dropdown.

    Instead of a row of folder chips plus a separate "Add another" button, one control shows the folders a note is in and opens a searchable list to add, remove, or create folders.

Added

  • Selah can point you to a Scripture passage that fits what you wrote.

    When something you captured or prayed seems to connect with a verse, the heartbeat may suggest one, humbly, as an invitation to compare ("…may be worth sitting with"). It names the reference and you open it yourself; reply naturally if it lands or doesn't. Rolling out gradually behind a flag, off by default for now.

Fixed

  • Selah holds onto more of what it learns about you.

    Its nightly review of your recent activity sometimes threw away a whole night's observations when the model returned its answer wrapped in extra explanation. Those notes are kept now.

  • The journal feed's reading-plan cards stopped contradicting their own dates.

    A past day's unread reading kept announcing itself as "Today's reading"; now only the actual current day does. Plan entries that had lost their plan showed "Day 1 of 0" or a blank "(plan)" name, and a loose capture left a stray dot trailing its timestamp. All three are cleaned up.

  • The "Use in Selah's memory" switch on a note had its knob hanging off the end.

    The toggle now reads cleanly, knob inside the track.

June 24, 2026

v0.39.9.0 → v0.39.10.0

Selah checks in during your first week.

Added

  • Selah checks in during your first week.

    After you capture your first thought, Selah follows up with a quiet, timed nudge — to pray through it, save a note, then see what it's learned about you. Three touchpoints across ten days, each one waiting at least a day before the next.

  • Telegram shows exactly what you can do.

    /help and the welcome message both use the same clear list of commands and capabilities, so you always know what Selah understands in a conversation.

  • Your notes can become part of what Selah remembers.

    Every note now has a "Use in Selah's memory" switch, on by default. Leave it on and Selah can draw on that note and bring it back when it's relevant to your study. Turn it off and the note stays saved and searchable, but Selah won't use it to remember, connect, or recall. Turning it off asks first, and nothing is ever deleted.

  • Selah brings back what's relevant, not just what's recent.

    In the Companion, the memories Selah surfaces now match what you're actually talking about, instead of whatever you happened to save most recently.

  • Each concept shows what you've come to believe.

    Open a concept and you'll see your own positions grouped into "What you believe," "Still working through," "Where you've seen this," and "In your words," each with where it came from.

Changed

  • Long notes are remembered all the way through.

    A long note used to lose its later passages when Selah pulled meaning from it. Now the whole note is covered.

June 23, 2026

v0.39.8.11 → v0.39.8.3

The dock panel on mobile now has two snap points.

Added

  • The dock panel on mobile now has two snap points.

    Tap the handle to expand it to 70% of screen height — useful for reading long Word Study or Cross-References content without losing the passage entirely. Tap again to return to the compact 340px default. The handle shows a chevron that rotates to indicate state.

  • A founding seat countdown appears at the top of every page.

    A slim bar below the navigation reads "✦ 100 founding seats at $9/mo — after that, Selah Plus is $12/mo" with a "Lock in pricing →" link. Dismiss it once and it won't reappear.

Fixed

  • Tagged words in interlinear mode are now selectable on iOS.

    Long-pressing a tagged word previously showed the Word Study panel instead of the OS text-selection gesture. Tagged words are now implemented as <span role="button"> so the selection gesture reaches the OS first.

  • The founding member notice no longer wraps to three lines on mobile.

    The sage-green pricing strip at the bottom of the pricing section now left-aligns its text on narrow screens, keeping the single-line layout.

  • The founding member seal now shows the full "FOUNDING MEMBER" text.

    The previous arc path was a 180° semicircle, which left no room for the F and R at the endpoints. The arc is now ~195°, giving the text comfortable clearance on both sides.

  • Reading plan scripture text is now consistent across all surfaces.

    Telegram daily messages, the journal drawer, and the reader all pull from the same source of truth (daily_readings.passage_ref) rather than a stale snapshot stored at generation time. Users who updated their reading plan no longer see the old passage reference in the drawer or Telegram.

  • Telegram now sends the full scripture passage.

    The previous 450-character hard cutoff silently dropped the text; longer passages now appear inline and are gracefully truncated with "… (cont.)" only when the full message would exceed Telegram's 4096-character limit.

  • Focus rings are crisp and consistent.

    Keyboard navigation now shows a clean sage outline with a 3px gap on every focusable element — buttons, links, inputs. The previous faint washed-out ring has been replaced by a single authoritative rule in globals.css.

  • Keyboard shortcut hints are readable on every button variant.

    The "N" key hint on the New Note button no longer looks like a persistent focus ring; its border and text now inherit the button's text color at 50% opacity, so it reads clearly on sage, secondary, and ghost buttons alike.

Changed

  • The reader tab strip shows a fade when more tabs are off-screen (mobile).

    A 28px gradient at the right edge signals that additional tools are available by scrolling.

  • The scrubber's section labels are always visible.

    The Old Testament / New Testament / Poetry section names previously appeared only on hover. They now appear at low opacity at all times, making the navigation bar readable on first encounter. Hovering a section brightens the label.

  • Tapping any reader button now shows a press-down scale.

    Topbar buttons, dock tabs, pane tools, and the mode toggle all respond with a subtle scale-down on press.

  • The pricing section urgency bar is removed.

    The green "Founding member pricing — 100 seats only" strip above the pricing ledger no longer appears. The context paragraph below the ledger does the work instead.

  • Founding member lock-in is now described as a minimum.

    The copy reads "lock in $9/mo · $90/yr for 24 months minimum" rather than a hard cutoff, which is more accurate while we're still in beta.

  • The AI cost explanation is simpler.

    "The companion and knowledge graph are AI-powered" is now "Our app is AI-powered," which is shorter and doesn't require readers to know what the knowledge graph is.

  • The pricing page now leads with the stakes.

    A sage-green notice above the pricing table reads "Founding member pricing — 100 seats only. When they fill, Selah Plus moves to $12/mo permanently." The founding member card strip also shows "First 100 seats · then $12/mo" so the price increase is visible in both places.

  • The context paragraph is honest about AI costs.

    The open-beta explanation now leads with the consequence: when 100 founding members fill, the price goes to $12/mo and stays there. Founding members lock in $9/mo for 24 months. The copy explains that the companion and knowledge graph cost real money to run, and that the $9/mo rate is what makes it sustainable — rather than building the cost into ads.

  • The founding member pricing context is now a card.

    The open-beta paragraph sits in a white card directly below the pricing ledger. The founding member seal is stickered on top of the card — centered and tilted — instead of living inside the pricing column. The $12/mo · $108/yr post-launch price note moved from the pricing column into the card body so the context and the caveat live together.

  • Onboarding: role cards auto-advance.

    Selecting a role moves directly to the companion step after a 160ms visual pause — no separate "Continue" tap required.

  • Onboarding: translation pills auto-scroll.

    Picking a translation on the companion step scrolls the tradition section into view so the next question appears without manual scrolling.

  • Onboarding: tradition +more button is now a pill.

    The expand button is inline with the tradition grid at 44px touch target height, replacing the small text link that appeared below the grid.

  • Onboarding: translation row scrolls horizontally on mobile.

    Nine translation options now lay out in a single scrollable row with snap points and a right-edge fade instead of wrapping into three rows.

  • Onboarding: new users skip the reading-plan gate.

    Completing onboarding sets formatChoiceSeen so the home screen shows the first-day hero and companion invitation instead of immediately redirecting to the reading plan.

  • First-visit tour works on mobile.

    The drawer opens automatically when a tour step needs to spotlight a nav item — previously the spotlight fell back to a centered popup with no visual anchor.

  • "How it works" now names the rhythm.

    The three-phase capture → organize → companion cycle replaces the old four-step journey. Each card names a real moment: capture a verse mid-sermon, find themes surfacing from your notes, let the companion ask the question you haven't asked yourself yet.

  • The companion section shows the conversation.

    Chat bubbles animate into view as you scroll the landing page, demonstrating a real exchange between user and Selah before signing up.

  • Feature sections stack vertically.

    The reader, prayer board, notes, and plan tiles now stack in a single centered column — each section has room to breathe. The responsive grid adjusts without breakpoints.

June 22, 2026

v0.39.8.2 → v0.39.8.0

Notes cards have depth.

Changed

  • Notes cards have depth.

    List and grid note cards now use the elevated card shadow pattern from the design system — they lift subtly and press on tap, matching the visual weight of cards elsewhere in the app.

  • Journal editor headings use Lora.

    The note title and all H2/H3 headings inside the editor are now set in Lora (serif), giving the writing surface a distinct journal-like character separate from the navigation UI.

  • Filter pills follow the design system.

    Active status and folder filters now use bg-sage text-white — the same vocabulary as filter strips everywhere else — replacing the previous ring/opacity variants.

  • Folder chip trigger is clearer.

    The add-to-folder button reads "Add folder" when no folder is assigned and "Add another" when one or more are present, replacing the ambiguous "Folder" label.

  • Empty state copy is warmer.

    When no notes exist, the placeholder now reads "A blank page is an invitation." The icon sits in a soft gold circle rather than appearing inline with low contrast.

  • Updated landing headline.

    "Selah is one place." is now "Your faith life, finally in one place."

  • Removed the small all-caps eyebrow label above the demo card in onboarding — the label was clutter, not context.

Fixed

  • Toolbar buttons meet 44px touch target.

    All four action buttons in the note editor (favorite, publish, reformat, delete) now have min-h-[44px] min-w-[44px] padding, meeting the iOS/WCAG minimum for interactive touch targets.

  • Saved timestamp is concise.

    "Last saved" timestamps now display as 09:45 AM instead of the system locale's verbose format with seconds.

  • Keyboard shortcut `N` is safe.

    The new-note shortcut now ignores Shift+N and modifier combos — only plain n while no input is focused fires the shortcut.

  • Screen reader announcements.

    Error banners now carry role="alert" so they are announced immediately on insertion. Status and folder filter strips have role="group" + aria-label; the "All" button has aria-pressed.

  • "Folders" eyebrow label removed.

    The uppercase section label above the folder filter strip is gone — the aria-label carries that context for assistive technology without the visual clutter.

  • Videos on mobile stay in the background.

    Tapping a screen-capture video on the landing page no longer triggers native player controls, fullscreen requests, or the Android video overlay. Videos are purely decorative: pointer-events: none on both .lp-vid and the knowledge plate video, disablePictureInPicture on all five video elements, preload="none" so they don't buffer on cellular.

  • CTA links go to sign-up.

    "Get started" in the nav, hero, and final section now goes to /sign-up instead of #pricing.

  • Copy is clearer for first-timers.

    FAQ answer about Telegram no longer uses "captures" or "your Stream" — rewritten as "notes" and "your study". Pricing and FAQ consistently say "knowledge map" instead of "knowledge graph", matching the section heading. Section eyebrows removed from Reader, Prayer board, Reading plan, and "How Selah is different" — down from five to one (Notes & journal, which uses the kicker intentionally).

  • Reading plan description is prose, not a checklist.

    The three-item bullet list is replaced by a single paragraph that reads naturally.

  • Switched-to plans stayed missing in settings.

    Switching to a new reading plan paused the old one, but only the active plan was shown — your other in-progress plans had no way to reappear or be resumed. The full library now renders.

  • The plan picker in settings had no way to go back.

    Opening the picker from Settings → Daily Message led to a dead end with no back button. A "← Settings" link now appears at the top of the pick step.

  • Updated the Telegram invite link.

    The community group link in the app was pointing to an expired invite URL.

Added

  • Your paused plans are always visible in settings.

    The reading plan section now shows every in-progress plan you've put on hold — not just the one currently active. Each paused plan displays how far you got and lets you resume or make it active with one tap.

  • Discard a paused plan you no longer want.

    A "Discard" action removes the plan from your library after an inline confirmation. Your active plan is never affected.

  • A confirmation moment after picking a plan.

    Choosing a reading plan now ends with a brief "confirmed" screen showing the plan name and when your first reading arrives, before continuing to the app.

June 21, 2026

v0.39.5.1 → v0.39.7.0

The app feels more physical.

Changed

  • The app feels more physical.

    Buttons squeeze a touch when you press them, cards lift on hover and settle when you click, and the home screen and onboarding reveal their lines in sequence instead of all at once. Cards now rest on a soft shadow rather than a hairline border.

  • The landing page resolves as you scroll.

    Each section's heading and copy ease in from a gentle blur as they reach the screen.

  • A little more room on the free plan.

    The Companion's free allowance went from 5 to 7 messages a day, still shared across web and Telegram.

Fixed

  • Small buttons are easier to tap.

    Close, dismiss, and help buttons across modals, drawers, the prayer board, and the reader now carry a full-size tap target even where the icon itself is small.

  • Numbers stop nudging the layout.

    The weekly summary counts use fixed-width figures, so the row no longer shifts as they change.

  • Profile photos get a faint outline so they read cleanly against any background.
  • A stray em dash in the pricing copy is gone.
  • Dragging a prayer in the Active column no longer jumps to the top-left.

    The card now follows your cursor in every column, not just the others.

  • The prayer board drags cleanly on the first try.

    The first card you dragged could land misaligned while later drags were fine; the board now measures its columns continuously during a drag, so the first one behaves like the rest.

  • No more dead "Promote to prayer" button.

    The capture drawer had a permanently-disabled button that read as broken. It's hidden until the feature ships.

Added

  • Admins can give any user a timed Plus trial.

    From a user's admin page, "Start trial" grants Plus for 7, 14, or 30 days, and "Extend" adds time to an active one. The trial ends on its own, and you can remove it any time. Accounts that pay through Stripe point you to the Stripe dashboard instead.

  • Tables you can actually edit.

    Drop a table into a note and a small toolbar now appears while your cursor is in it — add or delete rows and columns, or remove the whole table. Before, an inserted table was stuck for good.

  • Terms and Privacy where you'd look for them.

    Sign-up and sign-in now carry a "By continuing, you agree to our Terms and Privacy Policy" line with links, and the landing-page footer links both pages.

June 20, 2026

v0.39.2 → v0.39.4

The admin dashboard is now one room.

Added

  • The admin dashboard is now one room.

    It's a left-rail command center with a searchable, filterable Users directory. Each person shows their plan, billing status, email verification, last sign-in, and activity at a glance — no more bouncing between Stripe and Clerk to look someone up.

  • Grant a friend Plus from the admin.

    A Plan control on each user's page comps a free Plus plan in one click, and revokes it just as easily, for anyone without a paid Stripe subscription.

  • Google One Tap sign-in.

    Signed-out visitors now see Google's One Tap prompt automatically — one click to authenticate without navigating away or filling a form.

Changed

  • The per-user page consolidates the tools.

    It now carries read-only Billing and Identity panels (live subscription detail, a Stripe deep-link, Clerk sign-in and ban state) alongside the rename, admin, nudge, and delete actions, all in one place.

  • The "+ New" button and Search bar are now flag-gated.

    Both nav entry points are hidden by default while the features are still being designed. Enable PostHog flags nav_new_menu_enabled and nav_search_enabled (0% rollout) to show them per user.

  • The "selah" wordmark is now set in Geist sans-serif.

    Every surface that showed the brand name — nav, mobile drawer, onboarding header, sign-in, sign-up, and email footers — now uses Geist at weight 500, all lowercase. Cleaner, more minimal, and consistent with the rest of the type system.

  • The landing page wordmark matches.

    Both the header and footer on the public landing page use the same Geist treatment.

  • The trust row uses the real Link logo.

    The lock-and-link icons beneath the checkout button now show Link's actual brand mark instead of a hand-drawn chain — more recognizable at a glance.

  • Testimonials use the same type as the rest of the app.

    The quotes read in Inter (not a serif), consistent with the rest of onboarding.

  • The most important phrase in each testimonial is highlighted.

    A sage-tinted marker sweeps the full height of the text under "triggers my mind to think deeper" and "treated as a tool". It comes in slowly so scanners have time to read it, and the highlighted phrase is set slightly bolder.

  • Your billing plan shows in the settings sidebar.

    The Billing & plan row now says "Free" or "Plus" so you can see your plan at a glance without opening the page. On mobile the subtitle reads "Selah Plus" or "Free — upgrade anytime."

Fixed

  • Google One Tap now actually shows up.

    The One Tap prompt shipped last release but was silently blocked by the site's content-security policy, so signed-out visitors never saw it. Google's sign-in domains are now allowed and the prompt appears.

  • Companion replies on Telegram no longer push a big link card.

    When the Companion sent a reading-plan or Selah link, Telegram rendered a large preview image that crowded the chat. The Companion's replies now suppress that card. Sharing Selah elsewhere still shows the preview.

  • Lifecycle emails can't double-send.

    A retried Stripe webhook could send the trial-ending reminder or win-back email twice. Each now sends at most once.

  • Email links point at the right place by default.

    The fallback base URL was selah.app; it's now selah.so, so links never break if the environment variable is unset.

  • Onboarding survives a refresh.

    Reloading mid-signup no longer bounces you back to the first step.

  • Landing page headline and community link.

    The scatter section now reads "Your faith life, finally in one place." The Telegram community invite was expired; it's been replaced so clicking "Join the community" works again.

June 19, 2026

v0.37.0 → v0.39.1New

Sign-up is one continuous flow now.

Changed

  • The plan step shows social proof alongside the pricing.

    On desktop, testimonials from people who use Selah sit beside the plan card so you can read what others say while deciding. On mobile they stack above.

  • Real words from real people.

    Ever C. (a disciple) and Andrew B. (a church elder) share what they notice after using Selah — specific, unprompted, grounded.

  • The upgrade button is consistent everywhere in onboarding.

    Every primary call-to-action — from the welcome screen through the final demo — uses the same sage gradient button.

  • Selah's emails read tighter, and no longer use em dashes.
  • Sign-up is Clerk's polished screen now

    — the same look as sign-in, with social login available, instead of a hand-built form.

  • The whole app is easier to read and to navigate by keyboard.

    Links are darker and clearer, and a consistent focus ring follows you as you tab through the app.

  • Picking a reading plan is calmer.

    Instead of a wall of identical cards, there's one recommended plan to start with, the rest grouped by how much time they ask of you (a few weeks, a season, a year), and a quiet "build your own" at the end.

  • Selah Plus is live.

    $9/month or $90/year with a 14-day free trial. The free tier stays free, no card.

Added

  • Sign-up is one continuous flow now.

    Choosing your daily rhythm, building or picking a reading plan, and connecting Telegram all happen inside the onboarding wizard, with a Back button on every step. No more being dropped into a second setup screen after you thought you were finished.

  • A guided first look at Selah.

    On your first visit, a short walkthrough takes you through the Reader, your Journal, Prayer, the Companion, and Knowledge, one real page at a time.

  • Pick your plan when you sign up.

    The landing page sends you to pricing first. Choose Free and you go straight in. Choose Plus and you start a 14-day trial after onboarding, with a clear note that there's no charge today and a reminder before it ends.

  • A free Companion message every day, not just ten ever.

    The free tier now gives you 5 Companion messages a day instead of 10 for the lifetime of your account — enough to come back across several days and feel how Selah remembers your study. A quiet line appears only when you're down to your last one or two; nothing nags you before that.

  • Your reading on the web has its own pages.

    Browse the curated reading plans, see how Selah compares to other Bible tools, and read about what it's for — all without signing in.

  • A nudge before your trial ends and a way back if you leave.

    Plus trials now get a friendly reminder a few days before they convert, and if you cancel, a warm note that your study is still here whenever you want to return.

  • An invitation to the community.

    The welcome email now invites you into the private Selah group on Telegram, to share feedback and talk with the team.

  • Selah is open to the public.

    Anyone can sign up — no invite code. Every button on the landing page now starts an account, and sign-up is two steps instead of three.

  • Connect Telegram during onboarding.

    Right after you pick a reading plan, you can link Telegram in one tap and your daily reading arrives every morning. Skippable, and it skips itself if you're already connected.

  • The first run feels alive.

    A soft light drifts behind the onboarding screens, each step settles in at a calm pace, and the keepsake line draws its own underline. All of it goes still if you prefer reduced motion.

Fixed

  • The green buttons on the landing page now have readable white text.

    They were inheriting a dark color.

  • The "Kept" moment after your first note now waits for you to read it instead of vanishing on a timer.
  • The first-visit walkthrough no longer disappears when it reaches the Reader.
  • The landing animation no longer crashes.

    A rare crash (Sentry SELAH-SENTRY-2B) occurred when the ScrollTrigger fired after a chip element detached from the DOM on page load. The animation now checks whether the element is still attached before measuring it.

  • Opening a note no longer flashes a blank screen.

    Navigating from the notes list to a note editor briefly showed nothing before the editor loaded. There is now a loading skeleton so the transition is smooth.

  • The ⌘K folder picker no longer shows "No folders yet."

    It used to fetch your folders only when you opened the palette, so the first open always showed a brief empty state. Folders now load in the background on mount, so the list is ready when you open the palette.

  • Error messages across the app are now clean and consistent.

    In the stream, companion, reader, and notes, errors no longer leak raw browser messages. Every error surface says something like "Couldn't load your stream." or "Couldn't load notes." — nothing technical reaches you.

  • The Companion upgrade prompt appears when you've reached the free trial limit.

    Before, hitting the message limit surfaced a raw error instead of the option to upgrade.

  • Chat names no longer include intro phrases.

    A bug caused the AI to prefix titles with "Here's a short title:" or similar — those are stripped. Names like "David and Goliath" now appear instead of "Here's a title: David and Goliath".

  • The file import error says the right size.

    It previously said 2MB; the actual limit is 5MB.

  • Welcome and week-1 emails now open the right page.

    Both linked to a page that no longer exists, so the button did nothing useful; they now land you in your journal.

June 12, 2026

v0.33.2 → v0.36.3New

A new landing page.

Changed

  • A conversation's "⋯" menu and its note button stay pinned to the top-right

    of the chat as you scroll, instead of riding up out of view with the title. Picking "Rename" jumps you back to the top so the title field is in view.

  • Long conversation titles in the sidebar stay on one line and fade out

    at the edge instead of wrapping to two.

  • Every open conversation has a "⋯" menu in its top-right corner

    — rename, move to a folder, archive, or delete without going back to the sidebar.

  • Selah's replies dropped the green avatar dot

    for a cleaner, full-width message.

  • The floating companion bubble no longer appears on the companion screen itself

    , where it was redundant.

  • Removed the "Find a session" box

    from the sidebar; session search is moving to the global ⌘K.

  • You can set a conversation's status from its header

    — Open, Done, or Archived — and archive, restore, or delete a conversation from its menu. Archived conversations drop out of the default list.

  • The opening suggestions on a blank companion screen read as plain prompts ("Brainstorm a sermon", "Work through a passage", "Pray through something"), and the slash-command hints no longer repeat their own names.
  • A new landing page.

    The page a visitor sees before signing in is rebuilt from scratch. It opens on "A quiet place to study, pray, and teach." over a real, auto-cycling look at the app, then walks through the whole rhythm: your scattered study tools gathering into one place, a four-step "how it works", and three feature scenes that build themselves as you scroll — a verse picking up its Greek, a highlight, and an anchored thought; a prayer travelling from Active to Answered; an AI reading plan writing itself for your season. The companion section ("It will not write your sermon."), pricing with a clear free tier, a comparison table, the founder's note, and the FAQ round it out. The whole page scrolls smoothly.

  • Capture the page makes plain you can text Selah on Telegram

    , and the pricing is honest about what's free forever versus what the companion and knowledge graph cost.

  • Telegram is part of the free plan now.

    You can connect Telegram and talk with the Companion on it using your free messages — the same 10-message trial works on the web or in Telegram, whichever you prefer. Plus is for going unlimited and for proactive check-ins (Selah reaching out to you first). When you reach a limit, you get one calm note, not a wall.

Fixed

  • The companion's "New" button is a solid sage button again.

    It had been rendering as a cramped, dark-text blob; the previous fix didn't hold.

  • The "⋯" menu on a sidebar conversation opens in the right place.

    It was dropping to the bottom of the card; now it sits at the card's top-right corner, and the timestamp steps aside on hover.

  • The companion's text box now stays at the bottom of the screen

    in a brand-new chat and a short one, where you'd reach for it. It used to float up into the middle until the conversation grew long enough to fill the page.

  • The companion's buttons look like the rest of the app again.

    The "New" button and a few others had gone faint and flat; they're back to the app's normal solid styling.

  • Selah's "thinking" trail now settles below its reply

    once the answer arrives, instead of sitting above it.

  • The companion no longer scrolls as "one long page."

    The conversation, the session rail, and the living note each scroll on their own now, the message box stays put at the bottom, and opening a chat drops you at the latest message.

  • The new companion stopped responding for some people ("the connection dropped while I was thinking").

    If your conversation had been closed in the background — the 30-minute idle boundary, a "new conversation" tap, or opening a finished thread — the next message hit a dead end. It now quietly continues in a fresh conversation; finished conversations stay read-only, nothing is lost.

Added

  • A note from your first week.

    A few days after you start, if you saved something but haven't come back, Selah sends you one quiet email — your own first thought, with a gentle question to pick it back up. Reaches everyone, not just people on Telegram. One email, ever, and an unsubscribe link in the footer.

  • The companion screen is more complete and easier to live in.

    You can now organize past conversations into folders (a session can belong to several), filter the rail by folder, and close a conversation just by saying so — "close this session" — or with a Mark done action. When Selah keeps a living note beside the chat, a document icon reopens it after you've closed it. A short help note explains how the screen works.

June 11, 2026

v0.31.0 → v0.33.1New

Your beliefs, drawn as a map.

Changed

  • The app answers you now.

    Press a button or a tab and it deepens under your finger. Save a capture and the new entry settles into the feed instead of just appearing. Small moments that were missing — the difference between waiting and being answered.

  • An answered prayer finally feels like something.

    Move a prayer to Answered and the card glows warm gold, then settles — once, briefly, then it rests. The answered entry in your Stream echoes the same two breaths the next time you open it.

  • Your streak speaks in plain words.

    The prayer log marks the quiet milestones — "Seven days. A full week of showing up.", "A month of mornings." — and turns the number gold the day you reach seven, thirty, or a hundred. Still grace-based: a missed day doesn't punish you.

  • A warmer first line at home.

    The greeting now carries a second, quieter line that changes with the day.

  • The Companion, AI reading plans, and Telegram now follow your plan.

    Free includes a 10-message Companion trial and one AI-generated reading plan a quarter; Plus makes them unlimited and adds Telegram with proactive check-ins. When you reach a limit, Selah shows a calm upgrade card instead of an error.

  • Errors are now tied to a user (id only).

    When something breaks, the error report carries the user's id so you can tell who hit it and follow up — with their email, name, and IP still stripped, same as before. The companion's in-page cost estimate is now correct for Haiku calls (it was priced at the more expensive model).

Fixed

  • Full-height pages (settings, sign-up, admin) no longer jump as the mobile browser's address bar shows and hides.
  • You can delete and favourite a prayer on iPad now.

    Those actions used to live only on the prayer card's hover bar, which never appears on a touch screen — so on an iPad there was no way to reach them. They're now in the prayer's detail drawer (tap any prayer to open it): a star to favourite, a trash button with a confirm step to delete.

  • Your reading plan and your daily reading now agree on what day it is.

    If you fell behind on a plan, the daily reading (in the stream and on Telegram) used to freeze on your oldest unread day while the rest of the app showed today's calendar day — so the two disagreed (e.g. the card said Day 7 while your plan said Day 22). Both now show the same calendar day. Days you missed stay in the catch-up list on the web, ready when you want them.

Added

  • Your beliefs, drawn as a map.

    Knowledge now opens as a quiet constellation of everything you've studied — doctrines and themes as the largest names, the people and places that support them, connected by the notes and captures they share. Tap any belief to see it in your own words: the sentence you actually wrote, the verses it rests on, and a gentle sense of how rooted it is in your study so far. Nothing here grades whether a belief is right — only how much you've grown it. Switch to List anytime for the card view with merge and sync.

  • Selah Plus.

    Selah's core stays free. Plus opens the Companion without limits, the knowledge graph across every note you write, and Telegram — the parts that cost real money to run. $9/month or $90/year (two months free), with a 14-day trial and a card to start. Manage or cancel any time from Settings → Billing. If you were here before launch, Plus is on us — nothing to do.

  • A weekly nudge that brings your first capture back.

    If you saved one thing in your first week and didn't come back, the Companion now reaches out once over Telegram with a gentle question tied to what you wrote, so a single note doesn't go cold.

  • Per-user AI cost tracking, ready for launch.

    Every AI call the app makes — companion chat, devotionals, nightly memory and knowledge jobs, prayer matching, reading-plan generation — now records who it was for and what it cost, so you can see spend per person and per feature and tell who is driving the bill. Token counts and metadata only; no prayer or note content ever leaves for analytics.

  • A launch funnel.

    The app now records the moments that matter for activation — sign-up, onboarding finished, first session completed, Telegram linked — so the activation funnel, retention, and cost-per-user all live in one place.

Security

  • Public-launch hardening.

    Removed an internal debug endpoint from the app. Widened Telegram link codes so they can't be guessed inside their 15-minute window, and closed a race where two devices could claim the same code. The proactive check-in cron now claims each send atomically so a nudge can't fire twice.

June 10, 2026

v0.30.0 → v0.30.1New

The companion now reads your whole attachment.

Fixed

  • Groundwork fix for the new companion engine (still off by default).

    The experimental v2 companion engine couldn't reach the AI provider at all — every call failed — because of a base-path bug in the AI SDK's Anthropic adapter. Pinned the correct path; the engine's caching, step-by-step thinking, and tool use now all work end to end. No effect on the companion everyone currently uses.

  • The companion now reads your whole attachment.

    Attached notes used to be silently cut to the first paragraph or so; the companion answered as if the rest didn't exist. Notes now go in whole — a full sermon draft fits — and on the rare occasion something is still too large, the cut is marked so the companion knows it didn't see everything.

Added

  • A new dedicated companion screen, in early testing.

    Conversation on the left, a living note on the right: you watch the companion think and work — each step shown quietly as it goes — and when it starts a note, the note opens beside the chat. Stop a reply and keep what arrived, retry the last answer, edit a sent message and resend, find any session with ⌘K, and conversations name themselves after the first exchange. Off by default while it's validated; the classic chat is unchanged.

June 9, 2026

v0.29.0New

The landing page tour now shows Selah working, not screenshots of it.

Added

  • The landing page tour now shows Selah working, not screenshots of it.

    Three live demos play in "From a thought to Sunday morning": a capture types itself out and gets tagged to Romans 8:28, the same note resurfaces beside the verse three weeks later, and Sunday's outline assembles from the week's anchored thoughts. Each loops quietly while it's on screen and sits still when it isn't.

  • The "one tool" section crosses off the app pile in front of you.

    Logos, Notion, Obsidian, Telegram, and the rest get struck through one by one as the section scrolls in, instead of arriving pre-crossed.

Changed

  • The week-with-Selah timeline cascades in day by day

    instead of appearing all at once.

Fixed

  • No more blank gap under the hero preview on phones.

    The preview pane now sizes to the screenshot instead of holding a fixed height.

  • Reduced motion is honored across the whole landing page.

    The hero demo, the tour demos, and the strike-through all hold their finished state instead of looping. The "one tool" chips also keep their scattered layout for reduced-motion visitors — they used to pile up in the center.

  • Screen readers get a description of each tour demo.

    The old screenshots' alt text would have been lost in the swap; each demo now carries a spoken summary.

  • The tour demos survive a broken script.

    If JavaScript fails to load, every demo card still shows its complete final state — full sentence, tags, and confirmation — instead of an empty card.

June 5, 2026

v0.28.0 → v0.28.1New

Prayer reminders are opt-in.

Fixed

  • The companion no longer scatters loose captures across your stream during an interview or teaching-prep session.

    Those sessions are meant to gather everything into one place — the interview note or the teaching message — so saving stray captures along the way just made duplicates. It now waits for that single wrap-up. If you explicitly ask it to "save that as a capture," it still does.

  • No more invented "you haven't prayed for this in weeks."

    The "forgotten prayer" nudge now only fires for a prayer genuinely left untouched for 30+ days, measured from real engagement instead of guessed by the model. Fresh and recently-touched prayers are never described as neglected.

Added

  • Prayer reminders are opt-in.

    The companion no longer nudges you about a specific prayer unless you turn reminders on. There's a new toggle in Settings → Companion; it starts off, so a quiet prayer board stays quiet.

  • Your prayer streak counts everything you actually do.

    Creating a prayer, editing it, logging an update, or praying a session — even a short or discarded one — now counts toward your streak and activity heatmap. Before, only fully completed sessions counted, so most real prayer went uncredited.

Changed

  • The companion reaches out less often.

    The default time between proactive nudges went from one hour to two, so Selah feels present without crowding the day.

  • The companion stops repeating itself.

    It won't raise the same prayer or the same theme again within a cooldown window, and it caps general check-ins to once a week.

June 3, 2026

v0.25.0 → v0.27.1New

Pages load in one clean step.

Changed

  • The landing page shows the real app.

    The product tour in the hero now cycles through actual screenshots of Companion, the prayer board, and your knowledge graph instead of hand-drawn stand-ins. The philosophy section opens with a photo of Selah in use — an iPad and an open Bible — beside the words.

  • Returning to a page is instant.

    Move away from Library, Notes, Stream, or Reader and come back a moment later — it's already loaded, no spinner replay.

Fixed

  • The landing page no longer scrolls sideways on a phone.

    The prayer board preview was wider than the screen, dragging the whole page with it. It now stacks into one column on small screens.

  • The headline fits the phone screen.

    "A quiet place to study, pray, and teach" was oversized on mobile and broke awkwardly; it now sizes down and wraps cleanly.

  • Removed the dead Privacy and Terms links in the footer that went nowhere.
  • Pages load in one clean step.

    Library, Notes, and Stream used to flash a skeleton, then a second skeleton, then the content. Now there's a single loading state, then the page.

  • Unsaved note edits are protected.

    If a save fails, you'll see a retry prompt. Closing the tab with unsaved changes now asks before discarding them.

  • Highlighting on iPad works cleanly.

    The highlight sheet waits until you lift your finger before opening — no more popup mid-drag.

  • The Library looks like Notes.

    Same reading width, same top bar — consistent across both.

  • The Stream drawer stays open.

    Opening an entry in your Stream is reliable now; the panel no longer snaps shut.

  • Pages no longer flash white when you navigate.

    Moving between sections is smooth.

Added

  • A verse for your day.

    Your home screen now opens with one verse from Psalms or Proverbs — the same one for everyone each day. A quiet anchor before you start prep.

May 29, 2026

v0.24.0New

Your prayer board speaks the same status language as everything else.

Added

  • Your prayer board speaks the same status language as everything else.

    Prayers now use the one shared status system — the four columns (Active, Waiting, Ongoing, Answered) are those statuses, and the prayer panel gets the same status pill and picker you already see on notes. Marking a prayer answered from Telegram or the companion now lands it in your Stream the way doing it on the board always has.

Changed

  • Every page lines up.

    Notes, Library, Stream, Search, Settings, the companion, and onboarding now share one set of width rules, so the main column is the same comfortable reading width everywhere instead of cramped on some pages and sprawling on others. Loading screens match the real page padding, so content stops jumping when it arrives.

  • Status and folder sit on one row.

    On a note, the folder now sits beside the status instead of stacked below it. The list/grid view toggle is the same control across spaces, and your choice sticks.

Fixed

  • Changing a note's status sticks now.

    Setting a note to Exploring or Resolved used to quietly snap back to Active on reload; it saves for real.

  • Highlighting on iPad uses the bottom sheet

    — the touch-friendly highlight panel shows up on tablets, not just phones.

  • Reader polish on tablets

    — the sidebar footer stays pinned, the reading-plan catch-up box fits inside the dock, and the word-study badge is easier to tap.

  • Notes keep your chosen view on mobile

    — pick the list view and mobile stays a compact list instead of forcing the grid.

May 28, 2026

v0.23.0 → v0.23.1New

One status system across Selah.

Added

  • One status system across Selah.

    Notes, sessions, and prayers now share the same status: the same pill, the same dropdown, the same colors. The dropdown groups statuses by what they mean — Active, Done, Archived — so it reads the same everywhere.

  • Make your own statuses, per surface.

    Add a custom status (name, color, category) and it shows up only where it belongs — a note status won't clutter your prayer board, and vice versa.

Changed

  • Captures stop pretending to have a status.

    A capture is a quick thought on its way to becoming something. Instead of a status dot, a promoted capture now shows where it went — "→ Note", "→ Prayer", or "→ Session".

  • Deleting a custom status keeps your items where they are.

    If you delete a status you made, anything using it moves to the matching built-in status (a "done" item stays done) instead of silently reopening.

Fixed

  • Creating a status from a note no longer closes the menu.

    Clicking "New status" used to make the whole dropdown vanish; the form now opens in place.

  • Status pills are no longer clipped

    at the top of the note header.

  • The note editor no longer crashes on load

    in some cases (a rendering-timing fix shared with the scratchpad editor).

May 27, 2026

v0.22.6

Past weekly reflection cards now show the right companion session count.

Fixed

  • Past weekly reflection cards now show the right companion session count.

    Cards from weeks before the 0.22.5 update were showing "0 companion sessions" even when you had sessions that week. The count is now correct for all past weeks.

May 26, 2026

v0.22.5

You can turn the Saturday weekly reflection off.

Added

  • You can turn the Saturday weekly reflection off.

    Settings → Notifications has a new toggle for the Saturday-evening "Weekly reflection" digest. On by default for everyone. Flip it off and the digest stops landing in your stream; flip it back on whenever.

  • The weekly arc card now spells out the week.

    Under the headline, a single quiet line: "3 captures · 2 notes · 1 prayer · 4 companion sessions." Just the primitives that had activity this week — zeros hide. Replaces the broad "reflections" framing with the specific shape of what you actually did.

Changed

  • Disabling the digest takes effect across surfaces without a refresh.

    Same pattern as the daily-devotional toggle — flipping the setting broadcasts to every mounted surface so the stream, the menu, and any future digest affordances update in lockstep.

May 25, 2026

v0.22.3 → v0.22.4

Plan cards in the stream now update the second you mark a day read.

Fixed

  • Plan cards in the stream now update the second you mark a day read.

    Tap a plan day in the reader (or the drawer footer, or the day band), and the card in the stream switches to "✓ read" without a refresh. Before, the stream sat on stale state until you reloaded.

  • The "Today's reading" band hides itself when you mark the day read from anywhere else.

    Mark it in the reader, switch back to the stream — the band is gone. No more nag for a day you already finished.

  • Folder counts in the folder picker stay current.

    Move a note to a folder somewhere else in the app, then open the folder picker — the folder list reflects the move. Same for the prayer board (which also refreshes when you switch tabs back).

  • Telegram catches up on missed reading-plan days.

    If you skipped yesterday, this morning's message is for yesterday's day, not today's. The cron now walks the backlog before falling back to today. You stop silently losing days from Telegram.

  • Marking a plan day read from the daily devotional drawer updates the rest of the stream.

    Before, the devotional drawer's mark-read button worked but didn't tell any other surface, so cards stayed stale until reload.

  • "Send a daily message" delivers again when devotional is off.

    v0.22.2 decoupled the two settings on the page so toggling daily-scripture wouldn't silently re-enable devotional. But the morning cron still required both to be on, so the daily-scripture toggle wasn't actually delivering for anyone who had turned devotional off independently. The cron now respects the daily-scripture toggle on its own.

  • Enabling daily-scripture now also populates a default delivery hour.

    Before, you could toggle "Send a daily message" on without ever setting a delivery hour, and the cron would skip you silently. Now the toggle sets 7 AM local + auto-detects your timezone if either is unset, so the message actually arrives the next morning.

  • Re-anchor is no longer "Coming soon."

    The placeholder is gone. The pill is the action.

  • The homepage stopped 500ing after Brief 4 captures shipped (Sentry SELAH-SENTRY-1Y).

    A leftover prayers.tags column reference was throwing undefined_column on every page load because dev Neon had dropped the column out of band weeks earlier. The schema now matches reality, and the orphan prayer_tags table is gone too.

  • Prayer category writes stop racing each other.

    Two rapid taps on a prayer's status used to dispatch two opposite requests, and the loser would overwrite the winner. Mutations now go through one path with a stable cache key.

Added

  • Highlight a phrase in BSB, read it in WEB.

    Phrase highlights now follow you across translations. The matching tokens light up in the translation you switch to. When the auto-match isn't confident, you see the whole verse marked with a gold "adjusted" pill so you know the system isn't sure.

  • Multi-verse phrase highlights align verse by verse.

    A highlight that spans two verses gets aligned per-verse against the target translation. If verse 16 matches cleanly and verse 17 falls back, you see the precise phrase in 16 and the whole verse in 17 — not the whole highlight collapsing to fallback.

  • Re-anchor highlights when the auto-match is wrong.

    Click the gold "adjusted" pill on a phrase highlight, the active verse stays bright while siblings dim, you select the words you actually meant and hit Save. One click in, native text selection, no modal.

  • Universal status across notes, captures, and prayers.

    Four defaults everyone gets — Active, Exploring, On hold, Resolved — plus your own custom statuses through a single picker. Same color palette, same behavior, same place on every surface.

  • Notes and captures can live in more than one folder.

    A note about Romans 8 can sit in both Sermons and Romans without you picking one. Folder chips show in the note header with × to remove and + Folder to add another.

  • Note types became folders you can rename and merge.

    Threads, Insights, Teaching, Devotional — your old categories are now folders. A one-time banner explains the change; existing notes are auto-filed by their type.

  • Filter the Notes index by status, folder, or both.

    Two filter strips above the list: pick a status, pick folders, get the intersection.

  • Capture cards show status + folder chips in the Stream feed and reader dock.

    A glance at a capture card tells you its status and which folders it lives in.

May 23, 2026

v0.22.0 → v0.22.2New

Telegram prayer nudges stop inventing dates.

Fixed

  • Disabling "Daily devotional" actually hides devotional UI now.

    Toggling the setting off was only stopping the morning delivery; the stream still showed the "Sit with scripture" CTA, the "+ New" menu still listed Start devotional, the Devotionals filter chip stayed on the stream, and the settings page still showed this week's theme. All of those now disappear when you turn devotional off.

  • The toggle stops being silently flipped back on.

    Two unrelated flows were re-enabling devotional without telling you: toggling "Send a daily message" in settings, and revisiting the reading-plan picker. Both stop doing that. If you turn devotional off, it stays off until you turn it on yourself.

  • Re-enabling devotional updates the stream and menu instantly.

    No reload needed. Turn it back on in settings and the band, chip, and menu item all reappear.

  • Stuck on `?filter=devotionals` after disabling? Fixed.

    The URL now bounces back to All when the Devotionals chip disappears, so you can't get parked on an unreachable filter.

  • Settings page reads as intentionally quiet when disabled.

    When the toggle is off, the page shows the preview card plus a one-line "Re-enable to see your week's theme." instead of looking half-empty.

  • Telegram prayer nudges stop inventing dates.

    A prayer you added today no longer comes back as "this has been sitting since last month" or "you mentioned this a while ago." The AI now has the actual dates — added, last edited, last prayed — and only references them when the math is real.

  • The AI stops double-nudging prayers on a schedule.

    If you set daily, weekly, or monthly reminders on a prayer, only the scheduled digest sends them. The AI no longer picks the same prayer for a side nudge a few hours after the digest fires.

  • "Still carrying" nudges stop firing on fresh prayers.

    A prayer you added today isn't forgotten. That phrasing now requires either no prayer session in 7+ days, or a prayer added 7+ days ago that you've never opened.

Changed

  • The AI sees the body of your prayer, not just the title.

    Titles are usually three words; the actual context lives in the description. Nudges land with more specifics now — what the prayer is really about, not just a guess from the title.

  • Folder and favorite status reach the AI.

    A nudge about a Family prayer can sound different from a Career prayer. Starred prayers can be picked first.

  • Pray-through history reaches the AI.

    "When did I last pray this?" is now a real signal — not "when did I add it?" A prayer you wrestled with yesterday is not forgotten.

May 22, 2026

v0.21.0New

Organize prayers into folders.

Added

  • Organize prayers into folders.

    The prayer board now groups by folder as well as by status — a toggle above the board switches between them. Drag a prayer between folders, or make a new folder right from the board. Folders are shared with the Library, so a prayer you file shows up in both places.

  • Tell the companion to file prayers and set reminders.

    On Telegram you can now say "put these prayers in my Clients folder" or "remind me weekly about this one" and the companion does it.

Changed

  • Folders replace tags on the prayer board.

    Folders are the one way to organize a prayer now. Your existing tags carry over — each becomes a folder of the same name.

  • The activity heatmap moved to the Stats tab.

    Log is now just your session history. Stats holds the streak cards, the 52-week heatmap, and your rhythm — your prayer numbers in one place.

  • Each status column has a one-line explainer.

    Tap the question mark on Active, Waiting, Ongoing, or Answered to see what belongs there.

May 21, 2026

v0.19.0 → v0.20.0New

Privacy mode on the prayer board.

Added

  • Privacy mode on the prayer board.

    Tap the eye in the top bar and every prayer title, description, update, and session note blurs — so you can show the board on a shared screen without showing what you're carrying.

  • Edit and delete prayer updates.

    Fix a wording slip in an update, or remove one entirely, from the prayer's drawer.

  • A nudge to connect Telegram for reminders.

    Set a reminder on a prayer when Telegram isn't linked and the drawer now tells you reminders arrive on Telegram, with a link to connect it — so a reminder you set actually reaches you.

  • Prayer on Telegram.

    Start a prayer session from the Telegram bot — say "start prayer", pray, then "done" — and it lands in your web Prayer Timer log, stats, and streak, exactly like a session run on the site. Stop more than an hour after you started and the bot asks roughly how long you prayed instead of trusting a stale clock.

  • The bot understands prayer in plain language.

    Send "praying for the elders meeting" and it finds that prayer on your board and holds it with you. If it's something new, it adds it. No menus to tap through.

  • Per-prayer reminders.

    Every prayer on the board can carry a reminder — Off, Daily, Weekly, or Monthly — set from its drawer on the web. When reminders come due, the bot sends one message listing them; reply with a number, or just name the ones you want, and it starts a prayer session across them.

  • Mark a prayer answered from Telegram.

    Tap Mark answered, tell the bot how God met you in it, and the prayer moves to your answered prayers with the testimony saved.

  • A weekly prayer recap.

    Once a week the bot notes how many times you prayed, across how many prayers, and how many were answered.

Changed

  • The prayer card is just the title now.

    Folder, tags, and the stage buttons came off the card. At rest you see the prayer; hover and Pray, Favourite, and Delete appear along the bottom.

  • Folder and tags moved into the prayer's drawer.

    Open a prayer to set its folder or tags. The card stays clean, and the drawer now has a folder control beside its tags.

  • New tags all share one color

    instead of getting a random one. The five built-in tags keep their own colors.

  • The Answered column sits at the far right

    of the board, after Ongoing.

  • The prayer board uses the full width

    of the page.

  • Scripture references in the Telegram daily message are tappable.

    The day's passage and every cross-reference open straight to that passage in the Selah reader, and read as "Proverbs 21" rather than a code.

  • Prayer nudges are actionable.

    The bot's prayer reminders now carry Pray now and Mark answered buttons — one tap instead of a message you can't do anything with.

  • The Telegram prayer board

    is a numbered list you answer by typing: open one prayer, or start praying for several at once.

  • A prayer session started on Telegram shows up on the web.

    The prayer pill sees it, tells you it's running on Telegram, and lets you continue it on the web or end it from there.

Fixed

  • A malformed link into the reader

    — a bad note or passage id in the URL — now returns a clean not-found instead of an error page.

  • Choosing a translation Selah doesn't carry no longer breaks your daily reading.

    If you picked ESV or NASB at sign-up, the devotional errored out instead of showing anything. It now falls back to a translation that's available, and still remembers the one you'd prefer.

  • The Prayer Timer's Log and Stats tabs no longer overlap.
  • "Proverbs, Story & Gospel" now reads Proverbs by the calendar date.

    On the 21st of the month you read Proverbs 21, whatever day of the plan you're on. It used to start at Proverbs 1 and count up regardless of the date. The Old Testament story and New Testament readings still move in order.

  • The daily Telegram message no longer dumps a whole chapter into the chat.

    When the day's reading is long, the message carries just the reference; a short passage of a verse or two still comes through in full.

May 20, 2026

v0.16.0 → v0.18.2New

The Prayer Timer.

Changed

  • The "building your plan" screen is honest now.

    While a custom reading plan is generating, the wait screen used to show a sample list of days that looked like your finished plan but was the same every time. It now shows just the build steps; your real plan appears on the next screen.

  • The Companion shows its work.

    While it thinks through a question, a calm line tells you where it is — checking cross-references, looking up a word, drafting the reply — instead of a silent thirty-second spinner. The answer still arrives the same way; the wait just stopped being a black box.

  • The home and notes pages now use the same wider layout as the prayer page, so the surfaces line up.

Fixed

  • Building a custom reading plan no longer times out.

    Longer plans — a full year, say — used to fail with an error before they finished generating. They now build reliably, however many days you ask for.

  • Some people weren't getting their daily devotional.

    If you had no active reading plan and your week had no theme set, devotional generation errored out and skipped you — every day. It now passes over that day quietly and resumes the moment there's something to read.

  • The reading-plan picker now shows the full set of curated plans.

    They were missing immediately after the 0.16.0 launch.

Added

  • The Prayer Timer.

    Start a timer and pray. The clock holds when you pause; you can give blocks of time to specific prayers on your board, and jot a thought or a verse mid-session without losing focus. A focus mode clears the screen down to just the timer. Finished sessions are saved with a note (very short ones are discarded), and a Log and Stats view show where your prayer time has gone.

  • A reworked prayer board.

    The board is now a kanban with a filter row and custom tags you create yourself — organize prayers however fits.

  • A new curated reading plan — "Proverbs, the Story & the Gospel."

    A year in three short readings a day: a chapter of Proverbs keyed to the date, the Old Testament story of God's people in order, and a New Testament passage. At thirty turning points the Old Testament shadow and its New Testament fulfilment are set on the same day — Isaac bound on Moriah alongside the crucifixion, the bronze serpent alongside John 3, Jonah's three days alongside the sign of Jonah. Curated by Patrick B.

  • Two whole-Bible reading plans.

    "Bible in a Year" reads straight through, Genesis to Revelation. "Old & New Testament Daily" pairs an Old Testament reading with a New Testament reading every day. They join the curated set — seven plans to choose from.

  • The Reader — a dedicated Scripture study workspace.

    A new /reader surface for deep study. Read two passages side by side in a multi-pane layout. Tap any word for Word Study: its Strong's number, lexicon definition, morphology, how often it occurs, and how the KJV renders it. Tag multi-word phrases as single study targets. Cross-references show inline with hover previews. Visualizations bring the text to life — a family tree you can zoom, pan, and click through person to person; a places map; a timeline. A Gospel harmony lines up parallel accounts. A Resources tab surfaces Old-Testament-in-New quotations and the Names of God. Keep a scratchpad open beside the passage to write as you study, or summon the Companion into the reader to talk a passage through. Per-pane full-text search, a ⌘K command palette, KJV by default. The lexical, morphology, and cross-reference data comes from STEPBible — the open scholarly Bible dataset curated by Tyndale House, Cambridge.

  • Reading Plans — read through Scripture with a plan.

    Pick a curated plan (the New Testament in 90 days, Psalms + Proverbs monthly, the Sermon on the Mount, the Gospel of John, the Pauline epistles, or a year-long Wisdom-Story-Gospel rotation) — or describe a goal and have a custom plan built for you. Each day's reading lands as a card. The plan is calendar-aligned: "today" is the day you're actually on, and days you miss collect in a catch-up list you can read in order or skip. Mark days read, pause and resume without losing your place, and switch plans anytime — picking a plan back up resumes where you left off. A reading-plan tab lives in the Reader, your daily devotional is built from the plan's passage, the home dashboard tracks your progress, and Telegram delivers each day's reading.

  • Public profile pages.

    Your activity now has a shareable /@username page with a contribution-style heatmap, shown only when you turn on the activity-visible toggle.

May 1, 2026

v0.15.11

Sign-up rollback no longer leaves users in a half-deleted state.

Fixed

  • Sign-up rollback no longer leaves users in a half-deleted state.

    When a sign-up needs to be rolled back (bad invite code, transient Clerk outage), both the local account and the Clerk identity now come down together, or neither does. The previous path could quietly leave a "ghost" account that looked signed up but had no invite consumed. Two affected users on 2026-05-01 had their email verification restored manually.

  • Unauthenticated API requests return 401 instead of 500.

    Hitting prayer or concept endpoints without a session now returns a clean "Unauthorized" response. Previously the unauth case escaped as a server error and showed up as a spike in error tracking, drowning out real bugs.

  • Already-signed-in visitors no longer hit an error on the sign-up page.

    If you landed on the sign-up page while already signed in — for example, after an admin verified your email — you'd see a confusing error instead of getting into the app. You now go straight to onboarding instead.

April 30, 2026

v0.15.8 → v0.15.9

No more "you started a companion session about an hour ago" message after using Telegram.

Fixed

  • No more "you started a companion session about an hour ago" message after using Telegram.

    The bot was sending it after an hour of silence following any Telegram chat. Telegram chat doesn't have a session you "start" or "wrap up" — the message read as nonsense. Devotional sessions still get the same idle check, where it actually maps to something the user is doing.

  • Sign-up works again for invite-coded accounts.

    Some sign-ups in the last day created a Clerk account, then had it deleted seconds later, bouncing the user back to the sign-in page. Two affected users can retry their original invite codes and finish creating their accounts.

April 29, 2026

v0.15.7

Stream is a complete redesign.

Added

  • Stream is a complete redesign.

    The Stream page now shows every entry type in one unified feed — captures, notes, prayers, devotionals, companion sessions, weekly arcs — instead of a flat capture list. Each card opens into a drawer for inline detail. Date grouping, filter tabs (All / Captures / Notes / Prayers / Devotionals / Companion), live-session banner, a capture input pinned to the bottom, and a "+ New" menu for jumping into anything from one place.

  • Folders + Library.

    A new sidebar folder tree and a Library page give you one place to organize notes, captures, and prayers across every surface. Star a folder to pin it to the top. Drag items between folders. Open a folder to see breadcrumbs and sub-folders. Reorganizing never leaves items half-filed. The folder chip on each card lets you re-file in one click.

  • Weekly arc — your week, summarized in Telegram.

    A Saturday-evening Telegram message lands with a one-paragraph lede, this-week stats (captures, sessions, notes, primary book studied), prayer summaries from your active board, and the scripture refs that came up most. Quiet weeks get gentler copy ("a quieter week — sometimes that's the point") instead of a stat dump.

  • Cross-surface notifications.

    Things you do on the web — raise a prayer, save a note, end a session, confirm a theme, mark a prayer answered — now ping your Telegram chat with a short observational note. Events that started on Telegram don't echo back. If you do the same thing five times in two minutes, you get one ping, not five.

  • Telegram `/stream` command.

    Browse the same unified feed from inside the bot, paginated. Now you have parity between web and chat for what you've been up to.

  • Smarter heartbeat scheduling.

    Long active sessions get a single check-in ("still in 1 Cor 13?" after an hour). Prayer reminders and forgotten-prayer nudges look different from each other so you can tell at a glance which is which. Prayers and notes don't get nudged twice for the same thing under different wording.

  • Daily devotional card leads with scripture.

    The Stream's daily devotional card shows the scripture ref + opening line first so you can decide whether to dive in without expanding.

Fixed

  • Stream no longer errors out when you're signed out.

    Hitting /stream without a session used to throw a server error; it now redirects you to sign-in like every other authed page.

  • Untitled placeholder shows up on a fresh note.

    New notes were saving with the literal title "Untitled" instead of leaving the title blank, so typing in the title field appended to it. Now the field is empty by default and the placeholder reads "Untitled" until you write something.

  • Devotional settings card no longer logs a stray error when you navigate away mid-load.

    Switching surfaces while the card was fetching could leave a half-finished request that the page later complained about. It now cancels cleanly.

  • Filing an item into a brand-new folder is now all-or-nothing.

    Creating a folder and dropping an item into it in one gesture used to leave the item half-filed if the second step failed. The flow either succeeds completely or leaves the item where it was.

  • Telegram welcome message now mentions everything you can do.

    The /start linking flow undersold what was wired up; it now lists Stream browsing, prayer raising, note-saving from chat, and the Saturday weekly arc.

Changed

  • Public note URLs use a stable namespace.

    The user-facing share URL stays /@username/[slug] — that hasn't changed and your existing share links still work. Internally the route is now namespaced so adding new top-level pages won't collide with usernames in the future.

  • Prompts tightened across devotional, prep, heartbeat, learning, summary, and knowledge graph.

    Less restating things you already know, fewer hedge words, more direct observational voice. Quality re-checked against the eval suite for each surface.

  • Saturday-evening double-pinging fixed.

    When the weekly arc Telegram lands at 6pm, the regular Saturday devotional now drops the parts that overlap so you don't read the same three sentences twice in five minutes.

  • Marking a prayer answered uses 🕊 (peace dove) instead of 🌅 (sunrise).

    The dove reads tonally neutral whether the answer was joyful or somber — a sick parent who passed shouldn't get a sunrise emoji.

  • Help icons and loading states now consistent across pages.

    The ? help button sits in the same spot on every authed page; loading skeletons match the layouts they stand in for; keyboard shortcuts no longer fire from inside form inputs.

April 28, 2026

v0.15.6

Pages now show instant skeletons while loading.

Changed

  • Pages now show instant skeletons while loading.

    Notes, Companion, Prayer Board, Knowledge, and Search all display page-matched placeholder layouts the moment you navigate to them — no blank screens or layout jumps while data fetches.

  • Button and Badge styles compose cleanly.

    Tailwind class overrides passed via className now reliably win over defaults. Stacking multiple variants no longer produces unexpected merged styles.

  • New `Page` component for consistent 5-state layout.

    Any page that fetches data can now use <Page loading error empty emptyState> to get loading skeletons, auto-dismissing error banners, and empty states without writing that logic from scratch each time.

April 26, 2026

v0.15.5

Companion chat works across web and Telegram again.

Fixed

  • Companion chat works across web and Telegram again.

    Switching between the web companion and your Telegram bot could trigger a crash. Both surfaces now stay in sync without errors.

  • Notes load reliably again.

    Some users saw an error when opening their notes list. That's resolved.

April 25, 2026

v0.15.3 → v0.15.4

Companion now remembers things about you across sessions.

Added

  • Companion now remembers things about you across sessions.

    The memory system extracts atomic facts from session summaries (study style, theology, life context, preferences, observations) and stores them persistently. Facts are reinforced when they reappear, superseded when they change, and expired when they have a deadline. The companion and devotional engine pull the top active facts into context so each session builds on what came before.

  • Concept summaries now include personal context.

    When the cron resynthesizes a concept summary, it includes memory facts that mention that concept by name — prefixed [memory] in the snippet context passed to the LLM. "Grace" as a concept will now surface that you view it as empowerment rather than permission.

  • Concept cards show "Updated X ago".

    Every concept detail view now shows a relative timestamp ("Updated 3 hours ago") regardless of whether the concept has a summary yet. Previously the timestamp was only visible when a summary existed.

  • Notes track how many times they've been edited.

    A new edit_count column on notes increments on every content save. The companion's activity digest now reflects the real edit depth rather than a hardcoded floor of 1.

  • Cleaner public changelog page.

    The /changelog page now groups releases by date instead of stacking version sections vertically. When several versions ship the same day, they collapse into one accordion bullet per release with the version number tagged inline. Less scroll, easier to find what shipped this week.

Fixed

  • Prompt injection in memory facts is now caught and flagged.

    Fact text is screened against known injection patterns before storage. Suspicious facts are stored with flagged_injection=true and excluded from all LLM context rather than dropped — so "I want to disregard my doubts about grace" doesn't disappear, it just waits for review. Reinforcement updates also propagate the flag if a later extraction catches it.

  • Concept staleness matching is more accurate.

    The stale-concept flagging logic (which marks concepts for re-summarization after a session produces related facts) now uses a shared token-based matcher instead of a substring check. Short concept names (≤ 3 chars) no longer produce false positives. Same matcher used in both the pipeline and the cron so they can't diverge.

  • Profile regeneration is now concurrent-safe.

    factsVersion was set to facts.length on every update, so two simultaneous regenerations could both read 5 facts and write factsVersion: 5 — making the second write look like a no-op when it wasn't. Now incremented atomically with COALESCE(current, 0) + 1 in SQL on both the INSERT and UPDATE branches.

  • Database errors in Sentry now actually tell us what went wrong.

    Postgres errors from the Neon serverless driver were arriving as "NeonDbError: null" with no SQLSTATE, no severity, no way to triage. The redactor strips message text for privacy (users write prayers); the categorical Postgres metadata never made it through Sentry's normalization. Two new tags now ride along on every NeonDbError event: dbErrorCode (the 5-char SQLSTATE — 42P01, 23505, etc) and dbErrorSeverity (ERROR / FATAL / PANIC / etc). When a database query fails in production, we'll know in seconds whether it's a missing table (migration drift), a duplicate key, a connection failure, or a timeout. Closes [SELAH-SENTRY-D](https://selah-sr.sentry.io/issues/7440039530/), unblocks triage on SELAH-SENTRY-C and SELAH-SENTRY-3 (same throw site, different captures via errorDigest matching).

  • Telegram companion back online after silent migration failure took down the sessions table.

    relation "sessions" does not exist was killing every /api/telegram/webhook call since the stream v2 deploy. Root cause: the migration runner's regex splitter (/;\s*(?:\n|$)/) shredded DO $$ PL/pgSQL blocks into invalid fragments. Neon's HTTP driver accepted them silently (returned 200, executed nothing), the runner marked all three migrations (0026, 0027, 0028) as applied, and the companion_sessions → sessions rename never happened. Recovery migration 0032_fix_sessions_schema.sql applies all the skipped DDL idempotently — rename, new columns, index, stream_entries table, session_id foreign keys on stream_captures and notes.

  • Companion warnings stop arriving as "<unlabeled>" events.

    Sentry's captureMessage calls (the orphan-intent breadcrumb, the tool-loop hop budget exhaustion log, the final-response fallback warning) hand a static string to event.message, which the redactor strips for privacy. Without a tag, every site looked identical on the dashboard. New messageOrigin tag derives from a fixed prefix allowlist of literal strings our code emits — companion.orphan_intent, companion.hop_budget_exhausted, companion.final_response_fallback, ai.stop_reason, ai.schema.json_parse_failed, ai.schema.validation_failed, ai.job. Each captureMessage site now sorts to its own dashboard bucket. Closes [SELAH-SENTRY-8](https://selah-sr.sentry.io/issues/7436346156/).

April 24, 2026

v0.15.0 → v0.15.2New

Your Telegram companion now walks alongside you, not just organizes your desk.

Added

  • Sentry events you can actually triage.

    Every Sentry event now ships with three new tags the redactor keeps alongside the existing privacy allowlist: errorType (TypeError, Error, ...), errorMechanism (onerror, onunhandledrejection, generic), and errorOrigin (a tag like stream.load when the stripped error message starts with one of our own static throws). Before this, window.onerror-caught errors landed as "Error: null" with no way to tell a TypeError apart from a generic Error or a boundary throw apart from a global-handler capture. Now a single glance at the tags narrows the universe: errorType=Error + errorMechanism=onerror + no errorOrigin + no boundary = "thrown outside React and outside any throw site we recognized" — probably third-party or an async callback we forgot to wrap. Actionable in seconds. Privacy unchanged: exception messages still stripped; errorOrigin only ever holds one of the fixed literal prefix labels, never any user content.

  • Your Telegram companion now walks alongside you, not just organizes your desk.

    Most of the time it notices what you've been carrying (a recent devotional, a pattern of anxiety in your captures, a prayer you've been sitting with) and invites a heart-level response instead of reminding you about stale notes. A smaller slice still handles the file clerk work. The mix target baked into the prompt: ~60% formation (application, gratitude, lament, practice rhythms, shepherd questions, sometimes just "sitting with you"), ~25% study/notes organization, ~15% trivia.

  • New nudge types to match.

    [application], [meditation_invite], [gratitude_surface], [lament_invite], [practice_rhythm], [shepherd_question], [silence_invite] alongside the existing [note_stale], [prayer_forgotten], [connection], [did_you_know], [check_in], [offer]. All enum-locked at the parser — if Haiku invents a new tag like [heart_check], the nudge gets dropped (with a summary.skippedUnknownType counter for observability) rather than saved to the DB as a freeform string.

  • Post-devotional cooldown.

    If you just finished a devotional (saved it, opened it on web, or received it on Telegram), the heartbeat stays quiet for 4 hours. No more "you have stale notes" nudges 35 minutes after a morning reading. Cooldown anchors on the strongest completion signal available.

  • Weekly reflection nudge.

    On your reflection weekday (default Saturday), if you haven't written this week's reflection, you get one gentle "looking back at the week, where did you see grace?" nudge. It bypasses the post-devotional cooldown on purpose (reflection day IS the weekly wrap-up) but counts against your daily 2-nudge cap like any other content nudge.

  • First-nudge intro.

    The very first heartbeat you ever receive teaches you you can tune the companion by chatting with it: "Tell me anytime if the tone's off — 'more rest, less notes' — and I'll adjust." Delivered once via an atomic claim so a partial-write can't double-send it. Cap-exempt.

  • Visible tuning affordance on `/settings`.

    The heartbeat card now shows the first 280 characters of your current instructions inline (with a "Show full" toggle) and tells you how to change them: "Tell Selah in chat to tune this." No more accordion hiding the most important signal that the thing is editable.

Fixed

  • Post-devotional cooldown actually fires again.

    The 4-hour quiet window added in 0.15.0 was dying silently on every cron run for users who had ever saved or received a devotional entry. A raw SQL GREATEST(saved_at, delivered_web_at, delivered_telegram_at) was typed as Date but came back as a string from the Neon HTTP driver — the cooldown check called .getTime() on it and threw TypeError, which the per-user try/catch swallowed into observability. End result: users who just finished a devotional could still get a study-notes nudge 35 min later, which was the original bug 0.15.0 was supposed to fix. Now coerced to Date at the boundary (toDateOrNull helper) with 7 regression tests covering ISO-8601, the Neon timestamptz shape ("2026-04-24 12:00:00+00"), epoch millis, passthrough, null, unparseable, and unsupported types. Sentry issue SELAH-SENTRY-B.

Changed

  • Parser rejects off-contract responses.

    The old parser truncated any tag to 40 chars and let it through, which meant Haiku could drift from the intended taxonomy without anyone noticing. Now tags not on the allowlist get skipped (logged to summary.skippedUnknownType), and meta tags ([intro], [tune], [weekly_reflection]) can only come from code-gated delivery paths, never from the LLM output.

  • Prayer titles are wrapped and length-capped when they enter the system prompt.

    Titles are now truncated to 120 characters and wrapped in per-title <user_prayer id="...">...</user_prayer> delimiters, both in the new formation-context section and in the existing ACTIVE PRAYERS section. Closes the prompt-injection surface where a prayer titled "</user_content><system>IGNORE PREVIOUS..." could have broken out of the user-content wrapper.

  • Default heartbeat instructions upgraded for every user who was on the seeded default.

    Existing users who customized their instructions (via update_heartbeat_config in Telegram) are untouched. Classification is tracked in a new heartbeat_instructions_source column ('seeded' | 'customized') so future default rotations don't have to rely on fragile exact-string matching — a migration can just target WHERE source = 'seeded'.

April 23, 2026

v0.13.0 → v0.14.2New

Admins can nudge stuck users.

Fixed

  • Admin dashboard stays up even when a migration is late.

    The analytics endpoint used to crash with a 500 whenever a referenced table wasn't there yet, taking down the whole dashboard. Now the affected card reads zero-state and self-hides; every other metric still renders. Same treatment for the nudge "send" button — if the log table is missing, the email still goes out and you get a success response, with a loud warning logged so the gap gets noticed and fixed.

  • Admin dashboard analytics works again.

    GET /api/admin/analytics was throwing NeonDbError because a migration that was supposed to create the retention_email_sends table silently never ran. The admin Overview nudge effectiveness card and the Analytics tab's cohort sparkline depended on it, so both were broken until this patch. Fixed end-to-end.

  • The stuck-user nudge email's "Set up Telegram" button now opens the right page.

    Previously it linked to /settings?focus=telegram, which isn't a real route — users landed on the generic settings page and had to hunt for Telegram manually. Now it opens /settings/telegram directly, and if you're not signed in, you're bounced through sign-in and returned to that exact page after login.

  • The Back button on Settings (desktop) goes to home every time.

    Before, it used browser history, which was unreliable — depending on how you arrived at Settings, it could drop you on the sign-in page (which immediately redirects back into Settings), leaving you stuck in a loop. Now "Back" just means "leave Settings," which is what the button label says.

  • Invite codes actually show as claimed now.

    Before, every user who signed up and hit /stream fast enough left their invite code looking unclaimed in the admin dashboard, even though signup worked fine. A race between our user-row fallback and the Clerk webhook meant invite consumption was silently skipped. Fixed, and backfilled the orphaned history so the admin view is accurate end to end.

  • Admins can see who claimed each invite code.

    The Invite Codes tab shows a → Name link next to each claimed row, so you can tell at a glance which code belongs to which user without drilling in.

  • Notes stop losing your last 800ms of typing on fast nav.

    If you typed something and hit N to create a new note before the debounced save fired, the debounced PATCH is now flushed with keepalive: true on unmount. Nothing drops.

  • The "Pull in note" picker doesn't re-fetch every time anymore, and won't cross-populate between notes.

    Per-mount cache plus AbortController on rapid nav.

Added

  • Admins can nudge stuck users.

    In the admin Users tab there's a new mail-icon button per user. Clicking it sends a warm, manually-triggered email that pitches the Telegram companion + daily devotional with one CTA and leaves a reply loop open so you learn what's in their way. Guarded so it won't send to anyone who already has Telegram linked.

  • Double-send guard on nudges.

    If you've already nudged someone in the last 14 days, the admin tells you up front ("Last nudge sent 3 days ago") and requires an explicit override to send again. No more accidental double-taps.

  • Nudge effectiveness at a glance.

    The Overview tab now shows "X% linked Telegram after nudge" with the raw numbers as soon as you've sent at least one. Tells you whether the email actually moves the needle.

  • Telegram activation trendline.

    The Analytics tab has a new 8-week sparkline showing the share of each signup cohort that's linked Telegram. Latest cohort highlighted, with an up/down arrow vs the prior cohort so you can read the trend in a glance.

  • Faster page loads.

    Inter and Lora fonts are now self-hosted via next/font/google instead of fetched from Google on every cold load. LCP drops by roughly 100-300ms depending on network.

  • Cleaner landing page.

    The "Join the waitlist" button is now the primary filled CTA on hero and footer, and "I have an invite code" drops to outlined secondary, matching the roughly 95/5 split of who actually has a code. A one-line clarifier ("We'll email you when a spot opens. One email.") kills the implicit newsletter objection.

  • The "How it works" section on the homepage now has images.

    Each step — Capture, Study, and Share — shows a visual so you can see what Selah looks like before you sign up.

April 22, 2026

v0.12.0 → v0.12.1New

A changelog page.

Added

  • You can ask for today's devotional anytime, on any surface.

    On Telegram, the companion pushes it straight into the chat. On web, it surfaces a preview with a link to the full reading. No more "head to the app" dead-ends.

  • Migrations apply automatically on production deploys.

    New database changes run as part of the Vercel build — no more copy-pasting SQL into Neon by hand, no more forgetting.

  • A changelog page.

    Visit [selah.so/changelog](https://selah.so/changelog) anytime to see what's shipped, in plain English. Bookmark it to follow along.

  • Sliding settings sidebar

    with a dedicated page for devotional settings. The menu now slides between groups instead of jumping between pages, and your devotional timing, timezone, and theme all live together in one place.

  • The companion knows your week's devotional theme.

    Ask "what's this week's theme?" and it answers directly instead of saying it can't see that.

  • Instant Telegram delivery after a theme switch.

    Say "now" when changing themes and the fresh devotional lands in your Telegram chat right away — no waiting until tomorrow's scheduled time.

Fixed

  • Switching themes mid-week now actually works end-to-end.

    Before, if a cron-written entry existed under the old theme, the companion would keep serving it even after a pivot. Now the old entry is cleared on confirm and a fresh one is written under the new theme on next fetch.

  • The companion no longer describes two devotional themes as "running alongside."

    It used to rationalize stale chat history by inventing a parallel arc. Now it treats the DB as the single source of truth and the current week has exactly one theme, period.

  • Note reformat retries instead of giving up.

    If Claude returns an empty response (rare, but it happens), the reformat tries once more with an explicit nudge before surfacing a "try again" message. No more blank modals.

  • Switching themes mid-week now gives you the right content.

    If today's entry was already written under your old theme, changing themes replaces it with a fresh entry for the new one. Before, you could end up reading a devotional about the old topic even after a successful switch.

  • The changelog page shows cleaner dates.

    Timestamps at [selah.so/changelog](https://selah.so/changelog) now read "today", "yesterday", or "3 days ago" instead of "17 hours ago" — more honest since entries are dated by day, not by hour.

  • Finishing a prep interview is more reliable.

    Saying "done", "wrap up", or "finish the prep" now saves your note every time, and the Enrich/Format card shows up when you expect it.

  • The companion is more honest about what it did.

    It won't claim to finish a task it didn't actually complete.

  • Error tracking is working correctly again.

    A setting was blocking our internal tools from seeing what's happening in the app, which meant we were slower to spot bugs. Fixed.

April 21, 2026

v0.10.0New

If a theme isn't working, switch it.

Change your week's theme anytime

  • If a theme isn't working, switch it.

    Ask the companion to pivot and it'll suggest a new direction. Say yes, and it writes fresh entries for the rest of the week around the new theme. Nothing you've already written disappears.

  • The companion asks before it changes anything.

    It proposes the new theme first and waits for your "yes" before applying it.

  • Works on web and Telegram

    through the same flow.

Fixed

  • No more blank crash screens.

    If something goes wrong, you'll see a helpful message with a way back, not a white page.

  • Signing in takes you to where you were going.

    Before, it dropped you on the home page every time.

  • Our bug-tracking tools are working again.

    That means we can catch and fix problems faster.

April 20, 2026

v0.9.0New

If you email us for support, we can now see where things went wrong

Faster help when something breaks

  • If you email us for support, we can now see where things went wrong

    — did your devotional deliver, did Telegram connect, did your notes save. We see status signals, not your content. This lets us fix problems faster without having to ask you a bunch of questions first.

  • Better view of signup health.

    Helps us spot when something's broken for new users before they have to tell us.

Fixed

  • Daily devotionals arrive on time again.

    A bug was stopping delivery for some users. They're coming through now.

  • Analytics and error tracking are working.

    A setting was blocking our tools from seeing what's happening in the app. Fixed.

April 19, 2026

v0.8.1

The companion thinks longer before it answers.

Smarter companion

  • The companion thinks longer before it answers.

    Especially during prep interviews. Its answers are more thoughtful and less likely to be wrong.

  • It remembers you better.

    The companion learns about you quietly in the background. It's better at picking up what matters and skipping what doesn't.

  • Reminders sound more natural.

    The companion's nudge messages used to always sound like questions. Now they can be statements when that fits better — and they don't repeat as often.

April 18, 2026

v0.8.0New

The companion lives on every page on tablets.

Tablet companion

  • The companion lives on every page on tablets.

    Before, you had to go to a specific screen. Now it follows you around the app.

  • See changes live.

    When the companion edits a note while you're looking at it, the changes appear right away. No refresh.

  • Clean change cards.

    When the companion edits something from your chat, you see a tidy "View changes" card instead of a wall of text.

Settings redesigned

  • Settings are organized now.

    Eleven sections with a side menu. Finding what you're looking for takes one click instead of scrolling through everything.

  • Cleaner look.

    No more double borders or awkward spacing.

Fixed

  • The `/` menu shows up in the right place

    when you're typing in a long, scrolled note. Before, it jumped to the top of the page.

  • Telegram devotionals and reminders

    work again for users on Telegram only. A bug was blocking them.

April 17, 2026

v0.6.0 → v0.7.0New

Edit your notes by talking to the companion.

Conversational note editing

  • Edit your notes by talking to the companion.

    Ask it to "add a point about Romans 8 to my sermon prep note" or "tighten up the intro" and it actually does it. Works from the web companion and from Telegram.

  • List your notes from Telegram.

    Send /notes in the bot and you get a browsable list. Tap one to open a thread where every message you send gets appended to that note. Great for capturing thoughts on the go without opening the app.

  • Undo any AI edit.

    When the companion or Telegram modifies a note, an Undo button appears at the top of the note page with a diff summary ("Added 2 paragraphs to Introduction · from Companion"). One tap reverts the change. Nothing is permanent unless you want it to be.

  • Stale-version banner.

    If you have a note open in the web editor and Telegram edits it underneath you, we show a banner with a Refresh button so you don't accidentally overwrite each other's work.

  • New `note_edits` ledger.

    Every AI edit gets logged with before/after content, source surface (web or Telegram), and a plain-English diff summary. Foundation for the fuller history panel we're planning.

Fixed

  • Onboarding + notes no longer 500 for users with stale email rows.

    If a Clerk user's email matched a pre-existing user row with a different id (legacy Neon-auth leftover), the fallback insert silently no-op'd and every downstream foreign-key insert (user_onboarding, notes) blew up. Now we detect the collision explicitly and throw a clear error pointing at the migration script.

  • `src/app/api/telegram/webhook/route.

    ts` — voice path no longer sends the 👀 reaction twice (one Telegram API call saved per voice message)

  • 18 new tests for the transcription helper + 1 for the file-download guard (40 added across both files)

Added

  • `src/lib/note-edit-helpers.

    ts` — diff summary generation, section-level updates, append/replace helpers shared by companion + Telegram

  • `src/lib/db/schema.

    ts — new note_edits` table: userId, noteId, sourceSurface, contentBefore, contentAfter, diffSummary, revertedAt

  • `src/lib/companion-tools.

    tsappend_to_note, update_note_section, revert_last_edit` tools for the companion pipeline

  • `src/app/notes/[id]/page.

    tsx` — undo button, stale-version banner, polling for concurrent edits

  • `src/app/api/notes/[id]/undo/route.

    ts` — GET latest un-reverted edit, POST to revert

  • `src/app/api/telegram/webhook/route.

    ts/notes` command, inline-keyboard note picker, append-mode callback routing, undo callback

  • `src/app/api/debug/whoami/route.

    ts` — temporary auth diagnostic endpoint (to be removed after dev stabilizes)

  • `src/lib/transcription.

    ts — Whisper API wrapper, raw-fetch (no openai SDK), discriminated TranscribeResult`, exhaustive failure-reason mapping

  • `src/lib/telegram.

    tsdownloadTelegramFile(fileId) for two-step getFile` → file fetch

  • `src/app/api/telegram/webhook/route.

    ts — voice/audio dispatch in handleMessage, transcribeIncomingVoice helper, 🎙️` transcript confirmation message

Changed

  • `src/lib/auth-session.

    tsensureUserInDb now detects email collisions against stale user rows and surfaces a descriptive error instead of silently no-opping via .onConflictDoNothing()`

  • `src/proxy.

    ts/api/debug/* added to public route patterns (Next 16 private-folder _debug` convention forced the rename)

Voice notes on Telegram

  • Send voice messages to your companion on Telegram.

    Tap-and-hold the mic in Telegram, talk, release. The companion downloads the voice note, transcribes it via OpenAI Whisper, echoes the transcript back so you can verify (🎙️ "your words"), then routes it through the same companion pipeline as a typed message. Captures, prayers, slash commands — everything works.

  • Audio uploads work too.

    Forward an audio file from another chat and it gets transcribed the same way.

  • Friendly failure modes.

    Voice notes that are empty, too long (>10 min), or fail transcription get a clear message ("I had trouble transcribing that — try again or send text") instead of silent dropping.

  • No new env vars.

    Reuses the existing OPENAI_API_KEY (already used for embeddings).

April 16, 2026

v0.5.0New

The companion now reaches out to you.

Heartbeat Companion Nudges + Nightly Learning Loop

  • The companion now reaches out to you.

    Every 15 minutes, a Vercel Cron evaluates your recent notes, prayers, and captures with Claude Haiku. If there's something worth surfacing — a stale note, a forgotten prayer, a connection to the week's devotional theme — it sends you a Telegram message. Feels like a thoughtful friend, not a notification bot.

  • Smart nudge timing.

    You control active hours (default 8am–10pm) in Settings. Nudges respect a daily cap of 2 so they stay meaningful. Overnight windows work correctly — set 10pm–6am if you want late-night prompts.

  • Nudges that don't repeat.

    The system reads the last 7 days of nudges before asking the LLM to generate a new one. If you've already been reminded about Romans 8 three times this week, it won't ask again.

  • Heartbeat settings in the web app.

    The Settings page now has a Proactive Check-ins card. Toggle nudges on/off, set your active hours, and write custom instructions for the companion (e.g., "Only nudge me about Study-stage notes" or "Focus on prayer when I haven't prayed in 3 days").

  • Nightly companion learning loop.

    Every night at 2am, the companion reviews the past 24 hours of your activity — notes edited, captures saved, prayers engaged — and updates its understanding of you. Five facts about your patterns and interests stay current. Your companion profile is regenerated from those facts so every conversation starts with fresh context.

  • Activity-aware learning.

    The learning loop uses Haiku to reason over your recent activity digest. It can add new facts, update existing ones, and remove stale ones — so the companion's knowledge of you actually evolves rather than accumulating noise.

  • Telegram formatting fixed.

    Companion responses now render bold, italic, inline code, and links correctly in Telegram (HTML mode). This was a regression introduced in the prior release and is now fully restored.

Added

  • `src/lib/heartbeat.

    ts — context assembly, LLM evaluation, parseHeartbeatResponse, buildHeartbeatSystemPrompt`

  • `src/app/api/cron/heartbeat/route.

    ts — 15-minute Vercel Cron (GET), isWithinActiveHours, isNudgeCapReached`

  • `src/app/api/cron/companion-learn/route.

    ts` — nightly learning cron (GET), activity digest, fact maintenance

  • `src/app/api/heartbeat-preferences/route.

    ts` — GET/PUT/PATCH heartbeat preferences

  • `src/app/settings/heartbeat-card.

    tsx` — Proactive Check-ins settings card

  • `src/lib/companion-learning.

    tsbuildActivityDigest, runLearningLoop`, fact CRUD helpers

  • `src/lib/telegram.

    tssendHeartbeatNudge, markdownToTelegramHtml` (restored)

  • `drizzle/0015_heartbeat.

    sqlheartbeat_nudges table + companion_preferences` heartbeat columns

  • `drizzle/0016_companion_learning.

    sqltopFacts column on companion_preferences`

  • 5 new test files: 432 tests total (up from ~370)

April 15, 2026

v0.3.0 → v0.4.0New

Interview notes now save as full, editable study documents.

Full Interview Notes + Cross-Surface Session Navigation

  • Interview notes now save as full, editable study documents.

    When you say "save this" on Telegram or in the web companion at the end of an interview, the companion captures everything: the theological arc of the conversation (as a pull quote), all your significant insights (no 3-6 limit, no truncation), scripture references with context, your most powerful verbatim quotes, and any open questions to explore later. The saved note opens as a rich, editable TipTap document — not a read-only summary. Old notes keep working through a backward-compat read path.

  • Tap "View Note" from Telegram.

    After saving an interview, prep, or general note from Telegram, the companion now includes an inline "View Note" button that deep-links straight to the editable note in the web app. No more "I can't edit notes" confusion.

  • `/sessions` on Telegram.

    See your recent conversations across both web and Telegram with one command. Tap any session to jump to it on the web. Same agent, multiple surfaces — the session is unified.

  • "History" button on the web companion.

    The clock icon now has a visible "History" label so you can actually find the session drawer. The drawer itself already listed topics + dates; now new users know it exists.

  • Deep-link into any past session.

    Navigate to /companion?sessionId=X and the companion loads that conversation directly. If the session doesn't exist (typo, deleted, stale Telegram link), you get a clear error banner — "Couldn't find that conversation. Started a new chat." — not a silent empty chat.

  • Notes link back to their source conversation.

    The "View companion interview" button on an interview note now routes through the unified session URL, so you can jump from the saved note back to the conversation that produced it, continue thinking, and save again.

  • Telegram companion loop crash fixed.

    markdownToTiptap(undefined) no longer throws — empty input returns a valid empty-paragraph doc. parseLLMJson now recovers when the LLM wraps JSON output in prose. Both fixed the "Something went wrong" errors that were locking users out of their own conversations.

  • System prompt truth-up.

    The companion no longer believes falsehoods about its own capabilities. It knows notes are editable at /notes/[id], it knows it can save verbatim quoted content, and it knows to capture all insights without truncating for a 3-6 bullet limit.

  • Data integrity: `openQuestions` field drop fixed.

    Interview notes stored questions under the wrong field name, which caused every open-question section to render blank. Fixed with a dual-field read in the notes editor and the embeddings backfill cron — old notes now display their questions correctly, and re-embeddings don't silently lose questions text.

Prayer-Aware Companion

  • `/prayers` — your prayer board in one tap.

    Send /prayers in Telegram to see all your active, ongoing, and waiting prayers grouped by status. Each prayer gets inline [Answered] / [Waiting] / [Ongoing] buttons. Tapping a button updates the status in-place — the message edits itself and the buttons disappear so you can't accidentally retap.

  • `/note [text]` — save a note directly from Telegram.

    Send /note Romans 5:3 — suffering produces perseverance and it goes straight to your notes library with an auto-title and a deep link back to the note in the app.

  • Companion knows your prayer board.

    Every conversation now includes your most recent non-answered prayers as context. When you say "God answered my prayer about the job offer," the companion understands what you mean and can call update_prayer_status to mark it answered. It won't guess UUIDs — if it's unsure which prayer you mean, it asks by title.

  • Three new companion tools:

    read_prayers (filtered board lookup), update_prayer_status (mark answered/waiting/ongoing with an optional note), create_note (save a theological insight or study reflection directly from conversation).

  • Bug fix:

    /start, /help, /recent, /profile, /prayers, and /note no longer send a redundant 👀 acknowledgment reaction — the reaction from the message handler is sufficient.

April 14, 2026

v0.2.0New

End-to-end devotional pipeline.

Adaptive Daily Devotional System

  • End-to-end devotional pipeline.

    Users receive a fresh scripture-based devotional every day at their chosen local hour, delivered via Telegram and/or surfaced in the companion chat. The system is week-aware: Monday opens a theme, Friday closes with reflection, mid-week entries develop it.

  • `devotional_weeks` + `devotional_entries` tables

    (migration 0011) — week records track theme, proposedNextTheme, and week-end reflection; entry records carry all rendered fields (dayRole, scriptureRef, scriptureText, opening, reflection, prayerPrompt, question) plus Telegram delivery metadata.

  • `src/lib/devotional.ts`

    ensureTodaysDevotional is the core coordinator: claim a pending slot, call the role-specific LLM tool (theme_open / reflection_close / middle), write the result. Idempotent — concurrent callers compete for a pending row; only the first writer wins. LLM output truncated via v100()/txt() helpers before every DB write. tool_choice: { type: "tool", name } forces the correct role-specific tool to fire.

  • `POST /api/cron/devotional`

    — hourly Vercel cron that sweeps stale pending entries (> 10 min old), finds users at their delivery hour, generates entries, and sends to Telegram. Midnight hour normalized (% 24) for V8 Intl.DateTimeFormat quirk. Query capped at 500 users per run with a log warning when the limit is hit.

  • `POST /api/cron/devotional-extract`

    — nightly cron that extracts week-level reflection from completed entries and proposes next week's theme.

  • `GET /api/devotional`

    — returns today's devotional for the authenticated user (generating on first request).

  • `PATCH /api/devotional-preferences`

    — saves timezone, delivery hour, and devotional_enabled flag. IANA timezone validated via Intl.DateTimeFormat; isValidIanaZone exported for testability.

  • DevotionalMessage UI

    (src/components/companion/DevotionalMessage.tsx) — inline companion card rendering scripture reference, opening, reflection, prayer prompt, and reflection question with gold-tinted scripture styling per DESIGN.md.

  • DevotionalCard settings

    (src/components/settings/DevotionalCard.tsx) — timezone picker (20 common zones), hourly delivery selector, enable toggle, "Send now" preview button.

  • Daily Rhythm onboarding step

    — new step 4 in the onboarding flow introducing the devotional, with a scripted companion demo that walks through the companion philosophy using pre-scripted message pairs.

  • Notes page badge

    devotional note type now renders a gold "Devotional" badge in the notes list.

  • `isDevotionalStructured` type guard

    — replaces a blind cast in the companion page; validates dayRole shape before rendering the devotional card inline.

  • Telegram delivery

    sendDevotional renders devotionals as clean Markdown messages; atomic update sets deliveredTelegramAt only when IS NULL to prevent double-sends.

  • 15 new pure-function tests

    (269 total) — chunkMessage, verifyWebhookSecret, isValidIanaZone with full branch coverage.

  • Four adversarial-review fixes:

    midnight normalization, scale cap log warning, reflection_close idempotency guard, handleConnect single body parse.

New user discovers the bot → signup → back to Telegram.

Telegram Signup (Phase 1)

  • New user discovers the bot → signup → back to Telegram.

    Previously, a Telegram user with no Selah account hit a dead end: the bot sent them to /settings/telegram (7 steps to actually get connected). Now the bot creates a one-time signup invite, sends a single "Sign up to Selah" button, the website binds the chat on signup, and the user lands back in Telegram with the bot already greeting them.

  • `telegram_signup_invites` table

    (migration 0010) — 32-byte url-safe random token, 24h TTL, single-use, tracks chatId + Telegram username/first name. Inverse direction of the existing telegram_link_codes flow (website → bot).

  • `src/lib/telegram-signup.ts`

    createSignupInvite, findOpenInviteForChat, findSignupInvite, claimSignupInvite, pushTelegramWelcomeIfEligible, buildWelcomeMessage. The claim function handles happy path, invalid/expired/consumed tokens, and cross-user guard with idempotent self-reclaim.

  • `POST /api/telegram/claim`

    — auth-required. Body { token }. Binds the chat to the authenticated user and returns botDeepLink from TELEGRAM_BOT_USERNAME. Maps claim errors to 400 (invalid/expired/consumed) and 409 (chat_linked_to_another_user).

  • Webhook unlinked-user branch

    (src/app/api/telegram/webhook/route.ts) — replaced the dead-end "go to settings" message with a personalized welcome + "Sign up to Selah" button. Reuses an existing open invite if the user re-messages instead of creating a fresh row each time.

  • Sign-up + sign-in pages

    (src/app/sign-up/page.tsx, src/app/sign-in/page.tsx) — read ?via=telegram&t=TOKEN on mount, stash the token in sessionStorage, show a "Signing up from Telegram" banner. After successful auth, call /api/telegram/claim immediately. Sign-up routes to /onboarding?via=telegram; sign-in (already-onboarded users) redirects straight to the bot via window.location. Wrapped in Suspense for useSearchParams() per Next.js 16.

  • Onboarding flow

    (src/app/onboarding/onboarding-flow.tsx) — detects via=telegram from the URL, hides the "How did you find Selah?" question, forces signup_source = "telegram" in the PATCH (including on Skip), and swaps the step 3 CTA from "Enter Selah" to "Open Telegram." On completion, reads telegramBotDeepLink from the response and redirects via window.location.

  • `/api/onboarding` PATCH

    now returns telegramBotDeepLink when signup_source === "telegram" and TELEGRAM_BOT_USERNAME is set. Also triggers pushTelegramWelcomeIfEligible on the first completion transition (gated behind !before.completed). Non-fatal if the push fails.

  • Welcome push

    — 3-tier context-aware greeting: anchors on first capture content if saved, else on current focus, else falls back to a generic "share a thought" prompt. All under 2 sentences per DESIGN.md's Telegram response rules. No emoji in message text (DESIGN.md rule).

  • Memory fact seeding

    remains unchanged: signup_source = "telegram" is analytics, not memory, so it isn't written to memory_facts.

  • Claim-immediately-after-signup architecture

    — the chat → user link is established before onboarding begins. If the user abandons mid-onboarding, they can return to Telegram and keep using the bot; onboarding resumes on their next web visit.

  • Tests (38 new, 218 total):

    20 helper tests (telegram-signup.test.ts), 11 claim-route tests (telegram-claim-route.test.ts), plus updates to the onboarding-route suite covering the welcome-push gate and the bot deep link response shape.

Onboarding — Companion Context

  • Step 1 redesigned as a single dense screen

    — role (required-ish) plus four optional companion-context questions: Bible translation, what they're studying right now, theological tradition, and how they found Selah. All optional fields can be skipped with one button.

  • Translation preference

    — 9-option pill row (ESV, NIV, NLT, KJV, NASB, CSB, NRSV, MSG, Other), defaulted to ESV. Stored on user_onboarding.translation.

  • Tradition

    — 11-option pill row (Reformed, Wesleyan, Pentecostal, Baptist, Anglican, Lutheran, Catholic, Orthodox, Non-denominational, Still exploring, Other). Framed sensitively: "so we don't push contradictory stuff." Stored on user_onboarding.tradition.

  • Current focus

    — single-line text input. "What are you studying right now?" → free text up to 500 chars. The single biggest unlock for first-session value.

  • Signup attribution

    — "How did you find Selah?" pill row (Friend, Social, Search, Blog/podcast, Other). Stored on user_onboarding.signup_source. Analytics-only, NOT memory.

  • Memory fact seeding on completion

    — when a user finishes onboarding, role/translation/tradition/currentFocus are written into memory_facts (category: life_context / preference / theology, confidence 0.95, sourceType manual). The companion sees these from message #1 instead of cold-starting from zero. Gated so re-entry doesn't double-seed; non-fatal if seeding fails.

  • `PillRow` reusable component

    inside the onboarding flow with proper radiogroup/radio ARIA roles, 44px min touch targets, sage active state.

  • Migration `0009_user_onboarding_context.sql`

    — additive ALTER TABLE for the four new columns. Idempotent.

  • 30 new tests added (180 total passing)

    — helper coverage for the new fields, EAV mapping in seedMemoryFactsFromOnboarding, route validation for every new field's enum + bounds, the seeding gate (fires once, no re-fire on re-entry), and the non-fatal error path.

Signup + Onboarding

  • Dedicated `/sign-up` page

    — New optimized signup form replaces the inline toggle on /sign-in. Name is optional. Password has a show/hide toggle. Clear value prop, trust microcopy ("Free. No credit card. Takes 30 seconds."), and friendly error states.

  • Sign-in focused

    /sign-in is now sign-in only with a clear link to /sign-up for new users. Matches signup-flow-cro best practices: one page, one job.

  • New user onboarding flow

    /onboarding is a 3-step guided experience new users hit immediately after signup:

    1. Welcome + role — Pick how you use scripture (pastor, small group leader, student, personal). Skippable. Feeds companion personalization later.
    2. First capture (aha moment) — Guided textarea with an example placeholder. Saves a real stream capture so the user sees their Home populated immediately. Supports Cmd/Ctrl+Enter to submit.
    3. You're ready — Warm recap of what Selah can do (capture, companion, notes, prayer). Single CTA: "Enter Selah."
  • Onboarding state in DB

    — New user_onboarding table tracks role, first capture, and completed_at. Home page redirects any user with completed_at IS NULL to /onboarding, so returning users who bailed mid-flow resume where they left off.

  • `/api/onboarding` route

    GET reads status (creates row lazily), PATCH updates role, saves first capture, or marks complete. All fields optional so the client can update progressively.

  • Proxy matcher update

    /sign-up is now excluded from Neon Auth proxy alongside /sign-in so unauthenticated visitors can reach it.

April 13, 2026

v0.2.3

Upload a profile photo

Profile

  • Upload a profile photo

    — New photo section at the top of Settings → Public profile. Pick an image and it's resized, cropped to a square, and saved automatically. Change or remove anytime. JPG, PNG, and WebP welcome.

  • Branded default avatar

    — Accounts without a photo now show a warm soft-gold mark with a sage circle in the middle, matching the design system. Same mark on shared notes, the settings page, and anywhere the avatar appears.

  • Avatar on the settings page

    — Your avatar now sits beside your name and email in the Account card, and beside the Public profile link so it's obvious where to change it.

  • Consistent across surfaces

    — Shared note pages, settings, and the profile editor all use the same Avatar component, so the default and uploaded states look identical everywhere.

April 11, 2026

v0.2.0 → v0.2.2New

Tables in the editor

Knowledge Graph

  • Editable concept summaries

    — Click any summary on a concept's detail page to edit it inline. Click outside to auto-save. Write your own or hit the sparkle button to generate one with AI instantly (no waiting for background jobs).

  • "Generate Summary" button

    — One click to create a summary from your linked notes, captures, and teachings using AI. Available on concepts with no summary and inside the editor. 300 character limit keeps summaries tight.

  • Fixed stuck "updating" concepts

    — Concepts showing "updating" forever are now fixed. The background summarizer was being starved by the extraction pipeline. Summaries now process first, with a time budget that drains the full queue.

  • Smarter stale detection

    — The companion no longer mass-flags short-named concepts like "God" or "Sin" for summary refresh. Stale matching uses in-memory lookup instead of per-fact database queries.

  • Scripture parsing fix

    — "1 John 4:8", "2 John", and "3 John" references now parse correctly (trailing space in the regex key was eating the chapter separator).

Prayer Board

  • Inline-editable titles

    — Click any prayer title to edit it in place. Auto-sizing textarea preserves line wrapping. Enter saves, Escape cancels, blur saves. Optimistic updates with rollback.

  • Cleaner card layout

    — "Move to" buttons and delete icon collapse behind hover on desktop, always visible on mobile. Trash icon moved to top-right corner. Cards at rest show just the title and timestamp.

  • Loading skeleton

    — Card-shaped placeholders while prayers load instead of a blank board.

  • Keyboard shortcut hint

    N badge next to "Add Prayer" button on desktop.

  • Serif page heading

    — "Prayer Board" now uses Cormorant Garamond per the design system.

  • API: title updates

    — PATCH endpoint now supports updating prayer titles alongside status changes.

Design System

  • Added **Keyboard Shortcut Hints** pattern to DESIGN.

    md (styling, placement, rules).

  • Added **Loading Skeletons** pattern to DESIGN.

    md (card skeletons, anti-spinner rule).

  • New decisions logged: hover-only card actions, shortcut hints, skeleton convention.

Notes

  • Tables in the editor

    — Type /table to insert a 3x3 table with a header row. Columns are resizable by dragging. Tables styled to match the warm journal aesthetic (sage selection highlights, warm-white headers).

  • Paste markdown, get formatted content

    — Paste a markdown table, heading, or list into the editor and it auto-converts to rich text. No more raw | pipes or asterisks.

  • Selection-based cleanup

    — Select text in a note and click the sparkle (✦) in the floating toolbar to format just that section with AI. No selection = format the whole document (as before). Long notes no longer lose content during cleanup.

  • Slash commands fixed

    — The / menu now appears reliably when you type / at the start of a line.

Companion

  • Formatted interview transcripts

    — AI and user messages in companion interviews now render bold, italic, lists, headings, blockquotes, and tables instead of showing raw markdown like this.

Fixes

  • Reformat no longer truncates notes over 8K characters (raised to 25K with clear error for very long notes).
  • Reformat errors now show in the UI instead of silently failing.
  • Table CSS aligned to design system (4px grid spacing, `tabular-nums`, accessible `scope="col"` headers).
  • Defensive HTML escaping in companion transcript rendering.

April 10, 2026

v0.1.0New

`/prep` command

Companion

  • `/prep` command

    — Type /prep [topic] to start a Socratic interview for sermon, Bible study, or devotional prep. The AI interviews you (8+ exchanges before it lets you build), then formats your words into a structured teaching note with inline enrichment tags ([Historical], [Greek/Hebrew], [Cross-ref], [Cultural], [Illustration]). Your voice stays central. Saved as a note you can edit in the Tiptap editor.

  • Backend-driven session mode

    — The companion tracks what mode you're in (prep, interview, pray) server-side. No more frontend guessing.

  • Structural tool gating

    — The AI can't skip the interview. The save_prep tool is withheld until you've had enough exchanges. When you say "done," the AI is forced to call the tool instead of just saying "Building now."

  • Reading level matching

    — Prep output matches your vocabulary and tone. If you write simply, the note reads simply.

  • Full-page build animation

    — When the AI builds your prep note, a loading overlay shows progressive status messages instead of a generic spinner.

  • Socratic interview mode

    — Deep-dive conversations with pull-quote transcript UI.

  • Capture and note attachments

    — Attach your stream captures and notes to companion messages as context.

  • Session persistence

    — Leave and come back. Your conversation picks up where you left off.

  • `/pray`, `/interview`, `/help` commands

    — Quick-access slash commands for common actions.

Stream

  • Scripture auto-detection with expandable pills.
  • Chronological feed with timestamps.
  • Promote stream entries to notes (new or append to existing).

Notes

  • Tiptap rich text editor with slash commands (`/` menu: headings, lists, quote, divider).
  • Selection toolbar (floating: bold, italic, highlight, headings, list, quote).
  • Soft-gold text highlighting.
  • Properties drawer with stage stepper (Capture → Study → Finished) and type tags.
  • Auto-save with 800ms debounce.
  • Filter tabs: All, Capture, Studying, Finished, Threads, Teaching, Prep.
  • Scripture block extension (insertable via `/` menu).

Prayer Board

  • Kanban columns: Active, Waiting, Answered, Ongoing.
  • Drag-and-drop between columns.

Knowledge Graph

  • Auto-extraction pipeline: concepts, edges, and relationships from your notes and captures.
  • Knowledge dashboard (`/knowledge`) with type filters and manual sync.
  • Concept detail pages with delete and merge UI.
  • Auto-generated concept summaries.

Search

  • Postgres full-text search with GIN indexes.
  • Global search bar in sidebar.

Import

  • Import from Markdown, TXT, CSV, DOCX, and PDF files.
  • Proper markdown-to-Tiptap conversion (headings, lists, bold, etc.

    ).

Auth

  • Neon Auth (managed Better Auth) with middleware route protection.
  • Sign in/sign up page.