Skip to content

Repository files navigation

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.

Build License Min SDK Target SDK Compose

Home Folders Devices Settings

Home Dark Folder Detail Dark Insights Dark Add Device Dark


What is this?

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.


Download

Get it on GitHub Get it on Obtainium

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.


Features

🎨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+

Tech Stack

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

Architecture

┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│     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 AppContainer singleton — tiles and UI read the same flows.
  • Cancellation-safe — every suspend handler rethrows CancellationException.

Build

Debug APK:

./gradlew :app:assembleDebug

Release APK:

./gradlew :app:assembleRelease

Install:

./gradlew :app:installDebug

Run tests:

./gradlew test

Modules

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

Requirements

  • Android 9 (API 28) or higher
  • Target SDK 35, Compile SDK 36
  • JDK 17

Permissions

  • INTERNET — Syncthing REST API
  • FOREGROUND_SERVICE_DATA_SYNC — Persistent sync service
  • POST_NOTIFICATIONS — Service state and error notifications
  • RECEIVE_BOOT_COMPLETED — Auto-start on boot
  • CAMERA — QR code scanning
  • MANAGE_EXTERNAL_STORAGE (API 30+) — Folder access

Known follow-up work

  • 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.

License

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.

About

Material-Syncthing - A Syncthing Wrapper for Android With Material 3 Expressive Design.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages