Build · rw-projects

Global Ghostreader

Overview
Current Owner
@piotr
Stage
Build
Time in Stage
29d
Slack Channel
Stage Timeline
Backlog
2025-12-16 · @tristan
Shape
2025-12-16 · @kris
Build
2026-03-18 · @piotr
Expedite
Ship
Learn
Done
Stage Documents
motivation.md Motivation

Global Ghostreader — Motivation

Ghostreader has always been scoped to a single document — you highlight a passage, and the AI responds in that document's context. But Reader users accumulate hundreds of documents with thousands of highlights, and there's no way to ask questions that span that entire library.

Global Ghostreader is an agentic chat interface that searches across a user's full Reader library, synthesizes multi-document answers, and links back to source passages. It turns Reader from a place where you store highlights into a place where you can think with them.

From the original brainstorm (Dec 2025):

All of your research, in one place. All at your fingertips. Build up a corpus of knowledge you'll always have at your fingertips. Too much to read, not enough time? Ghostreader will help you always stay on top of everything you want to read.

Why now:

  1. Users have been asking for "chat with my library" for over a year — doc-level chat has been a top request, and global chat is the natural extension
  2. Turbopuffer indexing is ready — per-user namespace vector search, hybrid search across all documents, population + JIT indexing are built
  3. Strategic differentiation — this moves Reader from a read-later app to a knowledge tool, which is core to the refounding thesis
shape.md Shape Deliverable

Global Ghostreader — Shape

Definition of done

Users can open a full-page chat from the left nav that searches across their entire Reader library, synthesizes multi-document answers with source attribution, and links back to source documents. Document-level chat also upgraded with the same agentic capabilities. Conversation history persists with warm/cold logic.

Key design decisions

  • All chats are the same — no distinction between "global" and "document" chats. Context is fluid based on where the user is. The LLM decides what to "consider" (single doc vs. all docs) dynamically based on where the user is and what they ask.
  • Default to new chats — chat is a tool (like Spotlight), not an ongoing relationship.
  • Warm/cold orbit system — locations store a reference to their most recent conversation, expires after ~7 days of inactivity.
  • Unified link style — dashed underline for all references, with source pills at end of responses. Links in Reader should be more prominent than ChatGPT/Perplexity because clicking them is core to the value prop.
  • Blank slate varies by surface — global gets recent chats + prompt categories; doc-level stays minimal.

Scope (Milestones)

M1 ──→ M2 ──→ M3
 │
 ├───→ M4 ──→ M5
 │
 └───→ M6
  • M1: Basic global chat (staff-only) — full-page chat, model picker, source attribution, thinking states
  • M2: Agentic loop + cheaper model — multi-tool-call loop, search strategies, source diversification
  • M3: Document-level agentic loop — sidebar chat with current doc as priority context, "Add to Doc Note", preset prompts
  • M4: Conversation history + warm/cold — command palette, orbit logic, auto-naming, cross-platform sync
  • M5: Global chat page UI — blank slate with ghost mascot, doc count, 5 prompt categories (Find/Learn/Research/Catch Up/Recommend)
  • M6: Preset prompts → skills refactor

Infrastructure (already built)

Turbopuffer per-user namespace, hybrid search, WebSocket chat service, conversation model, document/highlight tools.

Out of scope

  • Mobile (separate RFD by Kris)
  • Bookwise implications (needs separate decisions)

Appetite

Large — 6 milestones spanning multiple months. M1-M3 are the core agentic experience; M4-M6 are polish and architecture.

build.md Build Deliverable

Global Ghostreader — Build (WIP)

This document is underway while the project is in Build. It will be finalized when the stage completes.

Entered Build: 2026-03-18 · Owner: @piotr · Initiative: rw-projects

Goal

Ship a full-page global chat and upgraded document-level chat in Reader web, following the M1–M6 milestone plan from Shape.

What's been built

M1: Basic global chat (staff-only)

  • Full-page chat surface with model picker, source attribution, thinking states
  • Agentic tool-calling loop with full-library search via Turbopuffer
  • Backend deployed staff-only (merged ~2026-03-23)

M2: Agentic loop + cheaper model

  • Multi-tool-call loop, search strategies, source diversification
  • Agentic tool abstraction, list_documents tool
  • Merged ~2026-03-30

M3: Document-level chat panel

  • Sidebar chat with current doc as priority context
  • PR opened ~2026-03-30, doc-level shipping first before global

M4: Conversation history + warm/cold (in progress)

  • PR #8843: Feature flag + cold-state conversations card
  • Auto-orbit logic, cross-platform sync

M5: UI polish (in progress)

  • PR #8850: Title generation + picker style tweaks
  • Auto-naming conversations

