Discovering saves
discover is the one part of a layout you always have to write. Given a game’s resolved save folder, it answers a single question: what are the individual saves in here? Everything else has a sensible default.
One save
Use these when the folder holds exactly one save.
discover: singleton— the whole save root is the one save. Use it for a single save file, or a folder you treat as one unit.discover: {file: "profile.sav"}— one named file directly under the root.discover: {dir: "SaveData"}— one named folder directly under the root.
Many saves
Use these when the folder holds several saves and you match them by pattern.
discover: {files: "*.sav"}— every direct-child file matching the glob is its own save.discover: {dirs: "Campaign*"}— every direct-child folder matching the glob is its own save.
The *.sav shorthand is the same as the long form {include: "*.sav"}. Switch to the long form when you need any of these:
exclude— keep everythingincludematches except names that also matchexclude:{dirs: {include: "*", exclude: "_temp"}}keeps every folder except_temp. You can supply justexclude—includethen defaults to “match everything”.regex— setregex: trueto match with regular expressions instead of globs:{dirs: {include: "^[0-9]+$", regex: true}}for numbered folders. The flag covers bothincludeandexclude.recursive— look at any depth, not just direct children:{files: {include: "*.sav", recursive: true}}. It defaults tofalse.
Rules to remember
includeandexcludework together. A save is kept whenincludematches its name andexcludedoes not.includedefaults to “match everything” andexcludeto “match nothing”, so either one can stand alone.- One language per matcher.
regex: trueswitches both sides to regular expressions; leave it off (the default) for globs.includeandexcludealways share one language. excludeprunes folders. Withrecursive: true, a folder whose name matchesexcludeis skipped whole — its contents are never searched.recursiveonly changes how deep the search goes — direct children by default, every level whentrue.- The base folder shifts between sections. In
discover, clauses match against the save root — the folder your path points at. Inpayload,trigger, andignore(the next page), they match against each save thatdiscoverfound.
The smallest valid layout is just a discover line — the rest fills in from defaults:
# Each subfolder is its own save
save_layout:
discover:
dirs: "*"