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
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
For anyone who'd rather not wait. You'll need a checkout of the repository and Node 18 or later.
./purple ext. It tests, builds, and copies the folder path to your clipboard.chrome://extensions and switch on Developer mode.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.
./purple ext safariSafari 18 or later. The unsigned-extensions switch resets when Safari restarts — that's Apple's design, not a fault here.
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.