After working in web development for quite a long time, I sometimes thought about creating my own native smartphone app. But there were two nuances: I lacked mobile development knowledge, and I did not have a problem the app should solve.
Of course, AI helped with the technical side of development, and the problem the app needed to solve appeared on its own. I have been using personal finance analysis apps for a long time, since 2020. During that time, I came to understand the limitations of the solutions available on the market. They became especially noticeable when I started getting interested in investments.
So I decided to create my own personal finance app based on that experience and on the need to track investments.
I chose iOS as the platform for two simple reasons: I use an iPhone, and in my opinion iOS has better monetization opportunities.
For the technical stack, the choice was between React Native and Swift. Since I have more than 12 years of experience with React, choosing React Native would have been more logical because it would have sped up development. However, I chose Swift because of its native nature. Later I did regret that a little when I spent several days fighting performance problems, because I did not know much about optimization in Swift.
I chose ChatGPT and Claude Code as my assistants. Both subscriptions cost $20 each. I used Codex and Claude Code through their apps, because it is simply more convenient than the terminal or chat systems built into IDEs.
Then I moved on to the most important thing: together with my “assistants,” I created a list of features and pages the first version of the app should include. At that point, I already knew what I needed. Based on my experience with other apps, I managed to combine what I used every day with what I missed in existing solutions.
In my app, I focused on solving a simple problem. Usually, apps are split into those intended for personal finance tracking and budgeting, and those built for investment portfolio tracking. These areas exist separately because each of them becomes very large if you go deep into the details. I decided to combine both areas, but keep investment analytics simplified: enough to understand the current state of a portfolio and see how it changed over time, without excessive detail.
I started the design work with the app icon. At first, I tried generating it with AI through Gemini, ChatGPT, and Figma Make. Figma Make produced the best results, but the free version has a limited number of requests. In the end, I created my own icon from scratch in Figma using vector graphics, although I still took inspiration from AI results while looking for the idea.
I did not have to draw the screen designs for a long time. Since this is a finance app, I decided to use standard Apple UI components as much as possible. So I did not create a separate Figma mockup for every page. Instead, I gave AI prompts with very specific descriptions of what I wanted to see in a particular section or page. I also added a note asking it to use standard UI components and SwiftUI elements.
Between the two agents, I would highlight Claude Code as the better tool for design and building page interfaces. Usually, it handled this better.
Most of the time, I worked around ChatGPT and Claude limits. As you know, these plans have five-hour and weekly token limits. So, to be as productive as possible, I tried to use all available tokens. A few times, I used up the weekly limit in the middle of the week. Overall, though, two subscriptions were enough if I worked without excessive fanaticism and chose the right models for specific tasks.
I also used both AI tools in parallel: I gave them tasks in different parts of the system to avoid merge problems. A great strategy was checking code written by ChatGPT with Claude Code, and vice versa. This helped maintain high code quality and minimize issues. Because I have a lot of programming experience, not knowing Swift did not prevent me from getting quality code: I understand the core principles of writing it well.
After implementing each feature or page, I asked the “assistants” to cover the written code with tests as much as possible. This helped a lot when the codebase grew and I needed to make changes to existing parts.
Thanks to tests, AI understood better what needed to change and where, without breaking anything. I am usually against bulky comments in code, but AI wrote whole blocks of text before methods. I think that also helped it better understand what the methods were for and avoid losing context.
Tests were not the only useful thing. Prompts that asked AI to find problems and improve code were also helpful. I often asked both tools one after another. Here is my standard prompt:
“Find code duplication, possible code splitting, redundant code, performance problems, security issues, possible code quality improvements. Propose a plan before changing anything.”
Naturally, we wrote the code in Xcode. For testing and verification, I used my own iPhone and the simulator. After finishing development, I tested the app for a week. I found many critical and non-critical bugs, and of course fixed them. Many bugs were related to translation. AI can translate, of course, but it does not always do it well and sometimes misses individual places. So I checked all pages looking for problems. At first, I planned to release the app with support for many languages, but because of translation issues, I decided to keep only English and Ukrainian at the beginning.
For monetization, I chose several in-app purchase options. First, I split the app into Free and Pro versions, defined the features that could be “sold,” and made them available only in the Pro version. Then I added a subscription and a one-time purchase option. All of this is easy to configure and test locally with StoreKit. This is one of the advantages of using Swift for app development.
Overall, writing the code from scratch took up to a month. I aimed for the highest possible code quality. For a finance app, this is especially important because the risk of critical bugs needs to be minimized.
To publish an app, Apple requires links to a privacy policy and a support page. Also, every self-respecting app should have its own website, so mine was no exception. Yes, I know React and can easily create a React app. But with AI, it can be done even easier and faster 😀. So I created a fairly simple landing page with several additional pages.
Then, with Amazon Route 53, S3, and CloudFront, my new website became available worldwide: https://calmfinance.app. This step turned out to be quite simple for me because I understand this topic. Out of curiosity, I even spent a bit more time working on animations and design improvements.
The app also needed a feedback channel, so I needed an email address on my own domain. After digging into the topic a bit, I found out that an iCloud subscription lets you create up to three addresses. After configuring Route 53 using the instructions Apple provided while creating the new email address, I got my own address: support@calmfinance.app. A big advantage is that emails sent to this new address actually arrive in my personal iCloud inbox. Replies, of course, are sent from the new address.
Preparing the app and filling in all the data required for publication took me several days. I used ChatGPT and various YouTube videos. Overall, it was not very clear, but I figured it out somehow.
Please note that configuring payments and subscriptions and adding business information to receive payouts are two separate sections of the publishing process.
I waited almost a week for the app review and then received a rejection. The reasons were an incorrect support page URL and missing “Privacy Policy” and “Restore Purchase” elements on the purchase screen.
The app publishing process deserves a separate article. I think I will write it later.
So, about the problems.
Not knowing various small details related to development in Xcode, debugging iOS apps, and publishing. On the other hand, this is experience, so next time I will already know all of it.
Insufficient Swift knowledge caused performance optimization problems when page functionality grew significantly. During this project, I learned how to debug iOS apps, but optimization with AI did not always produce results. I was lucky that the Claude Fable 5 model was available for one week. That exact model found and fixed the problem I had been unable to find for several days.
The limits of $20 AI plans restricted my development options, so I had to switch to the $100 Codex subscription. Most likely, tokens will become more expensive, so it is worth being ready for that.
As often happens when developing something new, the initial plan with many features eventually shrinks to a limited set. To move toward publishing the app, I reduced the number of supported languages to two and postponed part of the functionality for the future. There is probably no way around that.
Do I like Swift compared to JavaScript? Not that much. I guess I am already too used to JS problems and quirks.
Did I enjoy the publishing and waiting experience? Not that much 😀
Was it worth spending a month of life on all of this? Yes, even if revenue from sales is minimal. My family, friends, and I will be able to use a cool app for free.
Understanding programming principles allowed me to ask the right questions and formulate precise commands for AI. I could also question strange AI decisions, and that was very useful.
While waiting more than a week for Apple’s response, I personally felt how much the number of people who want to publish apps in the App Store has grown. Most of those apps are not very well made, and their interfaces are not very attractive. Still, they are apps in the App Store, and each of them can bring in some revenue. And if you create several such apps, with each new one you understand better how everything works and how to implement different ideas. This is possible even if at first you do not understand programming at all. So the competition is growing. But somehow, it will be okay 🙂
So here is my app: https://calmfinance.app.