Незаметный AI-ассистент прямо поверх экрана
Недавно наткнулся на любопытный оpen-source проект под названием cue. Это небольшое приложение, которое висит полупрозрачным окном поверх всех остальных программ, слушает происходящее на созвонах, смотрит на экран и выдает подсказки в реальном времени. Самое интересное здесь даже не работа с LLM, а то, как утилита скрывает себя от трансляции экрана в Zoom, Google Meet или Teams.
Если вам доводилось видеть платные сервисы вроде Cluely или Interview Coder, то концепция покажется знакомой. Разработчик cue решил собрать бесплатный аналог с открытым исходным кодом (лицензия GPL-3.0), куда можно подключить собственный API-ключ и не платить за сторонние подписки.
Как устроен этот ассистент
Приложение разделяет входящую информацию на три независимых потока.
Первый поток — ваш экран. Утилита делает скриншот в момент нажатия горячей клавиши или отправки запроса.
Второй поток — ваш микрофон. cue слушает голос владельца компьютера и переводит речь в текст.
Третий поток — системный звук (то, что говорят собеседники в наушниках). На Windows захват аудио из системы работает через системный loopback без лишних телодвижений. На macOS начиная с версии 14.4 задействован ScreenCaptureKit через флаги Chromium.
Каналы собеседника и пользователя обрабатываются раздельно, поэтому модель точно понимает, кто какую реплику произнес. Затем контекст отправляется в выбранную языковую модель, а ответ выводится прямо в плавающее окно по словам (стримингом).
Что умеет делать cue
Интерфейс выглядит как компактная стеклянная панель. Пространство вокруг нее кликабельно, поэтому она не мешает нажимать на кнопки в редакторе кода или браузере.
Вот основные сценарии работы с утилитой:
- Разбор задач на экране. Нажимаете комбинацию клавиш (по умолчанию Ctrl+H на Windows или Cmd+H на macOS), приложение снимает экран с кодом или условием задачи и выдает ход решения, рабочий код и оценку сложности по времени и памяти.
- Подсказки по ходу диалога. Кнопка «What should I say?» анализирует последние фразы собеседника и предлагает логичный вариант ответа.
- Резюме и вопросы. Можно нажать на кнопку подведения итогов беседы или сгенерировать уточняющие вопросы по теме разговора.
- Ответы на свободные вопросы. В поле ввода можно напечатать любой вопрос, объединяя скриншот открытого окна и историю недавнего обсуждения.
В настройках есть поле для резюме. Туда можно вставить свой профессиональный бэкграунд, и ассистент будет опираться на реальный опыт при ответах на вопросы с подвохом.
Локальная транскрипция и выбор моделей
В проект заложена концепция Bring Your Own Key (BYOK). Серверов у автора нет, телеметрия отсутствует, а ключи хранятся локально в файле cue-data.json.
Поддерживаются OpenAI, Anthropic Claude, Google Gemini, Azure AI Foundry, а также любые локальные или кастомные эндпоинты, совместимые с OpenAI Chat Completions (например, Ollama или vLLM).
Если не хочется отправлять аудиопоток в облако, транскрипцию речи можно переключить на whisper.cpp. В настройках аудио выбирается локальный режим и скачивается нужная модель, от базовой base.en до многоязычных и квантованных вариантов. Приложение поднимает локальный процесс whisper-server на временном порту и прогоняет очереди аудио через него. Аудиоданные на диск не сбрасываются, оставаясь исключительно в оперативной памяти.
Как окно остается невидимым при демонстрации экрана
Самая любопытная техническая деталь cue — защита от попадания в скриншоты и трансляции. Это не магия видеокарты и не хак с прозрачностью.
Внутри Electron вызывается метод setContentProtection(true), который обращается напрямую к системным механизмам операционной системы:
- В Windows применяется вызов
SetWindowDisplayAffinityс флагомWDA_EXCLUDEFROMCAPTURE. Оконный менеджер Windows (DWM) просто исключает окно из всех потоков захвата. В старых сборках Windows 10 (до 2004) это приводило к черному прямоугольнику, но на свежих версиях окно становится полностью невидимым для захвата. - В macOS выставляется флаг
NSWindowSharingNone. Он сообщает оконному серверу о необходимости скрывать окно из стримов. Правда, начиная с macOS 15.4 Apple немного изменила поведение API, поэтому на свежих релизах стопроцентная невидимость не гарантируется.
Для Zoom есть нюанс. В настройках клиента нужно включить продвинутый режим с фильтрацией окон:
Без этой галочки Zoom пытается захватывать сырой экран в обход фильтров приватности окон. Для Google Meet и Microsoft Teams ничего настраивать не нужно, они уважают системные флаги по умолчанию.
Установка и запуск
Проще всего забрать готовый бинарник со страницы релизов репозитория. Доступны сборки для Windows x64 и macOS на процессорах Apple Silicon.
Если хочется собрать проект из исходников, потребуется Node.js версии 22.12 или новее. Сборка не требует тяжелых нативных тулчейнов, так как автор намеренно написал клиент на чистом HTML, CSS и JS без лишних фреймворков:
git clone https://github.com/Blueturboguy07/cue.git
cd cue
npm install
npm start
Если планируете использовать локальный Whisper из исходников, перед первым запуском нужно подготовить бинарники:
npm run prepare:whisper
После старта приложения останется выдать разрешения на микрофон и запись экрана (на macOS), а затем вставить API-ключ в настройках.
В сухом остатке
cue — это наглядный пример того, как стандартными средствами Electron и системных API можно собрать удобного компаньона для созвонов, брейнштормов или решения технических задач. Код в репозитории компактный и хорошо читается, поэтому проект отлично подойдет еще и тем, кто хочет разобраться с захватом аудиопотоков и управлением видимостью окон в десктопных приложениях.
