Two related tightenings to the curator's behavior, both driven by user questions about scope (2026-05-23): 1. **Tighten the prompt to extract beats only from User: lines.** The transcript shows each message prefixed with role (User: / Assistant:). The previous prompt instructed the model to capture beats but didn't explicitly forbid using Assistant: content as a source. A small or medium model could read 'It sounds like you had coffee with Sarah' from an Assistant: line and turn it into a moment, even though that's the assistant paraphrasing the user — not a user statement. New prompt explicitly: Only User: lines are journal entries. Assistant: lines are context for disambiguation only. Never create a record from content that appears only in Assistant: text. 2. **Additive-only tool allowlist for the curator.** The curator previously had access to the full journal tool set — including update_*, delete_*, create_event, set_rag_scope, etc. The architecture removed tools from the chat for exactly the reason that confidently-wrong tool calls corrupt user data; the curator faces the same risk async. Filtering the tool list at curator-time keeps the boundary tight even if the system prompt fails to dissuade the model from hallucinated tool names. New _CURATOR_ALLOWED_TOOLS frozenset includes: - Additive primary work: record_moment, create_note (handles both notes and tasks via status), log_work (appends to existing task timeline — additive on its own row), save_person, save_place, create_project, create_milestone. - Read-only helpers needed for entity resolution: search_notes, search_projects, search_journal, list_tasks, list_projects, list_milestones, read_note, get_project, get_profile. Explicitly excluded: every update_*, every delete_*, create_event (calendar events need explicit user intent, not curator inference), set_rag_scope, lookup/research_topic/search_images (different surface entirely). Two-layer enforcement: the system prompt lists what's available and forbids the rest, AND the actual tools list passed to Ollama is filtered to the allowlist. So even if the model hallucinates a forbidden tool name, the call can't fire — execute_tool returns 'Unknown tool: <name>'. Bonus cleanup: _format_transcript now skips system and tool-role messages. They were noise for the curator's task (system prompts are instructions, tool results are JSON from prior calls). The narrowed transcript matches the contract the prompt enforces. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fabled Scribe
A self-hosted second brain and project management application with integrated LLM capabilities. Write, organise, and act on your notes and tasks with the help of a local AI assistant — all running on your own hardware.
Features
Notes and tasks with a Markdown editor, sub-tasks, milestones, and kanban project workspaces. AI chat with streaming responses, RAG over your notes, and tool use (web search, calendar, weather). A daily briefing that digests your tasks, RSS feeds, and weather on a schedule. Knowledge graph, per-user/group sharing, PWA with push notifications, an MCP server for external AI clients, and an Android companion app.
Quick Start
Prerequisites: Docker and Docker Compose. 8 GB+ RAM recommended for LLM inference.
Download docker-compose.quickstart.yml from this repo, then:
# Optional but recommended — set a secret key
export SECRET_KEY=your-random-secret-here
docker compose -f docker-compose.quickstart.yml up -d
Open http://localhost:5000. The first user to register becomes admin. Go to Settings → General to pull an LLM model — qwen3:8b or llama3.1:8b are good starting points.
GPU: Ollama runs CPU-only by default. See the comments in
docker-compose.quickstart.ymlto enable NVIDIA GPU passthrough.
Development: To build from source, see Development.
Documentation
| Doc | Contents |
|---|---|
| Architecture | Stack, design decisions, data models, key services |
| Configuration | Environment variables, Docker Compose, production setup, security |
| Features | Detailed feature breakdown and keyboard shortcuts |
| Development | Dev workflow, CI/CD, migrations, release process |
| API Keys & MCP | API key management and Fable MCP install guide |
| SSO / OAuth | OIDC setup for Authentik, Keycloak, and other providers |
| API Reference | All REST API endpoints |
| Android App | Flutter companion app architecture and feature status |
License
This project is privately maintained.