Для чего

Статьи, отложенные на потом, теряются по вкладкам и закладкам. burkmak собирает их в одну библиотеку на своём сервере, извлекает текст без рекламы и отправляет на читалку Kobo без правки прошивки. Выделения и заметки уходят в Obsidian.

Сохранение

  • Откуда угодно. Ссылка сохраняется из веба, мобильного приложения, share-меню Android или букмарклета в браузере.
  • Метаданные в фоне. Заголовок, сайт, описание и картинка появляются без перезагрузки страницы, по SSE.
  • Текст сразу. Статья извлекается при сохранении, и ридер, OPDS и Kobo получают её готовой.
  • Порядок. Теги, статусы (непрочитано, прочитано, в архиве) и избранное. У каждого пользователя своя библиотека.

Чтение

  • Ридер на Readability. Статья без рекламы и обвеса. Копия остаётся, даже если оригинал удалят.
  • Картинки кэшируются на своём сервере.
  • Полнотекстовый поиск по заголовку, адресу и тексту статьи на SQLite FTS5.
  • Выделения цветом и заметки к ним.
  • Светлая и тёмная тема.

Kobo

  • OPDS-каталог с обложками, пагинацией и поиском. Статьи скачиваются в EPUB и KEPUB, каталог добавляется на обычную Kobo через настройки.
  • Нативная синхронизация по протоколу магазина Kobo. Читалка забирает новые статьи при подключении, а статус прочтения возвращается обратно: дочитанная на Kobo статья становится прочитанной в burkmak, а архивированная в приложении исчезает с устройства. Нужен HTTPS. Протокол проверен на полной симуляции, проверка на живом устройстве впереди.

Obsidian

  • Экспорт в Markdown. API отдаёт статью заметкой с источником, метаданными, выделениями и заметками. Повторный экспорт обновляет ту же заметку.
  • Плагин для Obsidian синхронизирует экспорт в хранилище.

Под капотом

Бэкенд на NestJS с SQLite, веб на Nuxt, мобильный клиент на Flutter. Фоновые задачи выполняет воркер поверх базы, события в клиенты идут по SSE, внешних сервисов нет: локальный стек — два контейнера. API описан в OpenAPI, клиенты для TypeScript и Dart генерируются из спецификации.

Общий каркас Course Shelf, Coriolis и burkmak разобран в посте «Контракт, от которого код не может уйти».

Установка

Каждый релиз публикует Docker-образы для amd64 и arm64. Стек поднимается командой docker compose up -d.