Lattice
A workspace for your research.
Open-source Superhuman alternative: a keyboard-first Gmail client for Mac with AI drafts that use your own key. Free and open source.
ProductivityTypeScript · CSSGitHub @tommy-muckstackOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Open-source Superhuman clone: keyboard-first Gmail client with AI. Part of yourappisdead.
Loading the full README.
Read the full README ↗A keyboard-first Gmail client with a built-in AI assistant. Runs on your Mac, talks to Gmail and Claude with your own keys, and has no server of its own.
It is a from-scratch recreation of the Superhuman experience: split inbox (Important /
Other), j k e h triage, snooze, a Cmd+K command palette, undo toasts, and
"write with AI" drafts. The whole thing is a few thousand lines of TypeScript.
Prerequisites: macOS, Node 22 (nvm use reads .nvmrc), npm.
git clone <this repo> && cd SuperhumanIsDead
./scripts/setup.sh # installs dependencies, runs tests, builds
npm run dev # launches the app with hot reload
On first launch you can press Try the sample inbox to see the whole UI with fake data. To use your real mail you need two keys, both entered in the app's setup screen and stored encrypted on your Mac.
Gmail access needs an OAuth client that belongs to you. Google does not let apps share one.
https://www.googleapis.com/auth/gmail.modify. Under Test users add your
own Gmail address. You do not need to publish or verify the app for personal use.127.0.0.1. Google shows an "unverified app" warning because
this is your own test app; click Continue.Summaries, AI drafts and AI inbox sorting use Claude. Create a key at https://console.anthropic.com and paste it into the setup screen. Without it everything else still works.
| Key | Action |
|---|---|
j / k | Next / previous conversation |
e | Mark done (archive). In Done, moves back to inbox |
h | Snooze (1–5 picks a preset, or choose a time) |
r / a / f | Reply / reply all / forward |
c | Compose |
s / u / x | Star / unread / select |
z | Undo the last action |
⌘K | Command palette |
/ | Search (Gmail search syntax) |
Tab / ⇧Tab | Next / previous split |
g i g o g s g h g t g d g e | Go to Important, Other, Starred, Snoozed, Sent, Drafts, Done |
⌘J | AI: summarize the conversation (in the composer: write the draft) |
⌘⇧R | AI: draft a reply |
⌘↵ | Send |
? | All shortcuts |
src/main Electron main process: OAuth loopback flow, encrypted store (safeStorage),
Gmail REST proxy with token refresh, Claude proxy (streaming), snooze scheduler
src/preload The window.duper bridge (contextIsolation + sandbox on)
src/shared Pure modules: MIME builder, Gmail parser, split rules, key bindings. Unit tested.
src/renderer React UI: thread list, reading pane, composer, palette, overlays, demo inbox
safeStorage and never leave the machine. Mail content goes to Google and, only when
you invoke an AI action, to Anthropic.npm run dist:mac # produces dist/SuperhumanIsDead-<version>.dmg (unsigned unless you add an identity)
Set CSC_NAME or CSC_LINK/CSC_KEY_PASSWORD for electron-builder to sign and notarize.
npm test # vitest over src/shared
npm run typecheck
docs/SUPERHUMAN_SPEC_PROMPT.md is a prompt for an agent with a Superhuman account to
produce a measured spec (tokens, layout, motion, keyboard map). The resulting
docs/SUPERHUMAN_SPEC.md is the acceptance checklist; src/renderer/src/styles.css
holds every token in one place so the match is a matter of editing values.
MIT
web/ holds the single marketing page and /login (Firebase project yourappisdead,
email/password + Google). Copy web/.env.example to web/.env with the web app config, then:
npm run dev:web # local preview
npm run build:web # static files in out/web, served under /superhumanisdead/
Design tokens and the font (Inter, OFL, closest open match to Superhuman's sans) come from
the shared IsDead design system; refresh with npm run sync:design.
The full Superhuman keyboard map lives in src/shared/keys.ts (⌘K → Keyboard shortcuts shows it).
Highlights: E done, ⇧E not done, H remind me (natural language, "only if nobody replies"),
# trash, ! spam, ? Ask AI, 0 calendar (- T = to move days), g ; snippets,
;name inline snippets and ⌘; picker in the composer, ⌘⇧L send later, ⌘⇧H remind if no reply,
⌘⇧Z send instantly, ⌘⇧↵ send and mark done. Undo send uses the delay set in Settings.
Calendar uses the calendar.events scope (read and write): sign out and back in after upgrading.
N/P next/previous message, O expand, Space/⇧Space page, ← folder and label menu, ⌘O links and attachments, ⌘P print.V move, L labels, Y remove the label you are viewing, ⇧Y remove all labels, [ / ] remove then next/previous, ⇧M mute, ⌘U unsubscribe (asks first).Ctrl+1–9 switch account; ⌘K → Add another account.⇧C, ⇧R, ⇧↵, ⇧F open the draft in a floating window; ⌘⇧P pops it in/out, ⌘D toggles focus between draft and thread.⌘B ⌘I ⌘U ⌘K ⌘⇧X ⌘⇧7/8/9 (bold, italic, underline, link, strike, numbered, bullets, quote), ⌘⇧A attach (or drop files), ⌘⇧I Instant Intro, ⌘⇧F change From, :name emoji.2 week view, B quick-create ("Lunch with Ada tomorrow 1pm for 45m"), ⇧B full form. Guests only get an invitation if you add them, and the form says so.Settings → Read statuses. Turn it on and every email you send carries an invisible 1×1 image from a server you host
(node tools/pixel-server.mjs). Recipients are not told and some mail apps preload images, so treat it as a hint. Nothing is added unless both the host and the toggle are set.
npm run build, serve out/renderer (python3 -m http.server 5181 -d out/renderer), then SMOKE_CHROME=/usr/bin/google-chrome node scripts/smoke.mjs. It drives the sample inbox in a browser with a stubbed preload; no Google, no email.
This project is part of yourappisdead, a marketplace of free, open-source clones of paid SaaS apps. It is an independent clone built from public product behavior; it is not affiliated with, endorsed by, or using any code or assets from the original product. All brand names belong to their owners.
LICENSE).isdead-design.The website (web/) sends PostHog events to the shared IsDead project. See docs/ANALYTICS.md. The desktop app sends nothing.