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 .
OpenRouter is now the primary gateway for Companion, knowledge processing, summaries, titles, embeddings, and transcription, with task-specific Luna, Terra, and Sol routing.
Fixed
Selah stopped re-reading its own instructions from scratch on every message.
Since the provider switch it had been paying full price to re-send the same large, unchanging setup with every turn — about 933,000 tokens in a single day where it used to be a few thousand. No behavior changes; it just stops paying twice for the same thing.
Selah can read your notes back to you now.
Ask it to read, summarize, or pull a quote from a note and it will. Until now it could write notes, edit them, and undo those edits, but had no way to open one and read it — so when you asked, it told you it couldn't, which was true and useless.
Asking about a note no longer has to be phrased just right.
Saying "the note we made on Sunday" now works the same as "my note". Follow-ups keep working too: once you've pointed at a note, "read it", "pull it up", and "yes that one" stay on topic instead of losing the thread mid-request.
Note summaries and automatic thread titles work again.
Both had been failing on every single attempt since yesterday's provider migration — silently, because neither shows an error when it fails. Summaries just never appeared and threads never got named.
Your private notes can no longer end up in our error reports.
When a database write failed, the error it produced could carry a piece of whatever you had written, and that error was sent to our error-monitoring tool. Nothing was public and nothing was shared outside the tools we already use to run Selah, but study notes have no business being in an error report. They are now stripped before anything leaves.
The Reader stopped filing errors it can't do anything about.
A tracking script we're required to load on every scripture page throws when you navigate away mid-chapter. Those were being recorded as if they were our bugs, drowning out real ones.
A temporary OpenRouter privacy-policy or provider-availability error no longer spends an extraction attempt or permanently drops a note from the Belief Map.
The job remains queued until an eligible route is available, including when the note is processed in chunks.
Embedding requests now carry the same per-request privacy restrictions as text requests
, and successful extraction clears stale failure details.
A sermon whose knowledge extraction failed now gets another try instead of being dropped for good.
When Selah reads a note into your belief map and something goes wrong — an outage at the model provider, a bad minute on the database — that note used to be retired permanently and silently. Nothing ever went back for it, so its ideas simply never entered your map and nothing said so. Failed notes now rest a few hours and are picked up again.
A provider outage no longer costs a note its chances.
Every failure counted the same, so three bad minutes could retire a good sermon as surely as an unreadable file. Failures the platform caused now get more patience than failures in the content.
One note failing no longer stops every other note that day.
A single error while recording a failure took down the whole run, so notes queued behind it waited, and other background repairs were skipped along with them.
- Tightened Bible and doctrine answer prompts so direct answers lead with the conclusion, distinguish attraction, temptation, and chosen behavior, cite a bounded set of passages, and end with one focused Socratic question when appropriate.
A note no longer drops out of your Belief Map because the AI mislabelled one thing in it.
One bad label used to throw away every concept and connection found alongside it. Selah would try twice more, then give up on that note for good — it stayed out of your map with nothing to show you why. Now the good parts are kept and only the mislabelled item is dropped.
Changed
Selah now talks to one AI provider instead of two.
The old direct-to-Anthropic path is gone. It was never a live backup — switching to it needed a redeploy either way — and keeping two paths meant the unused one hid a real outage in the used one.
Added
- OpenRouter is now the primary gateway for Companion, knowledge processing, summaries, titles, embeddings, and transcription, with task-specific Luna, Terra, and Sol routing.
- Added metadata-only AI observability across PostHog, Sentry, Vercel, and the local usage ledger, including model, feature, latency, token, trace, and error tracking.
- Added OpenRouter privacy/provider restrictions and documented the gateway, rollback paths, and consent-based future evaluation corpus in the project TODOs.
The reading plan screen is new.
Added
The reading plan screen is new.
Tap your active plan to see this week at a glance — a row of day markers showing what you read and what you missed, your overall progress, and a list of recent passages that open straight to the Reader. A calendar tab shows the full month.
Falling behind on your plan now shows what to do, not a blank week.
When you've missed days, Selah shows how far behind you are and the readings you need to catch up — instead of leaving the current week empty.
The Journal is now a day-book timeline.
Each day gets its own header — Today, Yesterday, then weekday names with the date. Captures show as plain text with a gold verse tag when they carry a reference. Notes keep their titled card with a preview. Prayers, conversations, and devotionals appear as tally lines so what you actually wrote stays in view.
Fixed
Thoughts captured during a Selah conversation now stay in that conversation.
Captures were landing loose in the main feed even when you were mid-chat. Each save now lands in the thread it came from — on the web, in Telegram, and in the app.
The Reader no longer crashes when you open it.
A bug caused it to fail on every visit. It opens cleanly now.
The app stays readable on phones in dark mode.
Native chrome could go dark while app text stayed near-black, making it hard to read. The app now holds its light theme regardless of system setting.
Swiping away a companion message receipt now follows your finger
and springs back if you let go early. Before, it dismissed instantly with no animation.
- A finished reading plan no longer shows "0 of 0 days" on the Journal card.
- A plan card no longer shows two different "behind" counts at once.
Times in the Journal timeline no longer wrap to two lines.
AM/PM was also removed — just the hour and minute.
- A note row in the Journal now says "NOTE", not the name of the folder it's in.
The roadmap page now shows what's actually on the board.
Fixed
The roadmap page now shows what's actually on the board.
It was serving a snapshot taken before there was anything to show, so the page read "nothing here yet" while the roadmap already had cards on it. It reads the board on every visit now, so a change made in the admin shows up straight away.
A release cut on the same day as another could quietly fail to appear on the changelog.
Two entries sharing a date confused the page into treating them as the same entry. Both show now.
Added
A roadmap you can actually see.
What's coming is now on one board, kept current from inside Selah rather than mirrored out of a separate tracker. Backlog, Planned, In progress, Shipped — and new ideas, including things people ask for in support, go straight onto it.
Changed
The docs, the changelog, and the roadmap are one place now.
They used to look like three different sites; moving between them meant the page changed shape underneath you. Same sidebar, same header, same reading experience across all three.
The changelog page lost its banner and gained a home.
The sign-up link that lived in it now sits in the shared sidebar, so it's there on every page rather than just that one.