5 Tools You Should Use In Your Next Node.js Side Project
In the past year I created more than 10 side projects and these are the tools I used in most of them.

Introduction
3 Reasons Why You Should Create Side Projects As A Software Engineer
Reason #1: Learn And Experiment
As a Software Engineer, you might want to explore new tools and patterns, but you might not have the room to do it in your full-time job.
When you need to deliver value to your users, relying on something you and your team already know and trust is usually better. You don’t want to adopt the early-stage library or framework, which might disappear in a year.
That’s why you can create a side project to explore something new, monitor it, and propose it to your team.
Reason #2: Showcase During Interviews
During job interviews, one of the most common questions is:
Tell me about one project you worked on.
I have already written a post about this topic, but the TLDR is that you want to have a project you know from the beginning to the end to explain every decision you made working on it.
Reason #3: Solving A Problem You Have
As software engineers, we use code to solve people’s problems every day, and sometimes, we forget that we can also use it to solve our problems.
When you struggle daily with the same minor problem, you should consider making a small application to solve it. This is precisely what I did a few months ago with Kindlehighlights.
I wanted a simple way to extract notes and highlights from books I read on my Kindle, so I made it.
If you are curious about the project and want early access, leave a comment with the word HIGHLIGHTS, and I’ll DM you the link to access the app.
So, let’s dive into the 5 tools you should consider in your next side project.
Tool #1: TailwindCSS + DaisyUI
When you work on a side project, you should not focus on aesthetics.
You should work to make the project functional as soon as possible and release it. That’s why you should use something that can help you create a UI quickly and easily. Ideally, you can reuse it with some little tweaks in your next project, too.
With DaisyUI and TailwindCSS, you have:
A set of ready-to-use components.
It is easy to hack and adapt those components to your needs.
You can configure and modify the themes for every project.
It took me a couple of projects to create reusable components, but now I have a library of components I can reuse in every project.
Tool #2: Zod
You need validation if you plan to deploy (and you should) your side project.
When you use types, you want to trust them, but you know that, with Typescript, types do not exist at runtime. Zod is one of the best ways to bind your validation to your Typescript types. This way, validation is still there even if your types do not exist in the code you deploy.
I use Zod in many places of my app:
Validate forms on the frontend (see Tool #3).
Validate API responses on the client (see Tool #4).
Validate requests received in the API using fastify type provider.
I use Zod to create validation and types I can share between frontend and backend.
Tool #3: VeeValidate
VeeValidate is an awesome tool for creating and validating forms in Vue.
The best part is that you can use Zod validation in forms. I am obsessed with validation and keeping it in sync between my UI and API. This way, I can use the same Zod schema to validate my form and endpoint.
As an example, imagine you have a form you use to create a user:
Your form will have 2 text fields: email and password.
Email and password cannot be empty; the password must be at least 8 characters long.
Your API will expose an endpoint /api/users
and accept a POST request with the body being something like:
{
"email": "test@example.org",
"password": "mysuperstrongpassword"
}
You can create a CreateUserDTO using Zod:
You can use the same DTO in your vee-validate forms and fastify type provider.
Tool #4: up-fetch
I worked with plain fetch for years in my side projects until I discovered up-fetch.
When working on a side project, simplicity is key. That’s why I love up-fetch. It is nothing more than a wrapper of native fetch, which provides a few more features.
With up-fetch, you get:
Automatic body and params parsing.
Validation of the API response using a Zod schema.
Type of the response based on the provided Zod schema.
Up-fetch connects forms and API validation; with that, all the steps of the request flow are validated and typed.
Tool #5: Pocketbase
Pocketbase is a CMS in a simple executable file.
While it provides many functionalities, I only use it for 2 things: user management and authentication.
Users Management
When a project is in its early stages, you might not want to make it public.
Inviting people you trust to help you test it; Pocketbase is excellent. The flow I usually follow is this one:
Create a users
table in Pocketbase.
Users will have email, password, and confirmPassword fields. Pocketbase automatically validates and hashes password and confirmPassword fields.
Keep reading to understand how you can authenticate users in your app using Pocketbase.
Authentication
The authentication flow is always a JWT system through fastify-jwt, but users are stored only on Pocketbase.
So, when a user logs in, here is what happens:
A request reaches the
/api/login
endpoint of the fastify API.The user is authenticated using Pocketbase
pb.collection(’users’).authWithPassword(email, password)
I encode the user's id into the JWT token and return it.
I can authenticate the user with the JWT token at every request by retrieving the user from Pocketbase using the encoded ID.
Conclusion
In the last year, I created more than 10 side projects with different purposes: open-source libraries, personal projects I use for myself, possible small business ideas, and proof of concepts to experiment with something new.
Side projects are crucial to Software Engineering and are essential for increasing your chances of landing a new job and growing your career.
I used these tools in multiple projects, significantly increasing my productivity in 2024. I hope you can find this helpful list and try these tools.
Are there other tools you use? Let me know in the comments!
Great tips!