OpenLinear is a Telegram-native project tracker/status UI. It renders issue data as a compact mobile-first TUI and edits one pinned Telegram message instead of spamming the chat.
Many projects do not need another heavy work-management surface. They need a Linear-like project TUI inside Telegram: fast to scan, easy to navigate and simple to feed from scripts, CI or an existing tracker export.
OpenLinear is that Telegram layer: easy to embed, easy to replace, and small enough to understand.
- Renders a project status dashboard for Telegram.
- Uses one message as an app-like container.
- Supports pages: main, menu, category lists and issue details.
- Keeps navigation stateless through Telegram
callback_data. - Reads project data from JSON files.
- Avoids private SaaS lock-in for small teams and personal projects.
your scripts / CI / tracker export
│
▼
settings.json + projects.json + issues.json
│
▼
OpenLinear renderer
│
▼
one editable Telegram message
Read more:
This repository is an early standalone product foundation. The current version supports JSON-backed issue data and Telegram Bot API long polling.
Planned connectors can be added later without changing the TUI layer.
This is the recommended path. You only need Docker and a Telegram bot.
git clone git@github.com:loutab4k/OpenLinear.git
cd OpenLinear
docker compose run --rm openlinear validate --data-dir examples/basic
docker compose run --rm openlinear render --data-dir examples/basicCreate your own data directory:
docker compose run --rm openlinear init --data-dir /data
docker compose run --rm openlinear validate --data-dir /dataRun the Telegram bot:
export OPENLINEAR_BOT_TOKEN="paste_bot_token_here"
export OPENLINEAR_CHAT_ID="paste_chat_id_here"
docker compose run --rm openlinear sync --data-dir /data
docker compose up openlineargit clone git@github.com:loutab4k/OpenLinear.git
cd OpenLinear
make check
go run ./cmd/openlinear render --data-dir examples/basicCreate your own data directory:
go run ./cmd/openlinear init --data-dir openlinear
go run ./cmd/openlinear validate --data-dir openlinear
go run ./cmd/openlinear render --data-dir openlinearRun the Telegram bot:
export OPENLINEAR_BOT_TOKEN="paste_bot_token_here"
export OPENLINEAR_CHAT_ID="paste_chat_id_here"
go run ./cmd/openlinear sync --data-dir openlinear
go run ./cmd/openlinear run --data-dir openlinearThe first sync sends a status message and stores its message_id in .openlinear/state.json. Later updates edit the same message.
Doppler is recommended for local secret management, but OpenLinear does not require it. If you use Doppler:
doppler run -- docker compose run --rm openlinear sync --data-dir /data
doppler run -- docker compose up openlinear| Variable | Required | Default | Description |
|---|---|---|---|
OPENLINEAR_BOT_TOKEN |
yes for Telegram | Telegram bot token | |
OPENLINEAR_CHAT_ID |
yes for Telegram | Telegram chat, group or channel ID | |
OPENLINEAR_STATUS_MESSAGE_ID |
no | Existing message ID to edit | |
OPENLINEAR_DATA_DIR |
no | openlinear |
Data directory |
OPENLINEAR_STATE_PATH |
no | .openlinear/state.json |
Local state file |
OPENLINEAR_API_BASE_URL |
no | https://api.telegram.org |
Telegram API base URL |
OPENLINEAR_POLL_TIMEOUT_SECONDS |
no | 30 |
Long polling timeout |
OPENLINEAR_POLL_LIMIT |
no | 50 |
Updates per polling request |
OPENLINEAR_HTTP_TIMEOUT_SECONDS |
no | 35 |
HTTP client timeout |
OpenLinear reads three JSON files:
settings.jsoncontrols width, labels, categories and aliases.projects.jsoncontains optional project metadata.issues.jsoncontains the actual cards.
See examples/basic and docs/schema.md.
openlinear init --data-dir openlinear
openlinear validate --data-dir openlinear
openlinear render --data-dir openlinear
openlinear render --data-dir openlinear p
openlinear sync --data-dir openlinear
openlinear run --data-dir openlinear- Keep OpenLinear data in
openlinear/. - Generate or edit JSON files.
- Run
openlinear validate. - Preview the Telegram UI with
openlinear render. - Add Telegram secrets through env, Doppler, GitHub Actions secrets, systemd or your own secret manager.
- Run one
syncto create the status message. - Keep
runalive for inline navigation. - Call
syncfrom CI or cron for scheduled refreshes.
The main screen has only minimal controls: refresh and menu. The menu contains categories. Category pages show cards available in that section. Selecting a card opens the full issue page, similar to opening a pull request details page.
Every internal page includes navigation back to the main screen and one step back where applicable.
make fmt
make test
make vet
make checkCI runs the same quality gate on GitHub Actions.
Do not commit .env, .openlinear/state.json or real exported project data containing secrets. The example data is synthetic.
MIT
OpenLinear — небольшой self-hosted Telegram-интерфейс для статусов проектов. Он рендерит задачи в компактный мобильный TUI и редактирует одно закреплённое сообщение вместо спама в чат.
Многим проектам не нужен ещё один тяжёлый work-management surface. Нужен Linear-like TUI прямо в Telegram: быстро смотреть, удобно ходить по карточкам и просто кормить данными из скриптов, CI или экспорта существующего трекера.
OpenLinear — этот Telegram-слой: легко встроить, легко заменить, достаточно мал, чтобы быстро разобраться.
- Показывает статус проекта в Telegram.
- Использует одно сообщение как контейнер приложения.
- Поддерживает страницы: главная, меню, списки категорий и детальная карточка задачи.
- Хранит навигацию stateless через Telegram
callback_data. - Читает данные проекта из JSON-файлов.
- Убирает жёсткую зависимость от SaaS-трекеров для небольших команд и личных проектов.
your scripts / CI / tracker export
│
▼
settings.json + projects.json + issues.json
│
▼
OpenLinear renderer
│
▼
one editable Telegram message
Подробнее:
Это ранний foundation отдельного продукта. Текущая версия поддерживает JSON-источник задач и Telegram Bot API через long polling.
Коннекторы к внешним трекерам можно добавить позже без переписывания TUI-слоя.
Это рекомендуемый путь. Нужны только Docker и Telegram-бот.
git clone git@github.com:loutab4k/OpenLinear.git
cd OpenLinear
docker compose run --rm openlinear validate --data-dir examples/basic
docker compose run --rm openlinear render --data-dir examples/basicСоздать свои файлы данных:
docker compose run --rm openlinear init --data-dir /data
docker compose run --rm openlinear validate --data-dir /dataЗапустить Telegram-бота:
export OPENLINEAR_BOT_TOKEN="paste_bot_token_here"
export OPENLINEAR_CHAT_ID="paste_chat_id_here"
docker compose run --rm openlinear sync --data-dir /data
docker compose up openlineargit clone git@github.com:loutab4k/OpenLinear.git
cd OpenLinear
make check
go run ./cmd/openlinear render --data-dir examples/basicСоздать свои файлы данных:
go run ./cmd/openlinear init --data-dir openlinear
go run ./cmd/openlinear validate --data-dir openlinear
go run ./cmd/openlinear render --data-dir openlinearЗапустить Telegram-бота:
export OPENLINEAR_BOT_TOKEN="paste_bot_token_here"
export OPENLINEAR_CHAT_ID="paste_chat_id_here"
go run ./cmd/openlinear sync --data-dir openlinear
go run ./cmd/openlinear run --data-dir openlinearПервый sync отправит статус-сообщение и сохранит его message_id в .openlinear/state.json. Следующие обновления будут редактировать это же сообщение.
Doppler рекомендуется для локального хранения секретов, но OpenLinear не требует его. Если используешь Doppler:
doppler run -- docker compose run --rm openlinear sync --data-dir /data
doppler run -- docker compose up openlinear| Переменная | Обязательна | По умолчанию | Назначение |
|---|---|---|---|
OPENLINEAR_BOT_TOKEN |
да для Telegram | токен Telegram-бота | |
OPENLINEAR_CHAT_ID |
да для Telegram | ID чата, группы или канала | |
OPENLINEAR_STATUS_MESSAGE_ID |
нет | существующий message ID для редактирования | |
OPENLINEAR_DATA_DIR |
нет | openlinear |
директория данных |
OPENLINEAR_STATE_PATH |
нет | .openlinear/state.json |
локальный state-файл |
OPENLINEAR_API_BASE_URL |
нет | https://api.telegram.org |
base URL Telegram API |
OPENLINEAR_POLL_TIMEOUT_SECONDS |
нет | 30 |
timeout long polling |
OPENLINEAR_POLL_LIMIT |
нет | 50 |
число updates за polling-запрос |
OPENLINEAR_HTTP_TIMEOUT_SECONDS |
нет | 35 |
HTTP timeout |
OpenLinear читает три JSON-файла:
settings.jsonуправляет шириной, лейблами, категориями и алиасами.projects.jsonсодержит опциональные метаданные проектов.issues.jsonсодержит карточки задач.
Смотри examples/basic и docs/ru/schema.md.
openlinear init --data-dir openlinear
openlinear validate --data-dir openlinear
openlinear render --data-dir openlinear
openlinear render --data-dir openlinear p
openlinear sync --data-dir openlinear
openlinear run --data-dir openlinear- Держи данные OpenLinear в
openlinear/. - Генерируй или редактируй JSON-файлы.
- Запускай
openlinear validate. - Проверяй Telegram UI через
openlinear render. - Добавь Telegram secrets через env, Doppler, GitHub Actions secrets, systemd или свой secret manager.
- Один раз выполни
sync, чтобы создать статус-сообщение. - Держи
runживым для inline-навигации. - Вызывай
syncиз CI или cron для scheduled refresh.
На главной странице только минимальные действия: refresh и menu. В меню находятся категории. Внутри категории показываются карточки раздела. Нажатие на карточку открывает полную страницу задачи, по логике похожую на просмотр PR в GitHub.
На каждой внутренней странице есть переход на главную и шаг назад, где это применимо.
make fmt
make test
make vet
make checkCI запускает тот же quality gate в GitHub Actions.
Не коммить .env, .openlinear/state.json и реальные экспортированные данные, если в них есть секреты. Данные в примерах синтетические.
MIT