English version | Подробно в видео
Flutter / Android-компаньон к Notes Desktop — приложению заметок в стиле Telegram, где папки это чаты, а заметки — сообщения.
Приложение полностью офлайн (без серверов и телеметрии) и использует ровно тот же протокол peer-to-peer синхронизации и формат шифрования на диске, что и десктоп — поэтому телефон и компьютер сходятся к одним и тем же заметкам по локальной сети.
Десктоп-приложение (PySide6 / Qt 6): notes-desktop.
- Папки как чаты, заметки как сообщения — та же ментальная модель, что на десктопе.
- Текстовые и форматированные заметки, вложения-картинки и файлы, подписи.
- Peer-to-peer синхронизация с десктопом и другими телефонами:
- mutual-TLS с пиннингом сертификата, обнаружение по mDNS, сопряжение по QR;
- append-only журнал операций с version vectors и last-writer-wins;
- удаления фиксируются tombstone'ами; кросс-языковой conformance-набор держит семантику телефона и десктопа байт-совместимой.
- Локальное шифрование за ПИНом:
- всё хранилище AES-256-GCM (субключи на файл через HKDF);
- аппаратный гейт через Android Keystore (на поддерживаемых устройствах — через StrongBox), с integrity-MAC поверх keyring;
- опциональная привязка к биометрии — ключ-гейт требует аутентификации пользователя и разблокированного устройства, поэтому украденный заблокированный телефон нельзя перебрать офлайн;
- режим duress (обратный ПИН): крипто-стирает keyring, удаляет владеемые пути и показывает подложные заметки.
- Блокировка при уходе в фон: мастер-ключ забывается, а кэш расшифрованного медиа стирается всякий раз, когда приложение покидает передний план.
FLAG_SECURE(нет скриншотов, пустая миниатюра в списке недавних) и буфер обмена, помеченный как чувствительный на Android 13+.
- Flutter SDK (stable) с входящим в него Dart SDK.
- Android SDK / устройство или эмулятор (разрабатывалось на физическом Android-устройстве).
flutter pub get
# запуск на подключённом устройстве / эмуляторе
flutter run
# release-APK (обфускация + раздельные debug-символы)
flutter build apk --release --obfuscate --split-debug-info=build/symbols
# -> build/app/outputs/flutter-apk/app-release.apkПо умолчанию release подписывается debug-ключом Flutter. Для настоящего релиза настройте собственный ключ подписи в
android/(и не коммитьте keystore илиkey.properties).
Чистая Dart-логика (синхронизация, oplog, крипто, хранилище, поиск) гоняется headless обычным Dart-тест-раннером — без устройства и эмулятора:
dart test # весь набор
dart test test/sync_tombstones_test.dart # один файлКросс-языковые conformance-тесты (golden_conformance_test.dart,
convergence_conformance_test.dart) запускаются Python-обвязкой десктопа, когда оба
проекта присутствуют; сами по себе они пропускаются.
lib/
main.dart
app/ app_service (жизненный цикл, lock/unlock, движок), repository
storage/ модели, vault, search_index, кэш заметок
sync/ engine, oplog, apply, wire, transport, discovery, pairing, identity
crypto/ unlock, keyvault, keystore, crypto_fs, blob_crypto, duress, primitives
ui/ экраны и виджеты (чат, папки, календарь, поиск, синк, пин)
android/ Kotlin-хост (Keystore HMAC-гейт, FLAG_SECURE, чувствительный буфер)
test/ headless Dart-логика + conformance-тесты
Это личный проект, а не профессионально проаудированный security-продукт. Шифрование и duress — это защита в глубину, рассчитанная прежде всего на кражу устройства и принуждение, пока устройство заблокировано. Как только у атакующего есть root на устройстве, где приложение сейчас разблокировано, ключ находится в памяти, и никакая программная схема его не защитит. Аппаратные гарантии (StrongBox, анти-откатные счётчики) различаются между устройствами. Не полагайтесь на это приложение как на единственную защиту критически важных секретов без собственной проверки.
Нашли проблему безопасности — заведите issue (или сообщите приватно, если предпочитаете).
GNU GPL v3.0 — можно использовать, изучать, изменять и распространять, но производные работы тоже должны выходить под GPL.
