Files
FabledGrimoire/docs/features.md
T
bvandeusenandClaude Opus 5.5 0f5ef0be63
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 12s
CI & Build / TypeScript typecheck (push) Successful in 56s
CI & Build / integration (push) Successful in 1m4s
CI & Build / Python tests (push) Successful in 1m55s
CI & Build / Build & push image (push) Successful in 44s
rename(547): the server is grimoire — package, image, DB defaults, backups
Step 2 of the Scribe -> Grimoire rename.

- src/scribe -> src/grimoire, and every import, patch target, module path,
  hypercorn entry point and `python -m grimoire.restore` with it; pyproject,
  uv.lock and the frontend package are named grimoire.
- Image git.fabledsword.com/bvandeusen/fabledgrimoire; CI's Postgres service
  runs as grimoire / grimoire_test.
- Compose files default the DB user, database and (prod) volume to grimoire,
  each overridable from .env, so an install created as Scribe keeps its data
  by setting POSTGRES_USER, POSTGRES_DB and PGDATA_VOLUME.
- Backups are written as grimoire-<ts>.tar with format grimoire-backup-tar.
  Archives named scribe-* with the scribe-backup-tar manifest still restore
  and are still counted at the destination (folder and S3), with tests.
- Exports, the MCP auth realm, the ASGI scope key and the persistent logger
  carry the new name.

Kept on purpose: the secret-sealing key label stays "scribe.secrets.v1",
because every stored secret was derived under it.

Plugin identity (plugin name, hooks, env vars, .scribe marker, skills) is
step 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 10:50:45 -04:00

9.0 KiB

Features

Grimoire 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 Grimoire: 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

A Markdown editor (Tiptap) with headings, lists, code blocks and checklists inline, and a / menu for blocks.

  • 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

A task is a note with a status (todo, in_progress, done, cancelled), plus priority, due date, milestone and parent task.

  • 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, milestones and systems

  • 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.

Rules, lessons and moments

  • 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.

Snippets and the shape ledger

  • 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, Grimoire checks a snippet's cached body against its source and marks it current or diverged. Push webhooks keep that fresh.
  • The shape ledger: Grimoire 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.

Family canon

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.

Design systems

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. Grimoire 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.

Stored processes

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.

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 through the MCP endpoint at /mcp, authenticated with an API key. The Claude Code plugin in this repo adds:

  • hooks for session start, each prompt, before and after tool calls, the end of a turn, compaction and session end, all failing open if Grimoire is unreachable;
  • skills for the working practices: using Grimoire, writing plans, systematic debugging, verification, brainstorming, reporting back, reusing code, shape accounting and family canon;
  • your stored processes as skills.

See API Keys & MCP.

The web UI

  • 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.

Sharing

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.

Export and backup

  • 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 grimoire.restore brings a fresh instance back from one. See Backups.

Sign-in

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.

Settings

Tab Contents
General Timezone, trash retention, retrieval thresholds, moments, reply shapes
Account Email, password, active sessions
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

Key Action
g h Dashboard
g n Notes
g t Knowledge (everything, tasks included)
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
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