- Большинство «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. Оно даёт суперспособности и накладывает честные ограничения. Ниже — обе стороны.
Local-first vs Cloud-SaaS: кто что видит
Разница не в том, «где крутится UI», а в том, через чей сервер идут твои данные и у кого лежат auth-keys. Упрощённая диаграмма двух подходов:
В cloud-SaaS трафик физически идёт через их инфраструктуру — они могут (и в некоторых юрисдикциях обязаны) его логировать. В local-first машина говорит с Telegram-серверами напрямую, как обычный TDesktop, только автоматизированный.
| Что видит вендор | Cloud-SaaS | TG: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. Мы осознанно выбрали вторую сторону.
Содержимое ~/.tgon/ и как оно зашифровано
После установки TG:ON создаёт директорию ~/.tgon/ (на Windows — %APPDATA%\tgon\). Внутри — набор SQLite-баз, каждая отвечает за свою область:
| Файл | Что внутри | Шифрование |
|---|---|---|
sessions.db | Telegram auth-keys (session-files всех аккаунтов) | AES-256, ключ в Keychain |
contacts.db | База контактов, targets, категории | AES-256 at rest |
conversations.db | История Live Inbox, replies, tags | AES-256 at rest |
campaigns.db | Campaign metadata, schedules, templates | AES-256 at rest |
ai_context.db | Prompt history, LLM responses cache | AES-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 — только в защищённом системном хранилище.
Телефон подключается к твоей машине, не к нам
Один из сложных вопросов local-first: как пользоваться с телефона? Cloud-SaaS отвечает очевидно — web UI через их сервер. У нас иначе. Когда ты включаешь mobile access, происходит следующее:
- Твоя машина поднимает локальный HTTPS-сервер на случайном порту.
- Cloudflared (embedded в бинарник) создаёт outbound-tunnel до Cloudflare edge и получает уникальный поддомен типа
ab3f9x.tgon-tunnel.com. - TG:ON генерирует QR-код с этим URL + одноразовым pairing-токеном.
- Ты сканируешь QR телефоном. Telegram Mini App открывает URL через Cloudflare-tunnel → попадает напрямую в твою машину.
- Наш license-сервер в этом потоке не участвует. Вообще. Мы видим только факт генерации QR — и то случайный токен, ничего привязанного к твоему аккаунту.
Практический смысл: если наш license-сервер упадёт прямо сейчас, твоё mobile-подключение продолжит работать. Не сможешь только активировать новую машину (нужна проверка ключа). Существующие установки живут.
Что именно мы видим на своей стороне
Раз в сутки десктоп TG:ON делает один-единственный POST на наш license-сервер. Внутри — примерно это:
Что мы НЕ видим: сколько сообщений ты отправил, в какие каналы писал, какие targets подключил, какой LLM используешь, тексты промптов, ответы AI, содержимое Inbox, имена твоих аккаунтов, номера телефонов, список контактов. Вообще ничего из этого.
Что мы видим: ключ X активен на машине Y, версия приложения Z. Всё. Достаточно, чтобы понять «кто платит — пользуется», и недостаточно, чтобы профилировать твой бизнес.
Почему так мало метрик? Usage-based billing — архитектурная ловушка: как только продаёшь «по сообщениям», их нужно считать → логировать → тащить через свой сервер или ставить телеметрию в клиент. Мы выбрали flat-rate подписку и отказались от телеметрии как класса.
Как забрать свои данные, если ты уйдёшь
Проверка на vendor-lock простая: если я завтра перестану платить TG:ON — что я забираю? У cloud-SaaS обычно «zip-экспорт с их сервера, в их формате, частично». У нас — всё сразу, в открытых форматах. Конкретные шаги:
- Копируешь папку
~/.tgon/— у тебя на руках все SQLite-базы. - Открываешь
contacts.dbлюбым SQLite-клиентом (DB Browser, TablePlus,sqlite3CLI) — видишь все targets, категории, метаданные. - В UI TG:ON → Settings → Export есть кнопки: contacts в CSV, conversations в JSON, campaigns в JSON.
- Telegram session-files экспортируются в стандартный pyrogram/telethon-формат и открываются любым MTProto-клиентом.
- Закрыть подписку. Бинарник перестанет работать после истечения ключа, но твои данные у тебя.
Критерий зрелости local-first-решения: ты не зависишь от нашего API для доступа к своим данным. SQLite — открытый формат, описан в стандарте, существует с 2000 года. Твои базы переживут нашу компанию.
Где local-first проигрывает — честно
Обещали честность — вот она. Архитектура не волшебная, у неё реальные минусы:
- Обновления не автоматические. Не можем «выкатить фикс за 5 минут всем». Качаешь новую DMG / EXE вручную (или через in-app updater с согласия). Security-patches долетают медленнее.
- Работа с другой машины требует sync. Начать outreach на ноуте и продолжить на десктопе — скопируй
~/.tgon/. Авто-sync между устройствами нет (потребовал бы cloud-хранилища — см. manifesto выше). - Performance ограничен твоим железом. Старый MacBook Air 8 ГБ RAM + 50 аккаунтов одновременно — будет тормозить. В cloud-SaaS это чужая проблема.
- Teams 10+ — сложнее. Коллаборативный workflow требует ручного sync баз или запуска TG:ON на общем VPS. Решаемо, но не out-of-the-box как в SaaS-CRM.
- Backup — твоя ответственность. Диск умер без бэкапа → данные пропали. Мы не восстановим — у нас их нет.
Если критичны коллаборация 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 в любой момент.
Скачать