← Все проекты

Кейс · 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 · Как выглядит

Скриншоты

Скриншот проекта «Картотека: заметки с поиском» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «Картотека: заметки с поиском» на экране телефона, 390 пикселей
Телефон, 390 px

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, токен demo

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Открою доступ по запросу: напишите, и пришлю приглашение.

Запросить код