Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Doot by Oddship

A trusted, local-first emissary for your inbox.

Try the frozen demo →

Doot demo workspace with fictional email data

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.

What it does

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

Quick start

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 dev

Open 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 dev

With Docker:

docker compose up --build

The Compose volume doot-data retains the SQLite database. See configuration before exposing the container beyond localhost.

Development

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 audit

Pre-commit hooks run Biome through lint-staged. Run npm run prepare after cloning if npm did not install hooks automatically.

Architecture

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.

Safety model

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

Documentation

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.

Contributing

Read CONTRIBUTING.md. By participating, you agree to follow the Code of Conduct.

License

MIT © Oddship contributors. See LICENSE.

About

A trusted, local-first emissary for your inbox

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages