Shipping my first mobile app: what an operations leader learned taking PromptSpend to iPhone and Android
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…
For years, I worked in operations and financial management but decided to bring my cost calculator, PromptSpend, to mobile devices. After 15 years, I launched the open-source LLM cost calculator on both iOS and Android platforms. PromptSpend simplifies the process of determining the cost of running AI features by allowing users to input a representative conversation, select their traffic, and view the cost per conversation, day, month, and year across up to four models.
The app reads the same catalog as promptspend.com, featuring about 80 models from 12 providers, with live prices sourced and confirmed daily.
Initially, I considered bundling price tables within the app, but this approach proved problematic, as it would provide accurate pricing only on the day of creation and quickly become outdated. To ensure users receive current information, PromptSpend fetches live data upon launch, falling back to the last good copy for up to 24 hours with a visible warning if it cannot connect. This approach prevents users from being misled by potentially inaccurate data.
When designing the app, I made sure that any pasted text remains on the device, ensuring that no sensitive business data is uploaded or saved. Token counting occurs on the device itself, and all shareable outputs, such as summaries, comparisons, CSV files, and receipts, are generated using the token counts and costs, never from the original text.
The app's stack consists of Expo and React Native, with the cost engine extracted into a shared package that runs identical arithmetic across the web app, API, MCP server, and mobile devices. The builds are run on Expo's cloud service, and every iOS build must be release-ready due to a build cap imposed by Expo's free tier. This constraint fostered discipline, encouraging me to batch fixes, thoroughly test on local devices and Android, and then spend a build to address any remaining issues.
Despite automated tests passing, I conducted physical-device QA on an iPhone, iPad, and a $103 Galaxy A15. During testing, I discovered that the app sometimes opened on the wrong screen, a file-based router treated the Estimate screen as the root route, and a mystery sixth tab appeared on Android. Through meticulous debugging, I resolved these issues, including moving the Estimate screen to its own route, fixing a layout helper file that caused the router to register it as a screen, and simplifying the guided tour's highlight box to draw its own outline, preventing clipping on small Android screens.
These lessons highlight that while tests can verify the logic, physical devices are essential for catching layout issues.
Setting up store accounts proved time-consuming compared to coding the app. I registered with Apple as an individual, then converted to an organization, which required additional steps like converting iOS builds and obtaining a D-U-N-S number for Google Play. The process took weeks rather than days, emphasizing the importance of budgeting accordingly.
Prospective users can download PromptSpend on iOS (https://apps.apple.com/app/id6800386428), Android (https://play.google.com/store/apps/details?id=com.promptspend.app), or access the web version at https://promptspend.com. The source code is available on GitHub (https://github.com/AndrewAvery7/promptspend) under the MIT license.
Please note that estimates are not bills, and the cheapest model is not always the best choice; always verify the prices. If you encounter any issues, please report them in an issue.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.