Skip to main content

Staggered Versioning Deep Dive

Syncthing can keep a history of changed or deleted files in a .stversions directory. The staggered versioner is the most useful mode: it keeps more versions for recent changes and fewer for older ones — similar to macOS Time Machine.

Learning Focus

Set up staggered versioning as a fast recovery layer for accidental overwrites, while leaving long-term backup to Restic. Know the storage cost before enabling it on large sync folders.

Tool Snapshot
Versioning ModeRetentionStorage ImpactBest For
NoneNo historyNoneTrusted single-editor environments
Trash CanUntil manually clearedHighSimple undo on small folders
SimpleN last versions per fileModerateSingle device, predictable space
StaggeredTime-based graduated retentionTunableProduction multi-device environments
ExternalCustom scriptDependsIntegration with external VCS or backup

How Staggered Versioning Works

flowchart TD
A[File changed or deleted] --> B[Current version moved to .stversions/]
B --> C{Age of version?}
C -->|Less than 1 hour| D[Keep each change — high frequency]
C -->|1 hour to 1 day| E[Keep 1 version per hour]
C -->|1 day to 30 days| F[Keep 1 version per day]
C -->|30 days to 365 days| G[Keep 1 version per week]
C -->|Older than max age| H[Purge automatically]

Configuring Staggered Versioning

config.xml — staggered versioning for a folder
<folder id="docs-sync" path="/var/www/html/docs" type="sendreceive">
<versioning type="staggered">
<param key="maxAge" value="31536000"/> <!-- 1 year in seconds -->
<param key="cleanoutDays" value="365"/> <!-- Remove versions older than 365 days -->
<param key="versionsPath" value=""/> <!-- Empty = .stversions inside folder -->
</versioning>
</folder>

In the GUI: Folder → Edit → File Versioning → Staggered File Versioning.

Versioning Parameters

ParameterDefaultDescription
maxAge31536000 (1 year)Maximum age of versions in seconds. Set to 0 for unlimited.
cleanoutDays0 (disabled)Automatically delete all versions older than N days
versionsPath(empty)Custom path for .stversions — useful for storing versions on a different disk

Separating Versions to a Different Disk

config.xml — versions on a separate volume
<folder id="media-share" path="/var/www/html/media" type="sendreceive">
<versioning type="staggered">
<param key="maxAge" value="2592000"/> <!-- 30 days -->
<param key="versionsPath" value="/mnt/versions/media-share"/>
</versioning>
</folder>
# Ensure the versions directory exists and is writable by the syncthing user
sudo mkdir -p /mnt/versions/media-share
sudo chown syncthing:syncthing /mnt/versions/media-share

Browsing and Recovering Versions

Versions are stored in a mirrored directory structure:

.stversions/
└── path/
└── to/
└── file.txt~20260415-090000
└── file.txt~20260414-120000
recover-deleted-file.sh
# Find all versions of a specific file
find /var/www/html/docs/.stversions -name "myfile.txt~*" | sort

# Restore the most recent version
LATEST=$(find /var/www/html/docs/.stversions -name "myfile.txt~*" | sort | tail -n1)
cp "$LATEST" /var/www/html/docs/myfile.txt

# Or restore a version from a specific date
cp "/var/www/html/docs/.stversions/reports/q1.csv~20260101-000000" \
/var/www/html/docs/reports/q1.csv

Storage Cost Estimation

check-versions-size.sh
# How much space is .stversions using?
du -sh /var/www/html/docs/.stversions/

# File count
find /var/www/html/docs/.stversions -type f | wc -l

# Oldest version
find /var/www/html/docs/.stversions -type f -printf "%T@ %p\n" | sort -n | head -1
warning

On high-churn folders (logs, database dumps), .stversions can grow very fast. Always monitor its size and set aggressive cleanoutDays or use a separate versionsPath on a large dedicated volume.

Versioning Strategies by Folder Type

FolderChurn RateRecommended VersioningRetention
/var/www/html/docs — static docsLowStaggered365 days
/home/user/projects — codeMediumStaggered + git30 days
/var/log/app — application logsVery highNone (Restic handles it)N/A
/home/user/Desktop — user filesLowTrash canManual

Common Mistakes

MistakeEffectFix
Enabling versioning on a log folder.stversions fills disk in hoursExclude log files with .stignore
Default versionsPath on a small system diskVersions compete with system spaceSet versionsPath to a dedicated volume
maxAge=0 (unlimited) with no cleanoutVersions accumulate foreverSet cleanoutDays to a reasonable value

What's Next