shouldivibecodeit

Should I vibe codeMimestream?

Build a native Mac Gmail client over standards-based APIs with local cache

Your inbox is the reset link for everything else you own. It deserves better than your first sync engine.

?

Their verdict, the Individual price and the build-time estimate come from their entry, MIT-licensed. Checked 2026-08-04.

Can you build it?asked by canivibecodeit.com ↗KINDAweekend project · multi-day
?

Our verdict, the regret score and everything below it. Editorial and unsponsored — nobody can pay to be moved.

Should you ship it?asked by usDEMO ONLYvibe the v0, throw it away.

The honest answer

why the verdict is what it is

A three-pane mail window over the Gmail API is a genuinely fun weekend and it will look like the real thing by Sunday night. What it will not be is a sync engine. Mimestream's actual product is the boring middle layer: incremental history sync that recovers when the delta cursor expires, Gmail's label model rendered honestly rather than as folders, threading that agrees with what the web UI shows, and a cache that stays truthful while you are on a plane. Every one of those is invisible when it works and indistinguishable from a hang when it doesn't. And all of it runs on an OAuth grant over the mailbox that resets the password on everything else you own.

What actually breaks

not "if". the specific failures.

  • Incremental sync. Gmail keeps history records for roughly a week, so the first holiday you leave the app closed your stored startHistoryId is gone, the API returns 404, and code that reads that as 'nothing new' stops syncing while looking perfectly healthy
  • Labels modelled as folders. A Gmail message carries many labels and lives in none of them, so a folder tree turns 'file this' into removing INBOX server-side, on every device, for mail you only meant to tag
  • The OAuth grant. A Google Cloud project left in Testing publishing status issues refresh tokens that expire after seven days, so your mail client asks for consent again every week until you take a restricted mail scope through verification
  • Threading. Gmail's conversation grouping is not what References and In-Reply-To give you, so your threads split where the web UI's don't and you reply into the wrong half
  • Sending. MIME assembly, inline images and reply headers do not bounce when they are wrong — they render as an attachment blob in somebody else's client, permanently
  • The cache itself: your entire mailbox in a SQLite file under Application Support, with whatever protection the agent thought to add, which is usually none

Is that you?

the verdict is a default, not a law

ship it if
  • It is read-only — a triage view, a digest, or a better search over messages it never modifies
  • It asks for the narrowest scope that works, and gmail.readonly is genuinely enough
  • You would lose nothing but time if the local cache were deleted tomorrow
don’t ship it if
  • It holds a modify or full-mail scope and runs unattended on a schedule
  • Anyone but you signs into it
  • Archive, delete and label changes go server-side before you have watched a full wipe-and-resync complete cleanly
  • That mailbox is the recovery address for your bank, your domain registrar or your cloud account

If you build it anyway

the checklist, then the prompt that enforces it

  1. Start read-only with gmail.readonly. Every interesting UI problem in a mail client is available without a single write, and the scope upgrade should be a decision you make later and on purpose.
  2. Refresh token in the macOS Keychain, never a plist, a dotfile, or a column next to the messages it unlocks.
  3. Handle the expired-history 404 explicitly as 'full resync required' and put it on screen. Silent sync death is the defining failure of home-built mail clients.
  4. Model labels as a set, not a hierarchy. Adding one must never imply removing INBOX unless that is precisely what was asked for.
  5. Treat the local database as a cache with no authority. If deleting it and re-syncing does not reproduce identical state, you have accidentally invented a second source of truth for your email.
  6. Make destructive actions two-phase while you are learning: stage them, show the exact list of server mutations, apply on confirm.
the guardrail prompt
I am building a native desktop Gmail client for my own mailbox. Apply these before any UI work, and push back if I ask you to skip one.

1. Request gmail.readonly and nothing else. Do not add modify, send or full
   mail scope until I explicitly ask, and when I do, tell me what changes
   about the blast radius before writing any code.
2. Build read, thread, search and local-only triage first. The entire
   interesting part of this app exists without a single server write.
