Tech stack for indie App developers

Abracadabra
5 min readMay 5, 2024

--

Introduction

Most software engineers mastered the tools to build Apps in their job. While those tools work well for their employers, they are suboptimal — both in terms of money and time — for indie developers who usually build app by a 1~2 person team. The priorities from businesses in different stages are completely different. The more established the business, it cares more about stability, scale, and long-term efficiency. The more early stage the business, it cares more about iteration speed and short-term cost.

Employing the wrong tools is a costly mistake in any project. In this post, I will share what I’ve learned that works best for indie developers. The tools are fundamentally different than those in a small, medium sized, or large company.

Common architecture

We only consider Web or iOS because in most cases Android users don’t have enough paying power required for projects at bootstrap stage — with all due respect.

General Web/iOS App architecture

The above is a generic architecture of an App. At a high level, the App need the following five components:

  • A frontend UI for the user
  • An user account system
  • A backend where server-side logics are executed. For example, calling external APIs and update/query DB data.
  • DB for data persistent
  • Payment processing

If you want to build an iOS App that doesn’t need server side logic, the stack can be made Apple-only and simpler.

Apple-only stack (for iOS App w/o backend logic)

Below are the correct tool for each components.

Frontend UI

Web Applications

For Web applications, I would recommend VueJS. It’s has all advantages realized from the post-React generation Web frameworks while being the easiest to learn. React’s syntax is more obscure. NextJS’ more powerful features — server-sider rendering, etc — are useless for a bootstrap project; therefore its higher dev and learning cost are not worth it.

Before React, the previous generation combines a backend script (PHP, Rails) and a imperative Javascript lib (jQuery) to build the Web UI. I don’t recommend this approach now. The learning curve is about the same as VueJS, but the reflective/declarative approach pioneered by React was the winner after a decade of practice and debate. Given similar learning curve and dev cost, we should opt for the better coding experience from reactive frameworks.

iOS

The story of iOS is simple. Build SwiftUI App using Swift. The previous generation is the much chunkier UIKit. iOS dev has also evolved forseveral generations, the current SwiftUI is a decent tradeoff between the simplicity, learning curve, and the expressing power. It provides simple solutions for simple requirements and is possible to solve hard problems.

Flutter or its equivalents are designed to build Apps on both Android and iOS (possibly Web also.) Because we only need to build on one platform to validate the business idea, Flutter is never better than SwiftUI or VueJS.

User Account System

Most App are user specific. For example, subscription, user’s own data, and so on.

It’s crazy to build an user account system from scratch. Choose one of sign in with Apple, Google, or Facebook. (I remember a joke: Google’s biggest contribution to AGI is providing Sign in with Google to OpenAI.)

Here are two components: the underlying account system and the sign-in-with provider.

I recommend using Firebase for the account system. It has built-in integration with sign-in-with providers. Firebase also provide database and serverless functions for our App, at close to zero cost.

The App’s domain decides which sign-in-with provider is the best. I use Google or Apple.

Backend Code

Don't spawn an AWS EC2 server. (I suppose no one thinks about owning physical servers in 2024.) Use one of those cloud functions instead — AWS Lambda or Google Cloud Function. The reasons to prefer serverless are:

  • No need to spend one full day to step up the server — Provisioning, installing dependency, opening ports, configuring revers-proxy, DNS, SSL, and many others
  • No need to think about server scalability for a very long time. (99% projects won’t survive that long.)
  • Much cheaper than a real server until it grows very big. (99.9% projects won’t every be that successful.)
  • Less code. You only need to build the core logic to your projects. Almost zero boilerplate code.

There are other smaller reasons I didn’t include. Severless is the clear winner (and blessing) for indie developers of our age. Sadly, most enterprise developers are not aware of the stack because in their job, decision makers never consider it. They — both the people and the project — are often too old and too clumsy to adapt new and nimble tech.

Database

Web App should use Firebase

Use Firebase. There are two flavors: KV store (Firebase Realtime Database) and relational DB (Firebase storage). Choose the one based on your application.

iOS App w/o backend code should prefer CloudKit

In case of iOS Apps that doesn’t have backend logic — the cloud functions — Apple’s CloudKit is a more streamlined solution. It allow the iOS code to manipulate data stored on user’s iCloud account.

Payment processing

Web App should use Stripe

Stripe payment processing for Web App

Stripe encapsulates the crazy and wild payment jungle into manageable APIs. The processing contains four steps.

  1. The client code retrieves the payment UI from Stripe. For example, a link like https://buy.stripe.com/cN25ls2A3duLabK9AC. The payment link can be obtained after Stripe account setup.
  2. The user fill in the payment information (credit card number, etc) and send the information to Stripe.
  3. After verifying the payment information, Stripe will call a Webhook server on our backend (one of our cloud functions).
  4. The webhook logic will trigger our custom backend processing. For example, enable subscription, enable paid feature, or initiate the shipping or some products.

iOS App should use Apple’s StoreKit 2

Apple introduced StoreKit 2 two or three years ago. It’s much easier to use than the original StoreKit. The logic is much simpler but the implementation is still complex. You should be able to locate fine tutorials for subscription payments and merchant payments through Google or ChatGPT.

Examples

The above knowledge are aqquired while building the following projects.

  • WhatGPT. ChatGPT but no pay-as-you-go instead of subscription. And some other features like better search and chat history management. But an ugly UI. https://gpt.greenswan.pro/
  • ReadWithAI. Ask questions to GPT-4 when reading a hard to understand book. Launched books on App Store:

https://apps.apple.com/us/app/%E9%BB%84%E5%B8%9D%E5%86%85%E7%BB%8F-ai%E5%8A%A9%E5%AD%A6/id6473876404

https://apps.apple.com/my/app/%E8%B5%84%E6%B2%BB%E9%80%9A%E9%89%B4-ai%E5%8A%A9%E5%AD%A6/id6477305850

https://apps.apple.com/my/app/kjv-bible-study-with-ai/id6478344275

https://apps.apple.com/my/app/%E5%8F%B2%E8%AE%B0-ai%E5%8A%A9%E5%AD%A6/id6476935310

https://apps.apple.com/my/app/%E9%81%93%E5%BE%B7%E7%BB%8F-%E5%B8%9B%E4%B9%A6%E6%9C%AC-ai%E5%8A%A9%E5%AD%A6/id6476526082

--

--