Tamagui – UI kit that unify React Native and Web
tamagui.dev
tamagui.dev
Tamagui has a really elegant combination of a Styling system (the mechanics of applying styles to the underlying systems), a Theming system (the way sizes/colors are passed down within different contexts of the UI), and a Component system (high level components that are ready to use out of the box). In my opinion, this is where Tamagui shines above the competition- each abstraction effectively builds upon the underlying ones, and it gives you a bunch of ready-to-use components so you can start building quickly and worry about the details later. Way better than the "just copy and paste" model of Tailwind which forces you to maintain components and manually create a consistent UI for your app.
We are using Tamagui for our open source electron app + web site. We hope to have a React Native app in the future, so we are strongly opposed to any solution that is overly tied to CSS. If you want to see an example (real-world, messy) codebase that uses Tamagui, please take a look here: https://github.com/MintterHypermedia/mintter/tree/main/front...
The biggest downside, in my experience, is the heavy/complicated/fragile setup process of Tamagui. Although this is typical of any TS monorepo. If you struggle to integrate Tamagui in your codebase, I encourage you to power through the setup phase- the payoff is totally worth it!
The starter with nextjs/expo is sooo complicated though. I know it's not tamagui's fault, but the js ecosystem is a terrible mess. Bundlers/monorepo managers/package managers all come together to build a tower so tricky it feels like it will fall at any moment. And that's coming from someone _relatively_ used to it. It's wild to me that this is the best we can do at the browser, I've come to the conclusion that the ecosystem is not fixable. I hope WebIDL and GC in wasm take off and give us more options in the long run.
I’d like to first help https://vxrn.dev find some consistent contributors and get it stable.
And then I ported Expo Router to work with it, so shared single file system routes and no more need for a monorepo.
So now you’ve simplified from two bundlers, two stacks, four folders down to one stack, one bundler, and one folder.
And then I have some interesting ideas to make data a lot simpler which I’d like to try on top.
All together no reason we can’t make a modern Rails like experience work, but it is crazy how much work it is with all the modern stuff, but imo will pay off with something actually great for universal apps.
I wish you and your projects a lot of success and I'm looking forward to everything that's coming.
For me it feels a bit like using Tailwind CSS, but that works out of the box on all the platforms that I love. I have been active and asking questions on their Discord and people were helpful, the community seems to be good. Seems to be a pretty young project, but very interesting.
Anyone else feel the same ?
So building a good API layer + web app gives you possibility to build a good native app on top of same API later when your idea is validated
I’d say though that I’d actually choose Tamagui and native if I was going for speed to ship. Even if building a PWA, Tamagui is a great way with components designed for mobile.
I hate how so many of these things want to be a kitchen-sink framework that owns the world, instead of a library you can adopt piecemeal where it makes sense
Other than that, I think one cross-platform framework like Tamagui with a large company and team behind it would be the ideal framework for most projects.
Since it didn't exist: I did build a Tailwind-like UI library for Tamagui to make building new projects easier. It's called ComponentHub [0] and offers pre-built, more complex UI components
https://jonline.io https://bullcity.social https://oakcity.social
Take a look at the 3 videos here: https://solito.dev
Solito is a thin wrapper around React Native and next.js so make it easier to share as much code as possible between the website and the native apps but still have the apps actually behave like native apps.