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

推荐订阅源

美团技术团队
W
WeLiveSecurity
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
F
Full Disclosure
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Register - Security
The Register - Security
G
Google Developers Blog
C
Check Point Blog
GbyAI
GbyAI
A
About on SuperTechFans
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
T
Tor Project blog
AWS News Blog
AWS News Blog
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
MongoDB | Blog
MongoDB | Blog
Latest news
Latest news
aimingoo的专栏
aimingoo的专栏
U
Unit 42
Y
Y Combinator Blog
P
Privacy International News Feed
Cisco Talos Blog
Cisco Talos Blog
S
Securelist
S
Schneier on Security
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
C
Cisco Blogs
Webroot Blog
Webroot Blog
T
Troy Hunt's Blog
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
P
Privacy & Cybersecurity Law Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
罗磊的独立博客
Cloudbric
Cloudbric
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News: Ask HN
Hacker News: Ask HN
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Security Blog
Microsoft Security Blog

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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 миллионов точек без потерь
MAX Light — легкая версия клиента MAX для ПК Windows
squ1sh · 2026-06-16 · via Все публикации подряд на Хабре

Простой

7 мин

97

Всем ку! Пожалуй, стоит начать с того, что меня вообще сподвигло на создание данной версии:

  1. Нежелание некоторых юзеров пользоваться официальной версией для ПК по ряду причин:

    а) Требовательность к железу (даже видеокарту нагружает). А некоторым по работе приходится юзать МАХ на «уставших рабочих лошадках». Заявления, типа «эта тварь жрёт ресурсов больше, чем 1С».

    б) Постоянные обновления с полной переустановкой, а на момент написания статьи полный пакет официального МАХ весил 308 мб.

    в) Некоторые неудобства использования веб‑версии, особенно в режиме «Инкогнито». Чуть подробнее будет дальше в статье.

    г) Слежение за пользователем. Вроде, ничего особо криминального нет во встроенных трекерах, но бесит, когда тебя не спрашивают. Знаете, если Вы выходите из подъезда и бабульки на лавочке интересуются как у вас дела и куда направляетесь — это одно. Ваше дело — отвечать\не отвечать\соврать. А когда Вам при этом ещё и в трусы заглядывают без спроса — это уже другое.

  2. Не нашел хорошую альтернативу. Нет, есть конечно nemax‑mod для ПК, который представляет из себя оболочку для веб‑версии, но так такое... и сырое.

Значит, будем делать своё!

Итак, для начала выберем инструмент разработки, для этого есть некоторое количество моих «юзерфрендли принципов»:

а) Запуск на всём, чём можно. Некоторые из технологий и фреймворков будем использовать «заранее устаревшими». Выбор по старинке остановил на c# +.net framework 4.7. Конечно, можно было использовать более новые.NET 8\9\10, что гораздо упростило бы разработку и решило некоторых сложности, с которыми пришлось столкнуться. Но если у юзера Win10 без предустановленного.NET или даже Win7 (да, и такие отписываются в Issue на гитхабе), это создаст некоторые неудобства при первичном запуске.

б) Малый вес. Как можно меньше. Нет перегруженного интерфейса и прочих свистогуделок и прочего мусора.

в) Максимально простая установка. Поддержка обновлений. Желательно, удобных обновлений.

Ну что ж, приступаем!

  1. Для начала набросал простую оболочку, в которой запускается WebView2 с привязкой к сайту веб‑версии MAX и увидел несколько проблем:

    а) Хорошо, у меня есть окно, но как получать уведомления, если оно свёрнуто?

    б) При авторизации создается папка с файлами и кэшем веб‑версии в appdata. Меня это не устроило по ряду причин — по моему опыту хранение данных локально может быть на руку злоумышленникам. В своё время я легко получал доступ к перепискам различных мессенджеров, благодаря локальному хранению. И вообще, считаю папку с данными WebView2 — мусором. А пользователь не должен об этом задумываться при удалении мессенджера с рабочего компа.

    в) В принципе, при работе в режиме ‑inprivate (сиречь «в режиме Инкогнито»), создается временная папка, которая удаляется при закрытии окна, но тогда придется проходить авторизацию каждый раз при запуске.

  2. Мне понравилась идея с in private, но тогда нужно хранить ключ авторизации. Пишем перехватчик токенов на javascript. Легко и просто перехватываем токен авторизации, но как его хранить? Ответ лежит на поверхности — прямо в реестре с шифрованием по DPAPI — это решит сразу несколько проблем:

  • Не нужно постоянно проходить авторизацию

  • Токен «под рукой» для быстрого удаления

  • Копирование токена на другой комп не позволит использовать его на другой машине, так как DPAPI имеет жесткую привязку к windows user id, device id

  • Токен зашифрован и его нельзя «просто прочитать»

    Вопрос: кто‑то другой сел за комп и открыл эту программу. Либо она запустилась сама при загрузке системы и «посторонний» видит всю переписку. Решение — добавляем функцию пин‑кода. Опциональное, пользователь может отказаться и добавить пин‑код потом или удалить его.

    Логика работы парсера — при инициализации окна парсер проверяет, есть ли ключ авторизации в зашифрованном виде по месту хранения? Если есть — останавливается. Если нет — ждём авторизации от пользователя по QR‑коду. Как только токен перехвачен и сохранен — парсер останавливает работу.

    Не забываем про UX — добавляем в настройки удаление данных авторизации в один клик.

    3. Создаем иллюзию окна как отдельного мессенджера. Имеется ввиду необходимость сохранения положения окна и его размеров при каждом запуске. В том числе при наличии нескольких дисплеев. Сохраняем данные по размерам окна и координатам в реестре. Не шифруем )

