Two things are already truer than the demo shows. (1) oll-memory (PR #80, unmerged) already does PDF ingest, hybrid retrieval, ACL scoping, delete, and structured extraction — so half the "premium" roadmap is wiring, not building. (2) The real work is correctness plumbing — stable doc-ids, a relevance floor, retries, and routing generation through the one server that owns entitlement — because a writing tool whose citations can be wrong is worse than one with fewer features.
Part I — Build-Out (product + platform)
What we found in the code
oll-memory already does more than the sidecar exposes
PR #80 (unmerged) ships capabilities the front end never calls — so several "premium" items are a wiring job, not a new service to build:
| Already in the backend | What it unlocks for oll-write |
|---|---|
| base64 PDF / binary ingest | PDF ingest is frontend + BFF wiring only — the parse/chunk path exists. |
| hybrid dense + keyword (RRF) retrieval | Precision retrieval for both the proactive lane and chat — no re-implementation. |
| ACL-tag scoping | The per-user boundary is enforceable in the service, not just the BFF. |
DELETE-by-document_id | A delete affordance + the upsert story for edited sources. |
schema-locked /api/extract | Structured extraction powers gap-detection, style-profile, and onboarding summaries. |
The real gaps — six risk cards
Stale chunks on edit
document_id is content-hash-derived — edit a source and it hashes differently, so old chunks orphan and linger. In a tool where docs change every save, retrieval slowly fills with stale, contradictory versions. The #1 correctness gap.
No relevance floor → hallucinated citations
query always returns top_k and the prompt pushes the model to answer. A retrieval miss therefore becomes a plausible cited claim with a real-looking source chip. A green citation that points at nothing is worse than no answer.
Memory chat has no retry loop
The editor ops carry a TRANSIENT retry/backoff; memory chat does not. Under Groq 429s, chat fails while the editor recovers — an uneven, demo-breaking reliability seam.
Prod generation is a stub for chat
Chat calls oll-model directly with privacy:"any". So the 70b / Claude dial and metering never reach chat — the exact levers a paid plan sells. The dial is wired for editor ops, not answers.
Per-user scoping is sound but unproven
The BFF pins collection = mem:user:{id} server-side (good design) — but there's no executable cross-tenant test, only a comment. A silent regression could re-open the IDOR and no build would fail.
Drag-to-cite isn't wired
ChunkCards are read-only — the "drag a memory into the draft as a citation" gesture (previously mis-reported as done) doesn't exist yet. The signature trust gesture is still a plan.
Product improvements, prioritized
Tier A — cheap wins that harden demo → product (days)
| # | Improvement | What it fixes | Where it changes |
|---|---|---|---|
| A1 | Stable caller-supplied document_id + upsert + delete affordance | Kills RISK 1 — edits replace, not duplicate. Corpus stays clean. | oll-memory ingest/upsert; BFF ingest route; left-pane delete button. |
| A2 | Relevance floor + honest abstention (3 claim states: grounded / no-source / contradicted) | Kills RISK 2 — a miss says "I don't have this," never invents a citation. | oll-memory service floor; BFF chat compose; chat answer renderer. |
| A3 | Retry / backoff on memory chat (lift the editor's TRANSIENT loop) | Kills RISK 3 — chat survives Groq 429s like the editor does. | BFF handleChat; shared retry util. |
| A4 | PDF ingest — wiring only | Biggest-corpus formats accepted; backend already parses base64 PDF. | Frontend upload accept + BFF ingest passthrough. No backend change. |
| A5 | First-corpus "what I found" onboarding (auto source summary + 3 suggested questions via /api/extract) | Never show an empty sidecar — NotebookLM's highest-leverage move. | BFF onboarding route over /api/extract; left-pane empty-state. |
Tier B — the v2 set as concrete builds (1–2 weeks)
| # | Build | The discipline that makes it trustworthy | Where it changes |
|---|---|---|---|
| B6 | Inline citation Plate node | Mirror the repo's mention-kit; validate every citation maps to a retrieved chunk before render — no orphan chips. | Plate node/plugin; BFF citation validation. |
| B7 | Draft-from-bullets | Outline → per-section retrieval constrained to that section's chunks → generate. Grounding is scoped, not global. | new write-service /api/write/draft-grounded; editor outline UI. |
| B8 | Gap-chips | Decompose draft into claims via /api/extract, classify entailed / neutral / contradicted, calibrate by importance × gap to avoid alarm fatigue. Model on the repo's margin-layer. | BFF gap route; margin-layer render. |
| B9 | Voice / style profile ("learn my voice") | Extract a style spec from the corpus, inject into every op. A reusable primitive humaniz can share. | write-service style-extract; op prompt assembly. |
| B10 | Streaming | write-service already has SSE rewrite — extend to chat + long ops so answers arrive token-by-token. | write-service SSE; BFF stream passthrough; chat renderer. |
| B11 | 70b-for-chat dial | Route chat through write-service so the Groq ↔ Claude / 70b toggle finally reaches answers, not just edits. | write-service /grounded-chat; BFF handleChat. |
| B12 | Folder-sync / incremental ingest | Lower priority — retention plumbing, not a wedge. Powers the Rung-4 second-brain expansion. | a sync worker + incremental upsert. |
Service-quality essentials — do alongside
Retrieval precision
Shallow beats deep. Answer quality peaks at ~2 strong sources; deeper retrieval adds citation noise, not accuracy. Tune for precision, cap the source count.
Citations everywhere
Click-to-quote on every claim, and abstention as a first-class state — "no source for this" is a valid, visible answer, not a failure to hide.
Export-to-Markdown-with-citations
Retention and the answer to "is my corpus trapped?" — the objection NotebookLM, Notion and Craft all leave open. Own it: your notes and your citations walk out as plain .md.
Copy vs avoid
COPY — NotebookLM's auto source-guide + click-to-passage + ground-only prompt; Sudowrite's typed context cards + generate-then-refine chain + isolated style field; Notion's permission-aware retrieval (we already have it); Craft's chrome-kill focus + clean export.
AVOID — silent index failures; credit/metering anxiety that punishes feeding the corpus (meter generously — feeding is the value); stale-content contamination (add recency weighting); and treating a green citation as correctness — it's checkable, not correct. A citation says "here's the source," never "this is true."
Supporting oll-am platform changes
1 · oll-memory hardening
- Caller-supplied stable
document_id+ upsert-by-id — the fix for RISK 1, in the service. - Embed-dim / provider guard — a
nomic→other swap silently corrupts similarity. Add a boot check + a per-collection stamped dimension, so a mismatched embedder refuses to start rather than returning garbage. - Executable cross-tenant scoping test — build-failing (the house executable-arch-rules pattern), closing RISK 5.
- Service-level relevance floor — so every caller (not just oll-write) gets honest abstention for free.
- Chunk-count caps + a
top_kceiling, and prove the PDF path end-to-end.
2 · Deployment
Merge PR #80 through green CI → stand up oll-memory as its own Coolify app (Base Directory /services/oll-memory, Watch Paths, $PORT, X-Service-Token, alias oll-memory) + a private Neon oll_memory DB (pgvector, per ADR-008) + Ollama running nomic-embed-text (EMBED_PROVIDER=ollama, EMBED_DIM=768). The local hashed provider stays the CI / dev default so the pipeline needs no model download.
3 · Route generation through write-service in prod
Add POST /api/write/grounded-chat (and /draft-grounded) to oll-write's write-service. It verifies the Core JWT + plan, calls oll-memory /query, assembles the grounded prompt, generates via oll-model with the entitlement-appropriate model (Groq-8b free / 70b / Claude pro), applies metering + retry, and returns {answer, citations}. Then the BFF handleChat calls write-service instead of holding the oll-model token.
Reusable primitives — what each hardening banks
| Primitive | Where it lives | What else it unlocks |
|---|---|---|
| Context-assembly | write-service grounded-chat | specview docs Q&A · a support bot over any product's help corpus. |
| Multi-tenant memory | oll-memory + the scoping test | "chat with your docs" for any oll.am product, drop-in. |
| Citation / provenance | BFF validation + Plate node | auditable, source-linked answers everywhere. |
| Structured extraction | /api/extract | gap-chips · style-profile · braindump→spec · a standalone data-extraction product. |
| Style / voice profile | write-service style-extract | humaniz "sound like me" — the honest personalization lever. |
| Folder / incremental ingestion | sync worker (Rung 4) | a "connect your Drive / Obsidian" second-brain product on the same stack. |
Sequenced build-out roadmap
Make it real in prod
Merge #80 → deploy (Coolify + Neon oll_memory + Ollama nomic) → route memory chat through write-service /grounded-chat (entitlement + model dial + metering + retry).
Trustworthy & correct
Stable document_id + upsert + delete · relevance floor + honest abstention · inline citation node with pre-render validation · executable cross-tenant test.
Onboarding & the chargeable hook
First-corpus "what I found" · PDF ingest wiring · export-with-citations · gate the 70b / Claude dial + grounded chat behind the CHF 9 Pro plan (usage-meter-paywall).
Ship: the oll-write dollar.Compounding v2 (each also a primitive)
Voice / style profile · draft-from-bullets · gap-chips · streaming.
Ship: the differentiated writing studio + 3 reusable primitives banked.Power-user / second-brain expansion
Folder-sync + package multi-tenant-memory + folder-ingestion so a new "chat with your Drive" product is a thin frontend on the same stack.
Ship: a second product born from oll-write's own plumbing.Part II — Go-To-Market (who + where)
Segment priority — pain × reachability
| Segment | Why here | The wedge | |
|---|---|---|---|
| 1 | Researchers / academics PhDs + PKM / Obsidian power users | Best fit. The private "chat over my own notes / PDFs" conversation already happens around Obsidian Smart Connections — we're the missing writing half. | The editor that reads your own library while you write it up. |
| 2 | Authors / ghostwriters | Highest emotional pull post-Sudowrite / NaNoWriMo privacy backlash — but the most anti-AI / anti-promo rooms. Lead privacy-first, never "AI writing." | Your manuscript never leaves your computer. |
| 3 | Solo lawyers + grant writers | Narrower, highest willingness-to-pay, cleanest confidentiality story — on-device is a professional-responsibility argument. | A drafting aid you stay responsible for; nothing uploaded. |
| 4 | Consultants / agencies | Good pain (re-deriving decks from a scattered Drive), noisier — but strong paid-Slack targets to reach directly. | Re-derive the proposal from everything you've already written. |
Where each segment gathers
| Segment | Named communities |
|---|---|
| Academics / PKM | r/PhD · r/GradSchool · r/AskAcademia · r/ObsidianMD · r/Zotero · r/AcademicWriting · Obsidian Forum "Share & showcase" + Discord (highest-fit) · Zotero Forums · Ness Labs · academic Bluesky starter packs · scholar.social / fediscience Mastodon · newsletters PKM Weekly · Ness Labs · The Effortless Academic. Earn into Obsidian Smart Connections users — complement, don't attack. |
| Authors / ghostwriters | r/selfpublish (best) · r/worldbuilding · r/fantasywriters · r/pubtips · r/KDP · Literature & Latte / Scrivener forum · KBoards · Sudowrite & NovelCrafter Discords (the BYOK / local-Ollama crowd) · Facebook 20BooksTo50K · Association of Ghostwriters · reviewers ALLi · Indie Author Magazine · Written Word Media. |
| Grant writers + lawyers | r/grantwriting · r/nonprofit · GPA / GrantZone · Learn Grant Writing · Freelance Grant Writers' Network (FB) · r/Lawyertalk · r/LawFirm · ABA GPSolo + SoloSez listserv · Lawyerist LAB · Legal.io Slack · LawyerSmack. |
| Consultants / agencies | r/consulting · r/managementconsulting · r/copywriting · paid Slacks Fractionals United (best fit) · The Copywriter Club · Superpath · Online Geniuses · Umbrex · IMC USA. |
6 reachable personas
Priya — 3rd-year PhD
- Pain
- Lit review from a 150-PDF Zotero library; won't paste unpublished work into a cloud tool.
- oll-write value
- Ingest the whole library, write the review with related passages surfaced as she types, every claim cited to a PDF.
- Where
- r/PhD · r/Zotero · Obsidian Discord.
"Draft your lit review with your library as live context — the PDFs are embedded on your machine, nothing's uploaded."
Marcus — postdoc, Obsidian
- Pain
- Has a local-RAG stack (Smart Connections) but no real writing surface on top of it.
- oll-write value
- The missing writing half — a proper editor that reads the same private vault.
- Where
- r/ObsidianMD · Obsidian Forum · PKM Weekly.
"You already retrieve locally — here's the editor that writes from it. Complements your vault, doesn't replace it."
Maya — series author
- Pain
- Continuity anxiety across a long series; won't upload the manuscript after the Sudowrite scare.
- oll-write value
- Ingest the whole series, ask "did I change the captain's eye colour?", write forward with canon on hand.
- Where
- r/fantasywriters · NovelCrafter Discord · 20BooksTo50K.
"A continuity check that never uploads your manuscript — the index lives on your disk."
Daniel — book ghostwriter
- Pain
- Hours of NDA'd client interview transcripts; cloud AI is contractually off-limits.
- oll-write value
- Ground each chapter in the transcripts, cite the exact quote, keep it all local.
- Where
- Association of Ghostwriters · r/selfpublish.
"Write the chapter from the interviews — cited to the transcript, and the transcript never leaves your laptop."
Maria — freelance grants
- Pain
- 5–8 clients; reuses winning-proposal language, some embargoed; can't pool it in a shared cloud tool.
- oll-write value
- A private corpus of past wins; draft new proposals that reuse the language that landed.
- Where
- r/grantwriting · Freelance Grant Writers' Network · Learn Grant Writing.
"Reuse the language that won — from your own archive, kept private per client."
David — transactional lawyer
- Pain
- A precedent library unsearchable by meaning; ethics rule out upload / training.
- oll-write value
- Semantic search + drafting over his own precedents, on-device, with citations he can verify.
- Where
- SoloSez listserv · ABA GPSolo · r/LawFirm.
"Draft from your own precedent library, searchable by meaning — on-device, you stay responsible for every line."
Launch / submission targets
- Show HN — an honest, plain title (no marketing copy). The first real test with a claim-inspecting crowd.
- Free lasting boards — Uneed · MicroLaunch · Fazier · Peerlist.
- Pay-once directories — NoSubscription.org · Buy Once Software · Pay Once Alternatives · PayOnceApps · the recurring HN "buy once" threads. This is our home turf: "pay once" is the positioning.
- Evergreen SEO — SaaSHub · Launching Next · BetaList.
- AI directories — There's An AI For That · Toolify · Futurepedia.
- GitHub PRs — awesome-pkm · awesome-ai-tools.
- Authentic community posts — r/SideProject · r/ObsidianMD · Indie Hackers · #buildinpublic.
- Newsletter pitches — Ben's Bites · Recomendo / Cool Tools · TLDR AI.
- Product Hunt — last, after banking social proof from the steps above.
8 demo use cases
PhD lit review
Ghostwriter chapter
Series continuity check
Grant reuse
Lawyer precedent draft
Consultant proposal
PKM writing surface
Agency brand voice
Honest outreach angles
Academics / PKM
Answer real "chat with my PDFs privately" threads; disclose authorship; complement Smart Connections; show the local-embeddings architecture — this crowd inspects claims.
Authors
Lead "your manuscript never leaves your computer", never "AI writing." Ride the Sudowrite / NaNoWriMo distrust with a factual local-embeddings post.
Grant writers
Share a real "reuse winning language" workflow — a genuinely useful post, product mentioned in passing.
Lawyers
Professional-responsibility framing; never imply any bypass of review or duty — a drafting aid the lawyer stays responsible for.
Consultants
Participate-first in paid Slacks; offer a lifetime / free tier via the deals channel where those rooms expect it.
oll-write — Build-Out & Go-To-Market · propose-only · 2026-07-05. Grounded in the feature docs (what ships today), the product thesis (the empty market cell), and the integration plan (how memory welds in). Feeds Backlog + Strategy.
Honest sequencing: the humaniz.me first franc stays P0; oll-write's own chargeable rung (Rung 2) precedes the exotic features (Rungs 3–4). A real editor where your private corpus is live context — indexing on-device, pay once.