PhilippC/keepass2android
Password manager app for Android
Single-maintainer risk — review before adopting
worst of 4 axescopyleft license (GPL-3.0) — review compatibility; top contributor handles 96% of recent commits…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 4d ago
- ✓4 active contributors
- ✓GPL-3.0 licensed
Show 5 more →Show less
- ✓CI configured
- ⚠Small team — 4 contributors active in recent commits
- ⚠Single-maintainer risk — top contributor 96% of recent commits
- ⚠GPL-3.0 is copyleft — check downstream compatibility
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/philippc/keepass2android)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/philippc/keepass2android on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: PhilippC/keepass2android
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/PhilippC/keepass2android shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Single-maintainer risk — review before adopting
- Last commit 4d ago
- 4 active contributors
- GPL-3.0 licensed
- CI configured
- ⚠ Small team — 4 contributors active in recent commits
- ⚠ Single-maintainer risk — top contributor 96% of recent commits
- ⚠ GPL-3.0 is copyleft — check downstream compatibility
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live PhilippC/keepass2android
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/PhilippC/keepass2android.
What it runs against: a local clone of PhilippC/keepass2android — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in PhilippC/keepass2android | Confirms the artifact applies here, not a fork |
| 2 | License is still GPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | Last commit ≤ 34 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of PhilippC/keepass2android. If you don't
# have one yet, run these first:
#
# git clone https://github.com/PhilippC/keepass2android.git
# cd keepass2android
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of PhilippC/keepass2android and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "PhilippC/keepass2android(\\.git)?\\b" \\
&& ok "origin remote is PhilippC/keepass2android" \\
|| miss "origin remote is not PhilippC/keepass2android (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is GPL-3.0" \\
|| miss "license drift — was GPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 34 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~4d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/PhilippC/keepass2android"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Keepass2Android is an Android password manager that encrypts and syncs password databases compatible with KeePass 2.x and KeePassXC across devices. The app stores sensitive information in encrypted database files (KDBX format) and integrates native cloud storage (Google Drive, Dropbox, pCloud, SFTP) plus third-party sync solutions for cross-device password management. Hybrid architecture: core password logic in C# (KeePass port via Xamarin bindings in src/AdalBindings, src/AndroidFileChooserBinding); native Android UI and file storage abstractions in Java (src/keepass2android-app, src/javafilestorage); cloud provider integrations as modular bindings (src/DropboxBinding, etc.). Plugin system allows third-party extensions; minSdkVersion 21 (Android 5.0) through targetSdkVersion 35.
👥Who it's for
Android users who need a mobile password manager compatible with desktop KeePass ecosystems; developers contributing features, plugins, or translations to an established open-source security application; users of existing KeePass/KeePassXC installations seeking mobile access without vendor lock-in.
🌱Maturity & risk
Production-ready with active maintenance: the project has stable releases on Google Play (standard + offline variants), beta testing channels enabled, CI/CD pipelines configured (.github/workflows/build.yml and release.yml), and a structured plugin system. Commits are recent, documentation exists (docs/ folder), and translations are crowdsourced via Crowdin, indicating ongoing development.
Moderate risk: single maintainer (PhilippC) creates coordination bottleneck; 13 major external dependencies (OkHttp, Google APIs, Dropbox SDK, pCloud SDK, JSch) require ongoing maintenance and security audits; the codebase spans C# (Xamarin bindings), Java, and native code (C/C++/Assembly) increasing complexity. Crypto-critical application demands careful code review—GPLv3 license is permissive but users accept 'as-is' liability disclaimer.
Active areas of work
Active release cycle with GitHub Actions workflows for builds and releases; Crowdin translations being continuously updated; GitHub Sponsors and donation systems active; beta channel opt-in available on Google Play; issues/PRs tracked via standard GitHub templates (bug_report.yaml, feature_request.md, question.md).
🚀Get running
Clone with submodules: git clone --recursive https://github.com/PhilippC/keepass2android.git. Build requires Android SDK 35 (compileSdk), Java 11 (compileOptions), Xamarin/.NET framework for C# bindings. Run ./gradlew build in the javafilestorage or app directories (build.gradle visible in dependencies snippet). IDE setup: Android Studio recommended; C# components require Visual Studio or MonoDevelop.
Daily commands:
Build via Gradle: ./gradlew build (or gradlew.bat build on Windows). Debug build to emulator: ./gradlew installDebug. Build release APK: ./gradlew assembleRelease (requires signing config). CI/CD handled by .github/workflows/build.yml and release.yml. For C# bindings, compile AdalBindings.csproj in Visual Studio or msbuild src/AdalBindings/AdalBindings.csproj.
🗺️Map of the codebase
- src/keepass2android-app: Main Android application module containing Activities, UI layouts, and app-level logic for password database interaction
- src/javafilestorage: Abstraction layer for file storage and cloud provider integrations (Google Drive, Dropbox, pCloud, SFTP) via interface implementations
- src/AdalBindings/AdalBindings.csproj: Xamarin C# bindings that port KeePass 2.x password database logic and Azure authentication to Android
- .github/workflows/build.yml: CI pipeline defining build steps, signing, and artifact generation for stable and beta releases
- docs/Available-Plug-ins.md: Reference for plugin architecture and extension points; critical for contributors adding features outside core app
- src/DropboxBinding/: Example of cloud provider binding structure; pattern repeated for Google Drive, pCloud integrations
- .gitmodules: Declares submodule dependencies (likely KeePass upstream library); required for
git clone --recursive - Makefile: Convenience build targets and development tasks (check contents for common workflows)
🛠️How to make changes
Cloud storage features: Add provider implementations in src/javafilestorage (mimic DropboxFileStorageSetup pattern). UI changes: src/keepass2android-app/Activities and Fragments. Password logic: Upstream from KeePass 2.x C# port (src/AdalBindings wraps ADAL/Azure auth; core crypto in KeePass library). Plugins: Follow docs/How-to-create-a-plug-in_.md; register in plugin registry. Translations: Submit via Crowdin (crowdin.yml configured). Gradle/build tweaks: src/javafilestorage/build.gradle is representative; note ProGuard minification enabled for release builds.
🪤Traps & gotchas
Submodule initialization: Must use git clone --recursive or git submodule update --init --recursive or build will fail; KeePass library is a dependency. C# binding layer: Changes to AdalBindings require rebuild of both .csproj and Java wrapper; mismatch causes runtime crashes. Gradle sync issues: Note 'NOTE: If you change dependencies here, don't forget to update the jar files in JavaFileStorageBindings as well!' in build.gradle—manual JAR syncing required, not automated. Cloud provider tokens: Development requires OAuth credentials for Google Drive, Dropbox, pCloud; set up before testing cloud sync features. Signing config: Release builds in CI/CD likely require KEYSTORE_FILE and KEYSTORE_PASSWORD environment variables (not visible in snippet but standard for Play Store releases). ProGuard obfuscation: Release builds minifyEnabled, which can hide debugging symbols; keep debug builds for troubleshooting.
💡Concepts to learn
- KDBX Format (KeePass Database Format) — Core encrypted database format that Keepass2Android reads/writes; understanding KDBX structure (encryption, compression, entry serialization) is essential for password logic bugs or sync issues
- Xamarin Bindings (C#/.NET to Java/Android Interop) — KeePass logic lives in C# (src/AdalBindings); contributors modifying password decryption, encryption, or key derivation must understand how Xamarin marshals data between C# and Java layers
- OAuth 2.0 Token Refresh Flow — Cloud storage integrations (Google Drive, Dropbox) require OAuth token management; src/javafilestorage uses com.google.api-client and dropbox-core-sdk to handle token lifecycle, refresh, and expiry
- ProGuard Code Obfuscation & Minification — Release builds enable minifyEnabled with ProGuard (build.gradle); obfuscation removes symbols, making debugging production crashes harder; contributors must keep ProGuard rules (proguard-project.txt) in sync with library updates
- File Storage Abstraction Pattern — src/javafilestorage defines provider-agnostic interfaces (FileStorage, FileStorageSetup) implemented by Dropbox, Google Drive, pCloud, SFTP; adding a new cloud provider means implementing this interface and registering in the UI
- Android Gradle Build Variants & Product Flavors — App ships as 'online' and 'offline' variants (referenced in Google Play links); build.gradle productFlavors manages this; contributors need to test both to ensure features work in offline-only mode
- Submodule Dependency Management — KeePass library declared in .gitmodules; .gitignore and Makefile likely manage submodule updates; missing
git clone --recursivecauses build failures—critical for onboarding and CI/CD setup
🔗Related repos
keepassxc/keepassxc— Desktop/cross-platform password manager that Keepass2Android syncs with; defines KDBX format and encryption standardsdlech/KeePass2.x— Upstream KeePass 2.x C# library that Keepass2Android ports via Xamarin bindings in src/AdalBindingskee-org/browser-addon— Browser extension for KeePass ecosystem; users of Keepass2Android often use this for desktop/mobile unified password syncbitwarden/mobile— Alternative Android password manager with similar cloud storage integration patterns; useful reference for architecture decisionsmozilla/android-components— Mozilla's reusable Android components; Keepass2Android could adopt modern patterns (e.g., Architecture Components, LiveData) for maintenance
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add automated dependency vulnerability scanning to build.yml CI workflow
The repo has multiple outdated Google API libraries (google-api-client-android:1.30.5 from 2020, google-api-services-drive with RC version tag) and manual JAR files in JavaFileStorageBindings that are prone to security drift. The build.yml workflow currently only builds but doesn't scan for known CVEs. Adding Dependabot or OWASP Dependency-Check would catch vulnerable transitive dependencies before release, which is critical for a password manager.
- [ ] Add 'dependabot.yml' to .github/dependabot.yml enabling version-updates for gradle dependencies with security-updates pinned to high priority
- [ ] Extend .github/workflows/build.yml with a 'dependency-check' job using owasp/dependency-check-action or gradle-dependency-check plugin
- [ ] Document the dependency update process in docs/ (e.g., docs/Dependency-Management.md) noting the manual JAR sync requirement mentioned in the build.gradle comment
Add integration tests for cloud storage bindings (Dropbox, Google Drive, pCloud)
The repo has three separate binding modules (DropboxBinding, JavaFileStorageBindings with Google Drive/pCloud support) but no visible test coverage for the cloud sync functionality. The .github/workflows/ contains only build.yml and release.yml with no test execution steps. For a password manager handling sensitive file synchronization, this is a critical gap that could prevent regressions in cloud authentication or file transfer logic.
- [ ] Create src/JavaFileStorageBindings/Tests/ with AndroidX test cases for StorageProvider implementations (GoogleDriveStorageProvider, DropboxStorageProvider, PCloudStorageProvider)
- [ ] Add a new workflow .github/workflows/test.yml that runs './gradlew test connectedAndroidTest' on build variants
- [ ] Add test execution step to build.yml or make test.yml run on PRs with junit result publishing
Create plugin development documentation and add plugin API test examples
The repo references docs/Available-Plug-ins.md suggesting a plugin system exists, but there's no docs/Plugin-Development-Guide.md explaining how to build plugins. The AdalBindings, DropboxBinding, and AndroidFileChooserBinding show the pattern but new contributors have no guide. This blocks community plugin contributions and is a missed opportunity for extensibility.
- [ ] Create docs/Plugin-Development-Guide.md covering: binding architecture, where to place plugin JARs, required metadata transforms, minimal example plugin structure
- [ ] Add a new src/ExamplePlugin/ reference implementation showing a minimal file storage provider plugin with Metadata.xml and Additions
- [ ] Update docs/Available-Plug-ins.md with contribution instructions and link to the development guide
🌿Good first issues
- Add missing unit tests for javafilestorage cloud provider error handling: No test files visible in src/javafilestorage/ dependencies; network failures (Dropbox quota, OAuth refresh) lack coverage. Start by writing tests for DropboxFileStorage exception paths.
- Document plugin development workflow with a complete working example: docs/How-to-create-a-plug-in_.md exists but is referenced only via hyperlink (not in file list); create a minimal example plugin repo and link from docs/README.md with step-by-step Gradle setup.
- Update or create migration guide for upgrading OkHttp 4.12.0 digest auth to okhttp-digest 3.1.0 alternative: build.gradle shows both
okhttp3:okhttp:4.12.0andrburgst:okhttp-digest:3.1.0; dependencies may have incompatibilities or deprecations—audit and document upgrade path for contributors.
⭐Top contributors
Click to expand
Top contributors
- @PhilippC — 96 commits
- @MartinRenze — 2 commits
- @mrsruj — 1 commits
- @asmgf — 1 commits
📝Recent commits
Click to expand
Recent commits
1db0e0a— Merge pull request #3227 from PhilippC/bugfix/3049_fix-keyboard-inset (PhilippC)4279d37— fix inset calculation for built-in keyboard, closes #3049 (PhilippC)3610098— Merge pull request #3179 from mrsruj/patch-1 (PhilippC)24adf4c— add keepass2android offline google play link in readme (mrsruj)c1513bf— add a pull request template (PhilippC)b6e37c9— Merge changes for v1.14-r4, updating manifest for 1.15-r1 release (PhilippC)0fca416— changelog and manifest for 1.15-r0 (PhilippC)b959b44— adjust build.yml to change of default branch (PhilippC)b967fd1— enable broker based authentication for OneDrive for Intune/Entra-managed devices (PhilippC)39ab696— Merge branches 'master' and 'master' of https://github.com/PhilippC/keepass2android (PhilippC)
🔒Security observations
- High · Outdated Google API Client Dependencies —
build.gradle (JavaFileStorage module). The codebase uses google-api-client:1.30.5 and google-api-services-drive:v2-rev102-1.16.0-rc which are significantly outdated. These versions contain known security vulnerabilities and lack security patches. The 'rc' (release candidate) designation for the drive API is also concerning for production use. Fix: Update to the latest stable versions of Google API Client libraries (currently 1.35.2+). Replace the RC version of google-api-services-drive with a stable release. Review and test compatibility before updating. - High · Outdated Dropbox SDK —
build.gradle (JavaFileStorage module), src/DropboxBinding/dropbox-core-sdk-7.0.0.jar. The codebase uses dropbox-core-sdk:7.0.0 which is outdated. Dropbox has released newer versions (currently 10.x+) with security improvements and bug fixes. This version may contain unpatched vulnerabilities. Fix: Update to the latest stable Dropbox SDK version. Review Dropbox release notes for breaking changes and test thoroughly before deployment. - High · Outdated HttpClient Libraries —
src/JavaFileStorageBindings/gdrive/. The codebase includes httpclient-4.0.3, httpcore-4.0.1, and httpmime-4.0.3 which are extremely outdated (released 2010-2011). These versions have multiple known CVEs including SSL/TLS vulnerabilities and potential code injection issues. Fix: Update to httpcomponents-client 4.5.13+ and httpcomponents-core 4.4.13+. These are the current maintenance branches with security patches. - Medium · Outdated Google HTTP Client —
build.gradle and src/JavaFileStorageBindings/gdrive/. google-http-client:1.32.1 is outdated. While not critical, newer versions provide security enhancements and bug fixes. The presence of older versions (1.16.0-rc) in the gdrive folder indicates inconsistent dependency management. Fix: Update to google-http-client:1.42.3 or later. Ensure consistent versioning across all Google libraries. - Medium · Use of Release Candidate Dependencies —
build.gradle (JavaFileStorage module). The project uses google-api-services-drive:v2-rev102-1.16.0-rc in production. RC (Release Candidate) versions are not stable and may contain bugs or security issues not present in final releases. Fix: Replace RC versions with stable releases. Implement a policy requiring stable versions for production builds. - Medium · ProGuard Configuration Exclusion —
build.gradle. The build configuration excludes 'META-INF/DEPENDENCIES' in packagingOptions. While this prevents build conflicts, it may hide dependency issues and should be done intentionally with understanding of implications. Fix: Document why this exclusion is necessary. Consider if shade plugin or proper dependency management could resolve conflicts instead. - Medium · Outdated GSON Library —
build.gradle and src/JavaFileStorageBindings/gson-2.8.6.jar. gson-2.8.6 is used, but newer versions (2.10.1+) are available with security improvements and performance enhancements. This library handles JSON deserialization which could be exploited if vulnerable. Fix: Update to gson:2.10.1 or later. This is a straightforward update with good backward compatibility. - Low · JSch Library Version —
build.gradle and src/JavaFileStorageBindings/jsch-2.27.2.jar. jsch:2.27.2 is used for SSH functionality. While this is a relatively recent version, verify it's the latest available to ensure all SSH/SFTP security patches are included. Fix: Check for newer JSch versions and update if available. Monitor security advisories for SSH library vulnerabilities. - Low · Inconsistent Dependency Versions —
undefined. Multiple JAR files are stored Fix: undefined
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.