Material Syncthing: A modern, beautiful Android client for Syncthing
Thanks for the great work regarding the UI @lostf1sh. The main goal of this fork is to provide a more stable and reliable experience for users, while also adding new features and enhancements.
Syncthing is a free, open-source, peer-to-peer file synchronization tool that allows you to sync files between all your devices without relying on cloud services. This works especially well for Obsidian Notes, Photos and Videos, Emulator Game Saves etc. It is cross-platform and works on Windows, macOS, Linux, Android, and more.
Material Syncthing is a ground-up rebuild of the Syncthing Android client, written in Kotlin with Jetpack Compose and Material 3 Expressive. It replaces the legacy View/XML UI with a modern, fluid interface built for Android 9+.
Originally ported from Catfriend1/syncthing-android, this project strips away the Java/XML legacy in favor of coroutines, Flow, and Compose — end to end.
The Obtainium button imports the app and its release settings for automatic updates. If you want to build from source, see the Build section below.
| 🎨Material 3 Expressive | Wavy progress indicators, expressive motion, flexible top app bars, spring animations |
| 📁Folder Management | Create, edit, browse, pause/resume, repair index, ignore patterns |
| 📱Device Management | Add via ID or QR scan, share existing folders, connection status |
| 🔄Real-time Sync | ForegrounddataSync service with persistent notification, boot-on-start |
| 📊Insights Dashboard | Bandwidth history, sync health, recent changes, conflict resolution |
| 🔔Smart Notifications | Error center, device connection alerts, sync completion |
| 🔒Privacy First | No analytics, no cloud — your data stays on your devices |
| 🌙Dynamic Color | Full Material You dynamic theming on Android 12+ |
| Layer | Tech |
|---|---|
| UI | Jetpack Compose + Material 3 Expressive (1.5.0-alpha17) |
| Architecture | Coroutines + Flow,StateFlow for UI state, SharedFlow for events |
| Networking | Ktor client + OkHttp + kotlinx.serialization |
| DI | Manual composition (AppContainer) — no framework overhead |
| Persistence | DataStore (preferences), Room-ready architecture |
| Native | Embedded syncthing binary launched via ProcessBuilder |
| Build | Gradle 9.x, Kotlin 2.2.10, Version Catalogs |
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ app │────▶│ ui-core │────▶│ core-api │
│ (Screens) │ │(Theme/Design)│ │(REST Client)│
└──────┬──────┘ └──────────────┘ └──────┬──────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐ ┌─────────────┐
│ data │◀────│AppContainer │◀────│core-service │
│(Repo/Settings)│ │ (State Hub) │ │(Foreground) │
└──────────────┘ └──────────────┘ └─────────────┘
│
▼
┌──────────────┐
│ core-native │
│(Binary Launch)│
└──────────────┘
- Coroutines + Flow end to end. No AIDL, no listener callbacks.
- StateFlow shared via
AppContainersingleton — tiles and UI read the same flows. - Cancellation-safe — every suspend handler rethrows
CancellationException.
Debug APK:
./gradlew :app:assembleDebugRelease APK:
./gradlew :app:assembleReleaseInstall:
./gradlew :app:installDebugRun tests:
./gradlew test| Module | Purpose |
|---|---|
app |
Activity, navigation, screen composables, DI wiring |
core-native |
Native binary launcher, config bootstrapper, run state |
core-service |
Foreground service, notifications, boot receiver |
core-api |
Ktor REST client, event stream parser, DTOs |
data |
DataStore settings, repositories, sync constraints, health |
ui-core |
Shared Compose theme (SyncthingTheme), expressive components, formatters |
- Android 9 (API 28) or higher
- Target SDK 35, Compile SDK 36
- JDK 17
INTERNET— Syncthing REST APIFOREGROUND_SERVICE_DATA_SYNC— Persistent sync servicePOST_NOTIFICATIONS— Service state and error notificationsRECEIVE_BOOT_COMPLETED— Auto-start on bootCAMERA— QR code scanningMANAGE_EXTERNAL_STORAGE(API 30+) — Folder access
- Configuration backups restore app preferences, folders, devices, and Syncthing options on the same device. Device identity (
cert.pem/key.pem) migration is intentionally not implemented. - Android cloud document providers do not expose filesystem paths usable by the native Syncthing process. Primary storage and UUID-based removable volumes are supported; virtual providers would require a separate copy/cache layer.
- External file versioning requires an executable command supplied by the user and still needs device-specific validation on Android.
MPL-2.0. See NOTICE for upstream attribution.
This project is a derivative of Catfriend1/syncthing-android and fork of lostf1sh/material-syncthing, rebuilt with Compose and modern Android architecture.









