⎯ TL;DR
  • Большинство «Telegram automation SaaS» — cloud-first. Твои сессии, твой outreach, твои разговоры — на их серверах.
  • TG:ON — local-first. Бинарник 160 МБ, всё локально, зашифровано at rest (AES-256, ключ в Keychain).
  • Telegram-сессии в локальной SQLite → если сервер TG:ON упадёт, у тебя всё продолжает работать.
  • LLM-ключи в Keychain / Credential Manager, не в plaintext-файле.
  • Mobile access через Cloudflared-tunnel: телефон ↔ твоя машина, мы видим только QR pairing-код.
  • License check — machine_id + SHA-256 хэш ключа, раз в сутки. Без телеметрии, без usage-метрик.
  • Экспорт в любой момент: SQLite / CSV / JSON. Никакого lock-in.

На демо часто спрашивают: «а где вы храните наши Telegram-сессии?» Короткий ответ — нигде у нас. Они в зашифрованной SQLite на твоей машине, в ~/.tgon/. Мы физически не можем их достать — у нас их нет. Решение принято в 2023 году, когда мы начинали TG:ON. Оно даёт суперспособности и накладывает честные ограничения. Ниже — обе стороны.

01 · Архитектурное разделение

Local-first vs Cloud-SaaS: кто что видит

Разница не в том, «где крутится UI», а в том, через чей сервер идут твои данные и у кого лежат auth-keys. Упрощённая диаграмма двух подходов:

# Cloud-SaaS модель: ты → их сервер → Telegram API │ └─ они хранят: session-files, контакты, сообщения, LLM-calls, billing # Local-first модель (TG:ON): ты → твоя машина → Telegram API напрямую │ └─ локально: session-files, контакты, сообщения, LLM-calls ты → license-server только для: проверка ключ активен? (раз в день)

В cloud-SaaS трафик физически идёт через их инфраструктуру — они могут (и в некоторых юрисдикциях обязаны) его логировать. В local-first машина говорит с Telegram-серверами напрямую, как обычный TDesktop, только автоматизированный.

Что видит вендорCloud-SaaSTG:ON (local-first)
Telegram auth-keysДа, хранитНикогда
Твои сообщения исходящиеДа, проходят через их серверНикогда — идут напрямую в TG
Входящие ответыДа, в их InboxНикогда — в твоей локальной SQLite
База контактовВ их БДВ твоём ~/.tgon/contacts.db
LLM API callsПрокcируется через нихНапрямую от тебя к провайдеру
Usage-метрики (счётчики)Да, для billingНет, лицензия flat rate
Personal dataМинимум email + billingТолько machine_id и хэш ключа

Ни один подход не «лучше» абсолютно. Cloud-SaaS удобнее для коллаборации и работы с любого устройства. Local-first — для тех, кому важны data ownership и resilience. Мы осознанно выбрали вторую сторону.

02 · Что лежит локально

Содержимое ~/.tgon/ и как оно зашифровано

После установки TG:ON создаёт директорию ~/.tgon/ (на Windows — %APPDATA%\tgon\). Внутри — набор SQLite-баз, каждая отвечает за свою область:

ФайлЧто внутриШифрование
sessions.dbTelegram auth-keys (session-files всех аккаунтов)AES-256, ключ в Keychain
contacts.dbБаза контактов, targets, категорииAES-256 at rest
conversations.dbИстория Live Inbox, replies, tagsAES-256 at rest
campaigns.dbCampaign metadata, schedules, templatesAES-256 at rest
ai_context.dbPrompt history, LLM responses cacheAES-256 at rest
vault.dbИндекс 4.8M+ каналов (справочный)Без шифрования — публичные данные

Как работает шифрование: при первом запуске TG:ON генерирует 256-битный AES-ключ и кладёт в macOS Keychain (или Windows Credential Manager / gnome-keyring на Linux). Ключ доступен только приложениям с нашим Developer ID codesigning. Скопировали ~/.tgon/ на другую машину — без Keychain-записи получат зашифрованный blob, бесполезный.

LLM-ключи (OpenAI / Anthropic / DeepSeek API) лежат отдельно в Keychain, не в SQLite. Ни в plaintext, ни в env-переменной, ни в config.json — только в защищённом системном хранилище.

«Если я скопирую твой диск — я получу твои данные? Нет. Ключ живёт в Keychain, который привязан к твоему user-паролю.»
03 · Mobile access

Телефон подключается к твоей машине, не к нам

