← back to work

Personal project, 2026

DevNotes

A searchable memory for the things developers fix once and lose.

Capture notes and snippets in one submit, find them again with ranked full-text search, ask questions over your own notes, and publish the good ones as public pages.

Live app →Source →

Capture in one submit.

Notes, snippets, links and tasks from the dashboard, with templates for a TIL, a bug fix, a command or a checklist.

The DevNotes dashboard in a browser window, quick capture box, workspace stats and a 26-week activity heatmap

Find it again in milliseconds.

Ranked full-text search inside PostgreSQL, behind a command palette with filters like tag:react type:snippet.

The command palette open over the dashboard, Tokyo Night theme

Ask your past self.

Ask Workspace runs the same search over your notes and answers with source cards and highlighted excerpts.

Ask Workspace showing a question and the matching notes as source cards, Nord theme

Snippets, sorted by language.

Code-first notes land in a vault with lanes for bash, css, python and typescript, each with a copy button.

The snippet vault with language lanes and copy-ready code cards, Rosé Pine theme

Publish the good ones.

One click turns a private note into a public page with an author card, reading time and related notes.

A published note page with author card and reading time, Sakura theme

Works on a phone.

The same dashboard, Explore feed and public pages, laid out for a small screen.

Three phones showing the dashboard, the Explore feed and a public note

Make it yours.

Twenty-four colourways with their own typeface and corner dials. The Theme Studio previews everything and only applies when you say so.

Under the hood

The browser only talks to same-origin /api/*.

A catch-all Next.js route re-attaches the token from an HttpOnly cookie and forwards to FastAPI. No CORS surface, no backend URL in the bundle.

Refresh tokens rotate and notice theft.

Each device has a session row with a bcrypt hash of its refresh token. A stale token revokes the session.

Search lives in the database.

search_vector is a stored generated column, so the index is always consistent with the row. One backup, one deploy.

Every save keeps a snapshot.

The previous state is written in the same transaction, trimmed to the latest twenty.

Details

Built with
Next.js 16, React 19, FastAPI, SQLAlchemy, PostgreSQL 16
When
2026
Links