Blog — working notes on shipping software alone · Ahsan Mahmood
Working notes from building and maintaining a catalogue of products alone — architecture, mobile, security and the trade-offs behind them. Filter by topic, search by title.
All posts
Newest first. Pick a topic, or search by title.
Everything, by year
The full run in one place — no filter, no pages.
Most of what is written here came out of a real project with a real deadline. If you are making the same decisions, the first call is 30 minutes and free.
Building something like this?
- Start a project
- Latest
- Read the post
Working notes
Not tutorials. These are the decisions I had to make anyway, written down while they were still fresh — what the zero-cost constraint removes, where a free tier stops being free, and the failures that passed every automated check on the way to production.
- Published
- Most recent
- Topics
What building twenty-three products alone actually teaches you.
- Loading posts
- Next page
- Previous page
Full-stack developer in Lahore, Pakistan. One React and TypeScript codebase becomes a web app, an Android app and a browser extension — twenty-three of them are live. Everything written here came out of building and maintaining them alone.
- GitHub
- Ahsan Mahmood
- About the work
- Copy this snippet
- Loading the post
Read next
- Email
- Facebook
- Hacker News
- LinkedIn
- Reddit
- Telegram
- WhatsApp
- Close
- Copy the link to this post
Share this post
On this page
- Updated
- Search posts by title, summary or body
- Everything
- Filter by topic
In the feed right now
- How much does custom software cost, and what is in a quote? — $800 is the floor for a small, well-defined feature. Everything above it comes from a scoping call, in writing. What that quote contains, and what it omits.
- How long does a web app, an MVP or a full product take? — Small features 1–2 weeks, an MVP 4–8, a full production app 8–16. Where those ranges come from, how each is delivered, and what makes one of them slip.
- What does zero-cost infrastructure cost you? — Nothing paid sits in the critical path, so the product costs nothing to run. What that takes off your bill, what it forbids, and where a free tier ends.
- Can one codebase ship web, Android and a browser extension? — Yes. One React and TypeScript repository becomes a web app, a Capacitor Android app, and a Manifest V3 extension, packaged three times for three stores.
- Can I hire a full-stack developer remotely? — Yes. Pakistan Standard Time, UTC+5, asynchronous by default, with calls across US, UK, EU and Australian hours, and a first reply within one business day.
- What is actually changing in web development — Not predictions. Four shifts I have already had to design around: crawlers that do not run JavaScript, the platform absorbing dependencies, types as the…
- Pricing and plans without a payment processor — Why my products take payment through a redirect and an admin grant instead of a checkout integration, what that costs, and the entitlement bugs that bite…
- How this site is built, and what I rebuilt to fix — React 19, Vite, TanStack Router, Supabase and a click dummy that is the visual specification. Including the outlet bug that made nine service pages render…
- The JavaScript features I actually reach for now — Intl for anything a person reads, structuredClone, at(), Object.groupBy, and the platform APIs that replaced dependencies. Plus the number formatting that…
- Micro-animation: the 100ms rule, and everything else is… — Motion that earns its place versus motion that is decoration. Why acknowledgement beats a toast, why the browser gives you two free properties, and the…
- From junior to senior: what actually changed — Eight years from a frontend job in Lahore to running twenty-three products alone. The three shifts that mattered, and the one I was slowest to make.
- A feature-request board on Firestore, and the rules that… — Vote counts that cannot be forged, a status workflow that means something, and the security-rule subtlety that makes a list query fail while the…
- Reflectify 3-3-1: a journaling app that deliberately has… — Three gratitudes, three wins, one focus. Why the entries never leave the phone, why there is no model reading them, and what a constraint does to a product…
- PregnancyPal: building health software when the data is… — Week-by-week tracking, vitals, fertility and a community — on a free tier, with no cloud functions. What health data changes about every architectural…
- FilesHub: building the storage backend instead of paying… — A self-hosted Laravel platform that replaced Firebase Storage and every transactional-email vendor across an entire portfolio. What it took, and the…
- Trizlink: one React codebase as a web app and an Android app — Two surfaces from one repository, with a third planned. What actually got shared, what could not be, and the free-tier limits that shaped the data model.
- Refactoring a monolith you cannot stop shipping — The rewrite that loses a third of your features, the seams worth finding first, and why "delete the dead code" is the highest-value refactor nobody…
- Firebase Auth and social sign-in: the parts that are… — Social login is easy to add and easy to get subtly wrong. Custom claims that lie, rules that trust the client, and why an extension cannot use the Auth SDK…
- Accessible design systems: what React Aria gives you… — Moving from a styled component library to headless primitives plus Tailwind. What accessibility work is genuinely free, what is not, and the rich-text rule…
- Admin panels: four failures that ship looking complete — Every one of these was found in a live admin panel, and none is visible in a code review or a green build. Plus why the screen list should be derived from…
- One codebase, web and Android: what Capacitor actually costs — Shipping the same React app to the browser and to Google Play. The parts that are genuinely free, the parts that are not, and the config bug that ships…
- TypeScript patterns I actually use, and one that cost me… — Typed translation keys, satisfies, discriminated state and branded ids — plus the conditional type that took my typecheck from 14 seconds to 170 and how I…
- SEO for a single-page app, without pretending to have a… — AI crawlers do not run JavaScript. Neither, reliably, does anything else you care about. Here is how I get real content into static HTML without adopting…
- Why I reach for TanStack Router — Typed routes turn a whole category of navigation bug into a build error. Here is the one that shipped to production in my own app before I moved, and what…
- A zero-cost backend architecture that actually holds — Twenty-three products, no servers, no monthly bill. Here is what the constraint removes, what it forces you to design properly, and the day a free tier…
https://aoneahsan.com/blog