惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
腾讯CDC
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
The Hacker News
The Hacker News
T
The Exploit Database - CXSecurity.com
B
Blog
S
SegmentFault 最新的问题
P
Privacy & Cybersecurity Law Blog
T
Threatpost
博客园 - 聂微东
T
Tailwind CSS Blog
The Last Watchdog
The Last Watchdog
C
Check Point Blog
N
Netflix TechBlog - Medium
D
DataBreaches.Net
爱范儿
爱范儿
IT之家
IT之家
S
Secure Thoughts
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
C
Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
有赞技术团队
有赞技术团队
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
Schneier on Security
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
雷峰网
雷峰网
Project Zero
Project Zero
博客园 - Franky
H
Heimdal Security Blog
A
About on SuperTechFans
Security Latest
Security Latest
Webroot Blog
Webroot Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Telegram в IntelliJ: как устроен IDEGram и что он умеет
mamadra · 2026-05-16 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение7 мин

Охват и читатели317

Обзор

Плагин для JetBrains-IDE, который встраивает полноценный Telegram прямо в редактор. Плюс шифрованный шеринг кода, подсветка синтаксиса в теме получателя и магия с метаданными в обычном тексте сообщения. Разбираю изнутри.

TL;DR

IDEGram — это плагин для IntelliJ IDEA, PyCharm, WebStorm и других IDE на платформе JetBrains. Внутри живёт TDLib-клиент Telegram: чаты, реакции, форварды, голосовые, видео, threads в каналах. Сверху — три специфически-девовские фичи: отправка кода в Saved Messages одной кнопкой, шифрованный шеринг сниппетов через короткую ссылку (ключ не уходит на сервер) и peer-mode, где код красится подсветкой синтаксиса по теме получателя, а не отправителя.

Текущее состояние: версия 1.6.1, 192 установки, без рекламы. Эта статья — про то, что реально работает в коде сейчас, а не про дорожную карту.


Зачем это вообще

