I spent 15 years running operations and P&Ls, not writing apps. In August I set out to put PromptSpend, my open-source LLM cost calculator, on iPhone and Android. It is now live on both stores. This is what the gap between "the web version works" and "a stranger can install it" actually looked like.
What the app does
PromptSpend answers one question before you ship an AI feature: what will this cost to run? Paste a representative conversation, choose your traffic, and see the cost per conversation, day, month and year across up to four models. It reads the same catalog as promptspend.com: about 80 models from 12 providers, re-checked every morning, with every price carrying the source it came from and the date it was last confirmed.
Decision 1: no price table ships in the app
The easy path was to bundle a pricing file. I didn't. A bundled table is correct on the day you build it and quietly wrong every day after, and the whole point of PromptSpend is that the numbers are current. The app fetches the live catalog on launch. If it can't, it uses the last good copy for up to 24 hours with a visible warning, and after that it refuses to calculate. A missing number is better than a confident wrong one.
Decision 2: pasted text stays on the phone
People paste real prompts into a cost tool, and real prompts contain real business data. Token counting happens on the device. Nothing you paste is uploaded or saved, and there is no account, ad SDK or analytics identifier. The shareable outputs (a summary, a four-model comparison, a CSV, a receipt) are built from counts and costs, never from your text.
The stack
Expo and React Native, with the cost engine extracted into a shared package so the web app, the API, the MCP server and the phones all run identical arithmetic. Builds run on Expo's cloud service. I stayed on the free tier, which caps iOS builds per month, so every iOS build had to be release-ready. That constraint turned out to be good discipline: batch the fixes, exhaust the local and Android checks first, then spend a build.
What real devices caught that tests didn't
The automated suite was green the whole time. Physical-device QA on an iPhone, an iPad and a $103 Galaxy A15 still found:
- The app opened on the wrong screen. A file-based router treated the Estimate screen as the root route, which overrode the Home tab I had set as the start. Fix: move Estimate to its own route and make the root a redirect.
- A mystery sixth tab appeared on Android. A layout helper file sat inside the routes folder, so the router registered it as a screen. Fix: move it out, and add a release check that fails if it ever returns.
- The guided tour's highlight box landed in the wrong place on Android. Three rounds of coordinate-measurement fixes got closer but never right. The fix that worked was to stop measuring entirely and have each highlighted element draw its own outline.
- Everything clipped at the right edge on a small Android screen. One shared layout fix, not a patch per screen.
Lesson: tests prove the logic. Only a cheap physical phone proves the layout.
The paperwork took longer than the code
I expected the code to be the hard part. The store accounts were. I enrolled with Apple as an individual, then converted to an organization, and iOS builds stalled until Apple finished that migration. Google Play requires personal developer accounts created after November 2023 to run a closed test with at least 12 opted-in testers for 14 continuous days before production access; organization accounts are exempt, so I converted that account too. That meant a D-U-N-S number, organization identity checks and website verification. Budget weeks for this, not days.
Try it, and tell me what's wrong
- iPhone and iPad: https://apps.apple.com/app/id6800386428
- Android: https://play.google.com/store/apps/details?id=com.promptspend.app
- Web: https://promptspend.com
- Source (MIT): https://github.com/AndrewAvery7/promptspend
Estimates are estimates, not bills, and the cheapest model is not automatically the right one. If a price is wrong, that is the most serious bug this project can have, so please open an issue.
The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

Top comments (0)