Один из сложных вопросов local-first: как пользоваться с телефона? Cloud-SaaS отвечает очевидно — web UI через их сервер. У нас иначе. Когда ты включаешь mobile access, происходит следующее:

  1. Твоя машина поднимает локальный HTTPS-сервер на случайном порту.
  2. Cloudflared (embedded в бинарник) создаёт outbound-tunnel до Cloudflare edge и получает уникальный поддомен типа ab3f9x.tgon-tunnel.com.
  3. TG:ON генерирует QR-код с этим URL + одноразовым pairing-токеном.
  4. Ты сканируешь QR телефоном. Telegram Mini App открывает URL через Cloudflare-tunnel → попадает напрямую в твою машину.
  5. Наш license-сервер в этом потоке не участвует. Вообще. Мы видим только факт генерации QR — и то случайный токен, ничего привязанного к твоему аккаунту.
# Что происходит на сетевом уровне: phone → cloudflare-edge → cloudflared-tunnel → твой ноут │ └─ localhost:8443 (TG:ON UI) # license-сервер TG:ON здесь не участвует # Cloudflare видит зашифрованный TLS-трафик, не содержимое

Практический смысл: если наш license-сервер упадёт прямо сейчас, твоё mobile-подключение продолжит работать. Не сможешь только активировать новую машину (нужна проверка ключа). Существующие установки живут.

04 · License check

Что именно мы видим на своей стороне

Раз в сутки десктоп TG:ON делает один-единственный POST на наш license-сервер. Внутри — примерно это:

# Реальный payload license-check POST https://api.tg-on.com/v1/license/heartbeat Content-Type: application/json { "machine_id": "a3f4-9e12-...", # UUID, сгенерированный локально "key_hash": "sha256:7f2a...", # SHA-256 от твоего лиц-ключа "app_version": "4.6.2" # версия бинарника для force-update } # Ответ: { "valid": true, "expires_at": "2026-08-15" }

Что мы НЕ видим: сколько сообщений ты отправил, в какие каналы писал, какие targets подключил, какой LLM используешь, тексты промптов, ответы AI, содержимое Inbox, имена твоих аккаунтов, номера телефонов, список контактов. Вообще ничего из этого.

Что мы видим: ключ X активен на машине Y, версия приложения Z. Всё. Достаточно, чтобы понять «кто платит — пользуется», и недостаточно, чтобы профилировать твой бизнес.

Почему так мало метрик? Usage-based billing — архитектурная ловушка: как только продаёшь «по сообщениям», их нужно считать → логировать → тащить через свой сервер или ставить телеметрию в клиент. Мы выбрали flat-rate подписку и отказались от телеметрии как класса.

05 · Миграция away

Как забрать свои данные, если ты уйдёшь

Проверка на vendor-lock простая: если я завтра перестану платить TG:ON — что я забираю? У cloud-SaaS обычно «zip-экспорт с их сервера, в их формате, частично». У нас — всё сразу, в открытых форматах. Конкретные шаги:

  1. Копируешь папку ~/.tgon/ — у тебя на руках все SQLite-базы.
  2. Открываешь contacts.db любым SQLite-клиентом (DB Browser, TablePlus, sqlite3 CLI) — видишь все targets, категории, метаданные.
  3. В UI TG:ON → Settings → Export есть кнопки: contacts в CSV, conversations в JSON, campaigns в JSON.
  4. Telegram session-files экспортируются в стандартный pyrogram/telethon-формат и открываются любым MTProto-клиентом.
  5. Закрыть подписку. Бинарник перестанет работать после истечения ключа, но твои данные у тебя.

Критерий зрелости local-first-решения: ты не зависишь от нашего API для доступа к своим данным. SQLite — открытый формат, описан в стандарте, существует с 2000 года. Твои базы переживут нашу компанию.

06 · Компромиссы

Где local-first проигрывает — честно

Обещали честность — вот она. Архитектура не волшебная, у неё реальные минусы:

Если критичны коллаборация 10+ людей real-time, работа с любого устройства без sync и managed backup — local-first не про тебя. Нормальный trade-off, честнее сказать заранее. Для solo и команд до 5 человек local-first покрывает 95% use-cases и даёт то, чего SaaS не даст никогда: полный контроль над данными.

⎯ скачать

TG:ON для macOS · Windows · Linux

Desktop app, 160 МБ. Ставится локально, данные не покидают машину. 3 дня триала, без карты.

Скачать бесплатно
⎯ локально значит твоё

Качаешь бинарник.
Всё остальное — твоё.

160 МБ, macOS/Windows/Linux. SQLite под капотом. Export в любой момент.

Скачать