Набрал ghbdtn, а хотел привет? Нажми хоткей — и текст исправится на месте.
Без переключения раскладки, без порчи чужих полей, без интернета и телеметрии.
LayoutFix живёт в менюбаре и по горячей клавише исправляет текст, набранный не в той раскладке. Знакомая боль: печатаешь на автомате, поднимаешь глаза — а там ghbdtn nfr вместо привет как. На Windows это десятилетиями решал Punto Switcher. На macOS достойного бесплатного и открытого аналога не было — LayoutFix закрывает эту дыру.
- 🔤 Сам понимает направление (RU↔EN) — не нужно вручную выбирать, куда конвертировать. Решает частотный детектор на словарях и биграммах.
- ⌨️ Глобальный хоткей — по умолчанию
⌘⌥⇧Space(плюс опционально двойной⇧ Shift). - 🎯 Работает почти везде — Notes, Mail, Safari, Chrome, поля ввода, веб-формы. Несколько стратегий захвата текста с приоритетом.
- ↩️ Undo — повторное нажатие хоткея в течение ~3 секунд откатывает замену.
- 🛡️ Не ломает то, что не надо — email, ссылки, пути, команды терминала и приложения-исключения не трогаются.
- 🔒 Приватность по умолчанию — ноль сети, ноль телеметрии, логирование выключено. Всё локально.
⚠️ Пока приложение не подписано Apple Developer ID, поэтому при первом запуске macOS покажет предупреждение Gatekeeper. Это нормально для раннего опенсорса — код открыт, проверить можно. Нотаризованная сборка «скачал и запустил» появится, как только соберём 99ドル на Apple Developer ID (см. Поддержать проект).
- Скачай
LayoutFix.dmgиз раздела Releases. - Перетащи
LayoutFix.appвApplications. - Обойди предупреждение Gatekeeper (приложение пока не нотаризовано):
- macOS 13–14: правый клик по приложению → «Открыть» → в диалоге ещё раз «Открыть».
- macOS 15 (Sequoia) и новее: обычный запуск покажет блокировку без кнопки «Открыть всё равно» — зайди в Системные настройки → Конфиденциальность и безопасность, промотай вниз, там появится сообщение про LayoutFix и кнопка «Открыть всё равно».
- Выдай доступ в Системные настройки → Приватность и безопасность → Универсальный доступ — без него приложение не сможет читать и заменять текст.
Проект открыт целиком — можно собрать самому (см. раздел для разработчиков).
LayoutFix — бесплатный и открытый, я развиваю его в свободное время. Поддержка идёт напрямую в развитие: Apple Developer ID (99ドル/год) для нотаризованных сборок в один клик, новые языки раскладок, улучшение детектора.
Реквизиты (крипта USDT/BTC/TON и карты РФ) — в SUPPORT.md .
💡 Отдельная цель: 99ドル на Developer ID → нотаризованный
.dmg, который открывается двойным кликом без предупреждений.
Ядро (LayoutFixCore) — чистая логика без AppKit, полностью покрытая тестами:
- Whitelist отсекает то, что трогать нельзя (email, URL, пути, команды).
- Детектор пробует сконвертировать текст во всех активных парах раскладок и оценивает результат по частотным словарям — конвертирует, только если уверен.
- Системный слой захватывает текст (Accessibility API → буфер обмена → последнее набранное слово) и аккуратно заменяет его на месте.
Подробнее — docs/architecture.md.
- Нотаризованный
.dmg(после сбора на Developer ID) - Новые пары раскладок: украинский, французский, немецкий
- Popup с вариантами конвертации вместо «угадал / бипнул»
- Генерация таблиц раскладок из системы (
UCKeyTranslate) вместо ручных - Отдельные репозитории под Windows и Linux
Идеи и баги — в Issues. Как добавить язык — docs/adding-a-language.md, общий гайд — CONTRIBUTING.md.
Сборка, тесты и стабильный dev-сертификат
Sources/
LayoutFixCore/ чистая логика (без AppKit): раскладки, детекция, конвертация
LayoutFix/ приложение: менюбар, хоткеи, Accessibility, буфер обмена, настройки
Tests/
LayoutFixCoreTests/ юнит-тесты + Fixtures/real_world_examples.json
Scripts/ build-release.sh, notarize.sh
docs/ architecture.md, adding-a-language.md
swift test --filter LayoutFixCoreTestsТребует полноценный Xcode (не только Command Line Tools) — SwiftPM использует ресурсные бандлы, которым нужен macOS Platform path.
./rebuild.sh
Скрипт делает swift build, копирует бинарник и ресурсы в build/LayoutFix.app, подписывает и запускает приложение.
Совет по разработке. Разрешение Accessibility привязано к подписи. При обычной ad-hoc-подписи отпечаток меняется на каждой сборке и галочка «Универсального доступа» слетает. Чтобы этого не было, создайте одноразовый стабильный сертификат разработчика:
# Сгенерировать самоподписанный codesigning-сертификат "LayoutFix Dev" openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \ -keyout /tmp/lf_key.pem -out /tmp/lf_cert.pem \ -subj "/CN=LayoutFix Dev" \ -addext "keyUsage=critical,digitalSignature" \ -addext "extendedKeyUsage=critical,codeSigning" \ -addext "basicConstraints=critical,CA:false" openssl pkcs12 -export -legacy -inkey /tmp/lf_key.pem -in /tmp/lf_cert.pem \ -out /tmp/lf.p12 -name "LayoutFix Dev" -passout pass:layoutfix security import /tmp/lf.p12 -k ~/Library/Keychains/login.keychain-db \ -P layoutfix -T /usr/bin/codesign security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "" \ ~/Library/Keychains/login.keychain-dbПосле этого
rebuild.shподпишет им автоматически, отпечаток перестанет меняться и разрешение выдаётся один раз. Если сертификата нет — скрипт откатится на ad-hoc.
Для работы в Xcode можно открыть Package.swift напрямую, либо сгенерировать проект из project.yml через XcodeGen.
export DEVELOPER_ID_APP="Developer ID Application: Your Name (TEAMID)" ./Scripts/build-release.sh ./Scripts/notarize.sh build/LayoutFix.dmg
CI собирает и нотаризует .dmg на пуш тега v* — см. .github/workflows/release.yml.
App Sandbox выключен намеренно (в песочнице не работают глобальные хоткеи), поэтому дистрибуция — прямой подписанный .dmg, а не Mac App Store.
MIT. Делай что хочешь — только сохрани копирайт.
Понравился проект? Поставь ⭐ и поддержи — это помогает развитию.