A trusted, local-first emissary for your inbox.
Doot is an agent-first email workspace that investigates a local IMAP cache, builds useful views, and prepares reviewable actions. It never silently mutates your mailbox: archive, move, delete, folder, and Flow operations cross an explicit browser confirmation boundary.
Doot is an early v0.1 release. Run it locally, keep backups, and review every proposed mailbox action.
- Connects IMAP accounts, discovers provider folders, and incrementally syncs message headers.
- Searches the complete cache with SQLite FTS5 and fetches bodies only when opened via
BODY.PEEK[]. - Gives the agent paginated search, aggregation, selected-message, proposal, Flow, artifact, and bounded memory tools.
- Prepares structured local drafts with Doot, then saves them to the account's advertised IMAP Drafts folder only after explicit confirmation.
- Streams agent reasoning and tool progress into a persistent workspace that survives navigation.
- Renders agent responses as safe GitHub-flavored Markdown without raw HTML or remote images.
- Generates safe component specs—never model-authored HTML, CSS, URLs, or event handlers.
- Replays Agent conversations, sync jobs, Flow runs, schedules, proposals, and mailbox actions from a filterable History ledger.
- Schedules read-only sync or review-only Flow evaluations for once, daily, or weekly execution while Doot is running.
Requirements: Node.js 22 LTS and npm. Agent features also need a model provider connected through OAuth or an API key.
cp .env.example .env
npm ci
npm run devOpen http://127.0.0.1:8765. In Settings, connect a model provider using one of the methods advertised by Pi, select a model, then add and sync an email account. Doot stores provider tokens, account credentials, and cached mail in the local SQLite database configured by DOOT_DATABASE_PATH; protect that file and never commit it.
With Nix and direnv:
direnv allow
just setup
just devWith Docker:
docker compose up --buildThe Compose volume doot-data retains the SQLite database. See configuration before exposing the container beyond localhost.
just check # lint, type-check, and unit/contract tests
just build # production build
just ui-check # screenshot and widescreen regression audit; server must be running
just audit # production dependency auditPre-commit hooks run Biome through lint-staged. Run npm run prepare after cloning if npm did not install hooks automatically.
Browser ── Next.js + React ── SQLite/FTS5
│ ├────────── Pi agent runtime
│ └────────── ImapFlow ── IMAP
└── SSE (agent run) + WebSocket (background status)
One Node process owns Next.js, the Pi runtime, SQLite, IMAP operations, API routes, SSE, and WebSocket events. There is no Python service. See the architecture guide and codebase map.
- Organization is manually initiated; sync and startup do not trigger the model.
- Generated workspaces contain validated primitives and validated action intents.
- The agent creates local proposals; only browser-confirmed endpoints apply mailbox writes.
- An active Flow is reviewed and eligible for attached schedules; scheduled evaluations prepare proposals, never automatic mailbox mutations.
- Draft composition stays local until the user confirms an IMAP append; Doot never sends messages.
- Generated organization workspaces may suggest deletion, but deletion remains a manual Inbox proposal and confirmation flow.
- Remote images are blocked by default; HTML is sanitized and rendered in a sandboxed iframe.
- Doot is local-only and has no authentication in v0.1.
Read the complete safety model and security policy.
The source in docs/ is published with Oddship Moat at https://oddship.github.io/doot/. Product scope and decisions live in the v0.1 product specification.
The frozen demo is a real Next.js static export generated reproducibly from Doot's production screen components and versioned, fictional API responses by npm run demo:build. It contacts no external service and has no mailbox access. Run it locally with npm run demo:serve, and regenerate its README screenshot with npm run demo:screenshot.
Read CONTRIBUTING.md. By participating, you agree to follow the Code of Conduct.
MIT © Oddship contributors. See LICENSE.
