
This week I'm releasing something of a holy grail of OSS and, weirdly, feeling somewhat reluctant about it. Last week there was a big stir up when Tailwind announced they're struggling financially despite surging popularity. As the creator of Tamagui I had people reach out, and yes, we're feeling similar pains.
I'm excited about what we're releasing today. I'm excited more about what can be done with it. But I'm also feeling uncertain.
Why am I giving away so much for free? Why can't frontend capture value? And why even sell this amazing new "plus" stack for a measly few hundred dollars when I legitimately believe it's a secret to success, and I'm dipping my toe into consulting with it? I re-started my blog here because I wanted to write more personally on the releases, my own life changes, AI, and our weird and changing industry.
This week we're launching three things: One v1, Tamagui v2, and Takeout. Be sure to follow those links for more on each of the releases.
What I think One, Tamagui, and Takeout achieve for the first time is the ability to share code across two different platforms without downside. That is, you can create a beautiful, highly performant website (static or server rendered) for your splash pages, docs, and content, and have it seamlessly transition to a truly next-generation app-like experience, on native and web, all from one codebase, one shared set of routes, one style library, one data model, and all without having to resort of cumbersome, ugly code. In fact, I think the code is better than ever before, even compared to single-platform projects.
I came from "the web." At 14, Photoshop and vanilla HTML/JS/CSS, making simple websites, then onto full-stack PHP and Rails, then Backbone/Knockout, then React. About 5 years ago I started playing with React Native, and from that built Tamagui. At the time, our startup needed to ship a cross-platform app, but we weren't Facebook, so writing our apps twice was hard to justify.
Tamagui was born (much later) because I it was clear it was possible to share most styling code - so long as you had an optimizing compiler. Tamagui still is the only library that truly "solves" sharing code this way, and this well. Beyond the compiler, a truly incredible amount of work was needed to fully support SSR while also supporting spring animations and React Native rendering, meanwhile also supporting the many nice web styling features that CSS had spoiled us with on web.
So Tamagui solved a big part of sharing code. It brought us from maybe 25% shared code to 50%. To support Tamagui itself, we built out a paid starter kit, Takeout. At the time it was our best effort, but the truth is, it still wasn't easy, or pretty. Takeout v1 was launched about two years ago.
Outside of styling, when comparing to a single-platform app, many things sucked - mostly, having two frameworks, two bundlers, a monorepo, a ton of glue code, and ultimately having to patch in optimistic mutations for your data for anything to feel remotely native.
So, we made One. We first built vxrn as an experiment to see if we could get Vite to support React Native. When that worked, we continued to test building a framework. Luckily, around that time, Expo released Expo Router, which had great API surfaces and solved things nearly exactly as we were internally anyway. So, we changed course and instead ported Expo Router to vxrn, and when that worked, iterated on it to add rendering modes, loaders, middleware, redirects, a production server, a whole bunch of ecosystem compatibility improvements, and such. That eventually became One.
So - we solved the mess, mostly. Except that data problem.
Enter Zero. One of the founders, Aaron, became a friend of mine while I worked at Vercel as he happened to live down the street from me. And Zero happened to be my dream solution to data - for both web and native.
We set out to rebuild Takeout with Tamagui, One and Zero, and see how close we could get to the "holy grail" - nearly fully shared code, excepting various platform-specific UI, without a shitty end-result.
Tamagui has always been a side project while holding a full-time Staff engineeer job. It's monetization has always been just a way to keep a hobby alive. Juggling full-time and side-business has meant both have suffered.