FlipSmart
FlipSmart tells Old School RuneScape players which items to buy and resell on the game's Grand Exchange, through a RuneLite plugin and a web app.

FlipSmart's public market overview, captured Sept 29, 2026.
I'm a co-owner of FlipSmart. Its lead engineer built most of the product, including the market overview above, and he has more than ten times my commits. My part was smaller. In 2025 I set up the deploys and the first web app, and in 2026 I took billing live and cut a cache bill that got out of hand.
If you've never played, Old School RuneScape has its own stock market, the Grand Exchange. Players buy items low and sell them higher, which they call flipping, and the exchange keeps 2% of each sale, up to 5 million gold. FlipSmart reads the prices and tells a player what to buy, and at what price, for the gold they have. The player still makes every click.
I started on a Monday night in November 2025, five days after the lead engineer created the repo. My first four commits went in within 22 seconds: "bully doppler into line", "stuff the api into cans", "banish deploys to fly.io" and "guilt trip you into docs". That's settings, containers, hosting and docs, in that order. The first web app, with sign-in through Discord, landed on November 23, and subscriptions took most of my January.
The cache bill
Over the last weekend of April 2026, FlipSmart's database kept running out of connections. The fixes that weekend moved the busiest reads onto Redis, a fast in-memory cache. Mine stopped the app from holding database connections while it waited on other calls.
In May, the Redis bill was nearly thirty times April's. That Redis service charged by the command, and the new caches ran on every signed-in request, by design.
I wanted to measure before cutting, so I shipped the cuts behind switches, all off, with a counter on every Redis command naming the code that sent it. A week later the bill hadn't moved, because nobody had flipped the switches, me included.
The counter still proved me wrong. Nearly half the commands came from the cache I'd planned to keep, the one holding game prices. So I had each server hold those prices in memory for ten seconds before asking Redis again, and the cache that looked up who was signed in got switched off.
Last, I moved the cache to a server FlipSmart runs itself, with a flat monthly bill. A second AI model reviewed my plan for the move and came back no-go, with seven blockers. The revised plan ran on July 17 without a single cache error, and I deleted the old service 25 hours later.
Taking billing live
On the night of June 30, I merged the code to turn FlipSmart's payments on. All 1,969 tests passed, and it had a kill switch that could stop new charges without a redeploy. Six days earlier, a new Stripe API version had moved the field FlipSmart's checkout read. Left alone, checkout would have failed on the first real charge.
About two hours later, another engineer reverted my change, after the plugin started telling free players it had no recommendations. From what he could see, that was a reasonable call. The revert tried to deploy three times, and each time it hung for five minutes without printing anything.
Free players saw no recommendations because the switch-over had turned off the setting that gave every player premium for free. A free account is supposed to see an upgrade prompt, so to players who'd had premium for free that morning, the paywall looked like a bug.
The deploys hung for a different reason. The revert deleted an upgrade the live database had already applied, so the deploy couldn't work out where the database stood, and production kept running my code the whole time. Eighteen minutes after the revert merged, I reverted the revert, and premium-for-everyone went back on. The real switch-over came nine days later.
The engineer who reverted it filed the follow-up issue that night and wrote, in parentheses, "in this case, the code was not the actual cause." My code did have one real bug, in renewals. It never marked the card that paid for a player's first month as the card to charge for the second, and when the first renewals came due on August 10, the lead engineer fixed it that day.
Milestones Stripe billing
Stack
- Languages
- JavaTypeScriptPython
- Payments
- Stripe

Text mePaul Mikulskis
(617) 599-0775If this sounds like your situation, tell me what's going on.
This number usually answers in a minute or two, in my voice, and every conversation comes straight to me.
Text (617) 599-0775