PinMe — Android-приложение для локального хранения контактов, дат, напоминаний и истории разговоров. Основная реализация находится в каталоге android/ и написана на Kotlin с Jetpack Compose.
Web-приложение в
src/— исходный прототип. Оно собирается и проверяется в CI, но пока хранит поля контактов вlocalStorageи не предназначено для реальных конфиденциальных данных.
- SQLCipher-шифрование базы данных с отдельным случайным ключом для каждой установки
- хранение ключа базы под защитой Android Keystore
- пароль и биометрия для доступа к приложению и защищённым контактам
- теги, категории, даты, напоминания и записи разговоров
- активные и неактивные контакты
- русский и английский интерфейс с английским языком по умолчанию
- адаптивная навигация для телефонов, планшетов и развёрнутых экранов
- зашифрованный экспорт и импорт резервной копии
- открытый JSON-экспорт и импорт только после проверки резервного пароля
- запрет системных скриншотов и содержимого в превью недавних приложений
- автоматическая блокировка после ухода приложения в фон
Пароль отдельного контакта является уровнем авторизации интерфейса. Данные на диске защищает общий ключ SQLCipher; отдельного криптографического ключа для каждого контакта пока нет.
- Android 8.0 или новее, API 26+
- Java 17
- Android SDK 34
- Node.js 22.12–25 для проверки web-прототипа
cd android
export JAVA_HOME=/path/to/jdk-17
export ANDROID_HOME=/path/to/android-sdk
./gradlew compileDebugKotlin
./gradlew lintDebug testDebugUnitTest assembleDebugDebug APK создаётся в android/app/build/outputs/apk/debug/app-debug.apk.
Проверка web-прототипа:
npm ci
npm run lint
npm run build
npm audit --audit-level=highВ репозитории настроены:
CI: lint, typecheck, production build и dependency audit web-прототипа; Android lint и unit-тестыAndroid Alpha Release: подписанный release APK, проверка подписи, SHA-256 checksum и публикация GitHub Release- Dependabot: еженедельные обновления npm, Gradle и GitHub Actions
Android-приложение поддерживает English и русский язык. По умолчанию включён English; язык можно изменить внутри приложения в разделе «Настройки», выбор сохраняется между запусками.
CI сохраняет debug APK как временный artifact на 14 дней. Этот artifact не является каналом обновлений.
Релизный workflow собирает оптимизированный release APK с постоянным ключом подписи. Keystore не хранится в репозитории: он передаётся GitHub Actions через secrets ANDROID_KEYSTORE_BASE64, ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS и ANDROID_KEY_PASSWORD. Один и тот же ключ позволяет устанавливать новые alpha/stable APK поверх предыдущих.
Старые debug APK из прежнего workflow были подписаны временными ключами. При переходе на первую alpha-версию такую установку нужно удалить один раз; все последующие alpha/stable версии будут обновляться обычной установкой нового APK.
Открытый экспорт сохраняется как JSON без шифрования. Перед каждым открытым экспортом и импортом приложение проверяет текущий резервный пароль, но сам файл после сохранения доступен другим приложениям и содержит персональные данные, хэши паролей контактов и значения дополнительных полей.
Зашифрованный backup использует версионированный AES-GCM envelope с PBKDF2-HMAC-SHA256 и сохраняет decoder для старого формата. JSON backup поддерживает форматы v1 и v2; обновление приложения не должно менять обязательные поля без мигратора.
Резервные копии Android и web-прототипа не являются взаимозаменяемыми форматами; для реальных данных используйте Android-приложение.
- изменение Android-кода в ветке
mainсоздаёт alpha prereleasealpha-… - тег вида
v1.0.0-alpha.1создаёт alpha prerelease - тег вида
v1.0.0создаёт стабильный GitHub Release - workflow можно запустить вручную через Actions
git tag v1.0.0
git push origin v1.0.0Версию приложения задаёт тег vMAJOR.MINOR.PATCH[-сценарий]. Не коммитьте keystore и не удаляйте его из GitHub Secrets: потеря ключа блокирует обновление уже установленных APK.
android/ нативное Android-приложение
src/ legacy web-прототип
.github/ CI, автоматические alpha-релизы и Dependabot
Открытая лицензия пока не назначена. Все права сохраняются за владельцем проекта.