A self-hosted workspace that unifies tasks, calendar, notes, and mail around shared Spaces — with AI-powered capture everywhere and automatic scheduling. Built for ADHD workflows: one page, one header, everything reachable in as few clicks (or keystrokes) as possible.
- Tasks — kanban board home (
todo / doing / blocked / done), space filter chips, drag between columns, inline create; grouped-by-space overview (with a show-done toggle, most recently finished first) as the secondary view - Notes — space-scoped markdown capture (full EasyMDE toolbar) with AI "Cleanify", promote-selection-to-task, copy-raw-markdown, and public read-only sharing (a revocable
/n/<token>link that always serves the note's latest version) - Mail — register IMAP inboxes (passwords encrypted at rest), browse live, click to read, right-click an email → AI-drafted task
- Calendar — AI-parsed tasks auto-scheduled around your external ICS calendars and per-space time windows; drag to reschedule (and freeze)
- Spaces — manage your contexts (work / study / …) with per-weekday scheduling windows and a per-space AI context markdown that guides every AI task creation (guide, not source — never copied into tasks)
- Quick capture — paste anything into the header input from any view; the LLM turns it into structured tasks
- Assistant — embedded Chainlit chat (tab 6) with history, model picker, slash commands injecting tasks/notes, space-filter chips, skills, web search, and agentic tools: Simpler's MCP (audited writes) + an isolated execution sandbox with file round-trip — see doc/setup-assistant.md
- Keyboard-first:
1/2/3/4/5/6switch views (Tasks/Notes/Mail/Calendar/Spaces/Assistant),/focuses capture,?shows all shortcuts
.
├── src/ # Flask app (app factory + routes/ blueprints), templates, static JS/CSS
├── chat/ # Embedded Chainlit assistant (auth bridge, agent loop, tools, skills)
├── asgi.py # Canonical entrypoint: FastAPI umbrella (Flask + /assistant)
├── mcp_server/ # MCP sidecar exposing the workspace as agent tools
├── sandbox/ # Isolated execution sandbox sidecar (MCP, shared /workspace)
├── scripts/e2e/ # Local end-to-end harness (mock LLM + socket.io driver)
├── tests/ # pytest suite
├── migrate_db.py # prod SQLite migration script (additive DDL + data fixups)
├── doc/ # Documentation
│ ├── README.md # Detailed setup & usage documentation
│ ├── PROJECT_DESCRIPTION.md # Authoritative spec (schema, API, architecture)
│ ├── setup-assistant.md # Assistant setup & architecture
│ └── TODO.md # Roadmap
├── Dockerfile
├── docker-compose.yml
└── requirements.txt
See doc/README.md for detailed documentation and setup instructions.
docker-compose uppip install -r requirements.txt
python src/app.py # http://localhost:53000
python -m pytest -q # run the test suiteAfter pulling code that changes the schema, run the migration script against your prod SQLite file before restarting:
python migrate_db.py --dry-run # show the plan
python migrate_db.py --yes # apply (additive-only + idempotent backfills)All project documentation is located in the doc/ directory:
- README.md - Main documentation
- PROJECT_DESCRIPTION.md - Authoritative spec (schema, API, features)
- TODO.md - Development roadmap
Agent/contributor context lives in .opencode/context/ (overview + deep-dive topics).
See LICENSE for details.