All projects

№ 530307

FinallyNote

A personal notebook that files itself and lets my AI read it.

Problem

My note app does not categorize my notes, have an up-to-date search algorithm, or talk to Claude.

Solution

Finally, I built the note app I’ve wanted for years. FinallyNote is one feed I type into from my phone. Every note gets tagged, titled and indexed in the background, todos are pulled out of it, and any AI I use can search and write the whole notebook.

This app that should remove top-down cognitive load. Creativity needs space and focus.

Auto-tagging categories

Every note gets tagged in the background, but the AI can only pick from a vocabulary I control.

When a note is saved, a Memos webhook wakes the sidecar, which calls Claude with one strict set_tags tool. The system prompt lists the allowed vocabulary, read from a pinned Tag Registry memo holding one '#tag — description' line per tag and two-way synced with SQLite; anything outside that list is dropped. The model may propose at most one new tag, which lands as a checkbox in a Tag Proposals memo where ticking approves and deleting the line rejects; rejected names are never proposed again. Tags I type by hand register instantly. The same call returns a short title and any todos, and the tags are written back as a trailing hashtag line that survives in any Memos client or export.

Natural language search

Search finds notes by what they mean as well as by the exact words in them.

Every note body is indexed twice in one SQLite file: an FTS5 table for exact words, ranked with BM25, which favours rare terms that recur in a note, and a sqlite-vec table holding a Voyage vector embedding, which places notes with similar meaning close together. A query runs both. On the keyword side stopwords are dropped, since a small corpus's BM25 cannot down-weight them yet, and each term is quoted so punctuation cannot break MATCH syntax. The two ranked lists merge with reciprocal rank fusion, which scores a note by its position in each list rather than by raw score, so the scales never need reconciling. Hits are fetched fresh from Memos and returned as snippets.

The whole notebook as MCP tools

Any AI I use (Claude, Chat, Grok, etc) can search, read and write my notes, from my laptop or from the cloud.

One registerTools function defines search_notes, get_note, create_note, update_note, list_tags, describe_tag, the todo tools and the Lift tools, and mounts them on two transports. On my laptop it runs over stdio for desktop clients. From the cloud it is an Express app behind Caddy using the MCP SDK's streamable HTTP transport, stateless, with a fresh server per request. Access is a single-user OAuth 2.1 server the sidecar hosts itself: clients register dynamically, the consent page asks for one passphrase compared in constant time, and PKCE codes then become seven-day access tokens stored in SQLite. Every call is logged to a history the web app shows on its own tab.