Skip to main content

Reading backup archives

New backups use a standard 7z container. Programs read _rgsm/manifest.json; people use RESTORE.txt for manual recovery. The TXT layout and wording may change and are not a programming interface.

Format version 6​

The manifest is UTF-8 JSON with camelCase fields. Check the top-level version first: this document describes version 6. Do not restore an unknown version using current rules. Ignore unknown additional fields within a supported version.

FieldMeaning
identity.gameId / gameNameGame instance identifier / name at capture time
identity.snapshotIdBackup identifier; do not derive it from the archive filename
identity.createdAtUnix timestamp in milliseconds; may be absent
identity.legacyLocalTimeHistorical local time with an unknown time zone; may be absent
identity.deviceId / parentSource device / parent backup identifier; may be absent
identity.description / createdByNote / creation source, such as Manual or Timer
identity.recoveredMetadatatrue for metadata reconstructed during conversion; defaults to false when absent
identity.locationsSave entry saveUnitId and original path expression
groupsCaptured data groups; one save entry may match multiple groups
groups[].id / saveUnitIdGroup identifier / owning save entry identifier; join by identifiers, not array position
groups[].archivePathRelative path inside the archive, using / separators
groups[].kindfile, directory, or registry; registry data uses standard .reg files
groups[].relativePath / relativeExpressionMatch path relative to its logical save root / expression preserving variables; the latter may be absent
groups[].sourcePathDiagnosticOriginal captured location, for reference only; may be absent
groups[].deleteBeforeApplyThis entry's delete-before-restore setting

Minimal reader:

import json
from pathlib import Path

# First extract safely into a separate directory using a 7z-capable tool.
root = Path("extracted-backup")
manifest = json.loads((root / "_rgsm/manifest.json").read_text(encoding="utf-8"))
if manifest["version"] != 6:
raise ValueError("Unsupported backup format")
for group in manifest["groups"]:
print(group["saveUnitId"], group["kind"], group["archivePath"])

archivePath points to the actual data; directory groups include their descendants. Colliding names receive numeric suffixes. Use the manifest path instead of reconstructing it from the original filename.

Original paths belong to the source device. Recovery on another device must use that device's corresponding save locations; sourcePathDiagnostic is not an executable restore destination. _rgsm and RESTORE.txt contain backup metadata, not game saves.

Historical ZIP / 7z archives may lack this manifest. Convert them through the application's local backup upgrade first. Missing historical associations require a user choice; matching filenames alone is insufficient.