Skip to content

.sift.toml

version = 1
[organize]
strategy = "type"
unknown = "other"
[watch]
stability_seconds = 3
[[rules]]
enabled = true
priority = 100
pattern = "*.tmp"
action = "Trash"
description = "Trash all .tmp files"
[[rules]]
enabled = true
priority = 90
pattern = "*.zip"
action = "Move"
destination = "Archives"
description = "Move .zip to Archives"
Field Type Notes
version integer Must be 1 — the only version this Sift build supports. A file that doesn’t specify version is treated as 1.

An unrecognized top-level key in .sift.toml is a hard error, not a silently-ignored typo — a config file that can drive automatic mutation is never allowed to have a field that quietly does nothing.

Field Type Notes
strategy string "type" (default), "date", "audio", "video", "photos", or "documents". See Strategies.
unknown string "other" (default) or "skip" — what happens to a type-classified file with no recognized extension.
template string Required for date/audio/video/photos/documents; invalid for type. The destination pattern, e.g. "{year}/{month}" or "{artist}/{album}".
date_source string Only valid with strategy = "date".
Field Type Notes
stability_seconds integer 1300. How long a candidate file must sit unchanged before Watch organizes it. Defaults to 2.5 seconds if omitted. See Stability Window.

See Rules for the full field-by-field reference, action semantics, and destination-safety rules, and Rule Priority for how conflicts between multiple matching rules resolve.

See Configuration Lookup for the exact resolution order (local .sift.toml → global config → built-in defaults), and how recursive organize and Watch each pick which file governs which subtree.

Terminal window
sift init ~/Downloads
sift init ~/Downloads --force # overwrite an existing .sift.toml
Terminal window
sift config check ~/Downloads
sift config check ~/Downloads --json