An independent Android client for Dockhand – built to be fast and simple for daily use, with one focus: keeping your containers updated.
Note: This is a third-party project, not made by Finsys/Dockhand. The app talks to Dockhand's public REST API (documented at dockhand.pro/manual, section API reference) using a personal API token. It only uses the open, documented API – no Dockhand source code is used.
- Environments Dashboard (Home):
- Global metrics summary showing total running containers, stopped containers, and pending updates across all environments.
- Dedicated environment cards displaying health status (online/offline), active environment badge, container counts, stopped count, and pending updates.
- One-tap selection to switch active host and view its containers.
- Container list: Live status (running / stopped / paused), image name, and status text.
- Compose stacks: Browse compose stacks per environment, with container states and pending updates.
- Start / Stop / Restart: Immediate container lifecycle controls with safety confirmation on stop.
- One-tap updates: Tap "Update" on any container to pull the newest image and recreate it.
- "Update all": One-button bulk update for every container with a pending image update.
- Check for updates: Query Dockhand on-demand to check Docker registries for new images.
- Log viewer: Auto-refreshing container logs with pause and reload controls.
- Encrypted credentials: API tokens are securely stored on your device (Android Keystore via
expo-secure-store). - Bilingual: Seamless English and Norwegian (Bokmål) localization with automatic system language detection or manual override in settings.
- Android 7.0+ (API 24) or newer.
- A running Dockhand server reachable from the phone (same LAN or VPN).
- A Dockhand API token (
dh_...).
- Node.js 20+ (CI uses Node 20;
npm ci). - JDK 17 (Gradle toolchain; the project targets Java 17).
- Android SDK with platform tools and build tools 31+ (
ANDROID_HOMEset). - Expo SDK 57 (see
package.json).
- Open Dockhand in your browser → click your avatar (Profile).
- Scroll to API tokens → Generate token.
- Provide a name and optional expiry date → copy the token (starts with
dh_).
- Launch DockMobile.
- Enter your Dockhand server address, e.g.
http://192.168.1.10:3000. - Paste the token (
dh_...). - Tap Connect – the app verifies authentication and fetches all your environments.
| Dashboard | Containers | Stacks |
|---|---|---|
![]() |
![]() |
![]() |
- GitHub Releases: Download prebuilt
.apkfiles directly from the Releases tab. - Obtainium: Install and auto-update via Obtainium – tap
this link
to add DockMobile to Obtainium, or add
https://github.com/flugheim/dockmobilemanually. - Automated CI/CD: Every push to
masterand every version tag runs a full test suite and builds a release APK automatically via GitHub Actions.
Pushing a release tag will automatically build and publish the APK to GitHub Releases:
git tag v1.2.0
git push origin v1.2.0Prerequisites: JDK 17 and Android SDK configured (ANDROID_HOME).
npm ci
cd android
./gradlew assembleReleaseThe output APK is generated at:
android/app/build/outputs/apk/release/app-release.apk
npx eas-cli login
npx eas-cli build --profile preview --platform androidsrc/
app/ # Expo Router screens
_layout.tsx # Root navigation stack and theme provider
index.tsx # Environments Dashboard (home screen)
containers.tsx # Container list for selected environment
stacks.tsx # Compose stacks for selected environment
connect.tsx # Server & token connection screen
container/[id].tsx # Container details and actions
logs/[id].tsx # Container log viewer
settings.tsx # Connection settings and language switcher
api/
client.ts # REST client with resilient API normalization
components/ # UI components (EnvironmentCard, ContainerCard, etc.)
i18n/
translations.ts # Typed English and Norwegian translations
state/
SettingsContext.tsx # SecureStore credentials and environment state
__tests__/ # Unit tests for API client and translation parity
| Action | Endpoint |
|---|---|
| Environments | GET /api/environments |
| Container list | GET /api/containers?env=<id> |
| Pending updates | GET /api/containers/pending-updates?env=<id> |
| Check now | POST /api/containers/check-updates?env=<id> |
| Update containers | POST /api/containers/batch-update?env=<id> ({containerIds: [...]}) |
| Start / stop / restart | POST /api/containers/<id>/{start,stop,restart} |
| Logs | GET /api/containers/<id>/logs?tail=400 |
| Compose stacks | GET /api/stacks?env=<id> |
All requests include Authorization: Bearer dh_....
npx tsc --noEmit # TypeScript typechecking
npx expo lint # ESLint verification
npm test # Client normalization and i18n testsDockMobile is developed with substantial assistance from large language models (LLMs) for code generation, refactoring and debugging. All changes are reviewed, type-checked and tested by the maintainer before release. We believe in transparency: the full source code, commit history and build process are open for inspection, and the project is MIT-licensed. If you spot anything questionable or have concerns about any part of the code, please open an issue.
- All communication is direct between your phone and your Dockhand server – no third parties or telemetry.
- API tokens are stored in the Android Keystore using
expo-secure-store. - Recommendation: Host Dockhand on a private LAN or connect via a VPN (e.g. Tailscale or WireGuard).


