docs: architecture, configuration, development and features describe Scribe as it is today
Milestone 544, step 6217 (follow-up to #1778, which rewrote features.md and api-reference.md in July but left architecture.md and configuration.md alone). - architecture.md, configuration.md, development.md: rewritten against the code. They still described Ollama, chat, SSE generation, voice, project summaries, image caching, Docker secrets that the compose files don't use, a raw-SQL migration convention the migrations no longer follow, a 27-entry migration list, CalVer YY.MM.DD.N tags and the removed infra/ files. - features.md: adds what shipped since July (spikes, claims, moments, rule versions and verification, lessons, reply shapes, snippets and the shape ledger, forge integration, family canon, design systems, retrieval tuning) and corrects the Settings tabs and keyboard shortcuts (g g is the graph). - api-reference.md: adds the endpoints for snippets, lessons, design systems, family canon, platforms, shared areas, retrieval, rule versions, relations and verification, forge connections, webhooks, scheduled backups and the newer plugin hooks. - api-keys-and-mcp.md: Settings tab is "MCP Access"; a plugin install section; the tool-family table matches the tools that exist. - design-system.md: the dated "decisions in progress" changelog (April PR log, chat/journal/calendar surfaces) becomes a short present-tense section; the stored design system is named as the authority. - sso-oauth.md: the app is Scribe, not "Fabled Assistant". - README: feature summary and doc table brought current. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+83
-133
@@ -1,181 +1,131 @@
|
||||
# Features
|
||||
|
||||
Scribe is a self-hosted work system-of-record for software projects, built to be
|
||||
driven by Claude Code. There is **no in-app LLM** — Claude is the sole assistant,
|
||||
reaching Scribe through a built-in MCP endpoint and a bundled Claude Code plugin. The
|
||||
web UI is a clean surface for humans to read and edit the same data.
|
||||
Scribe is a self-hosted system of record for the work you do with Claude Code. Claude records what it learned, decided and built, and that record reaches the next session, so a solution is recalled rather than reinvented. There is no language model inside Scribe: Claude reaches it through the MCP endpoint and the Claude Code plugin, and the web UI is where people read and edit the same records.
|
||||
|
||||
## Notes
|
||||
|
||||
Write in Markdown with a live-preview editor (Tiptap/ProseMirror). Headings, bold,
|
||||
italic, lists, code blocks, and task checklists render inline. A slash-command menu
|
||||
(`/`) inserts common blocks.
|
||||
A Markdown editor (Tiptap) with headings, lists, code blocks and checklists inline, and a `/` menu for blocks.
|
||||
|
||||
- **Wikilinks** — Link notes with `[[Title]]` or `[[Title|Display Text]]`. Clicking
|
||||
navigates to (or auto-creates) the referenced note; the editor suggests existing
|
||||
titles while you type `[[`. Backlinks appear in the note viewer sidebar.
|
||||
- **Tags** — First-class `ARRAY[text]` column with autocomplete. Hierarchical tags
|
||||
(`area/backend`) supported — filtering by `area` matches all `area/*` children.
|
||||
- **Version history** — Every body edit snapshots a version (up to 20 per note).
|
||||
Browse, diff, and restore from the editor's History panel.
|
||||
- **Draft recovery** — In-progress edits persist across page loads and are restored
|
||||
when you reopen a note.
|
||||
- **Convert freely** — Turn a note into a task (sets `status=todo`) or back again.
|
||||
- **Wikilinks**: `[[Title]]` or `[[Title|text]]`, suggested as you type; backlinks show in the viewer.
|
||||
- **Tags**, with autocomplete. Hierarchical tags (`area/backend`) match their parent's filter.
|
||||
- **Version history**: browse, diff and restore earlier versions of a note.
|
||||
- **Draft recovery**: unsaved edits survive a reload.
|
||||
|
||||
## Tasks and Issues
|
||||
## Tasks
|
||||
|
||||
Tasks carry status (`todo` → `in_progress` → `done`/`cancelled`), priority
|
||||
(`none`/`low`/`medium`/`high`), due date, milestone assignment, and a parent task
|
||||
(sub-tasks). Notes and tasks share one model — a task is a note with a status.
|
||||
A task is a note with a status (`todo`, `in_progress`, `done`, `cancelled`), plus priority, due date, milestone and parent task.
|
||||
|
||||
- **Work logs** — Append timestamped progress entries (with optional duration) to a
|
||||
task without rewriting its body; shown chronologically in the task view.
|
||||
- **Issues** — A task whose `kind` is corrective: a problem you fixed or are fixing,
|
||||
with symptom → root cause → fix in the body. An issue can link the task it arose
|
||||
from and the System(s) it touches.
|
||||
- **Recurring tasks** — An interval or calendar recurrence rule spawns the next
|
||||
occurrence when a task is completed (a background job drains due spawns).
|
||||
- **Sub-tasks** — Any task can have children via `parent_id`; the viewer shows them
|
||||
inline.
|
||||
- **Kinds**: `work`; `issue`, for corrective work, which can link the task it arose from; and `spike`, a time-boxed investigation whose output is an answer.
|
||||
- **Work logs**: timestamped entries that record progress without rewriting the body. They are what the next session reads first.
|
||||
- **Claims**: a session that logs on a task holds it, so after a context compaction the work comes back to that session, and other sessions can see who is on it.
|
||||
- **Recurring tasks** spawn their next occurrence on a schedule.
|
||||
|
||||
## Projects and Milestones
|
||||
## Projects, milestones and systems
|
||||
|
||||
- **Projects** — Group related notes and tasks. Title, description, goal, status
|
||||
(`active`/`paused`/`completed`/`archived`), and a colour.
|
||||
- **Milestones** — Ordered stages within a project. A milestone is also the home of a
|
||||
**plan** — its body holds the design (Goal/Approach/Verification) and its child
|
||||
tasks are the steps. Completion percentage is shown on the project page.
|
||||
Milestones are searchable by meaning (`search(content_type="milestone")`), and an
|
||||
agent starting a plan (`start_planning`, `create_milestone`) is handed the active
|
||||
milestone that already has its title or reads as the same plan, so steps are added
|
||||
there rather than to a parallel plan. The match threshold is in Settings.
|
||||
- **Kanban view** — `/projects/:id` groups tasks by milestone in a column layout with
|
||||
status-advance buttons on the cards.
|
||||
- **Projects** carry a goal, a status and a colour, and group everything else. Entering a project gives Claude a short primer: its goal, recent plans and their next steps, open tasks, its systems and its design system.
|
||||
- **Milestones are plans**: a body holding the design (goal, approach, verification) and ordered step tasks. Starting a plan that matches an active milestone hands back that milestone instead of opening a second one.
|
||||
- **Systems** are a project's named areas ("auth", "retrieval"). Records are tagged with them, each has a charter saying what belongs there, and each maps to a canonical area shared across projects.
|
||||
- **Duplicate gates**: creating a record that reads like an existing one returns the existing one to update instead.
|
||||
|
||||
## Systems
|
||||
## Rules, lessons and moments
|
||||
|
||||
A **System** is a per-project, reusable, self-describing subsystem or area (e.g.
|
||||
"auth", "billing"). Associate any note, task, or issue with a System so research,
|
||||
build-work, and fixes for the same area line up and recurring problem-spots surface.
|
||||
- **Rulebooks → topics → rules.** A rule in a rulebook applies in every project; a project rule applies only there. A project that departs from a global rule says so with an `overrides` relation.
|
||||
- **Rules arrive by retrieval.** Nothing is preloaded: a rule reaches a session when what Claude is about to do matches its trigger (`when_to_apply`), whether that's the operator's message, a command or a file being written.
|
||||
- **Moments**: a rule about *when* something is done (finishing a task, reporting back, pushing) can be mounted on a moment of work, and arrives whenever that moment happens, whatever the words look like. Settings → General shows which actions reach each moment.
|
||||
- **Versions and verification**: every edit to a rule keeps the text it replaced. A rule that asserts a fact about someone else's software can say how to check it and when it stops being true, and a sweep lists rules due for a check.
|
||||
- **Preferences** are rules with the force of guidance rather than obligation.
|
||||
- **Lessons** record something learned the hard way, keyed to the situation where it applies, and link to the rules they are instances of.
|
||||
- **Reply shapes**: the default shape of Claude's replies (completion report, plan for review, question) arrives at the moment it applies. Settings → General shows them.
|
||||
|
||||
## Rules and Rulebooks
|
||||
## Snippets and the shape ledger
|
||||
|
||||
Scribe stores the operator's engineering and workflow **rules** so Claude follows them
|
||||
across sessions.
|
||||
- **Snippets** are recorded prior art: a reusable piece of code with when to reach for it, its signature and its canonical location in a repo. Claude searches them before building and is shown matching ones before it writes a file.
|
||||
- **Forge integration**: with a git forge connected, Scribe checks a snippet's cached body against its source and marks it current or diverged. Push webhooks keep that fresh.
|
||||
- **The shape ledger**: Scribe extracts the code shapes from a bound repo and tracks how each is accounted for: an instance of a snippet, a deliberate variant with its reason, or a one-off. Coverage shows what is still unclassified.
|
||||
|
||||
- **Rulebooks → topics → rules** — Rules are grouped by topic inside a rulebook.
|
||||
- **Rules arrive by retrieval** — Nothing is preloaded. A rule reaches a
|
||||
session when what the agent is about to do matches its trigger: a command,
|
||||
a file being written, or the operator's own message. `when_to_apply` is
|
||||
therefore the field that decides whether a rule is ever seen.
|
||||
- **Global or project scope** — A rule in a rulebook is global: it applies in
|
||||
every project. A project rule applies to that project only. Retrieval honours
|
||||
the difference, so a session sees global rules plus its own project's, never
|
||||
another project's. A project that departs from a global rule writes its own
|
||||
and links it with an `overrides` relation.
|
||||
## Family canon
|
||||
|
||||
## Stored Processes
|
||||
Projects on the same platform (Android apps, Go services, ...) share good ideas. An idea promoted to the family's canon reaches every project on that platform, and each answers it: adopted, a variant with its reason, or owed (filed as a task). `/family` shows the ideas and every project's answers.
|
||||
|
||||
Reusable saved prompts (a note with `note_type=process`) — e.g. a drift-audit or a
|
||||
DRY pass. The bundled plugin syncs each Process into a local Claude Code skill stub
|
||||
(`/scribe:sync`) that auto-surfaces by relevance and fetches the live procedure on
|
||||
demand.
|
||||
## Design systems
|
||||
|
||||
## Search and Knowledge Injection
|
||||
Tokens (colour, type, space, motion, ...) and written guidance, with inheritance: a project's design system can extend a house style and record where it departs. Scribe generates a stylesheet from it, checks code snippets against it, and gives Claude the values to use before it writes UI. `/design-systems` edits them.
|
||||
|
||||
- **Semantic search** — pgvector-backed similarity search over notes and tasks
|
||||
(in-process `fastembed` embeddings; no external model).
|
||||
- **Proactive knowledge-injection** — the plugin's `UserPromptSubmit` hook surfaces a
|
||||
short, high-confidence menu of maybe-relevant note *titles* into Claude's context
|
||||
each turn; Claude pulls a full body only when it judges it relevant. Gated so it
|
||||
stays quiet on most turns and never repeats within a session.
|
||||
## Stored processes
|
||||
|
||||
## Knowledge Graph
|
||||
Saved procedures, such as a drift audit or a DRY pass. The plugin syncs each one into a Claude Code skill (`/scribe:sync`), which fetches the live procedure when it is invoked.
|
||||
|
||||
`/graph` renders notes, tasks, and tags as a D3 force-directed graph. Tag nodes
|
||||
cluster notes that share tags; invisible project hubs attract project members. Physics
|
||||
controls (repulsion, link distance/strength, hub pull, gravity); click a node to peek,
|
||||
click a tag to filter.
|
||||
## Search and context injection
|
||||
|
||||
- **Semantic search** over notes, tasks, rules, milestones and systems, with embeddings computed in-process (no external model service). It falls back to keyword search if the embedder is unavailable.
|
||||
- **Context injection**: the plugin's hooks show Claude a short menu of possibly relevant records at the moments they matter: rules and prior art when a prompt arrives, before a command or a file write, and when a moment of work is reached. Claude opens a full record only when it judges it relevant.
|
||||
- **Tuning**: each surface has its own thresholds and budget, in Settings → General. Every change is logged with its reason, and retrieval telemetry shows what was surfaced and what was opened.
|
||||
|
||||
## Claude via MCP and the plugin
|
||||
|
||||
The whole store is reachable by Claude through a built-in **MCP endpoint at `/mcp`**
|
||||
(Bearer-auth with an API key). The **Scribe Claude Code plugin** (shipped in this
|
||||
repo) wires it up:
|
||||
The whole store is reachable through the MCP endpoint at `/mcp`, authenticated with an API key. The Claude Code plugin in this repo adds:
|
||||
|
||||
- a `SessionStart` hook that injects active-project
|
||||
context so Scribe surfaces without being asked (fail-open if Scribe is unreachable);
|
||||
- universal process-skills — writing-plans, systematic-debugging, verification,
|
||||
brainstorming — that route their output into Scribe;
|
||||
- your saved Processes auto-surfaced as skills.
|
||||
- hooks for session start, each prompt, before and after tool calls, the end of a turn, compaction and session end, all failing open if Scribe is unreachable;
|
||||
- skills for the working practices: using Scribe, writing plans, systematic debugging, verification, brainstorming, reporting back, reusing code, shape accounting and family canon;
|
||||
- your stored processes as skills.
|
||||
|
||||
See [API Keys & MCP](api-keys-and-mcp.md).
|
||||
|
||||
## Sharing and Collaboration
|
||||
## The web UI
|
||||
|
||||
- **Share** — Share any project, note, or task with users or groups at
|
||||
`viewer`/`editor`/`admin` levels from the viewer/project toolbar.
|
||||
- **Groups** — Admins create platform-wide groups and assign `member`/`owner` roles;
|
||||
share a resource with a group in one action.
|
||||
- **Shared with me** — `/shared` lists incoming shares with permission badges.
|
||||
- **Notifications** — An in-app bell (unread count, polled) fires when a project or
|
||||
note is shared with you or you're added to a group.
|
||||
- **Dashboard**: what to work on next. **Knowledge** browses everything.
|
||||
- **Graph** (`/graph`): notes, tasks and tags as a force-directed graph, with physics controls and filtering by tag.
|
||||
- **Trash**: deleted records wait here until retention purges them, and can be restored.
|
||||
- **Installable** as a desktop or mobile app.
|
||||
|
||||
Every read and mutation is scoped by owner + direct shares + group shares.
|
||||
## Sharing
|
||||
|
||||
## Data Export and Backup
|
||||
Share a project, note or task with users or groups, as viewer, editor or admin. Admins manage groups. `/shared` lists what has been shared with you, and an in-app bell notifies you of new shares. Every read and write is checked against ownership and shares.
|
||||
|
||||
- **Personal export** — download all your notes/tasks as a Markdown ZIP (YAML
|
||||
frontmatter) or a JSON array.
|
||||
- **Admin backup** — full application backup/restore with ID remapping on
|
||||
restore for cross-instance migration.
|
||||
- **Scheduled backups** — a daily, dated, uncompressed `.tar` to a folder or an
|
||||
S3-compatible bucket, laid out so a deduplicating tool such as restic stores
|
||||
only what changed; `python -m scribe.restore` brings a fresh instance back
|
||||
from one. See [Backups](backups.md).
|
||||
## Export and backup
|
||||
|
||||
## Progressive Web App
|
||||
- **Personal export**: your notes and tasks as a Markdown ZIP (with YAML frontmatter) or JSON.
|
||||
- **Admin backup and restore**, with ids remapped so a backup restores onto another instance.
|
||||
- **Scheduled backups**: a daily, dated, uncompressed tar to a folder or an S3-compatible bucket, laid out so a deduplicating tool such as restic stores only what changed. `python -m scribe.restore` brings a fresh instance back from one. See [Backups](backups.md).
|
||||
|
||||
Installable as a desktop or mobile app; a service worker caches the shell.
|
||||
## Sign-in
|
||||
|
||||
## Authentication
|
||||
|
||||
Native email + password, plus optional **OIDC** sign-in (Authentik, Keycloak, etc.)
|
||||
that links to a matching local account. Invite links, a registration toggle, password
|
||||
reset, and session invalidation are included. See [SSO / OAuth](sso-oauth.md).
|
||||
Email and password, plus optional OIDC single sign-on (Authentik, Keycloak, ...) that links to a matching local account. Invite links, password reset and signing out other sessions are included. See [SSO / OAuth](sso-oauth.md).
|
||||
|
||||
## Settings
|
||||
|
||||
| Tab | Contents |
|
||||
|-----|----------|
|
||||
| General | Instance preferences (key/value) |
|
||||
| Account | Email change, password change, session invalidation |
|
||||
| Profile | Per-user profile fields |
|
||||
| Integrations | SearXNG status |
|
||||
| Data | Personal export; backup / restore and scheduled backups (admin) |
|
||||
| API Keys | Create/revoke `fmcp_` keys for the MCP endpoint |
|
||||
| Config (admin) | Base URL, SMTP, DB-maintenance schedule |
|
||||
| Users (admin) | User list, invite links, registration toggle |
|
||||
| Logs (admin) | Error, audit, and usage logs with search |
|
||||
| Groups (admin) | Create/manage groups and membership |
|
||||
| General | Timezone, trash retention, retrieval thresholds, moments, reply shapes |
|
||||
| Account | Email, password, active sessions |
|
||||
| Profile | About you, response preferences, interests, work schedule |
|
||||
| Notifications | Email notifications |
|
||||
| Integrations | SearXNG, git forge connections |
|
||||
| Data | Export, backup and restore, scheduled backups (admin) |
|
||||
| MCP Access | API keys and the command to connect Claude |
|
||||
| Config (admin) | What's running, application URL, plugin marketplace, database maintenance, SMTP, forge webhook |
|
||||
| Shared areas (admin) | The canonical areas systems map to |
|
||||
| Platforms (admin) | The platform catalogue family canon is grouped by |
|
||||
| Users (admin) | Registration, invites, users |
|
||||
| Logs (admin) | Error, audit and usage logs |
|
||||
| Groups (admin) | Groups and membership |
|
||||
|
||||
## Keyboard Shortcuts
|
||||
## Keyboard shortcuts
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `g` + `h` | Home (dashboard) |
|
||||
| `g` + `n` | Notes |
|
||||
| `g` + `t` | Knowledge (tasks) |
|
||||
| `g` + `p` | Projects |
|
||||
| `g` + `r` | Rulebooks |
|
||||
| `g` (bare) | Graph |
|
||||
| `g` + `x` | Trash |
|
||||
| `g` `h` | Dashboard |
|
||||
| `g` `n` | Notes |
|
||||
| `g` `p` | Projects |
|
||||
| `g` `r` | Rules |
|
||||
| `g` `g` | Graph |
|
||||
| `g` `x` | Trash |
|
||||
| `n` | New note |
|
||||
| `t` | New task |
|
||||
| `e` | Edit the note you're viewing |
|
||||
| `/` | Focus search |
|
||||
| `?` | Show shortcuts panel |
|
||||
| `j` / `k` | Navigate list items |
|
||||
| `Enter` | Open selected item |
|
||||
| `e` | Edit current item |
|
||||
| `Esc` | Close panel / blur / go home (progressive) |
|
||||
| `Ctrl+S` | Save in editor |
|
||||
| `?` | Show shortcuts |
|
||||
| `j` / `k` | Move through a list |
|
||||
| `Enter` | Open the selected item |
|
||||
| `Esc` | Close the overlay, leave the field, then go to the dashboard |
|
||||
| `Ctrl+S` | Save in the editor |
|
||||
|
||||
Reference in New Issue
Block a user