Skip to content

Repository files navigation

stream-bot

GitHub

Telegram-бот для захвата мыслей, ссылок и вопросов на ходу. Каждая запись ложится чекбоксом в буфер захвата (wiki/stream.md) и автоматически размечается доменом через языковую модель. Замена «отправить себе в Избранное», но с последующей ручной проверкой.

Что делает

Отправляешь боту что угодно: текст, ссылку, пересылку. Без команд и форматирования. Бот сохраняет запись чекбоксом - [ ] YYYY-MM-DD HH:MM — текст (штамп по МСК) в секцию ## Входящее файла wiki/stream.md и в фоне размечает домен (ai / career / dev / infra / product / pm / personal / naumen / learning); для задач переписывает сырой текст в чистую формулировку, мусор зачёркивает. Файл коммитится и пушится в git.

Telegram → appendEntry → wiki/stream.md (## Входящее, чекбоксом)
                        ↓
            classify (claude-haiku-4-5): type + domain
                        ↓
            refineEntry (домен + чистая формулировка) / strikeTrash → git push

Поток

Смысл — разделить захват и обработку. На ходу сбрасываешь всё в одну точку, не думая о формате; за компьютером проходишь по записям руками и решаешь по каждой: сделать, превратить в заметку, отложить, удалить.

Команды

Команда Действие
/start приветствие
/stream Входящее: всего и сколько без тега
/triage батч-разметка всех записей без тега
(любой текст) сохранить запись, реакция 👌, фоновый триаг, ответ с распознанным типом

Бот отвечает только на TELEGRAM_CHAT_ID — это личный инструмент, не публичный.

Стек

Компонент Технология Зачем
Бот TypeScript + grammY приём сообщений из Telegram
Классификация Anthropic SDK, claude-haiku-4-5 тип и домен записи
Хранение markdown-файл читаемый формат, без vendor lock-in
Синк git версионность и синхронизация между устройствами
Деплой Docker работает 24/7 на VPS

Установка

Нужен Telegram-бот (токен у @BotFather), ключ Anthropic API и git-репо заметок.

git clone https://github.com/vonavikon/stream-bot.git
cd stream-bot
cp .env.example .env
# заполнить .env
docker compose up -d --build
docker compose logs -f

Куда пишет

Бот — единственный писатель в <WIKI_PATH>/wiki/stream.md, буфер захвата. WIKI_PATH — корень git-репо (там, где .git), в docker-compose.yml монтируется в /app/wiki. Новые записи ложатся чекбоксами в секцию ## Входящее (если её нет — бот создаёт):

## Входящее

- [ ] 2026-07-29 14:20 — изучить статью про RAG `#ai`
- [ ] 2026-07-29 09:05 — купить кофе `#personal`

Затем записи из stream.md переносишь в свой файл задач (wiki/tasks.md) или куда нужно — бот туда не пишет. Разделение нужно, чтобы у каждого файла был один писатель: иначе параллельные правки бота и синк Obsidian-плагином порождают конфликтные копии.

Конфиг (.env)

Переменная Назначение
TELEGRAM_BOT_TOKEN токен бота от BotFather
TELEGRAM_CHAT_ID chat id — бот отвечает только этому чату
ANTHROPIC_API_KEY ключ модели
ANTHROPIC_BASE_URL Anthropic-совместимый endpoint (по умолчанию https://api.anthropic.com, подставляется любой шлюз)
WIKI_PATH путь к репо заметок внутри контейнера (/app/wiki)

Git-синк

Контейнер работает как единственный писатель в репо заметок. Перед каждой записью — git fetch + reset --hard origin/main (сбрасывает локальное расхождение), затем add -A + commit + push. Жёстко, но детерминированно: бот всегда перекрывает ref и пушит своё. На других устройствах изменения появляются через обычный git pull. Ветка — main.

Roadmap

Сейчас бот принимает только текст. Направления развития — через мультимодальный LLM-шлюз (STT, vision, embeddings под одним ключом), по убыванию отдачи:

  1. Конфигурируемый провайдер. Модель захардкожена в src/config.ts, endpoint уже в env. Вынести модель в env и перевести классификатор на OpenAI-совместимый вызов — это открывает любой шлюз и снимает хардкод. База для остального.
  2. Голосовой ввод (STT). voice → транскрипция → обычный путь классификации. Половина записей в проде — короткие наброски на ходу, голос лучше подходит под сценарий «руки заняты».
  3. Фото и скриншоты (vision). photo → OCR + описание → запись. Сейчас фото молча пропускаются.
  4. Enrichment ссылок. URL в записи → загрузка страницы → краткая выжимка → запись с контекстом. Закрывает «потом не помню, зачем сохранил».
  5. Дедупликация (embeddings). При новой записи — embedding, поиск похожих в stream.md и архиве. Близкий дубль → пометка trash или ссылка.

Лицензия

MIT — см. LICENSE.

About

Telegram-бот для захвата мыслей и ссылок в markdown с LLM-триагом (тип + домен)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages