Спасибо, чуток поизучал тему глубже, думаю, что вы правы. Ситуация по факту лучше, чем я думал.
Сейчас Beetroot блокирует сетевые диски и UNC-пути при выборе data directory. Решение было defensive, но с учётом вашего разбора про SMBv3/NFS блок избыточен, заменю на предупреждение.
Облачные папки (OneDrive, Dropbox, Google Drive) - это отдельная история: там sync engine копирует файлы между устройствами без координации блокировок. Для них показываю предупреждение, а не блокировку.
По async I/O - всё через Tauri IPC, UI не блокируется при медленном диске. Плюс бэкапы через SQLite Backup API и автовосстановление при повреждении, так что даже в худшем случае данные не теряются.
Да, AI полностью опционален, он не встроен в ядро приложения и не требует никаких ключей для работы. Beetroot из коробки работает как обычный clipboard manager: история, поиск, starred clips, OCR, темы, трансформации текста (upper/lower/trim/title case).
AI-фичи появляются только если вы сами зайдёте в настройки и настроите провайдера. Без этого никаких запросов наружу, никаких зависимостей от облачных сервисов.
Единственное, что ходит в интернет без AI - это проверка обновлений (раз при запуске, GitHub API). Но и это отключается в настройках. После этого приложение живёт полностью оффлайн.
Отдельная опция в инсталляторе не нужна, потому что AI-код - это буквально один fetch к API, который никогда не вызывается без явной настройки. Ни бинарников, ни моделей, ни SDK в поставке нет.
Теоретически да, Tauri v2 поддерживает Linux, и основная логика (React + SQLite) кросс-платформенная. Но Windows-специфичного кода довольно много: clipboard monitoring через Win32 API, OCR через WinRT, определение раскладки клавиатуры, извлечение иконок приложений, window management (always-on-top, follow cursor, multi-monitor DPI). Это всё пришлось бы переписывать на Linux-аналоги (X11/Wayland, Tesseract, и т.д.).
Пока в приоритете Windows. Но Linux-порт вполне реален, архитектура позволяет.
В текущей версии Beetroot умеет трансформировать текст через AI — OpenAI и локальные модели (Ollama, LM Studio). В ближайшем релизе добавится Gemini. Но это только начало — вот что планирую дальше:
Глобальные AI-хоткеи. Выделяешь текст в любом приложении → шоткат → результат обратно на место. Исправление ошибок, перевод, переформатирование — без открытия окна, без потери содержимого буфера.
Webhook-пайплайны. Отправка клипа по хоткею в n8n, Make, Zapier или любой HTTP-эндпоинт. Результат возвращается как новый клип.
Логика такая: ALT+P и ALT+F - это локальные хоткеи, то есть работают когда окно Beetroot уже открыто. Но переключить режим нужно только один раз, настройка сохраняется. После этого каждый раз, когда вызываете Beetroot глобальным хоткеем, окно будет появляться рядом с курсором (режим Follow Cursor) или оставаться поверх всех окон (Pinned).
Переключить можно и мышкой - в футере две иконки рядом с шестерёнкой.
Размер шрифта уже настраивается: Settings → Appearance → Font Size (6 вариантов от 11 до 18px). Там же можно выбрать шрифт.
Первое уже есть. В Beetroot три режима позиционирования окна: по центру экрана (по умолчанию), следование за курсором и закреплённое окно поверх всех. Переключаются хоткеем или кнопкой в футере. В режиме Follow Cursor окно появляется прямо рядом с мышью, можно выбрать нужный клип и вставить, не отводя взгляда.
Портабельная версия: хороший запрос, пока только installer, но технически ничего не мешает сделать portable-сборку.
По паролям: сейчас Beetroot автоматически пропускает записи из парольных менеджеров (детектирует по специфичным форматам буфера обмена). Идея сделать это опциональным логична. Кому-то может быть удобно наоборот сохранять. Учту.
SQLite координирует доступ через файловые блокировки (fcntl на Unix, LockFileEx на Windows). Сетевые файловые системы реализуют эти блокировки ненадёжно. в FAQ SQLite прямо сказано: "fcntl() file locking is broken on many NFS implementations", а про Windows: "file locking of network files is very buggy and is not dependable". В https://www.sqlite.org/howtocorrupt.html описан механизм: если блокировки работают некорректно, два процесса могут одновременно писать в базу, что ведет к corruption.
В Beetroot база всегда локальная, но пользователи иногда выбирают синхронизируемую папку (OneDrive, Dropbox, Google Drive) как data directory, а это даже хуже, чем NFS: облачные сервисы синхронизируют файлы, а не блокировки, и два устройства могут писать в одну базу не подозревая друг о друге. Поэтому добавил детекцию таких папок и предупреждение при выборе пути.
Спасибо! На macOS пользовался Paste, по сути он и стал главным вдохновением для Beetroot. Ещё Alfred с его Clipboard History. Но Paste — это платная подписка, Alfred Powerpack тоже платный, и оба только Mac. Захотелось сделать что-то похожее для Windows, прежде всего для самого себя, чтобы пользоваться каждый день.
Отличная идея, спасибо за ссылку! Это уже в роадмапе — глобальные шоткаты для AI-действий без открытия окна. Сейчас кастомные промпты работают через контекстное меню, но в целом весь этот блок буду переписывать.
Помимо встроенных AI-провайдеров, думаю сделать опцию отправки по шоткату webhook в пайплайн (например n8n) и получение результата обратно в виде нового клипа — чтобы можно было строить любые цепочки обработки снаружи.
Я ничего против Electron не имею — это отличный инструмент, на нём написано огромное количество хорошего софта. Просто для себя сделал такой выбор. Как человеку, который писал код для i286 во дворце пионеров, мне морально тяжело видеть инсталлятор на 130 МБ и 300 МБ в трее. Наверное, профессиональная деформация, гонюсь за оптимизацией там, где можно и не гнаться.
Спасибо! Как раз в свежей версии (v1.4.0) это прикрутил — Ollama, LM Studio и любой кастомный OpenAI-compatible endpoint. Оказалось проще, чем я ожидал, но не без подводных камней: Ollama и LM Studio используют разные эндпоинты для списка моделей (/v1/models vs /api/tags), а reasoning-модели оборачивают ответ в теги, которые нужно вырезать. Плюс пришлось пробрасывать запросы через Rust IPC, потому что Tauri'шный CSP блокирует fetch на localhost из WebView — это было самое неочевидное.
Сейчас добавляю Gemini, дальше другие провайдеры. Технически подключить несложно, основное время уходит на тестирование.
По OCR — нативный Windows API (WinRT OcrEngine) работает мгновенно и без зависимостей, но качество на сложных изображениях ограничено (точно хуже, чем на MacOS). Есть идея сделать автоматическое распознавание текста на всех картинках в фоне — тогда по ним можно будет искать так же, как по обычному тексту.
Кстати, в версии, которая сейчас готовится к релизу, поиск уже работает не только по содержимому, но и по заголовкам окон-источников. Например, можно ввести название Telegram-канала — и найдутся все сообщения, скопированные оттуда, потому что Telegram подставляет название чата в title окна.
Спасибо, чуток поизучал тему глубже, думаю, что вы правы. Ситуация по факту лучше, чем я думал.
Сейчас Beetroot блокирует сетевые диски и UNC-пути при выборе data directory. Решение было defensive, но с учётом вашего разбора про SMBv3/NFS блок избыточен, заменю на предупреждение.
Облачные папки (OneDrive, Dropbox, Google Drive) - это отдельная история: там sync engine копирует файлы между устройствами без координации блокировок. Для них показываю предупреждение, а не блокировку.
По async I/O - всё через Tauri IPC, UI не блокируется при медленном диске. Плюс бэкапы через SQLite Backup API и автовосстановление при повреждении, так что даже в худшем случае данные не теряются.
Да, AI полностью опционален, он не встроен в ядро приложения и не требует никаких ключей для работы. Beetroot из коробки работает как обычный clipboard manager: история, поиск, starred clips, OCR, темы, трансформации текста (upper/lower/trim/title case).
AI-фичи появляются только если вы сами зайдёте в настройки и настроите провайдера. Без этого никаких запросов наружу, никаких зависимостей от облачных сервисов.
Единственное, что ходит в интернет без AI - это проверка обновлений (раз при запуске, GitHub API). Но и это отключается в настройках. После этого приложение живёт полностью оффлайн.
Отдельная опция в инсталляторе не нужна, потому что AI-код - это буквально один fetch к API, который никогда не вызывается без явной настройки. Ни бинарников, ни моделей, ни SDK в поставке нет.
Теоретически да, Tauri v2 поддерживает Linux, и основная логика (React + SQLite) кросс-платформенная. Но Windows-специфичного кода довольно много: clipboard monitoring через Win32 API, OCR через WinRT, определение раскладки клавиатуры, извлечение иконок приложений, window management (always-on-top, follow cursor, multi-monitor DPI). Это всё пришлось бы переписывать на Linux-аналоги (X11/Wayland, Tesseract, и т.д.).
Пока в приоритете Windows. Но Linux-порт вполне реален, архитектура позволяет.
В текущей версии Beetroot умеет трансформировать текст через AI — OpenAI и локальные модели (Ollama, LM Studio). В ближайшем релизе добавится Gemini. Но это только начало — вот что планирую дальше:
Глобальные AI-хоткеи. Выделяешь текст в любом приложении → шоткат → результат обратно на место. Исправление ошибок, перевод, переформатирование — без открытия окна, без потери содержимого буфера.
Webhook-пайплайны. Отправка клипа по хоткею в n8n, Make, Zapier или любой HTTP-эндпоинт. Результат возвращается как новый клип.
Примеры:
Скопировал ссылку → webhook достаёт заголовок, описание, OG-картинку → готовый markdown в буфере
Скопировал текст → webhook прогоняет через DeepL → перевод обратно
Скопировал код → webhook форматирует/линтит → результат в буфере
Скопировал email → webhook парсит контакт → добавляет в CRM
Скопировал данные → webhook пишет в Google Sheets / Notion
По сути — clipboard как универсальный input для любой автоматизации.
Фантазировать можно бесконечно.
Буду рад идеям.
Логика такая: ALT+P и ALT+F - это локальные хоткеи, то есть работают когда окно Beetroot уже открыто. Но переключить режим нужно только один раз, настройка сохраняется. После этого каждый раз, когда вызываете Beetroot глобальным хоткеем, окно будет появляться рядом с курсором (режим Follow Cursor) или оставаться поверх всех окон (Pinned).
Переключить можно и мышкой - в футере две иконки рядом с шестерёнкой.
Размер шрифта уже настраивается: Settings → Appearance → Font Size (6 вариантов от 11 до 18px). Там же можно выбрать шрифт.
Первое уже есть. В Beetroot три режима позиционирования окна: по центру экрана (по умолчанию), следование за курсором и закреплённое окно поверх всех. Переключаются хоткеем или кнопкой в футере. В режиме Follow Cursor окно появляется прямо рядом с мышью, можно выбрать нужный клип и вставить, не отводя взгляда.
Портабельная версия: хороший запрос, пока только installer, но технически ничего не мешает сделать portable-сборку.
По паролям: сейчас Beetroot автоматически пропускает записи из парольных менеджеров (детектирует по специфичным форматам буфера обмена). Идея сделать это опциональным логична. Кому-то может быть удобно наоборот сохранять. Учту.
SQLite координирует доступ через файловые блокировки (fcntl на Unix, LockFileEx на Windows). Сетевые файловые системы реализуют эти блокировки ненадёжно. в FAQ SQLite прямо сказано: "fcntl() file locking is broken on many NFS implementations", а про Windows: "file locking of network files is very buggy and is not dependable". В https://www.sqlite.org/howtocorrupt.html описан механизм: если блокировки работают некорректно, два процесса могут одновременно писать в базу, что ведет к corruption.
В Beetroot база всегда локальная, но пользователи иногда выбирают синхронизируемую папку (OneDrive, Dropbox, Google Drive) как data directory, а это даже хуже, чем NFS: облачные сервисы синхронизируют файлы, а не блокировки, и два устройства могут писать в одну базу не подозревая друг о друге. Поэтому добавил детекцию таких папок и предупреждение при выборе пути.
Спасибо! На macOS пользовался Paste, по сути он и стал главным вдохновением для Beetroot. Ещё Alfred с его Clipboard History. Но Paste — это платная подписка, Alfred Powerpack тоже платный, и оба только Mac. Захотелось сделать что-то похожее для Windows, прежде всего для самого себя, чтобы пользоваться каждый день.
Отличная идея, спасибо за ссылку! Это уже в роадмапе — глобальные шоткаты для AI-действий без открытия окна. Сейчас кастомные промпты работают через контекстное меню, но в целом весь этот блок буду переписывать.
Помимо встроенных AI-провайдеров, думаю сделать опцию отправки по шоткату webhook в пайплайн (например n8n) и получение результата обратно в виде нового клипа — чтобы можно было строить любые цепочки обработки снаружи.
Я ничего против Electron не имею — это отличный инструмент, на нём написано огромное количество хорошего софта. Просто для себя сделал такой выбор. Как человеку, который писал код для i286 во дворце пионеров, мне морально тяжело видеть инсталлятор на 130 МБ и 300 МБ в трее. Наверное, профессиональная деформация, гонюсь за оптимизацией там, где можно и не гнаться.
Спасибо! Как раз в свежей версии (v1.4.0) это прикрутил — Ollama, LM Studio и любой кастомный OpenAI-compatible endpoint. Оказалось проще, чем я ожидал, но не без подводных камней: Ollama и LM Studio используют разные эндпоинты для списка моделей (/v1/models vs /api/tags), а reasoning-модели оборачивают ответ в теги, которые нужно вырезать. Плюс пришлось пробрасывать запросы через Rust IPC, потому что Tauri'шный CSP блокирует fetch на localhost из WebView — это было самое неочевидное.
Сейчас добавляю Gemini, дальше другие провайдеры. Технически подключить несложно, основное время уходит на тестирование.
По OCR — нативный Windows API (WinRT OcrEngine) работает мгновенно и без зависимостей, но качество на сложных изображениях ограничено (точно хуже, чем на MacOS). Есть идея сделать автоматическое распознавание текста на всех картинках в фоне — тогда по ним можно будет искать так же, как по обычному тексту.
Кстати, в версии, которая сейчас готовится к релизу, поиск уже работает не только по содержимому, но и по заголовкам окон-источников. Например, можно ввести название Telegram-канала — и найдутся все сообщения, скопированные оттуда, потому что Telegram подставляет название чата в title окна.