- PVSM.RU - https://www.pvsm.ru -
Есть встроенный в Windows Win+V. Я честно пользовался им года полтора. А потом однажды скопировал кусок кода, полез искать то, что копировал двадцать минут назад, и понял, что искать там нечем. В Win+V нет поиска. Совсем. Список, по которому ты скроллишь глазами. Двадцать пять элементов, картинки вперемешку с текстом, и ты листаешь колёсиком, как ленту, пытаясь вспомнить, как выглядела нужная строчка.
Ещё он не помнит историю между перезагрузками так, как мне хотелось, теряет то, что я закреплял, и живёт своей жизнью где‑то в облаке аккаунта Microsoft, о чём я стараюсь не думать.
В общем, в какой‑то вечер я решил, что напишу своё. Получилось то, чем я теперь пользуюсь каждый день, и мне кажется, оно вышло достаточно аккуратным, чтобы показать. Называется ClipVault. Дальше расскажу, как оно устроено внутри, что я решил в него не добавлять и почему, и где скачать, если захотите потыкать.
Фоновая утилита для Windows 10/11. Живёт в трее, окно скрыто. Ловит всё, что вы копируете: текст, картинки, файлы. По Ctrl+Shift+V всплывает окно истории с мгновенным поиском, вкладками и превью. Выбрали элемент, он лёг обратно в буфер, окно спряталось. Всё.
История хранится локально, в %APPDATA%ClipVault. Никакого сервера, аккаунта и облака.


