Single sign-in to Solid for Android. One app holds the user's pod accounts; every other app on the device reaches those pods through it, with the user's permission and without ever handling a credential.
📖 Full documentation — guides, API reference and troubleshooting.
Solid gives people their own data, but on Android every app that wants to use a pod has to become an identity client: run the OIDC flow, mint and rotate DPoP tokens, store them safely, and repeat all of it in the next app. The user signs in again in each one, and each app's mistakes are theirs alone to make.
Android Solid Services owns the login. Tokens are DPoP-bound to keys generated in the Android Keystore and never leave the app; other apps talk to it over AIDL and get results, never credentials. The user signs in once, grants each app access explicitly, and can revoke it at any time — and an app integrates with one dependency and no auth code at all.
![]() |
![]() |
![]() |
![]() |
|---|
- One sign-in, many apps — several accounts from different pod providers, active at once.
- Native account picker — sign-in launches from the calling app's own foreground, so no special permissions are involved.
- Solid accounts in Android Settings, alongside every other account on the device.
- Full pod access over IPC — resources (CRUD, containers, patches, streaming), sharing, Linked Data Notifications, and data modules for contacts and tickets.
- Per-app grants the user reviews and revokes.
- Two libraries —
clientfor apps that go through Android Solid Services,apifor apps that prefer to speak to pods directly.
The app is on GitHub Releases; Google Play and F-Droid are in progress.
For your own app, one dependency:
implementation("com.erfangholami.androidsolidservices:client:0.6.1")Then follow Getting Started. There is also a sample app that runs every SDK call against a live pod, shown next to the code that makes it.
Requires JDK 17 (or JetBrains Runtime 17.0.9); set JAVA_HOME if the build complains.
./gradlew assembleFossDebug # the app, without Google services
./gradlew test # unit tests, all modules
./gradlew spotlessApply detekt # format, then static analysisThe APK lands in app/build/outputs/apk/foss/debug. Versions come from the git tag, so a working
copy needs no version edits. The
Architecture page explains how the
modules fit together.
Contributions are welcome — bug reports, fixes, docs and pod-server compatibility reports all help.
- Branch from
devand open your pull request against it; CI runs style, static analysis, unit tests and the instrumented IPC suite. - Run
./gradlew spotlessApply detekt testbefore pushing. - Cover behaviour with a test where you can. The client SDK's tests drive real calls across a process boundary, which is where most defects here have lived.
- Found something odd against a particular pod server? Say which server and how it responded — those reports have led to several fixes.
Please open an issue first for anything large, so the approach can be agreed before you spend time on it.
Thanks to funding
from NLnet
/



