На Hacker News показали SCM: локальный ИИ-поиск по фото и видео на Mac

На Hacker News показали SCM: локальный ИИ-поиск по фото и видео на Mac

В Show HN представлен SCM, приложение для macOS на Electron (в инструкции по сборке, версия 0.2.4), которое ищет по фотографиям и видео в любой папке. Описание проекта на GitHub обещает «глубокий» поиск по каждому снимку и каждому кадру: запрос формулируется обычным языком («опиши воспоминание»), а локальная модель компьютерного зрения находит подходящее. Главный тезис README: приложение local-first, без аккаунтов, облака и загрузок на сервер, вывод моделей выполняется на вашем Mac. Веса моделей скачиваются один раз при первом использовании (около 435 МБ для CLIP по умолчанию), дальше всё работает офлайн.

Поиск устроен в несколько режимов. По мере набора запроса сначала срабатывает мгновенный поиск по ключевым словам в именах файлов, затем подключается модель: результаты ранжируются по косинусной близости к векторным представлениям изображений, с поправками на совпадение фраз и имён файлов, порогом «честности», подобранным под каждую модель, и фильтром почти-дубликатов. У каждой плитки есть значок «почему найдено» (визуальное совпадение, совпадение по имени файла и т. д.) и подсказка с разбивкой оценки по компонентам. Китайские, японские и корейские запросы разбиваются на перекрывающиеся биграммы.

Видео разбиваются на сцены: ffmpeg находит границы кадров, для каждого сегмента берётся средний кадр и сохраняется постер. Поэтому результат ведёт к конкретному моменту, а не просто к файлу: на плитке виден постер сцены с таймкодом, а открытие видео перематывает прямо к нужному месту. Фильтр шума выдаёт «нет совпадений по сценам» вместо россыпи случайных кадров, а каждое видео даёт в выдаче не более трёх сцен. Видео целиком представляется тремя усреднёнными кадрами (на 20, 50 и 80 % длительности), у GIF усредняются средние кадры.

Отдельные режимы, распознавание текста (OCR) и диалоги. OCR на базе Tesseract работает в собственном процессе и не использует модель зрения, поэтому доступен, даже пока ИИ-движок прогревается или выключен; найденные слова подсвечиваются на плитках. Английский включён всегда, ещё 35 языков включаются в настройках (по умолчанию, упрощённый и традиционный китайский, японский, корейский); пакет каждого языка весит около 2,4, 5 МБ, набор по умолчанию, около 17 МБ. Поиск по речи, точное буквальное совпадение в расшифровках Whisper, без векторов и порогов. Результаты делятся на три уровня: «Точная реплика» (фраза подряд в одной реплике), «Точные слова» (все слова в одной реплике или в окне до 8 секунд) и «Произнесённые слова» (все слова в одном видео). Для расшифровки по умолчанию используется Whisper tiny.en (около 150 МБ), можно выбрать base.en (около 300 МБ); при смене модели все видео расшифровываются заново.

В приложении есть вкладки «Все», «Видео», а также переключаемые «Скриншоты» и «Email». Любой запрос можно сохранить как вкладку вместе с режимом поиска, до 20 вкладок. Скриншоты распознаются независимо от имени файла по четырём признакам: ручная пометка, словарь локализованных названий скриншотов (30+ названий на 20+ языках), метаданные PNG/JPEG и исходная папка. Вкладка Email показывает фото, на которых OCR нашёл адрес электронной почты, и умеет собирать адреса из «ломаного» распознавания вроде «gmail,com» или «allen [at] gmail [dot] com».

В приложении доступны четыре переключаемые модели зрения на ONNX Runtime; названия кроме CLIP по умолчанию в тексте не приведены. Смена модели заново строит векторные представления всей библиотеки: переключение происходит сразу, остальное дозаполняется в фоне, а пока процесс не закончен, поиск откатывается к ключевым словам по именам файлов. Опционально, в Settings → LLMs Chat, включается чат Ask: вспомогательный процесс llama.cpp, привязанный к loopback-адресу, отвечает на вопросы по уже извлечённым данным (реплики, текст с изображений, совпадения по именам файлов) и даёт кликабельные пронумерованные ссылки. Пока режим не включён, ничего не скачивается и не запускается.

Библиотека самоподдерживающаяся: папки под наблюдением импортируются автоматически, дубликаты после переименования отсекаются по хэшу содержимого (SHA-256), проблемные файлы повторяются до трёх раз. Медиа копируется в управляемую приложением библиотеку; телеметрии, аккаунтов и выгрузки нет. Скачивают данные только основные рабочие процессы и один раз: веса зрения (Hugging Face), языковые пакеты OCR (CDN Tesseract), веса Whisper и, только по согласию, llama.cpp и модели GGUF (GitHub и Hugging Face) с проверкой sha256.

