{"id":51167600,"url":"https://github.com/drewling/zero","last_synced_at":"2026-06-26T21:00:30.168Z","repository":{"id":367126570,"uuid":"1278463400","full_name":"drewling/zero","owner":"drewling","description":"Keep every Gmail inbox at only what still needs you — reversibly. A macOS menu-bar app: agent-judged open loops, editable categories, reply-in-your-voice, native Liquid Glass.","archived":false,"fork":false,"pushed_at":"2026-06-25T00:13:36.000Z","size":10101,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-25T02:05:41.856Z","etag":null,"topics":["email","gmail","inbox-zero","liquid-glass","macos","menu-bar-app","productivity","swiftui"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/drewling.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-23T20:19:40.000Z","updated_at":"2026-06-25T00:13:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/drewling/zero","commit_stats":null,"previous_names":["drewling/inbox-keeper","drewling/zero"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/drewling/zero","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drewling%2Fzero","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drewling%2Fzero/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drewling%2Fzero/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drewling%2Fzero/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/drewling","download_url":"https://codeload.github.com/drewling/zero/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drewling%2Fzero/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34832916,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["email","gmail","inbox-zero","liquid-glass","macos","menu-bar-app","productivity","swiftui"],"created_at":"2026-06-26T21:00:29.469Z","updated_at":"2026-06-26T21:00:30.154Z","avatar_url":"https://github.com/drewling.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# zero\n\n**Keep your inbox at \"only what still needs you,\" across every account, and never lose anything.**\n\nA quiet macOS menu-bar app that reads each Gmail thread, sets aside everything that\nisn't waiting on you, and keeps the rest one tap away. Nothing is ever deleted.\n\n\u003cimg src=\"design/screenshots/panel-loops.png\" width=\"320\" alt=\"zero open loops panel\"\u003e\n\n[![Website](https://img.shields.io/badge/website-zero.headless.com-1A73E8)](https://zero.headless.com)\n[![Platform: macOS](https://img.shields.io/badge/platform-macOS%2026%2B-black?logo=apple)](https://github.com/drewling/zero/releases)\n[![License: PolyForm-NC](https://img.shields.io/badge/license-PolyForm--NC-blue)](LICENSE)\n\n\u003c/div\u003e\n\n---\n\n## What it is\n\nMost \"inbox zero\" tools make you do the sorting. zero does the one part\nyou'd never finish by hand: continuously deciding what in your inbox is still an\n**open loop** (something genuinely awaiting your action) and quietly setting\neverything else aside.\n\nIt lives in the menu bar. You glance at it between meetings and see, across all\nyour accounts, the few things that actually need you. Everything else is archived\nreversibly, so the inbox stops being a swamp without anything going missing.\n\n**What it refuses to be:**\n\n- An auto-replier. Replies are drafted in your voice on demand; you review, edit,\n  and decide when (or whether) to send. It never sends on your behalf.\n- A unified mail client. Your Gmail stays exactly as it is.\n- A rule engine. There is no DSL, no regex, no filter list to maintain.\n- A real-time tool. It runs once a morning.\n\n## The panel\n\nFour views, one icon in the menu bar:\n\n| Open loops | Accounts | Undo | Settings |\n|:---:|:---:|:---:|:---:|\n| ![Open loops](design/screenshots/panel-loops.png) | ![Accounts](design/screenshots/panel-accounts.png) | ![Undo](design/screenshots/panel-undo.png) | ![Settings](design/screenshots/panel-policy.png) |\n| What still needs you, across all accounts | Per-account inbox and archive counts | Restore any day's archived mail in one tap | Your **Rules** (plain English), categories, daily schedule, and AI engine |\n\nThe panel is a dark \"Raycast\"-style liquid-glass overlay. Tap any thread to open\nit in Gmail, hover it to **Reply** (drafts in your voice, stays local until you\ntap Send) or **Set aside** (archived reversibly, immediately restorable).\n\n## How it works\n\n```\nmenu-bar app (SwiftUI)  --\u003e  local server (keeper_server.py, 127.0.0.1)\n                                 |  reads\n                             app/state.json  \u003c--  dashboard_state.py\n                                 ^                (per-account status, open loops, undo points)\n                                 |  Run / Undo\n                             review_open_loops.py  (Claude Haiku + keep-policy.md)\n                                 |\n                             gws CLI  --\u003e  Gmail (reversible label swaps only)\n```\n\nThe Swift shell is deliberately thin: it starts the local Python server and\nrenders a native SwiftUI panel against its JSON API. All judgment runs in Python\nwith Gmail reached via the `gws` CLI. The panel reads a cached state file so it\nopens instantly; it never talks to Gmail directly.\n\n## Why you can trust it\n\nThree properties, in priority order:\n\n1. **Reversible by construction.** \"Archive\" means remove the INBOX label and add\n   a dated recovery label (e.g. `zero/undo/2026-06-24`). Mail stays in All Mail,\n   fully searchable. Any day's sweep restores in one tap from the **Undo** view.\n   Nothing is ever deleted.\n2. **Ambient.** No new app to live in. Your Gmail and Apple Mail stay exactly as\n   they are. zero works quietly behind them, once a morning.\n3. **The judgment is an agent, not a rule list.** What counts as \"needs you\" is\n   written in plain English (see [keep-policy.md](keep-policy.md)) and enforced by\n   Claude Haiku reading each thread in full. Cold outreach with a real person's\n   name gets archived; a real person actually awaiting your reply is kept. A filter\n   rule cannot tell those two apart.\n\n## How \"needs you\" is decided\n\nYou edit one plain-language file, [keep-policy.md](keep-policy.md), or the\n**Rules** section under the **Settings** tab in the panel. No regex, no DSL. The default:\n\n\u003e Keep a thread only if a real person is awaiting your reply or decision, there is\n\u003e an unanswered direct question or request addressed to you, a payment has actually\n\u003e failed, it is a legal or contractual matter, or there is an explicit deadline with\n\u003e a real consequence. Archive everything else reversibly.\n\nTwo signals settle most cases automatically:\n\n- **Last message from you:** you already responded, the ball is in their court.\n  Archive it.\n- **Never replied to this sender, plus cold/sales content:** not a real loop, even\n  with a person's name on it. Archive it.\n\nWhen unsure, the policy keeps the thread. Everything archived is one tap away.\n\n---\n\n## Install\n\n\u003e **Requirements:** macOS 26 (Tahoe) on Apple Silicon. Everything else — Python, Node,\n\u003e the `gws` and `claude` CLIs — the installer sets up for you.\n\n### One command\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/drewling/zero/master/macapp/install-zero.sh | bash\n```\n\nThis installs any missing prerequisites (Homebrew → Python 3 / Node → the `gws` and\n`claude` CLIs), copies `zero.app` to `/Applications`, clears the macOS quarantine flag,\nand launches it. Re-running is safe. When it opens, skip to **[First run](#first-run)**.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWhy the quarantine step?\u003c/b\u003e\u003c/summary\u003e\n\nzero is signed ad-hoc, not notarized (there's no paid Apple Developer account behind a\nfree app). macOS quarantines *downloaded* un-notarized apps, and Gatekeeper then refuses\nto launch them — so a hand-dragged DMG silently does nothing, and because zero is a\nmenu-bar app with no window, the block is invisible. Clearing the flag is the standard\ninstall path for un-notarized open-source Mac apps; the script does it for you.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eManual install\u003c/b\u003e — prefer to do each step yourself\u003c/summary\u003e\n\n```bash\n# 1. Prerequisites\nbrew install node python3\nnpm install -g @googleworkspace/cli @anthropic-ai/claude-code\nclaude            # finish Claude login on first run\n\n# 2. Download zero from the Releases page, then clear the quarantine flag.\n#    Use the FULL path — a Homebrew/Python `xattr` earlier in PATH may silently no-op.\n/usr/bin/xattr -cr /Applications/zero.app\n```\n\nGrab the app from the [Releases page](https://github.com/drewling/zero/releases) and drag\nit to `/Applications` before running the `xattr` line. Then open it and follow\n**[First run](#first-run)** below.\n\u003c/details\u003e\n\n### First run\n\nOpen zero — it lives in the menu bar (no Dock icon, no window). The onboarding walks you\nthrough connecting Google and your AI, both in your browser, and **nothing leaves your Mac**:\n\n1. **Connect Google.** Sign in to each Gmail account you want zero to watch. zero asks for\n   one Gmail permission and your basic identity — [nothing else](#privacy-and-trust). For\n   now this uses *your own* Google OAuth client (a one-time setup — see **Bring your own\n   Google Cloud project** below); built-in one-click sign-in is in Google verification.\n2. **Connect your AI.** zero uses the `claude` CLI you logged into above to read and judge\n   threads. Prefer a different engine? Pick Codex, a local model, or another agent CLI\n   under **Settings → AI engine**.\n3. **Run it.** Hit **Run zero now** for the first sweep. To run it automatically each\n   morning, set a time under **Settings → Daily schedule** (or `./bin/zero schedule`).\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eBringing your own Google Cloud project\u003c/b\u003e — advanced\u003c/summary\u003e\n\nUntil zero's own Google client clears verification, sign-in uses a Cloud project you\ncreate. It's a one-time setup: make a **Desktop app** OAuth client at\n[console.cloud.google.com](https://console.cloud.google.com/) (APIs \u0026 Services →\nCredentials), enable the **Gmail API**, and paste the downloaded JSON into zero's\nonboarding screen.\n\nOne catch worth knowing: Gmail's `gmail.modify` is a *restricted* scope, so an\n**unverified** personal client can only grant it while the consent screen is in\n**Testing** with your address added as a **test user** — and Google then expires that\ngrant after **7 days**, so you'll re-authorize weekly. (A client in \"production\" but\nunverified can't grant restricted scopes at all.) Verifying your own client removes the\nweekly re-auth. See [docs/SETUP.md](docs/SETUP.md) for the full click-path.\n\u003c/details\u003e\n\n### Build from source\n\nRequires Xcode command-line tools (`xcode-select --install`) on macOS 26 (Apple Silicon).\n\n```bash\ngit clone https://github.com/drewling/zero.git\ncd zero/macapp\n./build.sh           # produces zero.app in macapp/build/\n./make-dmg.sh        # optional: packages it as a .dmg\n```\n\n\u003e **Contributor resources:** [Architecture](docs/ARCHITECTURE.md) · [API reference](docs/api/) · [Contributing](CONTRIBUTING.md) · [Security](SECURITY.md)\n\n---\n\n## Configuration\n\n**One file.** Edit [keep-policy.md](keep-policy.md) directly or via the **Rules**\nsection under the **Settings** tab in the panel. Write it in plain English. No syntax to learn.\n\nEverything else is optional and lives under **Settings**: your **categories**, the\n**daily schedule** (what time, which days, whether macOS notifies you), how far back\nto label archived mail, and which **AI engine** to use (Claude by default; Codex,\nHermes, or another agent CLI if you have one installed).\n\n**Optional voice grounding.** Copy `knowledge/profile.example.md` to\n`knowledge/profile.md` and fill it in. The drafter uses it as background when\ncomposing replies in your voice. You can also create per-account files at\n`knowledge/\u003caccount-slug\u003e.md`. These files are gitignored and stay on your machine.\n\nThere is nothing else to configure.\n\n---\n\n## Privacy and trust\n\n- **No project-operated backend.** Everything runs on your Mac. The only data that\n  leaves your machine is per-thread text sent to the Claude API through your own\n  `claude` CLI (for the keep/archive judgment and draft generation). See\n  [SECURITY.md](SECURITY.md).\n- **The local server binds to `127.0.0.1` only.** Nothing is reachable from the\n  network.\n- **Nothing is ever deleted.** Archiving is a reversible label change. Mail stays\n  in All Mail, fully searchable in Gmail.\n- **Your data stays on your machine.** `accounts.json` and `knowledge/*.md` are\n  gitignored and never committed.\n- **Gmail access uses your own credentials.** The `gws` CLI authenticates with\n  your Google account via OAuth; zero never handles your password or OAuth\n  tokens directly.\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\n[PolyForm Noncommercial 1.0.0](LICENSE). Free to use, fork, modify, and share for\nnoncommercial purposes. Commercial use and reselling are not permitted.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrewling%2Fzero","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdrewling%2Fzero","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrewling%2Fzero/lists"}