Изначально в задумке был Python с PySide6. Я от него отказался осознанно. Менеджер буфера это не то приложение, которое ты запускаешь и закрываешь. Оно висит в фоне сутками. Значит, оно не имеет права жрать сотни мегабайт оперативки и греть процессор просто фактом своего существования.
Поэтому Rust плюс Tauri 2 для бэкенда, TypeScript плюс Vite для интерфейса, SQLite для хранилища. Tauri вместо Electron ровно по той же причине: не тащить с собой целый Chromium, а использовать системный WebView2, который в Windows 10/11 и так уже есть. На выходе лёгкий нативный .exe, быстрый старт и расход памяти, за который не стыдно для фоновой утилиты.
Первое, что хочется сделать наивно, это опрашивать буфер по таймеру: раз в секунду посмотрел, поменялось или нет. Так делать не надо. Это и лишний расход, и гонки, и задержка.
Windows умеет уведомлять об изменении буфера сама. ClipVault поднимает отдельный поток clipboard-master, который подписывается на системные события и реагирует только когда буфер реально изменился. Ноль опроса, ноль холостого хода.
Дальше по цепочке: событие пришло, прочитали содержимое (текст, потом файлы, потом картинка), посчитали SHA-256 с префиксом типа, и вот тут первый приятный момент. Хэш нужен не только для дедупликации, но и для защиты от петли. Когда вы выбираете элемент из истории, приложение само кладёт его в буфер, а значит само же провоцирует событие изменения. Чтобы не создать дубликат собственной записи, перед записью в буфер хэш запоминается, и слушатель, увидев ровно этот хэш, просто пропускает событие.
Если вы копируете одно и то же по десять раз в день (а мы все копируем), плодить десять одинаковых записей глупо. В базе на content_hash висит UNIQUE, и повторное копирование не создаёт новую строку, а поднимает существующую: инкрементит счётчик использований и обновляет время. История остаётся чистой, а часто используемое само всплывает наверх.
Поиск сделан на SQLite FTS5. Это полнотекстовый движок прямо внутри SQLite, и он даёт мгновенный поиск по тексту и коду, включая кириллицу и префиксный поиск (набрали три буквы, уже нашлось). Токенайзер настроен на unicode61 со снятием диакритики, синхронизация основной таблицы с индексом висит на триггерах. Для утилиты, где поиск должен срабатывать в тот же момент, когда ты дописал слово, это ровно то, что нужно, и без единой внешней зависимости для поиска.
Картинки хранятся PNG‑файлами в отдельной папке, в базе лежит только путь и превью. В webview картинка отдаётся как data‑URL по запросу, а не тащится вся история разом.
Я не люблю, когда «приватность» это строчка на лендинге. Поэтому скажу конкретно.
Во всём приложении есть ровно один сетевой запрос: проверка обновлений. Уходит только версия и платформа, ничего из вашей истории туда физически не попадает, потому что код этого просто не делает. И этот единственный запрос отключается тумблером в настройках. Выключили, и приложение больше не ходит в сеть вообще никогда. Ноль запросов.
Никакой телеметрии. Никакого аналитического SDK. И, важное решение, которое я хочу проговорить вслух: в установщик не зашит никакой сторонний браузер, тулбар или «партнёрское ПО». Была идея добавить бандл одного известного браузера ради копеечки с установок. Я от неё отказался: это ровно то, что превращает утилиту в PUP в глазах антивирусов и SmartScreen, и это противоречит всему, ради чего я это писал.
Для приватных данных есть два инструмента, и оба бесплатны навсегда: пауза записи (для паролей и всего, что не хочется видеть в истории) и игнор‑список приложений (буфер из вашего банк‑клиента или менеджера паролей просто не попадает в историю). Безопасность я принципиально не прячу за деньги.
Тут инженерно любопытная часть. Я не хотел ни аккаунтов, ни сервера лицензий, ни «войдите, чтобы активировать». Поэтому лицензия сделана на офлайн‑подписи.
Ключ это подписанный payload ({tier, email}), подписанный приватным ключом Ed25519, который есть только у меня. Публичный ключ зашит в .exe. Приложение проверяет подпись локально, офлайн, один раз и навсегда. Подделать ключ без приватной пары нельзя. При этом ключ не привязан к железу, то есть вы вставляете одну и ту же строку на всех своих ПК, и на рабочем, и на домашнем. Есть экспорт и импорт лицензии.
Да, такой ключ теоретически можно передать другому человеку. Я сознательно принял этот компромисс: для утилиты за 399 ₽ городить аппаратную привязку и сервер активации это стрелять из пушки по воробьям, а тот, кто пойдёт искать чужой ключ, всё равно бы не купил. Мягкий сдерживатель это привязка к email покупателя, который показывается прямо в интерфейсе.
Мне кажется, это самая честная часть. Продукт определяется не только тем, что в нём есть, но и тем, что вы отказались в него пихать.
Шаблоны и автозамена (text expansion). Звучит красиво, но под капотом это глобальный клавиатурный хук и инъекция ввода в чужие окна. Это отдельный класс продукта, он палится антивирусами и прямо противоречит privacy‑позиционированию. Мимо.
Авто‑вставка. Соблазн сделать так, чтобы приложение само вставляло текст в активное окно, велик. Но это та же инъекция ввода, она ненадёжна между разными приложениями и ведёт себя непредсказуемо. Я оставил честное правило: приложение готовит буфер, а Ctrl+V вы жмёте сами. Скучно, зато работает всегда и везде.
Сетевое превью ссылок. Красивая карточка с заголовком страницы требует ходить в сеть за каждой ссылкой. Это убивает «полностью офлайн». Ссылки распознаются и чистятся от UTM локально, без единого запроса.
Аккаунт, подписка, облако. См. выше про лицензию. Ничего этого нет и не будет.
Общее правило, которым я мерю любую будущую фичу: «подготовить буфер, а пользователь вставит сам» это дёшево и ложится в текущую пассивную архитектуру; «приложение печатает за пользователя» это дорого, ненадёжно и палится. Всё, что на дорогой стороне, не проходит.
Базовая версия бесплатная и это полноценная замена Win+V: текст, картинки и файлы, автозахват, дедуп, превью, мгновенный поиск, смена горячей клавиши, пауза, игнор‑приложения, простой экспорт, автозапуск, авто‑обновления. Лимит истории 200 элементов. Большинству этого хватает с головой, и я не собираюсь ломать бесплатную версию, чтобы вынудить платить.
Есть ещё Pro за разовые 399 ₽ (без подписки и без аккаунта, активируется офлайн‑ключом и работает на всех ваших ПК). Он даёт больше для тех, кому базовой версии мало. Вот граница по возможностям:
|
Возможность |
Free |
Pro · 399 ₽ разово |
|---|---|---|
|
История: текст, картинки, файлы, автозахват, дедуп, превью |
до 200 элементов |
безлимит (до 10 000) + автоочистка по возрасту и количеству |
|
Поиск |
мгновенный полнотекстовый (FTS5) + фильтр по типу |
+ фасеты (дата, источник, тег), regex, умные коллекции |
|
Горячая клавиша вызова |
смена хоткея |
+ свои хоткеи для Pro‑действий |
|
Окно |
список, вставка, светлая и тёмная тема, навигация стрелками |
+ плавающий и компактный режим, память позиции и размера, размер шрифта |
|
Закрепление |
пины |
+ категории, цветовые метки, экспорт избранного |
|
Картинки |
захват, превью, вставка |
+ сохранить на диск, копировать путь, метаданные |
|
Цвета |
нет |
распознавание HEX/RGB/HSL, превью, конвертация |
|
Ссылки |
нет |
распознавание URL, чистка UTM, группировка по домену |
|
Вставка без форматирования |
нет |
Plain Text по хоткею или по умолчанию |
|
Слоты и быстрая вставка |
нет |
10 слотов + вставка N‑го элемента по хоткею |
|
Безопасность |
локально, пауза записи, игнор приложений |
+ мастер‑пароль с автоблокировкой |
|
Управление данными |
удаление, очистка, экспорт TXT/JSON |
+ правила автоочистки, импорт, слияние дублей |
|
Обновления |
авто‑обновление |
авто‑обновление |
|
Активация |
не требуется |
офлайн‑ключ, без сервера и аккаунта |
И, если честно, Pro это ещё и способ поддержать проект. Я делаю ClipVault сам, и эти 399 ₽ идут не в какую‑то воронку, а на то, чтобы я продолжал его пилить и делать следующие штуки. Так что если вам зашло и хочется, чтобы развивалось дальше, это ровно тот случай. Мне будет и полезно, и, чего скрывать, приятно.
Windows 10/11 x64, установщик подписан, обновления прилетают сами (и отключаются, если вы в режиме паранойи). Скачать код и собранный exe‑файл можно с Гитхаба [1].
Буду рад разносной критике по делу: и по продукту, и по коду, и по архитектурным решениям выше. Особенно интересно услышать, где я, на ваш взгляд, ошибся с границей Free/Pro или с отказом от той или иной фичи. Для того и пишу.
Если проект показался полезным и хочется, чтобы он развивался дальше, поддержать меня можно на Boosty [2]. Спасибо, что дочитали.
Автор: WufCorp
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/windows/458405
Ссылки в тексте:
[1] можно с Гитхаба: https://github.com/WufCorp/ClipVault/releases/tag/2.0.2
[2] на Boosty: https://boosty.to/wufcorp/
[3] Источник: https://habr.com/ru/articles/1084532/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1084532
Нажмите здесь для печати.