{"id":49428435,"url":"https://github.com/siddarthkay/syncup","last_synced_at":"2026-05-02T05:16:14.076Z","repository":{"id":352359023,"uuid":"1210563010","full_name":"siddarthkay/syncup","owner":"siddarthkay","description":"SyncUp: an open-source Syncthing client for iOS and Android, powered by react-native","archived":false,"fork":false,"pushed_at":"2026-04-26T15:20:03.000Z","size":6042,"stargazers_count":19,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-04-26T17:16:45.657Z","etag":null,"topics":["android","expo","file-sync","golang","gomobile","ios","react-native","syncthing"],"latest_commit_sha":null,"homepage":"https://siddarthkay.com/projects/syncup","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/siddarthkay.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-14T14:36:09.000Z","updated_at":"2026-04-26T15:19:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/siddarthkay/syncup","commit_stats":null,"previous_names":["siddarthkay/syncup"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/siddarthkay/syncup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddarthkay%2Fsyncup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddarthkay%2Fsyncup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddarthkay%2Fsyncup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddarthkay%2Fsyncup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/siddarthkay","download_url":"https://codeload.github.com/siddarthkay/syncup/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siddarthkay%2Fsyncup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32422144,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T06:29:02.080Z","status":"ssl_error","status_checked_at":"2026-04-29T06:29:00.631Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","expo","file-sync","golang","gomobile","ios","react-native","syncthing"],"created_at":"2026-04-29T10:34:56.159Z","updated_at":"2026-04-29T10:34:59.412Z","avatar_url":"https://github.com/siddarthkay.png","language":"TypeScript","funding_links":["https://github.com/sponsors/siddarthkay"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"mobile-app/assets/icon.png\" alt=\"syncup\" width=\"220\"/\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eSyncUp\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  An open-source Syncthing client for iPhone and Android, powered by the Syncthing daemon via gomobile.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/siddarthkay/syncthing-app/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/siddarthkay/syncthing-app/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MPL--2.0-blue.svg\" alt=\"License: MPL-2.0\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nSyncthing's official Android client was archived in December 2024.\nNo single client ran on both phones from one codebase, so I built\nthis. The daemon runs in-process via\n[`gomobile`](https://pkg.go.dev/golang.org/x/mobile), with a React\nNative UI scaffolded from\n[react-native-go](https://github.com/siddarthkay/react-native-go).\n\n## Screenshots\n\n\u003c!-- TODO: add screenshots --\u003e\n\n| Status | Folders | Devices | Settings |\n|--------|---------|---------|----------|\n| ![Status](docs/screenshots/status.png) | ![Folders](docs/screenshots/folders.png) | ![Devices](docs/screenshots/devices.png) | ![Settings](docs/screenshots/settings.png) |\n\n\u003cdetails\u003e\n\u003csummary\u003eCross-platform sync demo\u003c/summary\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/cross-platform-sync.png\" alt=\"iOS, Android, and desktop syncthing nodes sharing the same folder\" width=\"800\"/\u003e\n\u003c/p\u003e\n\n\u003c/details\u003e\n\n## Differences from other clients\n\n- **Daemon runs in-process on Android.** The `Go` daemon lives inside\n  the app via `gomobile`. There is no subprocess to manage, no IPC\n  between a background service and the UI, and no service-restart\n  handling.\n- **Auto-accept folders from trusted peers.** When you add a peer, you\n  can toggle auto-accept so any folder they share is added to your\n  device automatically without a prompt. Other pending offers show up\n  as accept/ignore cards in the Folders tab.\n- **QR pairing works both ways.** Display your device's QR for a peer\n  to scan, or scan theirs. The 56-character device ID never needs to\n  be typed by hand.\n- **UI updates in near real time.** Long-polling `/rest/events` means\n  config changes, folder state, and incoming offers reach the UI in\n  about a second, instead of on a polling interval.\n\n## Status\n\nThe first real milestone was an iOS simulator, an Android emulator, and\na desktop Syncthing node all sharing the same folder and moving files\nbetween them. The codebase is at v0. Nothing is on an app store yet;\nthe release process is documented in\n[docs/RELEASE.md](docs/RELEASE.md).\n\n## Architecture\n\nThe React Native UI talks to the embedded daemon over its REST API at\n`127.0.0.1:8384`. A `TurboModule` implemented in `Swift` and `Kotlin`\nhandles daemon lifecycle, preferences, and sandbox filesystem helpers.\nThe `Go` side (`backend/wrapper.go`) wraps\n`github.com/syncthing/syncthing/lib/syncthing` and is bound through\n`gomobile`.\n\nFolders, devices, and events are not re-exported as `gomobile` types.\nThat path runs into the marshaller's constraints quickly. Everything\noutside lifecycle calls goes through `fetch('/rest/...')` instead,\nwhich has been simpler to work with.\n\n## Build\n\nEvery `make` target runs inside a Nix shell automatically — you don't\nneed to install Go, Node, or JDK yourself. The only prerequisites are:\n\n- **[Nix](https://nixos.org/download/)** (with flakes enabled)\n- **Xcode 16+** (iOS, macOS only — not available through Nix)\n- **Android SDK** with **NDK r26** (Android — install via Android Studio)\n\nIf you prefer managing all tools yourself, pass `SYSTEM=1` to bypass\nNix:\n\n```bash\nmake sim-ios SYSTEM=1\n```\n\nIn that case you need: Go 1.25+, Node 20+ with Corepack enabled for\nYarn 4, JDK 17, CocoaPods, and the Android SDK/NDK listed above.\n\n### Release builds\n\n```\nmake setup         # install Go toolchain + Node deps\nmake ios           # Go backend + iOS simulator build\nmake android       # Go backend + debug-signed APK\nmake sim-ios       # build + install + launch on simulator\nmake sim-android   # build + install + launch on emulator\nmake test          # Go + Android + iOS + JS tests\nmake clean\n```\n\nA cold build takes about six minutes for iOS and three for Android on\nan M2. Subsequent builds are faster once `gomobile` is cached.\n\n### Dev builds\n\nFor iterative development with hot reload:\n\n```\nmake dev-ios       # build Go backend + start Expo dev client (iOS)\nmake dev-android   # build Go backend + start Expo dev client (Android)\n```\n\nJS/TS changes reload instantly. Go changes require restarting the\ndev target.\n\n### Lint \u0026 typecheck\n\n```\ncd mobile-app\nyarn lint\nyarn typecheck\n```\n\nCI runs lint, typecheck, and `go vet -tags noassets ./...`.\n\n## Background sync\n\nAndroid keeps the daemon running in the background while the system\nallows it. Settings exposes wifi-only and charging-only toggles that\ndrive the run-condition monitor.\n\niOS is more constrained. Apple does not permit continuous background\nexecution for apps outside the VoIP and audio categories, and this\napp does not qualify. It registers two `BGTaskScheduler` jobs and gets\nroughly one to two hours of opportunistic sync per day, sometimes with\nmulti-hour gaps between runs.\n\nIf you want a node that is genuinely always online, run Syncthing on a\ndesktop or server that stays up 24/7. Your phone remains opportunistic\non its own, but it reconciles against a complete copy whenever it\nwakes up, instead of depending on other peers being online at the same\ntime.\n\nAndroid folders live under app-scoped external storage at\n`/storage/emulated/0/Android/data/com.siddarthkay.syncup/...` and\nare deleted when the app is uninstalled.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Inspiration\n\n- [pixelspark/sushitrain](https://github.com/pixelspark/sushitrain)\n- [researchxxl/syncthing-android](https://github.com/researchxxl/syncthing-android)\n- [siddarthkay/react-native-go](https://github.com/siddarthkay/react-native-go)\n\n## Support the project\n\nIf this is useful to you, a GitHub star is the signal I watch to\ndecide what's worth continuing. Sponsorships cover the Apple developer\naccount and testing devices, and they let me spend time on the harder\niOS background work instead of billable client work.\n\n- [Star on GitHub](https://github.com/siddarthkay/syncthing-app)\n- [Sponsor on GitHub](https://github.com/sponsors/siddarthkay)\n\n## License\n\nMPL-2.0. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsiddarthkay%2Fsyncup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsiddarthkay%2Fsyncup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsiddarthkay%2Fsyncup/lists"}