Каждый, кто работал в опенспейсе, знает приём: подходит тимлид — Alt+Tab. Telegram стоит на втором мониторе, и каждое переключение — это маленькое палево. У меня была вторая раздражалка: я постоянно копировал куски кода в чаты, и каждый раз — открой клиент, найди чат, вставь, оберни в ```, не забудь указать язык. Десять секунд на одну отправку, повторённые сто раз в неделю, складываются в "хочу одну кнопку".

IDEGram — это и есть та одна кнопка. Точнее, четыре action'а в IDE и tool window с полным Telegram-клиентом.


Базовый слой: это реально полноценный Telegram, а не превью

Клиент построен на TDLib (нативная библиотека от Telegram), забандленной прямо в плагин. NativeLoader детектит платформу при старте и грузит libtdjni из ресурсов — пользователю не нужно ничего ставить отдельно. Поддерживаются macOS x64/arm64, Windows x64, Linux x64. Linux ARM64 — в планах, см. WIP-секцию.

Что реально работает прямо сейчас:

  • Чаты, папки, архив. Список чатов с фильтрами и folder-tabs, синхронизация с Telegram-десктопом. Поиск глобальный и локальный по сообщениям в чате, плюс фильтр по отправителю — очень полезно, когда нужно найти "что Петя писал про этот баг".

  • Полное форматирование текста. Bold, italic, underline, strike, code, pre, spoilers. Парсятся как entities из TDLib, рендерятся в Compose-канвасе.

  • Реакции. И обычные Unicode, и кастомные эмодзи (включая анимированные через Skottie / TGS).

  • Reply и forward. У форварда нормальные опции: можно скрыть оригинального автора (sendCopy) или убрать подпись.

  • Threads и комментарии в каналах. Подгружается через GetMessageThreadHistory, рендерится отдельным режимом с заголовком "What is this thread about".

  • Голосовые с waveform. Записываются прямо в IDE средствами Java (OGG Vorbis), не через TDLib. Играются с визуализацией.

  • Видео и GIF. Сначала через JCodec (быстрый старт без зависимостей), потом плагин апгрейдит плеер до JCEF (embedded Chromium) — поддерживается полноценное видео с управлением.

  • Видео-кружочки. Тот же JCEF, но в круглом контейнере.

  • Поллы. Голосовать можно. Создавать — пока нет (см. WIP).

  • Pin / Unpin с отдельной панелью закреплённых сообщений и поддержкой "favourites" — мини-избранные сообщения пользователя.

  • Schedule send, silent send. Кнопка в composer'е разворачивает меню с "Send normal / Schedule / Send silently / Send when online". Дата и время — через нативный диалог.

  • Mute и notification settings с правильной иерархией: сначала смотрятся настройки конкретного чата, если не заданы — scope defaults (private/group/channel). Синхронизируется с TG при старте.

  • Drag-and-drop файлов прямо в окно чата.

  • Custom emoji как реакции и как inline big-emoji (когда отправляешь только эмодзи, оно рендерится крупно).

  • Link previews — passthrough из TDLib + расширенные OG-теги от собственного snippet-сервиса для ссылок на сниппеты.

Из того, что специально не делает (и не претендует пока):

  • не отправляет стикеры (только принимает),

  • не создаёт поллы,

  • не отправляет контакты, геолокацию и venue (входящие — только в списке чатов превью-строкой).

Это базовая часть. Дальше идут вещи, ради которых плагин, собственно, и делался.


Killer feature #1: Send to Saved Messages

Самая утилитарная фича. Контекстное меню → "Send to Saved Messages" → выделенный кусок (или весь файл) улетает в твой self-chat в Telegram. Без диалогов выбора чата, без подтверждений.

Что под капотом:

  • Если текст больше 4000 символов (лимит Telegram), он автоматически режется по границам строк на несколько сообщений.

  • Бинарные файлы блокируются: проверяется первые 4 КБ, если NUL-байтов больше 5% — экшен молча отказывает, чтобы случайно не отправить себе скомпилированный .exe вместо логов.

  • AtomicBoolean inFlight блокирует повторные клики, пока запрос летит.

Реальный кейс: ставишь брейкпоинт, копируешь содержимое переменной в Run Debug, выделяешь в консоли, Send to Saved Messages — теперь оно у тебя на телефоне, можно дома посмотреть, можно переслать коллеге.


Killer feature #2: шифрованный шеринг сниппетов

Здесь интереснее.

Стандартный сценарий: тебе надо скинуть коллеге кусок кода — функцию, traceback, конфиг. Что делают обычно:

  • кидают как текст в TG → теряется подсветка, страдают длинные простыни;

  • кидают через Carbon → красиво, но картинка, не копируется;

  • кидают через GitHub Gist → нужен аккаунт, ссылка длинная, и код физически лежит на чужом сервере в plaintext.

Последнее — реальная проблема для многих компаний, у которых политики безопасности запрещают Pastebin и аналоги. Поэтому в IDEGram сделано так:

  1. Шифрование происходит на стороне IDE. Плагин генерит случайный AES-256-GCM ключ, шифрует сниппет, отправляет на сервер только шифротекст.

  2. Ключ кладётся в URL-фрагмент: idegram.app/s/<id>#<key>. По спецификации HTTP всё после # в браузере не уходит на сервер — обрабатывается только на клиенте.

  3. Сервер хранит шифротекст + неконфиденциальную метадату (язык, число строк, размер, имя файла если разрешил). Расшифровать он не может — у него нет ключа.

  4. Получатель открывает ссылку, JS на странице читает ключ из фрагмента, делает GET за шифротекстом, дешифрует локально.

То есть код физически не покидает машину разработчика в открытом виде. Сервер у компании-провайдера (то есть у меня) можно фактически взломать, и злоумышленник получит набор шифротекстов и сможет узнать, что Вася делился 47 строками на Python — но не узнает, что именно там было.

Метадата в превью (язык, число строк, имя файла, никнейм автора) опциональна и настраивается в Settings → Code Sharing → URL share:

  • "Include filename in metadata"

  • "Include console context header when sharing stacktraces" — если шеришь из Run/Debug консоли, в превью добавляется имя конфигурации запуска.

Под капотом: ShareViaIdegramUseCase, проверка фича-флага SNIPPET_SHARE (есть/нет в текущем тире), RunContentManager для подтягивания имени Run-конфига, AES-256-GCM в JCA, base64url для фрагмента.


Killer feature #3: peer-mode и подсветка темы получателя

Это самая моя любимая фича технически.

Когда отправитель и получатель оба сидят в IDEGram, ссылка не нужна вообще. Сниппет уходит прямо как Telegram-сообщение, без upload'а на наш сервер. Но рендерится он у получателя как полноценный код-блок с подсветкой.

И вот тут — нюанс. Код красится не темой отправителя, а темой получателя. То есть если ты отправляешь Kotlin-сниппет из своего "Dracula", а коллега сидит в "Light", он увидит подсветку под Light. Получатель читает свой стандартный EditorColorsManager.globalScheme и SyntaxHighlighterFactory — то есть это буквально тот же подсвечиватель, который красит код в его IDE прямо сейчас. Поддерживается ~20 языков через alias-map (js→JavaScript, kt→kotlin, py→Python, и т.д.). Fallback на plain mono.

Никакой Pastebin, никакой Carbon, никакая GitHub Gist такого делать в принципе не могут — они не знают, какая тема в редакторе у того, кто откроет ссылку. А IDEGram знает, потому что получатель открывает у себя, в своей IDE.

Magic protocol

Возникает вопрос: а как peer-mode вообще понимает, что это сниппет, а не обычное сообщение? Telegram же не знает ничего про IDEGram.

Ответ: метадата кодируется прямо в текст сообщения. Незаметно для пользователя — там есть специальный header с языком, именем файла, range строк, плюс хеш-маркер. MagicProtocol.kt парсит это на получателе, и если маркер найден, сообщение рендерится как PeerSnippetBubble вместо обычного текста.

Если получатель в обычном Telegram-клиенте, он увидит сообщение как код-блок в ``` — потому что мы заворачиваем содержимое в обычный TG-codeblock, и magic-маркер прячется в незначащих символах. Так что фолбэк на обычный TG работает прозрачно.

