Как я сделал общие доски в Telegram, которые живут прямо в чате

от автора

Я сделал бота для заметок и задач в Telegram — TG Notion. Недавно добавил общие доски, которые работают прямо в чате. В этой статье расскажу, как это устроено технически, с чем пришлось сильно повозиться и что ещё не готово.

До общих досок бот уже умел личные заметки и задачи. Пользователь заходит, пишет заметку, ставит задачу с чекбоксом — всё как в обычном блокноте, только внутри Telegram. Выглядит примерно так:

Поле заметок

Поле заметок

Потом я подумал,что для командной работы или просто для компании друзей было бы прикольно использовать общие доски,как для идей,так и для заметок. Использовать их в чатах телеграм.

Сейчас это работает так: Создаёшь доску, выбираешь тип (заметки или задачи), нажимаешь «Поделиться» — и в выбранный чат падает карточка с названием доски и тремя кнопками: «Добавить», «Открыть», «Обновить».

Доска в чате

Доска в чате

Все участники чата видят эту карточку. Можно добавить заметку или задачу — она появится у всех. Кнопка «Обновить» показывает актуальный список. Кнопка «Открыть» открывает полный интерфейс Mini App, где можно редактировать и удалять свои записи.

Доска в миниэпп

Доска в миниэпп

Технически это работает через inline‑режим Telegram: бот получает запрос, находит доску в базе и через answerInlineQuery возвращает карточку с кнопками. Кнопки «Добавить» и «Открыть» — это прямые ссылки на Mini App с параметрами. “Обновить” — callback, который перерисовывает сообщение.

Бот написан на Node.js с библиотекой node‑telegram‑bot‑api. База — SQLite через better‑sqlite3, без ORM, чистые SQL‑запросы. Хостится на Bothost. Mini App — отдельная HTML/CSS/JS страница, которая открывается внутри Telegram через WebApp API.

Изначально бот был на Python с aiogram, но Bothost с ним не сдружился — вебхуки работали через раз. После переезда на Node.js проблемы с хостингом ушли. Плюс better‑sqlite3 работает синхронно и быстро, без отдельных серверов для базы.

Код выложен на GitHub, репа открытая: https://github.com/Elrick‑from‑Malnibone/tg‑notion‑node

С чем пришлось повозиться…

Начну с того, что часть проблем ушла после переезда на Node.js. На Python+aiogram я долго не мог заставить Bothost нормально работать с вебхуками — платформа их вроде поддерживает, но на практике всё упиралось в 502. После перехода на Node.js эти проблемы исчезли. Но появились другие.

Вебхуки и allowed_updates. Telegram требует, чтобы для inline‑режима бот принимал обновления типов inline_query и callback_query. Bothost при каждом деплое сбрасывал allowed_updates до дефолтных, и бот переставал видеть inline‑запросы. Я не мог понять, с чего это карточка не отправляется в чат?? Оказалось надо принудительно указывать allowed_updates при установке вебхука прямо в коде:

bot.setWebHook(url, {    allowed_updates: ['message', 'inline_query', 'callback_query']});

502 ошибка. Даже после фикса вебхука, getWebhookInfo показывал 502 Bad Gateway. Помогло добавление health‑check эндпоинта /health, который просто отвечает 200 OK. Заодно добавил проверку req.method === ‘POST’ в обработчик вебхука — Telegram шлёт только POST, а Bothost при проверке стучался GET’ом и получал непонятный ответ.

if (pathname === '/health' && req.method === 'GET') {    res.writeHead(200, { 'Content-Type': 'application/json' });    res.end(JSON.stringify({ ok: true }));    return;}

web_app внутри inline_keyboard. Хотел сделать кнопку «Добавить» через web_app, чтобы сразу открывать Mini App. Не работает. Telegram не поддерживает web_app внутри inline_keyboard. Пришлось переделать на прямые ссылки с параметром startapp.

{ text: '➕ Добавить', url: `https://t.me/Telega_notion_bot?startapp=board_add_${hash}` }

Авторегистрация юзеров. Пользователи, которые заходили в доску по ссылке, не регистрировались в боте — я их не видел в статистике. Добавил проверку и авторегистрацию в трёх местах: inline_query, callback_query и при добавлении заметки через API. Наверное потерял много юзеров. А может и нет,как щас узнаешь.

В итоге

Сейчас бот умеет:

  • Личные заметки и задачи (с чекбоксами, тёмной/светлой темой)

  • Общие доски двух типов: для заметок и для задач

  • Доска появляется в чате как inline‑карточка с кнопками «Добавить», «Открыть», «Обновить»

  • Права доступа: редактировать и удалять записи может только автор

  • Авторегистрация пользователей при входе в доску (не нужно жать /start)

Доска задач в чате

Доска задач в чате

Что ещё не умеет,но скоро будет:

  • Добавление задач прямо из чата (пока открывается Mini App)

  • Галочки в inline‑карточке задач, которые можно отмечать без открытия Mini App

  • Английский язык

  • напоминалки и дедлайны

  • Нормальное превью ссылки на доску (OG‑теги)

Сейчас в моём канале @system_develope идёт голосование за следующую фичу. Подписчики решают, что я буду пилить дальше. Так что добро пожаловать, буду рад каждому голосу!).

Бот: https://t.me/Telega_notion_bot

ссылка на оригинал статьи https://habr.com/ru/articles/1065448/