M6: Preset prompts → skills refactor

  • Not yet started

What's in progress

  • Feature flag rollout for broader staff/beta testing
  • Cold-state UI for conversation history
  • Title generation and model picker polish

What's not done yet

  • M5 blank slate with ghost mascot and prompt categories
  • M6 skills refactor
  • Mobile (separate RFD, out of scope for this Build)
  • Bookwise implications (separate decisions needed)

Open Questions (for Expedite)

  • "Global ghostreader" naming — team questioning whether this is the right user-facing name
  • Evals strategy — how to measure quality of agentic responses at scale
  • Doc-level vs global launch sequencing — doc-level shipping first, global later
  • Resize handle for chat panel deferred until global launches
Daily Digests 12
2026-04-15 Daily Digest

Global Ghostreader — 2026-04-15

Stage: Build | Owner: @piotr

Activity

  • @piotr opened PR #8843: "Add Use Global Ghostreader feature flag and cold-state conversations card" — feature flag for broader rollout, cold-state UI showing conversation history.
  • @piotr opened PR #8850: "Global Ghostreader: title generation + picker style tweaks" — auto-naming conversations and UI polish on the model picker.
  • These PRs advance M4 (conversation history + warm/cold) and M5 (UI polish) work.
  • Project backfilled into Rails from GitHub, Slack, and Notion history.
2026-04-13 Daily Digest

Global Ghostreader — 2026-04-13

Stage: Build | Owner: @piotr

Activity

  • Web Product Milestones doc updated with M1-M6 breakdown and dependency graph.
  • Discussion about evals/testing: want ability to flag broken chats and create evals from them, plug in different models and score.
  • @piotr adding new tools to the agentic system; deploys will break current staff-only v2 (accepted tradeoff).
  • Agent loop tool limit of 10-11 confirmed as good, no change needed.
  • @dan noted "global ghostreader" is a confusing name.
  • @tristan wants to use RAILS with @piotr for this project going forward.
  • Dedicated #rp-global-ghostreader-web channel created (Apr 12).

Open questions

  • Naming: "global ghostreader" confusing per @dan
  • Evals framework design TBD
  • Write tool permissions placement (top of preferences page)
2026-04-02 Daily Digest

Global Ghostreader — 2026-04-02

Stage: Build | Owner: @piotr

Activity

  • Design scope clarification in Slack: doc-level chat ships first, global comes later.
  • @tristan: "doc level first for sure... we've been promising chat with doc for like over a year now... i am not blocking it on us perfecting global chat."
  • Resize handle decision: no handle for doc-level chat, handle added once global ghostreader launches (@kris).

Key decisions

  • Doc-level chat ships before global chat
  • No resize handle until global launches
2026-03-30 Daily Digest

Global Ghostreader — 2026-03-30

Stage: Build | Owner: @piotr

