XenneX/LLC
All posts

A decade on Ionic (and why I'd do it again)

Ten years of shipping apps on the same framework. What that consistency actually costs — and what it buys.

#ionic#angular#mobile#stack#retrospective
A decade on Ionic (and why I'd do it again)

I started XenneX in 2014. The first two products — Cosmic Crush and Comet — were built in Lua with Corona SDK, back when that was a reasonable way to ship a cross-platform mobile game without wanting to die. By 2015, I'd moved to Ionic. I've been building on it ever since.

That's a long time to stay loyal to a framework. Long enough that people occasionally ask why — usually expecting a pragmatic answer about output or cross-platform reach. The real answer is messier than that.

How the consistency started

It wasn't a strategic decision. I picked up Ionic because I already knew Angular and it let me ship web, Android, and iOS from a single codebase without learning Swift or Kotlin. For a one-person studio, that math is obvious.

What I didn't expect was how quickly that initial familiarity compounded. By the third product I wasn't just writing faster — I was reusing mental models, component patterns, service structures. The fourth product inherited a deployment pipeline I didn't have to think about. The fifth one got auth, in-app purchases, and offline sync almost for free, because I'd already solved those problems somewhere else.

A single tech choice made in 2015 to avoid learning a new language had turned into a small but real competitive advantage. That's not planning. That's what consistency does when you don't interfere with it.

What it costs

The honest version includes the downsides.

Ionic is not the right tool for every problem. Native performance ceilings are real. There are UI interactions — certain gestures, certain animations — where a native app would feel materially better and a hybrid app just doesn't. I've shipped features I knew weren't as good as they could have been because rebuilding in native was a cost I wasn't willing to pay for a side project.

The Angular dependency is the other thing. Angular is a good framework with a strong team behind it. It's also opinionated in ways that occasionally feel like fighting the framework instead of building your product. When everyone else was shipping React, staying on Angular was a choice I had to keep making deliberately, which sounds more confident than it usually felt.

And there's a subtler cost: familiarity can blind you. If the right answer for a given product is something you haven't used in years, you might not see it. I've built things in Ionic that probably should have been lighter — a simple static site, a server-rendered page, anything that didn't need the whole PWA machinery. Stack comfort is a useful heuristic that occasionally leads you to the wrong place.

Where it actually broke

AI Recaps, launched in 2026, is the most technically demanding thing I've shipped under the XenneX banner. Ionic on the front end was fine — that part held up. But the backend required real-time transcription, webhook coordination, scheduled jobs, and Stripe billing logic that was complex enough to warrant a proper framework. I reached for NestJS.

That wasn't a referendum on Ionic. It was the backend finally becoming interesting enough to deserve its own treatment. NestJS and Ionic complement each other well — same TypeScript idiom, similar module patterns — but I'm not pretending they're the same choice. NestJS has opinions that cost you time up front. For AI Recaps, those opinions were worth it.

Why I'd do it again

When I look at the XenneX product list — Redinfinite, WSB Stock Tracker, Unobtainium, Dealery, Game Night, AI Recaps — there's a through-line of shared infrastructure that only exists because I made the same boring choice over and over. Each product benefited from the ones before it. The debugging intuition, the deployment patterns, the way I structure services: all of it transferred.

Solo development is a resource problem. You're always doing more with less. Consistency is one of the few free resources available to you, and it pays out over years, not sprints. I've shipped roughly a product a year since 2019 — not because I'm fast, but because I'm not starting from scratch every time.

If I were advising someone starting a studio today, I wouldn't say "use Ionic." I'd say: pick something capable, learn it deeply, and resist the urge to switch until you have a genuinely compelling reason. The switching cost isn't just the new syntax. It's the loss of everything you'd compounded on the previous choice.

Ionic happened to be my something capable. A decade later, I still ship on it. That's boring in the best possible way.


AI Recaps is the newest thing out of XenneX — airecaps.com if you want to see what the stack looks like when it's pointed at something.