Syncthing
syncthing.netWindows, Mac, Linux, BSD, AndroidContinuous file synchronization between 2 or more clients. It is simple, yet powerful, and fully-encrypted and private. Syncthing can be deployed with Docker, and there are native clients for Windows, Mac, Linux, BSD and Android.
- Homepage:syncthing.net
- GitHub:github.com/syncthing/syncthing
- Web info:web-check.xyz/check/syncthing.net
Syncthing Source Code
Author
Description
Open Source Continuous File Synchronization
Homepage
https://syncthing.net/Repository
- LicenseMPL-2.0
- Created26 Nov 13
- Primary languageGo
- Size127,666 KB
- Stars87,948
- Forks5,431
- Watchers87,948
Top Contributors
@calmh (4629)
@AudriusButkevicius (987)
@imsodin (894)
@st-release (226)
@tomasz1986 (124)
@jesselucas (112)
@acolomb (91)
@greatroar (88)
@Zillode (58)
@bt90 (34)
@dependabot-preview[bot] (33)
@uok (29)
@dependabot[bot] (28)
@lkwg82 (28)
@norgeous (26)
@andersonvom (21)
@canton7 (18)
@rasa (16)
@pixelspark (15)
@deepsource-autofix[bot] (14)
@marbens-arch (14)
@emlun (13)
@alex2108 (13)
@aviau (12)
@nekr0z (11)
@wweich (11)
@cqcallaw (10)
@plouj (10)
@KayoticSully (10)
@filoozom (9)
@ralder (9)
@nrm21 (9)
@kamadak (7)
@rumpelsepp (7)
@dargmuesli (6)
@xduugu (6)
@jedie (6)
@qepasa (5)
@letiemble (5)
@otbutz (5)
@krozycki (5)
@brgmnn (5)
@seehuhn (4)
@keevBush (4)
@cyberb (4)
@pyfisch (4)
@ardevd (4)
@Stefan-Code (4)
@jpjp (4)
@ProactiveServices (4)
@HairyFotr (4)
@Valloric (3)
@bigbear2nd (3)
@kluppy (3)
@kozec (3)
@jarlebring (3)
@fti7 (3)
@mrclmr (3)
@Ratio2 (3)
@tmm1 (3)
@AkaZecik (3)
@maen-bn (3)
@danog (3)
@KeyWeeUsr (3)
@rjpruitt16 (3)
@marclaporte (3)
@Shidory (3)
@yyogo (3)
@acogdev (3)
@kralo (2)
@maximal (2)
@MikeLund (2)
@MikolajTwarog (2)
@nicoonoclaste (2)
@hiqua (2)
@ruslanye (2)
@shaaraddalvi (2)
@Shablone (2)
@maishivamhoo123 (2)
@liusy182 (2)
@qbit (2)
@swenske (2)
@veeti (2)
@dagecko (2)
@desbma (2)
@entity0xfe (2)
@gudvinr (2)
@kwhite17 (2)
@mathias4833 (2)
@mattn (2)
@SimplyPeachy (2)
@tbodt (2)
@xarx00 (2)
@gsaraf (2)
@vrusinov (2)
@jayachithra (2)
@andrewrabert (2)
@aionescu (2)
@agoeckner (2)
@bahadir60 (2)
Recent Commits
Jakob Borg(24 Aug 26)
chore: set User-Agent on all outgoing HTTP requests (#10867) It's only polite, and it enables better troubleshooting in situations like weird-ass requests to the upgrades download service. --------- Signed-off-by: Jakob Borg <[email protected]>
Syncthing Release Automation(24 Aug 26)
chore(gui, man, authors): update docs, translations, and contributors
Jakob Borg(20 Aug 26)
build(deps): update dependencies (#10865) Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(19 Aug 26)
build: use Go 1.27, minimum version is Go 1.26 (#10864) ### Purpose 🎉 Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(18 Aug 26)
Merge branch 'infrastructure' * infrastructure: fix(stdiscosrv): slightly increase reannounce times and smoothing fix(stdiscosrv): 500 errors should be accompanied by log entry fix(ursrv): data problems are the clients fault build: sign docker images
Jakob Borg(16 Aug 26)
fix(stdiscosrv): slightly increase reannounce times and smoothing Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(15 Aug 26)
fix(stdiscosrv): 500 errors should be accompanied by log entry Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(15 Aug 26)
fix(ursrv): data problems are the clients fault Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(26 May 26)
build: sign docker images Signed-off-by: Jakob Borg <[email protected]>
Syncthing Release Automation(17 Aug 26)
chore(gui, man, authors): update docs, translations, and contributors
Jakob Borg(11 Aug 26)
fix: open GUI when relaunched instead of printing error (fixes #10727) (#10852) This is primarily to improve the experience in environments that start Syncthing from a graphical environment, e.g., Windows. When already running, instead of printing an error we open the GUI. If the GUI is not available (but the lockfile indicates we are running), print an error and exit. If --no-browser is given or STNOBROWSER is set, act like before. Closes #10736. Marking as `fix` because this does not deserve to trigger a minor release on its own. --------- Signed-off-by: Jakob Borg <[email protected]>
Syncthing Release Automation(10 Aug 26)
chore(gui, man, authors): update docs, translations, and contributors
Jakob Borg(05 Aug 26)
fix(api): correctly return metrics, support bundle (fixes #10847) (#10849) Our faked request wasn't good enough; improve it, adding a test. Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(05 Aug 26)
fix(model): correctly handle receive-only changed directories (fixes #8004) (#10843) When adding a folder in receive-only mode where the contents were already identical to a remote device, directories would remain as locally changed when everything else had consolidated. The reason this happened is that we only did the matching between locally changed files and their global equivalent for changed items, but directories are typically not "changed" much as we don't track their mtime, so they wouldn't pass through this stage when scanning. Now, instead, do the check when we're anyway walking all the files in phase two of scanning. This catches all cases of identical items, files or directories, regardless of how they came to be in the index. Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(05 Aug 26)
chore: style fixes from `go fix` (#10846) Just `go fix ./...` Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(03 Aug 26)
fix(db, model): better handle db connections, puller concurrency, avoid deadlock (fixes #10841) (#10842) There is a danger of deadlock wherever we have database operations inside a database iterator. The iterator itself pins a connection, so the nested operations need another connection; if we've reached maxOpenConns then it blocks until a connection is released. If all connections are consumed by such iterators then none can make progress. Luckily, we have limited concurrency for most such iterator loops. They are part of scanning, pulling, reverting, etc where there is only ever one such routine per folder. The exception is block reuse in the copier routine, which is limited by the `Copiers` setting per folder. This could in practice deadlock since you could set copiers to eight and end up with six `AllLocalBlocksWithHash` iterators when `maxDBConns=6`, all of which need to make additional database calls inside the loop. This PR fixes the problem twice; - The problematic loop does not need to be reentrant. The set of blocks that may be returned by the iterator is finite so we can easily just collect them to a slice before we start processing them. This avoids the problem entirely. - We do not need to limit database connections as strictly as we currently do. Increase the maximum allowed, while reducing the number of held-open idle connections slightly. This is not an exact science, but ideally we want "most" operations to be able to use the pinned connections to avoid cache churn. Most operations are short lived queries, or single-goroutine iterators with short lived queries inside, so four connections seems like it should usually be enough. 🤷 - Additionally, set a cap on Copiers. Currently you could set it to an arbitrarily large number, which is not advantageous. Limit it to 2*NumCPU which scales somewhat with system performance. Signed-off-by: Jakob Borg <[email protected]>
Syncthing Release Automation(03 Aug 26)
chore(gui, man, authors): update docs, translations, and contributors
Jakob Borg(27 Jul 26)
chore(syncthing): include local db entries in perfstats (#10839) As used by the latest few PRs with graphs in them Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(27 Jul 26)
chore(model): optimise fsync calls (#10831) This improves performance when running with fsync enabled. The key observation is that the OS may coalesce multiple concurrent fsyncs, so we gain some performance by issuing them in parallell. Since they run from the finisher routine, a simple fix is to run multiple finisher routines. That's the `after` line in the graph below. The other step is to do the same for the directory fsyncs, issuing them concurrently with a limiter. In both cases I used the Copiers value as the concurrency factor. Additionally, add some buffering to the channels between routines to minimise stalls where a routine needs to wait for another. This is the `after2` line. All in all, this speeds up syncing 25k tiny files from 190s to 130s, a 30% improvement. <img width="821" height="540" alt="Screenshot 2026-07-25 at 22 58 34" src="https://github.com/user-attachments/assets/18272c89-a99e-4ee4-9b5e-b278967ea7c6" /> --------- Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(27 Jul 26)
chore(fs): optimise casefs caching performance (#10830) This tweaks the casefs cache to do in-place updates for modifications we perform, instead of dropping the entire cache. That is, we add, remove and rename things in the cache after having done the corresponding operation. We still drop the cache entirely on larger operations like MkdirAll, and before Walk, and the 1s expiry is unchanged. The result is performance much closer to the original. I set up a device with 150 000 tiny files and measured the time it took for a blank device to come online and sync all the files, with default settings apart from `fsync` being disabled, as it otherwise dominated the benchmark... There are three runs, all are identical in the first 40 seconds which is the index transmission & reception, then we can see the `sensitive` run (casefs disabled) finishes at 137 seconds (137-40 = 97s spent syncing); the `before` run finishes at 238s (198s spent syncing); the `after` run finishes at 142 seconds (102s spent syncing). So, effectively the sync time is cut in half, and is now very close to having case sensitive enabled. <img width="812" height="476" alt="Screenshot 2026-07-25 at 23 22 22" src="https://github.com/user-attachments/assets/0aa39712-9fd7-46cf-969e-b6a20f150a3c" /> --------- Signed-off-by: Jakob Borg <[email protected]>
Simon Frei(27 Jul 26)
chore(model): don't check existing file twice in rename detection (#10833) This is related to and lessens issue: https://github.com/syncthing/syncthing/issues/10777 @SoongVilda found that a recent change to track already deleted or existing files only in the scope of a batch, also stopped tracking already existing files. Thus the osutil.IsDeleted check can be executed many times if lots of identical files get picked up in a scan: https://github.com/syncthing/syncthing/issues/10777#issuecomment-4991039201 The change in question: chore(model): more efficient tracking of renames during scan (#10653) 2721b7b5222ff414d02b35789a82028508918a8e --------- Signed-off-by: Simon Frei <[email protected]>
Syncthing Release Automation(27 Jul 26)
chore(gui, man, authors): update docs, translations, and contributors
Jakob Borg(26 Jul 26)
fix(api): handle empty path in static request (#10837) The panic would be recovered by the HTTP server, but this is cleaner. Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(26 Jul 26)
fix(versioner): handle invalid empty command (#10836) Same same Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(26 Jul 26)
fix(ignore): handle pattern resulting in empty string (#10835) Minor fix to avoid a panic in ignore matching. Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(26 Jul 26)
fix(upnp): guard against out of index string access (#10834) Broken responses may have empty path component. Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg(25 Jul 26)
chore: deflake TestRecvOnlyRevertNeeds (#10827) There was a rare, tricky race condition in the setup, where a pull could get started, find the blocks from the file we injected in updateLocalsFromScanning, copy them into a temp file, then fail the pull because the file was already in place. Then later, after the revert, another pull would start, find the temp file and reuse it, making it so needed=0 instead of the expected needed>0 the test checks for. This avoids all that by setting the local index data prior to getting it from the "remote" device, thus avoiding the initial pull and temp file creation etc. Signed-off-by: Jakob Borg <[email protected]>
tbodt(25 Jul 26)
chore(gui): better describe when a pending folder/device notification will reappear (#10808) The tooltip on the dismiss button for notifications confused me a bit (wdym mean "may" recur?) so here is an attempt at a clearer message. Signed-off-by: tbodt <[email protected]>
Rohit Tanwar(25 Jul 26)
fix(gui): add bottom margin to folder action buttons for wrapped spacing (#10728) adds a bottom margin to buttons inside panel footers, ensuring a comfortable gap between wrapped button rows. (Fixes #10689 ) Signed-off-by: rohitanwar <[email protected]>
Jakob Borg(25 Jul 26)
chore: slightly optimise rename detection (ref #10777) (#10819) Only run rename detection for new files. This skips an expensive check for all updates to existing files. The tradeoff is that we no longer immediately detect renames on top of another file as a rename -- this may instead become a copy+delete operation on the destination. --------- Signed-off-by: Jakob Borg <[email protected]>
Syncthing Security
Security Advisories (2)
- mediumPatched
CVE-2022-46165Cross-site Scripting (XSS) in Web GUI
- mediumPatched
CVE-2021-21404Crash due to malformed relay protocol message
Syncthing Website
Website
Syncthing
Redirects
Does not redirect
Security Checks
All 65 security checks passed
Server Details
- IP Address185.199.108.153
- Hostnamecdn-185-199-108-153.github.com
- LocationFrancisco,Indiana,United States of America,NA
- ISPGitHub Inc.
- ASNAS54113
Associated Countries
DE
US
IE
Safety Score
Website marked as safe
100%
Blacklist Check
syncthing.net was found on 0 blacklists
- AntiSocial Blacklist
- Artists Against 419
- Badbitcoin
- Bambenek Consulting
- CERT Polska
- CoinBlockerLists
- CRDF
- CryptoScamDB
- EtherAddressLookup
- EtherScamDB
- Fake Website Buster
- MetaMask EthPhishing
- NABP Not Recommended Sites
- OpenPhish
- PetScams
- PhishFeed
- PhishFort
- Phishing.Database
- PhishStats
- PhishTank
- Phishunt
- RPiList Not Serious
- Scam.Directory
- SecureReload Phishing List
- Spam404
- StopGunScams
- Suspicious Hosting IP
- ThreatFox
- ThreatLog
- TweetFeed
- URLhaus
- ViriBack C2 Tracker
Website Preview
Syncthing Docker
Container Info
syncthing
Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes.
View on DockerHub
linuxserver/syncthing:latestRun Command
docker run -d \
-p 8384:8384/tcp \
-p 21027:21027/udp \
-p 22000:22000/tcp \
-e PUID=${PUID} \
-e PGID=${PGID} \
-v /portainer/Files/AppData/Config/Syncthing:/config \
-v /sync \
--restart=unless-stopped \
linuxserver/syncthing:latestCompose File
version: 3.8
services:
syncthing-container:
image: "linuxserver/syncthing:latest"
ports:
- "8384:8384/tcp"
- "21027:21027/udp"
- "22000:22000/tcp"
environment:
PUID: 1000
PGID: 100
volumes:
- "/portainer/Files/AppData/Config/Syncthing:/config"
- /sync
restart: unless-stoppedEnvironment Variables
- Var NameDefault
- PUID1000
- PGID100
Port List
- 8384:8384/tcp
- 21027:21027/udp
- 22000:22000/tcp
Volume Mounting
- Container PathHost Bind
- /config/portainer/Files/AppData/Config/Syncthing
- /sync(anonymous)
Syncthing Reviews
More Backup and Sync
Modern and simpler alternative to Nextcloud/ownCloud crafted with TypeScript. Unifies file management, sync, sharing, notes, RSS, expenses, calendars, contacts, and photos, with MFA, WebDAV, CalDAV, CardDAV, SSO, and more.
Feature-rich productivity platform, that can be used to backup and selectively sync encrypted files and folders between 1 or more clients. A key benefit the wide range of plug-ins in the NextCloud App Store, maintained by the community. NextCloud was a hard fork off OwnCloud.
An open source cloud storage and sync solution. Files are grouped into Libraries, which can be individually encrypted, shared of synced. Docker image available for easy deployment, and native clients for Windows, Mac, Linux, Android and iOS.
About the Data: Syncthing
Edit Syncthing Data
You can edit Syncthing's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external
sources, a list of these can be found data documentation.
Origin Data
Modify Data
API
You can access Syncthing's data programmatically via our API. Simply make a GET request to:
https://api.awesome-privacy.xyz/v1/services/syncthingThe REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.
Share Syncthing
Help your friends compare Backup and Sync, and pick privacy-respecting software and services.
Share Syncthing and Awesome Privacy with your network!