Browser extension

The offers you already have,
in the answer.

Your card issuer gives you offers at specific shops — spend $200 at the supermarket, get $75 back. They rotate monthly, nobody publishes them, and they are frequently worth more than the rate on the card. The extension collects them while you are already signed in to your issuer, so they end up in the answer instead of in an email you didn’t open.

Chrome and Safari · no bank login

Get it

Coming to Chrome and Safari.

It's built and it works. It isn't in the stores yet — when it is, these buttons light up and installing takes one click.

Want to know when? team@purplewallet.app

Run it from source

For anyone who'd rather not wait. You'll need a checkout of the repository and Node 18 or later.

Chrome, Edge, Arc, Brave

  1. Run ./purple ext. It tests, builds, and copies the folder path to your clipboard.
  2. Open chrome://extensions and switch on Developer mode.
  3. Load unpacked, and paste.
  4. Sign in to American Express, open your offers page, then click the toolbar icon.

Safari

Safari won't load a folder — an extension has to be wrapped in a Mac app first. ./purple ext safari runs Apple's own tool for you and opens the Xcode project it writes.

  1. ./purple ext safari
  2. Build and run the project that opens.
  3. In Safari: Develop → Allow unsigned extensions, then enable it in Settings → Extensions.

Safari 18 or later. The unsigned-extensions switch resets when Safari restarts — that's Apple's design, not a fault here.

What it does, and doesn't

It reads one page. That's the whole job.

The part everyone else gets wrong

When it breaks, it goes quiet.

Every tool that reads bank sites has the same weakness: the bank changes something, the reader half-works, and the app starts showing offers that are stale or wrong — with nothing in the system aware anything happened. Three offers where there were twelve looks like a quiet month. Nobody investigates a quiet month.

So ours refuses to half-work. It checks that what came back is the shape it was written for, and if a single offer doesn’t read cleanly, it discards the whole batch and reports itself broken. You get nothing rather than something wrong, and we find out the same day.

It also doesn’t rummage through the page looking for text to match. It asks your issuer for the same list their own site is asking for, and reads the answer — which is why a visual redesign doesn’t touch it, and why it adds no work for your bank beyond what your own browser was already doing.

The same rule runs downstream: an offer the extension found never changes a recommendation on its own. It has to survive the check that it actually paid out first.