PeerModeDecider автоматически выбирает, как отправить (peer-mode vs link-mode) в зависимости от размера сниппета и regsitry-флагов. Маленькие куски идут peer-mode, большие — через зашифрованную ссылку.


Маленькие штуки, которые радуют

Это список вещей, которые не вошли в killer-features, но которые я ловил кайф пилить и которые делают плагин приятным.

  • Темная тема «из коробки». Своих палитр у плагина нет — все цвета берутся из EditorColorsManager IDE. Меняешь тему в IDE — IDEGram перерисовывается. Compose-for-IntelliJ + Jewel дают это бесплатно.

  • Throttling уведомлений. Один балон на чат не чаще раза в две секунды (THROTTLE_MS = 2000 в MessageNotificationService). Иначе при массовых апдейтах в групповом чате IDE превращается в дискотеку.

  • Тулвиндоу без шортката. У ToggleToolWindow намеренно не назначен hotkey. JetBrains-плагины часто грешат тем, что захватывают Ctrl+Shift+T «потому что у нас же тест‑фреймворк». Я считаю это хамством. Пользователь сам биндит в Settings → Keymap.

  • Auto-scroll на unread + ленивая пагинация вверх. Открываешь чат — прыжок на первое непрочитанное. Свайп вверх подгружает историю.

  • Sender filter в поиске сообщений. Можно отфильтровать поиск конкретно по отправителю.

  • Глобальный кэш в PathManager.getSystemPath(). TDLib-база, файлы, стикеры, GIF, JCEF — все живут в одной общей папке инсталляции IDE, а не в <project>/.idegram/. Старая папка по проектам — legacy, плагин показывает уведомление один раз и предлагает мигрировать.

  • PasswordSafe для credentials. Номер телефона и флаг активной сессии хранятся в OS keychain через стандартный IDE API, а не в plain-text JSON.

  • JcefStickerOverlay + автоочистка scratch-папки. Раз в час PluginInitializer.sweepStickerScratchDir() чистит мусор из …/idegram/jcef/, иначе она разрастается.

  • Compose DragAndDropTarget в MessageViewPanel — файл бросаешь прямо в чат, не нужно открывать attach-меню.

  • Re-entry guard через AtomicBoolean inFlight на ShareViaIdegram и SendToSavedMessages — даблклик не отправит две копии.

Ничего из этого само по себе не «вау‑фича», но в сумме это и есть то, что отличает плагин от прототипа.


Что НЕ работает (честный список)

Хабровская традиция требует, чтобы автор не врал про дорожную карту. Поэтому:

  • Linux ARM64. Нативной TDLib-либы для ARM64 пока нет, я её не собрал. На обычном Linux x64 всё работает.

  • Мультиаккаунты. Архитектура держит ровно одну сессию на инсталляцию IDE. UI для переключения аккаунтов не сделан. Я в курсе, что многие хотят, дойдут руки.

  • Локализация. Все строки захардкожены на английском. messages.properties нет. Если важно — заводите issue.

  • Создание поллов и отправка стикеров отдельно от альбома. Голосовать можно, видеть стикеры можно, отправлять — нет.

  • Отправка контактов / геолокации / video notes. Принимаем (в виде превью в списке чатов), отправлять не умеем.

  • Sticker / GIF download в текущей версии — заглушка. Стикеры через JCEF-оверлей рендерятся из встроенных, но не докачиваются по требованию.


Что дальше

Следующие штуки в очереди (без обещаний по срокам):

  • линуксовая нативная либа (x64 уже работает, ARM64 — собрать);

  • мультиаккаунты;

  • создание поллов;

  • whitepaper по архитектуре приватности (зашифрованный шеринг достоин отдельного разбора с криптографами);

  • собственно платный релиз — сейчас бесплатно, фича-флаг переключу когда наберётся критмасса пользователей.

Спасибо, что дочитали.