Установка, через Homebrew (Apple Silicon, macOS 12+): brew tap allenv0/scm, затем brew trust allenv0/scm и brew install --cask allenv0/scm/scm. Cask сам снимает флаг карантина macOS, поэтому ручные шаги с Gatekeeper не нужны. Из исходников приложение собирается через Bun и electron-builder (команды bun run dev, bun run dist). Без идентификатора разработчика Apple в связке ключей DMG собирается неподписанным: локально он работает, но при первом запуске macOS может потребовать «правый клик → Открыть».

Ключевые факты

  • SCM, приложение для macOS на Electron (в инструкции по сборке версия 0.2.4): поиск по фото и кадрам видео по описанию, тексту на изображении (OCR) и произнесённым словам (Whisper).
  • По README, всё локально: без аккаунтов, облака и выгрузки файлов; веса скачиваются один раз (около 435 МБ для CLIP по умолчанию), дальше офлайн.
  • Видео делятся на сцены: поиск ведёт к конкретному кадру с таймкодом, не более трёх сцен на видео; поиск по диалогам, точное совпадение в расшифровках Whisper (tiny.en около 150 МБ по умолчанию).
  • Четыре переключаемые модели зрения на ONNX Runtime; смена модели заново строит индекс всей библиотеки в фоне, до завершения поиск идёт по именам файлов.
  • Установка через Homebrew на Apple Silicon (macOS 12+); чат на локальной LLM (llama.cpp) включается только по желанию.

Почему это важно

Поиск по личному архиву фото и видео обычно либо ограничен именами файлов, либо требует загрузки материалов в облако. SCM, судя по README, пытается закрыть оба недостатка: ищет по содержимому (описание, текст на картинке, речь в видео) и при этом, как заявлено, ничего не отправляет наружу. Особенно заметна детализация по видео: результат ведёт не к файлу, а к конкретной сцене с таймкодом. Новизны на уровне моделей тут нет: приложение собирает вокруг готовых CLIP, Whisper и Tesseract законченный интерфейс.

Кому это важно

Тем, у кого на Mac накопились большие папки фото, скриншотов и записей и кому важна приватность: фотографам, монтажёрам, людям, которые хранят много скриншотов с текстом или записей разговоров. Полезен и разработчикам, которым интересен пример локального индексатора на Electron, ONNX Runtime, ffmpeg и Tesseract: в README подробно описаны устройство, тесты и структура репозитория.

Как это применить

На Apple Silicon с macOS 12+ ставится через Homebrew: brew tap allenv0/scm, brew trust allenv0/scm, brew install --cask allenv0/scm/scm; обновление, brew upgrade --cask allenv0/scm/scm. Для минимальных прав можно доверять только cask, а не весь tap. Затем нужно импортировать папку (⌘I, перетаскивание или наблюдаемые папки) и дождаться индексации. Самостоятельная сборка идёт через Bun: bun install, bun run dev или bun run dist (есть вариант dist:unsigned). Стоимость и лицензия в предоставленном тексте не указаны.

Можно ли доверять

Все утверждения о приватности (нет телеметрии, аккаунтов и выгрузок, офлайн после первой загрузки весов) взяты из README самого проекта; независимой проверки в тексте нет. В тексте не названы автор приложения и лицензия (известно лишь, что Homebrew-репозиторий размещён под аккаунтом allenv0). Нет и измерений скорости, точности или времени индексации: бенчмарки упомянуты только как скрипты, которые пишут отчёты в JSON. Названия четырёх моделей зрения, кроме CLIP по умолчанию, не приведены, сравнения с Apple Photos или Spotlight нет.

Риски и подводные камни

Первая загрузка весов (около 435 МБ для CLIP по умолчанию, плюс Whisper и языковые пакеты OCR) требует сети. Смена модели зрения заново индексирует всю библиотеку, смена модели Whisper заново расшифровывает все видео; пока идёт пересборка, поиск работает по именам файлов. Медиа копируется в библиотеку приложения, то есть занимает дополнительное место на диске. Без подписи Apple сборка из исходников может потребовать «правый клик → Открыть» при первом запуске. Заявленная поддержка, macOS (для Homebrew, Apple Silicon); Windows и Linux в тексте не упоминаются.

«Local-first: без аккаунтов, без облака, без загрузок. Вывод моделей выполняется на вашем Mac.»

— README проекта SCM