Activity

  • M2 agentic tooling PR merged.
  • @piotr opened M3 PR (#8686): document-level chat panel — right sidebar chat activated from global chat, preset prompts dropdown with context-sensitive switching (document/passage/word-level), V1 Jinja template pipeline.
  • @piotr deployed Ghostreader v2 backend as staff-only; backward compat intentionally not preserved.
  • @eleanor flagged possible Ghostreader response degradation regression.
2026-03-23 Daily Digest

Global Ghostreader — 2026-03-23

Stage: Build | Owner: @piotr

Activity

  • M1 foundation PR merged.
  • Same day: @piotr opened M2 PR — agentic tool abstraction with AgenticTool base class (Pydantic validation), list_documents tool for browsing by category/location/tag/recency, cycling status labels (thinking/searching/composing).
2026-03-18 Daily Digest

Global Ghostreader — 2026-03-18

Stage: Shape → Build | Owner: @kris → @piotr

Activity

  • Entered Build. @piotr opened first PR: "Reader — Global Ghostreader Chat."
  • Foundation: agentic tool-calling loop that searches across entire Reader library, synthesizes multi-document answers, links back to source passages.
  • Full-page chat accessible from left nav, model picker, source attribution with inline links and source pills.

Key decisions

  • Build ownership transferred to @piotr
  • M1 (basic global chat, staff-only) is the first milestone target
2026-02-18 Daily Digest

Global Ghostreader — 2026-02-18

Stage: Shape | Owner: @kris

Activity

  • Testing Round 2: tested @artem's updated mobile build with OTAs.
  • UI polish feedback: grab handle height, background behind input, border/shadow of panel, swipe-to-dismiss jump when presets disappear, header bg should match transcript, half-height should match initial height, long input wrapping (model picker should wrap below, send button anchored to bottom).
  • GG Spec finalized with warm/cold logic, orbit system, all surface behaviors (mobile global, mobile doc, desktop global, desktop doc), and shared behaviors.
2026-02-04 Daily Digest

Global Ghostreader — 2026-02-04

Stage: Shape | Owner: @kris

Activity

  • Testing Round 1: @kris and @tristan tested @artem's mobile build (v7.99.179).
  • @kris filed UI issues: input top-aligned on first doc tap, full-height sheet should cover buttons, half-height too tall, input bar not anchored during scroll, ordered list wrap weirdness, preset prompt toast should be part of chat response.
  • @tristan filed: "You're offline" error too sensitive, horizontal scrollbar on prompts looks weird, swipe down to half-sheet missing, YouTube-style transitions as inspiration.
  • @kris referenced Craft and Notion for smooth native transition quality.
  • Discussion about building custom native sheet component (hard in React Native, maybe easier in Swift/Kotlin).
2026-02-01 Daily Digest

Global Ghostreader — 2026-02-01

Stage: Shape | Owner: @kris

Activity

  • Global Chat Design Round 1: @kris presented blank slate exploration, unified link style (dashed underline + ↗ for doc links), proposal to unify global and doc chat components.
  • @tristan reframed the problem around two variables: "where" (reading view vs global screen) and "considering" (single doc vs all docs). The LLM should decide "considering" dynamically.
  • This led to the key architectural decision: all chats are the same, context is fluid based on where the user is.
  • @tristan proposed expanding source attribution UI to show scope — e.g. "Searched inside Way of Kings" vs "4 documents referenced, 1,800 searched."

Key decisions

  • Unified chat identity: no distinction between "global" and "document" chats
  • LLM dynamically decides what to consider based on user location and query
  • Shared components across global and doc chat surfaces
2026-01-15 Daily Digest

Global Ghostreader — 2026-01-15

Stage: Shape | Owner: @kris

Activity

  • Design Round 2: @kris iterated on link style (dashed/solid underline treatments) and link behaviors — proposed "3 sources" pill instead of expanding/collapsing inline.
  • Two link behavior options presented: V1 (half-sheet excerpt) vs V2 (navigate directly to doc).
  • @tristan and @dan aligned: uncolored links with up-right arrows for external, minimal source pill, direct snippet navigation (no "tap to scroll" button).
  • Technical constraint flagged: rendering secondary document modal over primary doc may be infeasible.
2025-12-18 Daily Digest

Global Ghostreader — 2025-12-18

Stage: Shape | Owner: @kris

Activity

  • Design Round 1: @kris presented doc-level chat designs via Loom covering UI style (full article vs peek), link style (internal vs external), and document cards (citation vs LLM synopsis).
  • @tristan feedback via Loom: preferred source pills at bottom, exact paragraph excerpts over LLM summaries, and inline links — argued links in Reader should be more prominent than ChatGPT/Perplexity because clicking them is core to the value prop.
2025-12-16 Daily Digest

Global Ghostreader — 2025-12-16

Stage: Backlog → Shape | Owner: @tristan → @kris

Activity

  • "Bashing on Global Ghostreader" brainstorm doc created in Notion.
  • Initial vision: "All of your research, in one place. All at your fingertips. Save everything, then cut through the noise and read only signal across your library."
  • Project moved into shaping with @kris driving design.
DateSummary
2026-04-15 Piotr opened PRs for feature flag + cold-state conversations card, title generation + picker tweaks. Backfilled into Rai...
2026-04-13 Milestones doc updated (M1-M6). Evals discussion. "Global ghostreader" name questioned.
2026-04-02 Doc-level chat ships first, global later. No resize handle until global launches.
2026-03-30 M2 merged. M3 PR opened — document-level chat panel. GR v2 backend deployed staff-only.
2026-03-23 M1 foundation merged. M2 PR opened — agentic tool abstraction, list_documents tool.
2026-03-18 Entered Build. Piotr opened first PR — agentic tool-calling loop, full-library search.
2026-02-18 Testing Round 2: more mobile polish. GG Spec finalized with warm/cold orbit system.
2026-02-04 Testing Round 1: Kris + Tristan tested Artem's mobile build, filed detailed UI feedback.
2026-02-01 Global Chat Round 1: unified chat identity decision — all chats are the same, context is fluid.
2026-01-15 Design Round 2: settled on dashed underlines, source pills, direct snippet navigation.
2025-12-18 Design Round 1: doc-level chat UI, link style, document cards. Tristan feedback via Loom.
2025-12-16 Project kicked off with brainstorm. Moved from Backlog to Shape, @kris driving design.
Linked Documents & Assets