PlainApp is a free, open-source Android app that turns your phone into a self-hosted management hub you can access from any web browser on the same network β no accounts, no cloud, no subscriptions. Whether you need to transfer files, read SMS, browse photos, or mirror your screen, PlainApp puts full control back in your hands.
Most phone-management tools either route your data through their own servers, lock features behind subscriptions, or plague you with ads. PlainApp is different:
- 100% local β your data never leaves your network
- End-to-end encrypted β every connection is secured with TLS + XChaCha20-Poly1305
- Completely free and ad-free β no purchases, no upsells, ever
- Fully open-source β audit the code, build your own binary, or contribute
Open a browser on any desktop or laptop connected to the same Wi-Fi network and get a full dashboard to manage your Android device β no app installation required on the computer side. Supports PWA so you can pin it to your desktop like a native app.
| Category | What you can do |
|---|---|
| Files | Browse internal storage, SD card, and USB drives; upload, download, rename, delete |
| Media | View and manage photos, videos, and audio; stream them directly in the browser |
| Contacts | View, search, and manage your contacts |
| SMS & Calls | Read messages and call logs; send SMS from your desktop |
| Apps | List installed apps and export APKs |
| Notifications | Mirror phone notifications to the browser in real time |
| Screen Mirror | Live-stream the phone screen to the browser with audio and remote control support |
| Device Info | Check battery, storage, network, and system details |
PlainApp is also a capable standalone app β not just a server:
- Markdown Notes β write and organize notes with a clean editor
- RSS Reader β follow your favorite websites with a distraction-free reader
- Video & Audio Player β full-featured media player with playlist support
- TV Cast β cast media to any DLNA/Chromecast-compatible TV
- Peer-to-Peer Chat & File Sharing β share files and messages directly between devices without a server
- Pomodoro Timer β stay focused with a built-in work timer
- Sound Meter β measure ambient noise levels in real time
- Zero data sent to any third-party server
- All traffic between phone and browser is encrypted (TLS + XChaCha20-Poly1305)
- No account registration required
Video: https://www.youtube.com/watch?v=TjRhC8pSQ6Q
Reddit: https://www.reddit.com/r/plainapp
Discord: https://discord.gg/RQWcS6DEEe
QQ Group: 812409393
| Feature | PlainApp | AirDroid | KDE Connect | AnExplorer | Pushbullet |
|---|---|---|---|---|---|
| Open source | β | β | β | β | β |
| 100% local / no cloud required | β | β | β | β | |
| End-to-end encrypted (local) | β | β | β | β | |
| Ad-free | β | β | |||
| Free all features | β | β | |||
| Web browser access (no desktop app needed) | β | β | β | β | β |
| File manager (browser UI) | β | β | β | β | |
| SMS from desktop | β | β | β | β | β |
| Screen mirroring | β | β | β | β | β |
| Media streaming in browser | β | β | β | β | |
| Notification mirroring | β | β | β | β | β |
| Built-in RSS reader | β | β | β | β | β |
| Markdown notes | β | β | β | β | β |
| P2P chat & file sharing | β | β | β | ||
| TV casting (DLNA/Chromecast) | β | β | β | β | β |
| PWA support | β | β | β | β | β |
| No account required | β | β | β | β | β |
PlainApp requires Android 9.0 or higher.
PlainApp is fully open-source.
If you have any doubts, you're free to review the code, build your own version, or simply choose not to use it.
If you run into issues, feel free to open a GitHub issue β I'm always happy to help.
Please donβt leave a one-star review without giving it a fair try.
Keep plain-core next to this repository. Run from this repository root.
./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 commitBefore publishing Rust consumer changes, publish Core first, run ./scripts/core update, and commit the resulting plain-rs/Cargo.lock with the consumer source. Verify with local overrides disabled:
bash scripts/check-ui.sh
./gradlew :plain-common:testAndroidHostTest :shared:testAndroidHostTest
./gradlew :app:assembleDebug- Generate
release.jksfile under$rootProject/appfolder.
keytool -genkeypair -v -keystore ./app/release.jks -alias release -keyalg RSA -keysize 4096 -validity 36500- Create
keystore.propertiesfile with following content under$rootProjectfolder.
storePassword=
keyPassword=
keyAlias=release
storeFile=release.jks

