Кейс · Go-бэкенд
Картотека: заметки с поиском
База Markdown-заметок на Go и SQLite: вики-ссылки [[заметка]] с обратными ссылками и графом связей, полнотекстовый поиск FTS5 (bm25, подсветка, упрощённая русская морфология), история версий с собственным diff, автосохранение с разрешением конфликтов, экспорт и импорт .md.
- Go
- SQLite
- FTS5
- bm25
- modernc.org/sqlite (без CGO)
- REST API
- Markdown (свой безопасный рендер)
- SVG force-layout
- Vanilla JS
- embed
- Docker
- GitHub Actions
01 · Как выглядит
Скриншоты


02 · О проекте
Что это и зачем
«Картотека» — база Markdown-заметок на Go и SQLite. Заметки связываются вики-ссылками [[заметка]] с обратными ссылками и графом связей, а поиск работает на SQLite FTS5 с ранжированием bm25, подсветкой совпадений и упрощённой русской морфологией.
Один бинарник: stdlib и modernc.org/sqlite (без CGO), интерфейс на ванильном JS встроен через embed. В демо-режиме добавляются 12 заметок о самом проекте, каждая честно помечена.
Ограничения
Русская морфология упрощённая: срезание окончаний из короткого списка плюс префиксный поиск. Беглые гласные, чередования и неправильные формы не обрабатываются, у коротких слов возможны ложные совпадения.
Переименование заметки не переписывает [[старые ссылки]] в других заметках. Нет таблиц, картинок и сносок в Markdown.
Один общий токен, без пользователей и прав. Конфликты разрешаются целиком (взять чужое или перезаписать), построчного слияния нет.
Граф рассчитан на сотни заметок, а не на тысячи. Тесты с -race проходят только в CI (локально нет gcc).
Что внутри
- Свой безопасный Markdown-рендер: исходный текст экранируется целиком, теги создаёт только рендер из закрытого набора, схемы ссылок из белого списка; тест на XSS прогоняет около 30 нагрузок
- Вики-ссылки [[Название]] и [[Название|подпись]], backlinks, ссылка на ещё не созданную заметку оживает, когда заметка появится
- Граф связей на SVG: раскладка Фрухтермана — Рейнгольда на ванильном JS, перетаскивание узлов, переход с клавиатуры
- Поиск FTS5: bm25 с весами (название ×8, теги ×4, текст ×1), префиксный поиск, подсветка в Go-коде, фильтр по тегу
- История версий и построчный diff на LCS между любыми двумя версиями, восстановление версии
- Автосохранение с оптимистичным обновлением списка, откатом при ошибке и разрешением конфликтов по rev (409)
- Экспорт всего в zip из .md с front matter, импорт папки .md, файлов или zip
- REST API под Bearer-токеном, тёмная и светлая темы, Docker и GitHub Actions
03 · Как запустить
Запуск одной командой
git clone <репозиторий по запросу> notes-search
cd notes-search
SEED_DEMO=1 go run ./cmd/server # http://localhost:8089, токен demo04 · Код
Репозиторий приватный
Исходники лежат в приватном репозитории. Открою доступ по запросу: напишите, и пришлю приглашение.
Запросить код