Software Engineering: A Human Journey Before Anything Else
Nuxt UI just released its version 4.
This article isn't about the tech. It's a human story. You can continue to read.
You might wonder why this matters enough to write about it. For me, it marks the end of a project that kept me busy for months and gave me the chance to collaborate with people around the world.
Today I want to share that journey because I tweeted a lot about it, but apart from the people I collaborated with, I haven't shared much.
Some weeks ago I published an article about my shift from writing code for the sake of writing code to using my skills to create moments. That change drastically affected how I view software development, my job, and my goals.
This release is part of that journey.
So when did this journey start? On Dec 7, 2024 I tweeted:
Imagine, Nuxt UI but like Shadcn Vue 🫣
At first it was just an idea. I tweet often to test interest.
That tweet has been viewed more than 18k times and liked 105 times. The signal was clear: people were interested. Funny enough, apart from that tweet I didn't have a concrete plan or a clear vision of what I wanted to build.
So why did I tweet it?
The Beginning
Let's go back a few years to give some context.
From day one, I'm a huge fan of Nuxt UI. Day one was May 16, 2023. Strangely, I clearly remember what I was doing when I saw the announcement on Twitter: I was leaving my office, on the bridge crossing the Seine, about to take the tram. That could be ordinary, but I never take the tram to go home, I always take the bus.
The announcement didn't leave me indifferent. I felt a spark of excitement. Nuxt was becoming more than just a framework. Nuxt has always been about details and delightful developer experience. If they could bring that same level to the component library, they could win over developers.
At first it wasn't Nuxt UI but NuxtLabs UI. The components had been extracted from Volta by the Volta team. We had to wait for version 2.8.0 before NuxtLabs UI was rebranded to Nuxt UI.
A few months later, on November 2, 2023, they announced Nuxt UI Pro. Amazing, but it cost $199. At the time I was still a student and, honestly, with all the love I have for Nuxt, that was a lot of money for something I used only as a hobby.
In the FAQ they mentioned that students could get a discount. After extensively trying the Pro components, and without being able to deploy them, I reached out to the team for that discount on November 5, 2023.
A day later, Sébastien replied with a 100% discount code to thank me for my contributions to Nuxt Content, UnJS and Nuxt Studio. Nuxt UI Pro, for free. I couldn't believe it. Thank you, Sébastien! Just thinking about it makes me smile.
Now, let's move to the end of 2024.
The Need
For the past few months I have been learning Laravel. With Laravel I discovered Inertia and I completely fell in love. This tool changed the way I build applications.
At the same time I started a job where I had the freedom to choose my tech stack. I chose Laravel, Inertia and Vue. So for both my personal and professional projects I embraced this stack.
Nothing is perfect, and this stack had a downside.
Nuxt UI was available only for Nuxt and not as customizable as I wanted. That was frustrating because I had grown to love the components and the developer experience they provided. There was nothing close to matching it for Vue.
But aren't we makers? If it doesn't exist, why not create it?
This led me to an idea. Shadcn was becoming the de facto library for building React applications. It comes with a beautiful design system and a smart distribution system. Projects own their components, which makes customization easy at the project level. However, the developer experience when using these components is far from the Nuxt UI experience.
What about creating a Shadcn-like library for Vue? A Nuxt UI clone, distributed like Shadcn, but for Vue and compatible with Inertia. The Nuxt UI developer experience available to every Vue developer, it gave me chills to imagine it.
This is how the tweet was born.
With that idea in mind and a strong interest in building this library, I had to get started. Building and maintaining a library is huge work, so I asked on Twitter if anyone was interested in joining me.
Five people answered the call, much more than I expected!
Shout out to a bei, David Pena, Enzo Notario, aussieboi, and Grygoriy Lyashenko for joining me on this adventure! If one day you come to Paris, please reach out!
I had a plan, a team, and we were ready to build.
At the same time, Nuxt UI was progressing toward version 3. Two weeks before my tweet, a pull request to make Nuxt UI compatible with Vue 3, created by Daniel, was merged. But it still wasn't as customizable as I wanted, and there was no support for Inertia.
The Build
At first, I wasn't sure how to approach this. I knew I wanted to create a library that matched the developer experience of Nuxt UI, but I didn't want to simply copy it.
This wasn't a direct fork of Nuxt UI. Regularly I copied components from Nuxt UI, adapted them to make them Nuxt-agnostic, and sometimes changed their behavior to match my preferences.
The team did that for every component, every composable, every utility function, and even every theme. We also built a documentation site to let users copy and paste code snippets easily, with automatic code modifications if you were using Inertia or simply Vite, and embedded demos for each component.
We even built a bash script to automate the setup process and a way to install only the needed components along with their dependencies.
This was absolutely amazing to build and so satisfying to have something working and used in projects.
For example, code.soubiran.dev was built with this library. Even my own website, the one you're currently on, also uses it.
The Truth
On April 14, 2025, a pull request to add support for Inertia was merged.
I had to face the facts: Nuxt UI was finally becoming what I wanted to build. The customization was not as good as owning the components, but it was open source. Why not submit some contributions? I know each component inside out and had already made some improvements in my fork. I just had to port them back.
So I did. Since December 1, 2024, I contributed nineteen times.
Maintaining my fork was honestly a lot of work and far more than the value I was able to add. Sometimes it's better to let go and focus on what truly matters.
I'm grateful for the experience. It gave me the chance to learn deeply from the Nuxt UI source code and connect with the team through Twitter messages and GitHub issues. One fun aspect of working with a global team: you could go to sleep after sending a message and wake up to a new pull request!
Now, it's time to admit: Vue UI is officially over.
- Website: vue-ui.barbapapazes.dev
- Code: Vue UI Labs
Thanks to the entire Nuxt team, especially Sébastien, Benjamin, and Hugo for your wonderful work on Nuxt UI. 🫶
A picture is worth a thousand words, but sometimes a thousand words express more than anything else. I hope this inspires you to embark on your own journey. Remember: You Don't Need to Be Chosen, You Can Just Do Things.
From time to time I love to look back at my previous articles. I like to take time to reflect on the journey I've taken. This helps me appreciate each new day and each new person I meet along the way.
Thanks for reading! My name is Estéban, and I love to write about web development and the human journey around it.
I've been coding for several years now, and I'm still learning new things every day. I enjoy sharing my knowledge with others, as I would have appreciated having access to such clear and complete resources when I first started learning programming.
If you have any questions or want to chat, feel free to comment below or reach out to me on Bluesky, X, and LinkedIn.
I hope you enjoyed this article and learned something new. Please consider sharing it with your friends or on social media, and feel free to leave a comment or a reaction below—it would mean a lot to me! If you'd like to support my work, you can sponsor me on GitHub!
Discussions
Add a Comment
You need to be logged in to access this feature.