1
4
Fork
You've already forked Phandroid
0
Phandroid — the Phanpy Mastodon web client, wrapped as a native Android app with Capacitor. Install via Obtainium; see the README.
  • JavaScript 80.7%
  • CSS 18.6%
  • Kotlin 0.5%
  • HTML 0.1%
2026年07月12日 20:10:36 +00:00
.github feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
android chore(release): bump to 2.0.2 (auto, upstream merge) 2026年07月12日 19:21:02 +00:00
assets feat(android): branded adaptive launcher icon and splash screens 2026年07月07日 18:42:24 +02:00
compose feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
design feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
public feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
readme-assets feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
scripts feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
src Merge remote-tracking branch 'upstream/main' 2026年07月12日 19:18:36 +00:00
tests feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
.env docs: point public distribution at Codeberg (native Obtainium source) 2026年07月09日 12:31:50 +02:00
.env.production feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
.gitattributes chore(upstream): configure Phanpy upstream sync (merge attrs + docs) 2026年07月08日 07:25:00 +02:00
.gitignore chore: gitignore mail.env (never commit mail config) 2026年07月09日 15:43:27 +02:00
.oxfmtrc.json feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
.release.env.example fix(dist): release-gitea.sh works on bash 3.2 + auto-loads token 2026年07月08日 10:24:40 +02:00
capacitor.config.json release: 2.0.0 — rename applicationId to dev.umrath.android.phanpy; drop self-host refs 2026年07月11日 07:23:33 +00:00
CHANGELOG.md docs(changelog): add 2.0.2 entry (retroactive; auto-build now writes these) 2026年07月12日 20:10:36 +00:00
CHANGELOG.phanpy.md feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
crowdin.yml feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
env.schema.json feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
i18n-volunteers.json feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
index.html feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
LICENSE Initial commit 2026年07月07日 17:48:47 +02:00
lingui.config.js feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
package-lock.json feat(share): register Phandroid as an Android share target ( #378 ) 2026年07月08日 07:50:28 +02:00
package.json feat(share): register Phandroid as an Android share target ( #378 ) 2026年07月08日 07:50:28 +02:00
PHANDROID_CUSTOMIZATIONS.md release: 2.0.0 — rename applicationId to dev.umrath.android.phanpy; drop self-host refs 2026年07月11日 07:23:33 +00:00
playwright.config.js feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
PRIVACY.MD feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
README.md release: 2.0.0 — rename applicationId to dev.umrath.android.phanpy; drop self-host refs 2026年07月11日 07:23:33 +00:00
rollbar.js feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
SECURITY.md feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
vite.config.js feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00
wrangler.jsonc feat: import Phanpy web app as project base 2026年07月07日 18:12:48 +02:00

Phandroid

This is a fork of Phanpy, with the goal of making it installable as an Android app.

It uses Capacitor to wrap the Phanpy web app into a native Android app — the same approach iPhanpy takes for iOS. Rather than reimplementing the UI natively, Phandroid ships the proven Phanpy web client inside an Android WebView shell and adds a thin, well-isolated layer of Android-specific tweaks (deep-link OAuth, native camera, in-app browser, hardware back button, edge-to-edge insets).

Built with LLM: this Android port — the Capacitor integration, the Android-specific override layer and the surrounding tooling — was created with the assistance of a large language model.

Status: released and installable via Obtainium from Codeberg (see Installation). Supports OAuth login, native camera, an in-app browser, an Android share target, edge-to-edge UI and optional FOSS push (UnifiedPush). See CHANGELOG.md and PHANDROID_CUSTOMIZATIONS.md for details.

App identity

  • applicationId: dev.umrath.android.phanpy
  • URL scheme (OAuth deep link): phandroid://
  • Display name: Phandroid

Installation

⚠️ Upgrading from a pre-2.0.0 build? Reinstall required. Version 2.0.0 changes the app package id to dev.umrath.android.phanpy. Android treats the new package as a different app, so it cannot update in place: uninstall the old Phandroid, then install this one from the Codeberg URL below. Logged-in accounts, settings and push registration do not transfer and must be set up again (the signing key and the phandroid:// login are unchanged). If you added the app in Obtainium from the old source, remove it there and re-add the Codeberg URL.

Phandroid is distributed as a signed APK — not on the Play Store.

  1. Install Obtainium (from F-Droid or its GitHub releases).

  2. In Obtainium tap Add App and paste the Codeberg repo URL:

    https://codeberg.org/umrath/Phandroid
    

    Obtainium recognises it as a Forgejo (Codeberg) source and picks up the latest release APK automatically — no special source type and no version regex needed.

  3. Tap Add, then Install. Obtainium offers future updates automatically.

Direct APK (sideload)

Download the latest phandroid-vX.Y.Z.apk from the releases page and open it to install (allow "install unknown apps" for your browser / file manager if prompted).

Push notifications (optional, FOSS — no Google)

Phandroid uses UnifiedPush: encrypted Web Push, decrypted on-device, with no Google/FCM.

  1. Install a UnifiedPush distributor, e.g. Sunup. Open it once and grant its permissions (notifications + battery-optimization exemption — it keeps the push connection alive).
  2. In Phandroid go to Settings → Push Notifications (beta), turn it on and choose which notification types you want.
  3. Allow the two prompts Phandroid then shows: the notification permission and the battery-optimization exemption (so push keeps working reliably).

Building

Phandroid is a Capacitor app: the web client is built with Vite, then wrapped by the native Android project under android/.

Prerequisites

  • Node.js 22+ and npm 10.x
  • Android Studio with an Android SDK (platform android-35 and build-tools 35) — required to compile and run the APK
  • A JDK 17–21 (Android Studio bundles a suitable JDK; JDK 21 is known to work)

1. Install and build the web app

npm install
npm run build # outputs to dist/
npx cap sync android
npx cap open android

Then run the app on an emulator or a connected device from Android Studio.

2b. Or build a debug APK from the command line

Point Gradle at your SDK by creating android/local.properties with sdk.dir=/absolute/path/to/Android/sdk, then:

npx cap sync android
JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" \
 ./android/gradlew -p android :app:assembleDebug

The APK is written to android/app/build/outputs/apk/debug/app-debug.apk.

Live reload during development

npx cap run android --livereload --external

Regenerating the launcher icon / splash

npx capacitor-assets generate --android

(reads assets/logo.png; the adaptive icon background colour is set in android/app/src/main/res/values/ic_launcher_background.xml).

Credits