Reproducer (2026-04-29 dentist appointment): user said "this Friday, I have an appointment" with no other details. The model immediately called create_event with title="Appointment", description="User mentioned an appointment this Friday but hasn't provided details yet.", all_day=true. THEN it asked the user for time/location in its reply. When the user came back with "8am at my dentist for permanent crown fitting", the model called update_event — but never updated the title, leaving the placeholder "Appointment" in the calendar permanently. The bug isn't about the tool surface, it's that the model created an event before it had real content. The system prompt had no rule against this, so the model hedged: "log a placeholder, ask for details, then update". That pattern pollutes the calendar with garbage titles and forces immediate update_event calls. create_event tool description now includes an explicit anti-pattern: record a moment, ask for the missing pieces, and only call create_event once you have actual title + time + location. Stand-in titles like "Appointment" / "Meeting" / "Event" with "details TBD" descriptions are explicitly named as the failure mode. Pure prompt change. 18 tests pass; ruff clean. Co-Authored-By: Claude Opus 4.7 <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.