PlainApp: An Android Phone That Serves Its Own Web Dashboard, Plus a Rust Core and a Self-Signed Build Process
🔥 PlainApp is an open-source app that lets you securely manage your phone from a web browser. Access files, media, contacts, SMS, calls, and more through a simple, easy-to-use interface on your desktop.
At a glance
- What is it?
- PlainApp turns an Android phone into a local web server so a browser on the same network can manage its files, messages and screen. The privacy claims are strong and specific, and so are the boundaries: same network, Android 9 or newer, and a build that needs your own keystore.
- Who is it for?
- PlainApp suits people who want to manage an Android phone from a desktop browser without an account or cloud service, and who can audit or build the code. It does not suit remote access from outside your network, or anyone who needs an independent security review, since the encryption and privacy statements are the project's own.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Kotlin, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- plainhub/plain-app7,198 ★ · +439
| Repository | 2026-09-23 | 2026-11-14 |
|---|---|---|
| plainhub/plain-app | 6.8k | 7.2k |
439 Stars in the last 52 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The phone is the server, and the browser must be on the same network
PlainApp is a free, open-source Android app that turns your phone into a self-hosted management hub. You open a browser on any desktop or laptop connected to the same Wi-Fi network and get a dashboard for the device, with no app installation needed on the computer side. It also supports PWA, so the dashboard can be pinned to your desktop like a native app.
The network restriction is part of the design. The README describes access from any web browser on the same network, and its privacy pitch is that your data never leaves it. The consequence is that this is not a remote-access tool: if your phone is on mobile data and your laptop is at the office, there is nothing to connect to. In return you get no account, no cloud relay and no subscription. The app is available from Google Play, F-Droid and the GitHub releases page.
TLS plus XChaCha20-Poly1305 protects the link, but the phone still exposes a lot to that browser
The README says every connection is secured with TLS and XChaCha20-Poly1305, that no data goes to any third-party server, and that no account registration is required. It labels the feature end-to-end encrypted in its comparison table, with the qualifier local.
Read that qualifier carefully. The encryption is between your phone and your browser on the same network, which stops casual snooping on the Wi-Fi. It does not reduce what the dashboard can do once you are in. The feature table lists reading SMS and call logs, sending SMS, viewing contacts, browsing internal storage and SD cards, exporting APKs, mirroring notifications and live-streaming the screen with remote control. Anyone who gets access to that dashboard gets that reach, so treat the access path as the sensitive part. The README gives no independent audit of the encryption or the app, so these are statements by the project itself.
The feature table spans eight areas, from files to remote screen control
The browser dashboard covers eight categories. Files: browse internal storage, SD card and USB drives, with upload, download, rename and delete. Media: view and manage photos, videos and audio, and stream them in the browser. Contacts: view, search and manage. SMS and calls: read messages and call logs, and send SMS from the desktop. Apps: list installed apps and export APKs. Notifications: mirror phone notifications to the browser in real time. Screen mirror: live-stream the screen with audio and remote control support. Device info: battery, storage, network and system details.
The breadth is the draw and the risk. Several of these categories need Android permissions that most apps never ask for, so installing PlainApp means granting a lot to get a file manager. The compatibility line is short: Android 9.0 or higher. The repository also contains an iosApp directory, but the README describes an Android app and states no iOS support, so do not plan around an iPhone.
It also ships as a standalone toolbox, which widens what you are installing
The README presents PlainApp as more than a server. Built-in Android tools include Markdown notes, an RSS reader, a video and audio player with playlist support, TV casting to DLNA or Chromecast compatible TVs, peer-to-peer chat and file sharing without a server, a Pomodoro timer and a sound meter.
If all you want is a file manager in a browser, you receive these as well. That matters for two reasons. The app's surface area, and so the code to trust, is larger than a single-purpose tool. And you may find that some features, such as the RSS reader or the notes editor, overlap with apps you already use. On the other hand, the peer-to-peer sharing and TV cast features mean that a person who does want them gets everything from one open-source source tree with no ads. The project says it is completely free and ad-free, with no purchases.
The comparison table is the author's own grid, not a measured benchmark
The README compares PlainApp with AirDroid, KDE Connect, AnExplorer and Pushbullet across seventeen rows, with a legend for fully supported, partially supported or requiring a paid plan, and not supported. PlainApp gets a full mark in every row. KDE Connect is shown without browser access or media streaming, AirDroid without an open source license, and Pushbullet without local-only operation.
Because the author wrote the grid, treat it as a statement of what the project considers important, not a test result. Rows such as PWA support and a built-in RSS reader are features only PlainApp has by this table, which tells you what the project chose to emphasize. If you rely on another tool's capabilities, check that tool's current state yourself. The table is also a snapshot: marks such as partial or paid depend on plans that change. Still, it is useful for one thing, which is seeing how the author defines the goal: browser-only, local-only, no account.
Building your own copy needs a keystore, a sibling plain-core checkout and a Rust workspace
The README says the code is open so you can review it, build your own version, or choose not to use it. The build starts with a signing key. Generate a release keystore under the app folder:
keytool -genkeypair -v -keystore ./app/release.jks -alias release -keyalg RSA -keysize 4096 -validity 36500Then create keystore.properties in the project root with storePassword, keyPassword, keyAlias set to release, and storeFile set to release.jks. The repository root includes build-apk.sh, build-aab.sh, Gradle files, a plain-rs Rust workspace with a rust-toolchain.toml, a plain-common module and a shared module. Debug builds use:
./gradlew :app:assembleDebugSigning with your own key means your build is a different app identity from the store release, so it will not update the Google Play or F-Droid install. Keep plain-core cloned next to the repository if you work on the Rust side.
Core development uses a script that switches between local and locked plain-core
For contributors, plain-core is a separate repository that you keep next to this one. From this repository's root, three commands control which core the build uses:
./scripts/core local # Use local plain-core
./scripts/core local --off # Stop using local paths
./scripts/core update # Lock this project to the latest remote commitThe rule before publishing Rust consumer changes is to publish Core first, run the update command, and commit the resulting plain-rs/Cargo.lock together with the consumer source. Then verify with local overrides disabled. The verification commands run bash scripts/check-ui.sh and the Gradle host tests for plain-common and shared.
The release history shows how fast this moves: v3.3.22 on 2026-09-09, v3.3.24 on 2026-09-10 and v3.3.25 on 2026-09-11, with a last push on 2026-11-01. The license is AGPL-3.0, so read it before redistributing a modified build.
Editorial conclusion
PlainApp suits people who want to manage an Android phone from a desktop browser without an account or cloud service, and who can audit or build the code. It does not suit remote access from outside your network, or anyone who needs an independent security review, since the encryption and privacy statements are the project's own. Check the AGPL-3.0 terms before redistributing a build.
Frequently asked questions
What does PlainApp do?
PlainApp is an open-source Android app that lets you manage your phone from a web browser on the same network. It covers files, media, contacts, SMS, calls, notifications, installed apps, device info and screen mirroring.
Is PlainApp safe to use?
The project says it sends no data to third-party servers, needs no account and encrypts connections with TLS and XChaCha20-Poly1305. These are its own claims, and the source is open under AGPL-3.0 for you to review.
How do I use PlainApp?
Install the Android app from Google Play, F-Droid or the GitHub releases, then open a browser on a desktop connected to the same Wi-Fi network to reach the phone's dashboard. Android 9.0 or higher is required.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/plainhub-plain-app)Star history chart for your README
[](https://hysenlabs.com/projects/plainhub-plain-app)Was this useful?