All posts

Small team, sharp tools

Two people. Five products. Zero meetings. That's not a limitation — it's the whole strategy.

Small means every decision is intentional. No one hides behind a process. No one ships something they haven't personally used. Here's how we stay productive without burning out or shipping garbage.

2
People on the team
5
Products shipped
0
Meetings per week

The indie developer tool stack

Every layer chosen for a reason. Click to see why:

Our technology stack

Opinionated choices. Each one earned.

Next.js for websites and web apps — static export to Cloudflare Pages, no server to manage. SwiftUI for native macOS apps. We pick the right tool for the platform, not the one that does both poorly.
Serverless at the edge. Cloudflare Workers run in 300+ cities. D1 gives us SQLite with zero configuration. No Docker, no Kubernetes, no infra team. Deploy in seconds.
We don't roll our own crypto. Apple's Secure Enclave handles key storage and biometrics. App Sandbox enforces isolation at the kernel level. NoxKey has zero outbound connections — verified by macOS, not by us claiming it.
Push to main, everything deploys. Websites go to Cloudflare Pages. macOS apps get code signed, notarized, and uploaded to R2 — all in CI. No manual release process. The entire pipeline is auditable in git.
AI isn't a product feature — it's a development multiplier. Claude Code writes implementation, runs tests, creates PRs. We review, refine, ship. It removes the gap between thinking and building.

How we ship without sprints or standups

No ceremonies. No story points. Here's what we actually do:

How a feature goes from idea to production

1

Feel it

Notice friction in our own workflow

2

Sketch it

30-min design in a text file, not Figma

3

Build it

Ship the smallest useful version

4

Use it

Dogfood for a week minimum

5

Ship it

Push to main. Done.

Opinions we've earned

You don't get to be opinionated without trying things first. Here's where we've landed — and why:

We use

TypeScript everywhere

Types aren't bureaucracy. They're documentation the compiler enforces. Every hour on types saves three hours debugging.

We avoid

Microservices

At our scale, microservices add complexity without value. A monorepo with clear boundaries gives us modularity without the network calls.

We use

SQLite over Postgres

For most of what we build, SQLite is faster, simpler, and needs zero infrastructure. D1 gives us SQLite at the edge. No connection pools.

We avoid

Electron

200MB to ship a window. We'd rather learn SwiftUI and ship something that belongs on the platform.

We use

Static exports

If a page doesn't need a server, it shouldn't have one. Our marketing sites are static HTML on Cloudflare's edge. Fast, cheap, unkillable.

We avoid

Jira / Linear sprints

Task trackers are fine. Sprint ceremonies for two people are overhead pretending to be process. We use a text file and git issues.

The structural advantage of small

Big teams optimize for coordination. Small teams optimize for output. We don't have meetings about meetings. We don't write documents that describe other documents. We don't maintain compatibility with decisions made by people who left three years ago.

We sit down. We build. We ship.

That's not a flex — it's a structural advantage. And we intend to keep it.