Building NoteVault: A Local-First Note-Taking App
Sometimes, the goal isn’t to reinvent the wheel — it’s to build your own version of it and ship it. NoteVault was my take on that. A note-taking app that just works: no login, no backend, no fluff. Just a fast, clean, local-first tool built with React, styled with Tailwind, and deployed with a single click.
The Goal
Build a fully functional, offline-first note-taking app with:
- Fast, modern UI using Tailwind and React
- Persistent data with
localStorage
only (no backend) - Instant feedback and minimal friction for users
Stack Overview
Layer | Tools |
---|---|
Frontend | React + Vite + Tailwind CSS v4 |
Storage | Browser localStorage |
UI Feedback | react-hot-toast for toasts |
Deployment | Netlify CI/CD |
Local-First Simplicity
Instead of relying on cloud databases or user authentication, I chose to keep everything in the browser using localStorage
. That decision made the app:
- Instantly available offline
- Easy to reset, duplicate, or share
- Fast to load and save
Notes are stored and synced automatically with each change. They persist across refreshes and browser sessions, with no backend code required.
Key Features
- Add, Edit, Delete Notes: A straightforward CRUD experience.
- Timestamps: Each note records its creation and last update time.
- Search: Filter notes by title or content with instant feedback.
- Export: Download all notes as
.json
or.txt
in one click. - Responsive Design: Works great on desktop and mobile.
- Toast Notifications: Subtle feedback for actions like save/delete/export.
Styling with Tailwind CSS v4
Tailwind CSS v4 changed the game by removing the need for config files. With the new Vite plugin and @import 'tailwindcss'
in my styles, I had a lean and modern setup with zero boilerplate.
I focused on clean spacing, readable fonts, and simple visual hierarchy — nothing flashy, just clean UI and a good user experience.
Deployment on Netlify
Deploying NoteVault was smooth:
- I pushed the project to GitHub
- Connected it to Netlify
- Set the build command to
npm run build
- Published the
dist/
directory
Now, every push to main
triggers an automatic deploy. No servers, no Docker, no pain.
Challenges Faced
- Tailwind v4 learning curve: With the removal of
tailwind.config.js
, I had to re-learn how to integrate styling the new way. - Dark mode troubles: I initially tried adding dark mode, but due to Tailwind’s structural changes in v4, I shelved it to avoid bloat.
- Responsive layout quirks: Making the note display clean across devices took some flexbox wrangling.
- Avoiding feature creep: I kept the scope tight to avoid falling into the “build everything” trap. Focused MVP > unfinished ambition.
What I Learned
- How to build and deploy a full SPA frontend with React and Vite
- Practical Tailwind CSS skills using the v4 plugin-based system
- Using
localStorage
effectively as a persistence layer - Creating user feedback with
react-hot-toast
- How to scope a project small, finish it, and move on
Try It Out
This was a small but meaningful project. It’s not fancy. It’s not perfect. But it’s done — and that’s the point.
Whether I evolve NoteVault into a synced, authenticated web app down the line or keep it as-is, it stands as a clean example of building something useful with intention and momentum.