Note
This repo is a mirror of the rill template in
withoneai/forkable.
It exists so Replit, Bolt and gh repo create --template can start from
a whole repo. It is rewritten on every sync, so send changes to the
source repo, not here.
The preferred way to start is the Forkable CLI. It names your fork, fills
in local/profile.md with who it is for and where, and starts a fresh git
history:
npm create forkable@latest my-rill -- --template rill
Starting from this repo instead (Use this template, or a builder import):
pnpm install
pnpm start
Then fill in {{FOR}} and {{IN}} in local/profile.md and rename the
project in package.json and forkable.json.
- Replit: the
.replithere installs with pnpm and startspnpm dev, the UI on port 5180 (mapped to 80) over the Acme sample. If the embedded Postgres will not start, add Replit's PostgreSQL database; Rill uses itsDATABASE_URL. Sign in with One does not work there yet (the callback is pinned to localhost). - Bolt runs in a browser sandbox that cannot start Postgres or open a raw database connection, so Rill does not run there today.
- Lovable builds from a prompt, not a repo import. Point the prompt at this repo.
An AI email client on your own Gmail. Your goals and your VIP list decide what you see first. Jev judges every email and an LLM writes. Sign in with One and Gmail or Outlook integrations come built in.
Free and open source. Runs on your machine with one command, or hosted at rill.forkable.dev.
npx @withone/rill
- Five lanes: VIP, Goals, Reply, Other, Screener. Every row shows why it is there, with Jev's judgments and their percentages.
- Goals steer triage. Tell it "close the round, hire two engineers, land three design partners" and the inbox sorts by that.
- VIPs match by address, domain or a plain description ("anyone on our board"). Per-VIP rules: always top, never auto-draft, reply-within reminders, follow-ups.
- Drafts ready before you open the thread, in your voice. The AI never sends. Only your keypress sends.
- A morning brief, follow-up nudges, snooze, reply later, Ask your inbox with cited emails, Cmd+K for everything.
- Calendar built in: Day, Week, Month and Agenda, invites, Offer times and meeting links.
Secured by One. Each user connects their own accounts, and they can revoke them any time.
| Engine | When | Who pays |
|---|---|---|
| Claude Code or Codex on your machine | local mode, tool-less | your subscription |
| Claude, GPT or Gemini through One | you granted that connection to Rill | you, on your One account |
| Your own model, connected through One | you connect Anthropic, OpenAI or Gemini like you connected Gmail | you |
Same prompts, same validator, on every engine. The writer has no tools and cannot act.
pnpm install
pnpm start # triages the Acme sample inbox, prints lanes and the brief, exits 0
pnpm dev # the full UI on the sample inbox at http://127.0.0.1:5180
Create a Connect app in the One dashboard (Developers, Connect, New app) and register http://localhost:51789/api/one/callback. Then open http://localhost:5180/setup/connect (or Settings, General, Sign in with One) and paste the client ID, client secret, Connect key and permission set. They go to your macOS Keychain (elsewhere, ~/.rill/connect.env, mode 0600) and sign-in turns on without a restart. Setting them in .env still works as a fallback. Signing in with One is the only login.
Jev runs on your grant too: connect TypeSafe in One and grant it to Rill. Without it, the writer answers Jev's questions and rows get a Check badge. The app never holds a platform key or an API secret, only the grant.
Rill keeps everything in Postgres through Drizzle: mailboxes, threads, judgments, drafts, goals, VIPs, calendar events and the ledger. Nothing to install.
- Local (default). Rill starts its own embedded Postgres on first run, with its data in
~/.rill/dbon port 55439.pnpm start,pnpm devandnpx @withone/rillall use it. If one from an earlier run is still up, Rill reuses it. Settings, Database shows which one is in use and where it lives. - Your own Postgres. Set
DATABASE_URLin.envand Rill uses that instead of the embedded one. - Hosted. The Cloudflare Worker reaches Neon Postgres through Hyperdrive, same schema as local.
Migrations run on every start, so a fresh database comes up with the full schema. After a schema change in packages/core/src/db/schema.ts, run pnpm db:generate and commit the new file in packages/core/src/db/migrations/.
| Variable | Default | What it does |
|---|---|---|
DATABASE_URL |
unset | use this Postgres, skip the embedded one |
RILL_HOME |
~/.rill |
data directory, the database lives in <RILL_HOME>/db |
RILL_PG_PORT |
55439 |
port for the embedded Postgres |
To start over, stop Rill, check nothing still holds ~/.rill/db (head -1 ~/.rill/db/postmaster.pid names the process), then delete the folder. The next start makes a new, empty database.
INBOX.md plain-English lanes and rules the code compiles
fixtures/ the Acme sample inbox and recorded answers
packages/core schema, Gmail sync, Jev, policy, writer engines, ledger
server Hono on Node (local) and a Cloudflare Worker skeleton (hosted)
ui Vite + React
cli npx @withone/rill
Platforms One connects to: https://withone.ai/llms.txt
License: MIT