3. Put the refresh token in the OS keychain. Not a plist, not a dotfile, not a
   column in the message database. Never log a token or an Authorization
   header, including in error paths.
4. Write in the README that a Google Cloud project in Testing publishing
   status issues refresh tokens that expire after seven days, and that going
   to production with restricted mail scopes means Google verification.
5. Implement sync with users.history.list, and treat an expired
   startHistoryId as an explicit 'full resync required' state shown in the
   UI. Never treat that 404 as 'no changes'.
6. Model labels as a set per message. Adding a label must not remove INBOX.
   Write a test for archive that asserts exactly one label was removed and
   nothing else changed.
7. The local database is a cache with no authority. Give me a command that
   wipes and re-syncs it, and make passing that round trip a precondition for
   building any write feature.
8. Before delete or archive exist, build a staged-changes view: I see the
   exact list of server mutations you are about to perform, and confirm it.
9. Never permanently delete. Move to TRASH and let Gmail's own thirty-day
   window be the undo I did not write.
10. Back off on 429 and rateLimitExceeded with jitter. A tight retry loop
    against my own mailbox is how quota gets burned overnight.
11. Out of scope, and say so rather than half-building: IMAP for non-Gmail
    accounts, S/MIME, PGP, push. Then tell me $4.99 a month buys somebody
    else's sync engine.
paste this before you build — not after something breaks31 lines · 2005 chars

That one keeps you out of trouble. For the prompt that actually builds it, canivibecodeit.com has one.

their build prompt ↗

Or don’t build it

the boring option, and the way back out

just pay for it

As soon as you want it to be your actual mail client rather than a project. $4.99 a month is a native app from someone who has been debugging Gmail's history API against real mailboxes for years, covers every Google account you have across five devices, and never asks you to reauthorise on a Tuesday because your consent screen is still in Testing.

$4.99/mo is cheaper than your weekend.

your exit plan, if you already built it

There is barely an exit problem if you keep the discipline: the mail lives in Gmail, your app is a window onto it, and quitting means deleting a cache. The trap is state that exists nowhere else — your own tags, snoozes, a read/unread flag you tracked locally. Mirror those into real Gmail labels or accept that they die with the app, and take a Takeout mbox once a year regardless of what you build.

prior art · someone already did this
Mailspring

Actively maintained open-source desktop mail client with its own sync engine, and the closest thing to a reference implementation of this problem.

Thunderbird for Android

Long-lived open-source mail client whose issue tracker doubles as a catalogue of everything that goes wrong in mail sync.

Questions

The Gmail API is just REST. Why is this rated harder than it looks?

Because fetching messages is not syncing them. Sync is a state machine that has to survive being closed for a fortnight, a network that dies mid-page, labels changing on another device, and a history cursor Google only keeps for about a week. The REST calls are the easy afternoon. Reconciling two mutable copies of a mailbox is the part Mimestream is actually selling.

What is the safe version of this project?

Read-only. Authenticate with gmail.readonly, build the triage UI, the search, the thread view, the digest — whatever it was you actually wanted — and never issue a write. You keep every interesting design problem, and the worst outcome of a bug is a wrong-looking screen instead of mail that has quietly left your inbox everywhere at once.

How bad is it really to keep the OAuth token in a config file?

That file is a bearer credential for the account that resets the password on most of the rest of your life. Anything running as your user can read it, it lands in backups you were not thinking about, and it outlives the app you deleted. The Keychain exists for exactly this and costs about ten lines.

did you build it?

Every week, someone ships something they shouldn’t have.

New verdicts, the worst thing that landed in the trap, and the occasional incident report. No other email, ever.

also on the regret index
Inbox ZeroABSOLUTELY NOT

An autonomous agent with delete permission on your inbox is a very fast way to lose something.

ShortwaveYOUR FUNERAL

An agent with inbox access takes instructions from anyone who knows your email address.

Spark PremiumYOUR FUNERAL

Send later means a server that holds your mail password and presses send while you are asleep. Twice, sometimes.

last reviewed 2026-08-04 · verdict is editorial and unsponsored · shared entry data from canivibecodeit under MIT · not legal advice