Уведомления

  • Проводим опрос среди юзеров. Что нравится и не нравится, когда они используют оригинальную веб‑версию МАХ? Приходим к выводу, что нам необходимо:

  • Корректно всплывающие уведомления типа стандартных, но лучше и функциональнее.

  • Понимать, что было пропущено уведомление, если юзер отошел от компа. А именно — мигание иконки приложения в панели задач, либо красная точка на иконке в трее.

    Значит, делаем уведомления в правом нижнем углу с нуля. Включаем логику определения получения новых сообщений. При взгляде на чат видим, что у нас есть три вида состояния — синий бейдж с количеством сообщений — новое непрочитанное. Серый бейдж — новое непрочитанное в чате, для которого пользователь выключил уведомления. Нет бейджа — нет новых сообщений. Изучаем веб‑страницу, ищем div'ы и классы, отвечающие за бейджи, парсим эти состояния. Дебажим.

    Передаем из javascript в c# данные. Пишем CustomNotification.cs, который будет рисовать нам уведомления в нижнем углу Windows.

    Прописываем определение состояния окна программы (мы же не хотим получать всплывающие уведомления прямо во время переписки?) — окно либо в фокусе, либо нет. Если нет — показываем уведомления. Опять дебажим...

    Парсим данные из чата с синим бейджем — аватар, имя\ник пользователя и тело сообщения. Всё это добавляем в наш нотификатор и снова и снова дебажим. Не забываем про такие нюансы как — крестик на уведомлении для быстрого закрытия, положение уведомления по, скажем так, Z‑координате (мы должны видеть уведомление из нашей программы поверх всех других окон, в том числе в 3D приложениях, но это не должно приводить к их сворачиванию).

    Добавляем функцию «антифлуд» — это когда кто‑то начинает спамить короткими сообщениями, и Вам это не нравится — показываем новые сообщения не чаще чем задано определённым временным лимитом. Добавляем проверку на дубли сообщений — когда Вы получили новое сообщение, то получили и уведомлении в трее, но если Вы его не прочитали в течение отведенного времени, то программа могла отправить уведомление повторно. Чтобы этого не происходило — храним в памяти тело сообщения и, если дубль, то не показываем. Это решает проблему с постоянно всплывающими уведомлениями, когда юзеру тупо некогда ответить на сообщение (допустим, пишет срочное письмо, сценарий, отвечает клиенту). И не придётся постоянно жать на крестик.

    Разыгрываем в голове ситуацию — юзер отошел по своим делам. В это время пришло новое сообщение, появилось уведомление и исчезло спустя несколько секунд. Программа свёрнута и чат не виден. Хорошо, уведомление исчезло через пару секунд, значит, если юзер не отреагировал, то через пару секунд включаем ненадолго мерцающую подсветку иконки в панели задач. Моргнём два‑три раза и дальше будем просто светиться (не надо моргать почем зря, может юзеру не до чата, а так просто оранжевым светится иконка внизу и сильно глаз не мозолит). А если свернуто в трей? Тогда красная точка над иконкой в трее. И без всяких «99+» непрочитанных сообщений, это лишнее.

    (пока писал эту статью, решил, что нужна будет дополнительная настройка «Показывать уведомления поверх других окон» с возможностью отключения, а то вдруг юзер катает‑нагибает? Уведомление может перекрыть ему стратегически важную информацию. Сказано‑сделано)

Собираем билд...

  • Изначально была идея собрать всё в один.exe файл, вес которого был примерно 1–1,5 мб, и потреблял примерно 15 мб RAM. Это успех... но не всё оказалось так просто. Одна из нативных библиотек, написанная на c++ никак не хотела встраиваться. Это рушило «концепцию одного файла» на корню. Да и нужно было еще проработать дополнительную безопасность. Добавляем на всякий случай защиту от XSS‑атак, блокировку трекеров, антидебаггер (с которым хапаем проблем при тестировании и получаем невозможность запуска на виртуальных машинах), отслеживание контрольных сумм. Оставался открытым вопрос последующих обновлений. Понятно, что веб‑версия сама по себе новая при каждом запуске, но как быть с обновлением билдов самой программы? Накидав всяких фич по безопасности заметил, что потребление RAM значительно выросло, но не критично. А в моей RAM еще свежи воспоминания о чаяниях юзеров по поводу полной переустановки десктопного МАХ при каждом обновлении... так быть не должно!

    Подумав немного, решил использовать Velopack для обновлений. По итогу отказался от концепции «одна программа — один файл». Единственное — зашил парсер на javascript внутрь.exe, а то как‑то несекьюрно. Velopack помог решить несколько вопросов сразу:

  • Дельта‑обновления в фоне. Вышел новый билд? При запуске программы Вы получите уведомление о наличии обновлений. В случае согласия обновиться — даже глазом моргнуть не успеете, как программа получит обновления только новых файлов и быстро перезапустится. Только. Новых. Файлов. А не полный реинсталл, чем любят грешить некоторые девелоперы.

  • Пусть библиотеки не будут вшиты в.exe, зато при сборке нового билда и получении обновлённных библиотек юзеру будет проще обновиться с меньшими затратами на трафик.

  • Velopack сам контролит хэш файлов, так что эту функцию, как и несколько других, вырезал из исходного кода за ненадобностью.

  • Что не понравилось? Работа мессенджера в таком режиме потребляет RAM на уровне «телеги», скачками до 100–300 мб RAM. В среднем около 100 мб.

  • Вес установочного файла <10 мб. Пока только win‑x64. Пользуйтесь!

P. S.: У меня на гитхабе есть еще интересные штучки...