Remember how I wanted to make this newsletter a regular endeavor while writing a book and not spending much time on other writing? Well, considering the last edition was 5 months ago and the book still isn’t published, that didn’t go as planned 😂 Nevertheless, here I am, and today we will talk about what I’ve been up to! So, take a break, grab your drink of choice (ice flat white for me, as it’s summer in Riga!), and settle in for a short (who am I kidding 😂) ride into Daria’s Flutterland.
BBapps: Apps that care for you and the planet 🫶🏽🌍
The last time we talked about what I was up to, I mentioned I wanted to work on my own product. I’m excited to say that this plan is in full swing. To make it official and solve various business-related problems, my husband and I founded a company—BBapps. What does BB mean? I won’t tell, at least not yet. Maybe in an interview with Forbes magazine in a couple of years… (I mean, a girl can dream 😂).
After some thinking and planning, we came up with another strategy. The app business is tough, and focusing on a single product is risky because there's always a high chance it might flop. To increase our chances of success, we decided to create a set of apps in different domains, publish them one after another, and keep iterating. While the apps are different, they are united by one core principle that has been important to me from the start and the reason I embarked on this journey: to create “apps that care for You and the Planet.” Technology has the power to both ruin and save the world (so dramatic), and I want to contribute to the latter. Many of you already know about Bunny Search, and today it’s time to tell you about one of my new apps: NativePal.
Trigger warning: the rest of the post will mention AI 🤪
NativePal: Learn that language your own way
In one of my previous newsletters, I talked about developing a language-learning app that provides a personalized experience. “Personalized” has become much more accessible thanks to Generative AI, such as GPT and Gemini. After using ChatGPT for the first time, I immediately knew this would be a game changer in language learning.
Long story short, that’s how the idea of NativePal came to be—an AI bot that engages with you in the target language in a natural, adaptive format. Available 24/7, it never tires of talking and doesn’t make fun of your mistakes. Besides practicing conversations on your favorite topics, it can give thorough feedback on your errors, vocabulary, and use of language. This was the idea for the MVP of version 1.0. Of course, further possibilities are endless, but one thing I’ve been unlearning is perfectionism and learning to ship 😂
Creating this app was a lot of fun, especially the characters. We used Midjourney for character images, and the aesthetics and design of the app itself marked my debut as a designer 😁 In a startup, you do everything, as they say 😅
So this is NativePal:
Now, since this is a tech newsletter, let's talk about some technical challenges. The tech stack of the app includes Flutter, Firebase, and the GPT API. I covered many implementation details and how exactly Firebase is used with GPT in my recent talk at the Full Stack Flutter Online Conference. It's a quick 20-minute talk discussing securing API keys, GPT API, Firebase Extensions, Cloud Functions, App Check, Performance Monitoring, and RevenueCat. If you're interested in those details, you can check it out here.
GPT or Gemini, that is the question
When I started developing this app, Gemini didn’t exist. When it did appear, it wasn’t available in the EU, so that answers the question in a nutshell. But I wouldn’t be a software developer if I didn’t try it anyway, thanks to VPN and the #GeminiSprint hosted by Google in March.
I tried to recreate a stripped-down version of NativePal using the Gemini API. I used the same prompts as for GPT, but it was harder to get consistent responses. Sometimes it ignored the instruction to respond in Spanish, and other times it inserted random formatting such as Markdown. I'm pretty sure this will be (or maybe already is) fixed, but another major feature that is lacking is the ability to set a “system” prompt in the API. In GPT, you can distinguish between prompts set by the “system” and prompts from the “user.” This way, you have more control over the model's behavior, and users have less. This is crucial for my app, as I have characters who should ideally behave like characters 😁
I’m sure this feature will come eventually, and I’m still looking forward to trying Gemini in production one day. Especially because of the surrounding infrastructure: Google is really making it easy for developers to use, and I’m particularly fond of Vertex AI SDK for Firebase, especially since you don’t need to use API keys and can secure your app via Firebase App Check.
GPT-3.5 vs GPT-4: Costs, Performance & Hallucinations
With GenAI APIs, you pay for tokens, and the more advanced the model, the more you pay. Currently, in NativePal, there are two main functionalities:
Actual conversation with the character
Message analysis report
For regular conversations, GPT-3.5 performs well, at least with popular languages (not the case for Latvian...). However, when generating a message analysis report, it often fails: inconsistent response formats and absurd hallucinations. This led me to experiment with function calling and fine-tuning. While function calling improved the response format, the content was still lacking. Fine-tuning the model seemed promising, but to make it productive, I would need a lot of training data. This is still the plan if the app needs to scale.
For now, I went the easy (expensive) route and used GPT-4. It performs surprisingly well for the task, so we decided to use it as is for now. However, it is notoriously slow as an API, with responses often taking 10-20 seconds, which degraded the user experience. Initially, I generated the bot reply and message analysis report in one function, returning the response only once everything was complete. The solution was to make these requests in parallel. Now, the bot replies almost instantly, and the message analysis report is generated in the background, allowing the user to continue the conversation seamlessly.
This is something to consider when choosing between the models. There are even more considerations, which I discussed during another talk in April for Flutter Riga, but unfortunately, it wasn't recorded. Maybe I'll give it at another meetup later this year again 😝
Do not get me started: publishing experience with Google PlayStore
Throughout my career, I’ve published dozens of apps to both Google PlayStore and Apple AppStore. Both had their issues, but in general, publishing to PlayStore was a breeze, while Apple was notorious for random rejections. How surprised was I to find out that lately, the experience has become the opposite…
Submission #1: 12 days of waiting (!) and an email to support, only to finally be rejected because the app description had the word “best,” which is against PlayStore Policy. Does anyone even read app descriptions nowadays? Anyway, I waited for 12 days to be rejected for a silly reason like this, which wasn’t even related to the app itself and could’ve been checked automatically. Ok, I removed the word and resubmitted the app.
Submission #2: Rejected. They attached a screenshot of a stuck loading screen that I could not reproduce. No description, just a screenshot. I added more logs and better error handling because, from Crashlytics, it looked like Firebase Remote Config could be failing at that location on the app launch.
Submission #3: Suspended. With, wait for it… no description at all. Just an empty string. So much for automated checks.
And suspension means that I can’t upload the app with this package name again, and the next step might even lead to my account being terminated completely. I think we all know what that means. I appealed because there was literally nothing to work with, and I didn’t want to play the guessing game and risk losing my account.
While waiting for a response to my appeal for a couple of weeks, it was time to go to San Francisco for Google I/O. So, I decided to use this opportunity to book office hours with the Google PlayStore team 😈
At this point, I was so frustrated with the whole experience that I didn’t expect much. Thankfully, the Googler I met with was very helpful. He escalated my appeal internally, and in a couple of days, I got a response with actual useful feedback. Still very cryptic, but it was something I could work with. The main issue was that my subscription screen didn’t say users are billed automatically and that they can cancel anytime 🗿 From the screenshots, it looked like the reviewer was unlucky to use the app when GPT was down, hence it returned errors. I added more descriptive messages and more prominent empty screens (just in case), and finally, the app was approved. It took me around 1.5 months and a trip to San Francisco to get the app published, so I think you can imagine the range of emotions I feel about this whole situation.
By the way, problems with Google PlayStore didn’t stop there, but that’s a story (stories?) for another newsletter 😂 Meanwhile, with AppStore, I published new versions every week, and they all got approved the first time within a couple of hours (except the very first version, but that was my problem with T&C / Subscription). Moreover, the latest app I published, a lifestyle tracker called TrackIt, got approved in less than one hour. A new app, initial launch. What a time to live in.
What’s next for NativePal?
The current version of the app is very simple, and that's intentional. As a software developer, I'm used to constantly building. But as a product owner now, my goal is to create something useful, impactful, and that pays my bills. Preferably also for a villa in Tibidabo, Barcelona. To achieve this, I need to listen to user feedback. That's why I'm monitoring analytics, experimenting with ASO, and planning to test some hypotheses next.
Considering that an app with no marketing and just one feature (which, let's be honest, is quite basic for GenAI) already has 5 people who decided it's worth purchasing a subscription, that's great news. It shows potential. This is also my first app with paid features; my previous apps were free or salary-based 😁 So, I'm new to this indie world and very excited to see how it evolves! Here are some ideas I have for the near future of NativePal:
I've noticed that not many people return to the app after the initial couple of uses. I need to work on user retention tactics, such as push notifications and scheduled reminders.
Analytics show that users try to start a second chat. In the free version, you can only have one chat. To make the second chat option even more appealing, the next big feature will be creating custom characters. This will also allow me to add all GPT-supported languages and significantly increase the potential user base, as I won't need to create a predefined character set for each language (which currently takes time).
I've received feedback from friends that the message analysis report is very useful. To enhance it, I plan to add interactive exercises derived from the report, targeting specific mistakes rather than random lessons.
Another thing I’ve heard a lot from my users is that the "beginner" level isn't truly for beginners—you need some language skills to use it. While that was the initial goal, I see that "beginner" is the most popular level. I'll brainstorm ways to address this, possibly by providing hints in the free-form chat and adding role-plays for specific scenarios.
Initially, I thought the next big feature would be voice messaging. However, after experimenting with that, I found that for many less popular languages, like Latvian (again), the model speaks with a heavy English accent, which kinda defeats the app's purpose. I might add this feature for specific languages like English and Spanish, but it will require more experimenting.
And with this, I think we can wrap up the talk about NativePal… for today 😁 I’m very excited to be finally sharing what I’m working on here in my newsletter, and hope that I can stay more consistent than before. After all, I still have to tell you about TrackIt, Bunny Search news, and another app in the making… 👀
Before I finally let you go to enjoy the rest of your day, a quick announcement that I’ll be speaking at my fave conference this year again - Flutter & Friends ‘24 in Stockholm, 1-3 September.
There is a high chance that tickets will be sold out, and you don’t want to miss this one out, trust me! We’ll be talking about Static Code Analysis with a sprinkle of magic. Or a sip of Felix Felicis 😉
Until next time, and if you found this issue interesting, don’t hesitate to let me know!
And as always, let’s talk on Twitter (X 🙄)
-Daria 💙
P.S. Check out all of my apps here, or download specifically NativePal here.
Glad you posted!