citebible.oll.am/carry) answers real situations with cited WEB scripture — and after tonight's retrieval-quality tuning (deployed 9ed1d40) the answers are genuinely pastoral: grief → 2 Corinthians 1:4 & the laments; anxiety → Proverbs 12:25 / Matthew 6; hopeless → Psalm 42 / Romans 15:13. The root URL now lands on CiteBible (/ → /carry), and a real SEO front door is built (26 "Scripture for …" pages + a hub). Built, not charging: the Pro "generate a reflection" feature + its fail-closed paywall are wired to the existing platform Pro plan — but checkout won't complete until CiteBible is registered in Core. This is not "a money machine is live." It is "the free door is open and swept; the paid door is built and waiting for your key."Everything below is a Sam-console action — no code, no deploy from me. Do step 1 to make the Pro upgrade actually charge; do step 2 because a credential was exposed overnight; step 3 is when-ready cleanup.
Core (core.oll.am) keeps an allow-list of products that may run its magic-link + checkout flow. CiteBible isn't on it yet, so a Pro upgrade click has nowhere to land. Add one env var and redeploy Core:
Coolify → oll-core app → Environment →
PRODUCT_VERIFY_BASE_CITEBIBLE = https://citebible.oll.am
→ Redeploy
No new Stripe price needed. The plan is the existing platform Pro — STRIPE_PRO_PRICE_ID = price_1TmvlJI5o19D7tAoP1cJgN51 (a monthly subscription, already set on Core). After this redeploy, the upgrade → Core checkout → oll_pro flow works for CiteBible.
During tonight's debugging two credentials were pasted into chat. Treat both as burned. Neither is optional — the Neon password also guards oll_core, and the service token is the one required secret gating oll-memory.
a) Neon neondb_owner password — rotate, then update the connection string on both apps that use it:
Neon console → roles → neondb_owner → reset password
→ update DATABASE_URL on:
· oll-core app (guards oll_core)
· oll-memory app (guards oll_memory)
→ redeploy both
b) OLL_MEMORY_SERVICE_TOKEN — the shared service token between the CiteBible frontend and oll-memory; regenerate and set the same new value on both:
Generate a new random token →
→ set OLL_MEMORY_SERVICE_TOKEN (identical value) on:
· oll-memory app (verifies it)
· CiteBible frontend app (sends it)
→ redeploy both
CiteBible runs as preview deploys off feat branches (unmerged, per the frozen-main guardrail). Nothing here is required to charge — it's the follow-through:
feat/citebible-one-box and the corpus branch feat/bible-verse-reingest to main when you've clicked through them — merging publishes the SEO front door (the 26 /for/{situation} pages + hub) to the public domain.Honest rung per line. "Verified live" = I typed it against the deployed URL tonight. "Built" = code exists and passes locally, but no live proof of the paid outcome yet.
| Thing | Rung | Evidence |
|---|---|---|
Free retrieval — citebible.oll.am/carry, no login, real situation → cited verses |
Verified live | "I feel alone and afraid" → 5 verses + themes fear, feeling abandoned by God, refuge, peace; "grief" → Psalms 42/43/6, James 4. Verse-level, WEB translation, real citations. |
Verse-level Bible corpus on Neon oll_memory |
Verified live | 32,284 nodes = 31,095 verses + 1,189 chapters, migrated via pg_dump (no re-embed). nomic-embed-text on self-hosted oll-ollama. |
| Retrieval quality tuning — the big one: pastoral, not keyword-matched | Verified live · 9ed1d40 |
oll-memory now prefers verse-level hits, applies a vector floor to drop keyword-only noise, and enriches chapters with their best_verse. Result: anxiety → Proverbs 12:25 / Matthew 6; grief → 2 Corinthians 1:4 & the laments; hopeless → Psalm 42 / Romans 15:13. Deployed to the live oll-memory. |
| Still Room — seamless "Read in context" expand (no duplication) | Verified live | Refined design shipped + deployed; expand reads the surrounding passage in place. Now also pins the best verse and expands the chapter in the result display. |
Root landing — citebible.oll.am/ now opens CiteBible |
Verified live | / → /carry 308 redirect; the bare domain lands on the product instead of a stray index. |
| Input UX — bigger multi-line box + starter chips + cleaner refs | Live (preview) | P0 reference fix + prefix strip (no more malformed locators), a larger multi-line input, one-tap starter chips, and a tighter theme rewrite so the step-back query stays on the situation. |
| SEO front door — the honest, free, cited-scripture landing surface | Built · publishes on merge | Title / description / OG / JSON-LD / robots / sitemap on /carry, plus 26 programmatic "Scripture for {situation}" pages at /for/{slug} and a /for hub — each with grounded, cited verses + per-page JSON-LD; 28-URL sitemap. Goes to the public front door when the branch merges (step 3). |
| Pro generation — write a grounded reflection FROM the verses | Built · fail-closed · gate wired | Feature + paywall-on-CREATE built on the frontend branch, fail-closed (no entitlement ⇒ no generation); checkout needs Core ignition (step 1). Does not charge yet — do not claim revenue. |
Pro entitlement — the platform oll_pro monthly plan |
Reused · not wired to CiteBible | STRIPE_PRO_PRICE_ID already exists on Core; no new/one-time price. Becomes reachable from CiteBible only after step 1. |
The whole design turns on one honest line: retrieval is free forever, generation is Pro. Searching scripture for your situation costs nothing and needs no login — that's the SEO front door and the honest gift. Asking the engine to write a grounded reflection from those verses is the paid act, gated behind the existing platform Pro. The paywall sits on the Create button, never on Search.
oll_proThe honest story: CiteBible didn't come up on the first try. Three separate integration faults each looked like "the corpus is empty" but had distinct root causes. Naming them teaches the shape of a cross-service bug — the symptom is always downstream of the break.
| Symptom | Root cause | Fix |
|---|---|---|
| CiteBible frontend → oll-memory returned 401 / rejected | Service-token mismatch — the frontend and oll-memory were carrying different OLL_MEMORY_SERVICE_TOKEN values across the shared coolify network. |
Set one shared secret on both apps; token now baked as the only required secret (min-env defaults for the rest). |
| oll-memory booted but every query came back empty | DATABASE_URL pointed at the wrong Neon database — not the one holding the verse corpus, so retrieval had nothing to rank. |
Repointed DATABASE_URL to oll_memory (the DB carrying the 32,284 verse/chapter nodes). |
| Retrieval ran but rankings were noise — irrelevant verses on top | Embedder mismatch — the query was being embedded with a different model than the corpus was ingested with, so vectors lived in different spaces. | Aligned both sides on nomic-embed-text via self-hosted oll-ollama; corpus migrated by pg_dump so vectors were preserved, no re-embed. |
With all three wires corrected, the chain came up green end-to-end: CiteBible frontend → oll-memory (retrieval) → oll-ollama (nomic embeddings) + Neon oll_memory (verse corpus) → oll-model (step-back theme rewrite). The theme rewrite is what turns "grief" into the retrieval themes you saw — a step-back query expansion through the frozen Model gateway.
Bringing the chain up only got a verse back. The harder, more valuable work was making the right verse come back — the one a person in that situation actually needs, not the one that shares a keyword. That's the retrieval-quality tuning deployed tonight (9ed1d40).
Three changes, all inside oll-memory, all live:
citebible.oll.amfeat/citebible-one-box · the one-box /carry UI + Still Roomoll-memory:5008 · memory.oll.amfeat/bible-verse-reingestoll-ollama:11434oll_memoryoll-model:5003All on the Hetzner VPS (Coolify), shared coolify Docker network. Min-env baked as defaults — the only secrets needed are OLL_MEMORY_SERVICE_TOKEN and DATABASE_URL. This mirrors the platform pattern: a thin product frontend over a reusable Core/Model/Memory backend, integrating over HTTP only.
The overnight board is fully cleared. Honest rung on each line.
| Task | Shipped | Rung |
|---|---|---|
| Integration / bring-up | Diagnosed + fixed the three wires (token · DB URL · embedder); brought CiteBible up end-to-end and verified real answers against the live URL. | Verified live |
| Retrieval quality tuning — the big one | oll-memory now prefers verse-level, applies a vector floor to drop keyword-only noise, and enriches chapters with their best_verse — so grief / anxiety / hopeless return genuinely pastoral scripture. | Deployed 9ed1d40 |
| Input & refs | P0 reference fix + prefix strip (no malformed locators), bigger multi-line input, starter chips, tighter theme rewrite. | Live (preview) |
| Result display | Pin the best verse + expand the chapter in place; root / → /carry 308 redirect so the bare domain lands on CiteBible. | Live |
| Styling | Refined Still Room — seamless "Read in context" expand with no duplication; deployed. | Live |
| Pro generation | Built the "write a reflection from the verses" feature + wired a fail-closed paywall on CREATE to the existing platform Pro plan. | Built · fail-closed · checkout needs Core ignition |
| SEO front door | Title / description / OG / JSON-LD / robots / sitemap; 26 programmatic "Scripture for {situation}" pages at /for/{slug} + a /for hub, each with grounded cited verses + per-page JSON-LD; 28-URL sitemap. | Built · publishes on merge |
| Diagram accuracy | Fixed the platform extension-layer diagram (sibling C4 language); drew the oll-core reuse so CiteBible reads correctly on the architecture page. | Merged to main |
| Build-in-public share kit | Drafted the launch/share kit for CiteBible — copy for the distribution push once the branches merge. | Draft · not posted |
| This handover | The honest final digest + the unchanged ignition checklist; state + timeline updated. | This page |
9ed1d40) · SEO engine + Pro-generation built, awaiting Core ignition