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-плагином порождают конфликтные копии.
| Переменная | Назначение |
|---|---|
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 fetch + reset --hard origin/main (сбрасывает локальное расхождение), затем add -A + commit + push. Жёстко, но детерминированно: бот всегда перекрывает ref и пушит своё. На других устройствах изменения появляются через обычный git pull. Ветка — main.
Сейчас бот принимает только текст. Направления развития — через мультимодальный LLM-шлюз (STT, vision, embeddings под одним ключом), по убыванию отдачи:
- Конфигурируемый провайдер. Модель захардкожена в
src/config.ts, endpoint уже в env. Вынести модель в env и перевести классификатор на OpenAI-совместимый вызов — это открывает любой шлюз и снимает хардкод. База для остального. - Голосовой ввод (STT).
voice→ транскрипция → обычный путь классификации. Половина записей в проде — короткие наброски на ходу, голос лучше подходит под сценарий «руки заняты». - Фото и скриншоты (vision).
photo→ OCR + описание → запись. Сейчас фото молча пропускаются. - Enrichment ссылок. URL в записи → загрузка страницы → краткая выжимка → запись с контекстом. Закрывает «потом не помню, зачем сохранил».
- Дедупликация (embeddings). При новой записи — embedding, поиск похожих в
stream.mdи архиве. Близкий дубль → пометкаtrashили ссылка.
MIT — см. LICENSE.