The problem
I was using Notion for quick notes, but it was slow to open and Markdown didn't feel native. I wanted something local-first, minimal, with instant search, that didn't depend on a heavy app just to jot down a 2-line idea.
Role and impact
- Individual project, full-stack.
- From idea to working MVP in 3 weeks.
- Sub-100ms full-text search over 500+ test notes.
- 40 Vitest tests covering the Markdown parser and tagging logic.
Technical decisions and challenges
The challenge was saving every change without the editor "jumping" or losing the cursor position. I evaluated simple debounce versus an optimistic approach with Zustand for local state and syncing to Supabase every 2 seconds.
I ended up using Zustand + 800ms debounce, because local state updates instantly (zero visual lag) and the sync to Supabase runs in the background without blocking user input.
I compared Postgres tsvector (via Supabase) against a client-side library like
Fuse.js.
I chose tsvector because it scales better as notes grow, and I don't have to
load the entire dataset into the client to search.
Autosave flow
Detailed stack
| Layer | Technology | Why |
|---|---|---|
| Frontend | Next.js 15, Tiptap, Zustand, Tailwind | Tiptap lets me extend the editor (code, checklists) without rewriting it |
| Backend | Supabase (Postgres + tsvector, RLS) | Native search in the DB, secure multi-user access with RLS |
| Testing | Vitest, React Testing Library | Coverage of the Markdown parser and tagging logic |
Gallery



What I would do differently
I'd implement offline-first sync from day one with something like PowerSync or RxDB, instead of adding it later. The current autosave assumes a stable connection, and that's a real limitation for field use or intermittent connectivity.