Complete guide for using the Foothold Checkpoint Tool to manage DCS Foothold campaign saves.
- Python 3.10 or higher
- Windows (PowerShell)
- DCS servers with Foothold campaigns
git clone https://github.com/VEAF/VEAF-foothold-checkpoint-tool.git
cd VEAF-foothold-checkpoint-tool
poetry installpoetry run foothold-checkpointThis tool can also be used as a plugin for DCSServerBot, providing Discord slash commands for checkpoint management directly from Discord:
- Save, restore, list, and delete checkpoints using Discord slash commands
- Role-based permissions for checkpoint operations
- Discord notifications for checkpoint events
- No need to access the server command line
For plugin installation and usage, see the Plugin Guide.
The rest of this guide covers the CLI usage. Plugin users should refer to the Plugin Guide instead.
The tool uses a YAML configuration file located at ~/.foothold-checkpoint/config.yaml.
On first run, the tool automatically creates a default configuration file. You can customize it for your setup.
# Directory where checkpoints are stored
checkpoints_dir: ~/.foothold-checkpoints
# DCS servers configuration
servers:
production-1:
path: D:\Servers\DCS-Production-1\Missions\Saves
description: "Main production server"
test-server:
path: D:\Servers\DCS-Test\Missions\Saves
description: "Test server"
# Campaign configurations with explicit file lists (NEW in v1.1.0)
campaigns:
afghanistan:
display_name: "Afghanistan"
files:
persistence: # Required: at least one file
- "foothold_afghanistan.lua"
ctld_save:
files:
- "foothold_afghanistan_CTLD_Save.csv"
optional: true
ctld_farps:
files:
- "foothold_afghanistan_CTLD_FARPS.csv"
optional: true
storage:
files:
- "foothold_afghanistan_storage.csv"
optional: true
# Example with campaign name evolution
germany_modern:
display_name: "Germany Modern"
files:
persistence:
- "FootHold_Germany_Modern_V0.1.lua" # Canonical name (first = current)
- "FootHold_GCW_Modern.lua" # Accepted (legacy name)
ctld_save:
files:
- "FootHold_Germany_Modern_V0.1_CTLD_Save.csv"
- "FootHold_GCW_Modern_CTLD_Save.csv"
optional: true
ctld_farps:
files: []
optional: true
storage:
files: []
optional: trueKey Points:
checkpoints_dir: Where checkpoint ZIP files are storedservers: Map server names to theirMissions\Savespathscampaigns: Explicit file lists for each campaignpersistence: Required Lua files (at least one)ctld_save,ctld_farps,storage: Optional file types- First filename = canonical name (used when restoring)
- Multiple names = accepted alternatives (for old checkpoints)
Migration from v1.0.x:
# OLD format (v1.0.x)
campaigns:
Afghanistan: ["afghanistan"]
# NEW format (v1.1.0)
campaigns:
afghanistan:
display_name: "Afghanistan"
files:
persistence:
- "foothold_afghanistan.lua"
ctld_save:
files: []
optional: true
ctld_farps:
files: []
optional: true
storage:
files: []
optional: trueSee config.yaml.example for complete examples.
Create a checkpoint of a campaign's current state.
poetry run foothold-checkpoint save --server production-1 --campaign afghanistan --name "Before Mission 5"poetry run foothold-checkpoint save --server production-1 --all --name "End of Week Backup"poetry run foothold-checkpoint save
# The tool will prompt for:
# - Server selection
# - Campaign selection
# - Optional name/commentOptions:
--server: Server name from config--campaign: Campaign to save--all: Save all detected campaigns--name: Optional checkpoint name--comment: Optional description
Display all available checkpoints.
poetry run foothold-checkpoint listOutput:
┌──────────────────────────────────────┬──────────────┬────────────┬─────────────────────┬─────────────────┐
│ Checkpoint │ Server │ Campaign │ Date │ Name │
├──────────────────────────────────────┼──────────────┼────────────┼─────────────────────┼─────────────────┤
│ afghanistan_2024-02-13_14-30-00.zip │ production-1 │Afghanistan │ 2024-02-13 14:30:00 │ Before Mission 5│
│ CA_2024-02-13_14-31-00.zip │ production-1 │ Caucasus │ 2024-02-13 14:31:00 │ Before Mission 5│
└──────────────────────────────────────┴──────────────┴────────────┴─────────────────────┴─────────────────┘
poetry run foothold-checkpoint list --detailsShows all files contained in each checkpoint:
[Table as above]
Files in afghanistan_2024-02-13_14-30-00.zip:
- foothold_afghanistan.lua
- foothold_afghanistan_storage.csv
- Foothold_Ranks.lua
poetry run foothold-checkpoint list --server production-1poetry run foothold-checkpoint list --campaign afghanistanpoetry run foothold-checkpoint list --server production-1 --campaign afghanistanRestore a checkpoint to a server.
poetry run foothold-checkpoint restore afghanistan_2024-02-13_14-30-00.zip --server test-serverBehavior:
- Auto-backup (NEW): Creates timestamped backup before overwriting (enabled by default)
- Files are extracted to the target server's
Savesdirectory - Automatic renaming (NEW): Files renamed to canonical names from config
- Example: Old
FootHold_GCW_Modern.lua→ NewFootHold_Germany_Modern_V0.1.lua
- Example: Old
- Integrity is verified using SHA-256 checksums
Foothold_Ranks.luais NOT restored by default
poetry run foothold-checkpoint restore afghanistan_2024-02-13_14-30-00.zip --server test-server --no-auto-backup--no-auto-backup if you're certain you want to overwrite without a safety backup.
poetry run foothold-checkpoint restore afghanistan_2024-02-13_14-30-00.zip --server test-server --restore-rankspoetry run foothold-checkpoint restore
# The tool will:
# 1. Display available checkpoints
# 2. Let you select one
# 3. Prompt for target server
# 4. Ask for confirmation before overwritingCross-Server Restoration:
You can restore a checkpoint created on production-1 to test-server. The tool handles this automatically.
Remove old or unwanted checkpoints.
poetry run foothold-checkpoint delete afghanistan_2024-02-13_14-30-00.zipThe tool will:
- Display checkpoint metadata
- Ask for confirmation
- Delete the file
poetry run foothold-checkpoint delete afghanistan_2024-02-13_14-30-00.zip --forcepoetry run foothold-checkpoint delete
# Select checkpoint from numbered listConvert existing manual backups into proper checkpoints.
poetry run foothold-checkpoint import D:\Backups\Manual\2024-02-10 --server production-1 --campaign afghanistan --name "Old backup"Behavior:
- Scans the directory for Foothold campaign files
- Detects campaign automatically if
--campaignnot specified - Issues warnings for missing expected files (non-fatal)
- Creates checkpoint with current timestamp
- Computes checksums for all files
poetry run foothold-checkpoint import D:\Backups\Manual\2024-02-10
# The tool will:
# 1. Auto-detect campaigns in directory
# 2. Let you select which campaign to import
# 3. Prompt for server and optional name/comment# Friday evening: Save all campaigns
poetry run foothold-checkpoint save --server production-1 --all --name "End of Week - Feb 16"
# List recent backups
poetry run foothold-checkpoint list --server production-1
# Test restore on test server
poetry run foothold-checkpoint restore afghanistan_2024-02-16_18-00-00.zip --server test-server# Before testing: Create checkpoint
poetry run foothold-checkpoint save --server test-server --campaign afghanistan --name "Before new mission test"
# ... test the new mission ...
# If broken: Restore previous state
poetry run foothold-checkpoint restore afghanistan_2024-02-13_16-00-00.zip --server test-server# List all checkpoints
poetry run foothold-checkpoint list
# Delete old ones
poetry run foothold-checkpoint delete afghanistan_2024-01-15_10-00-00.zip
poetry run foothold-checkpoint delete afghanistan_2024-01-18_14-30-00.zipProblem: Specified server doesn't exist in config.yaml
Solution: Add the server to your config file or check for typos.
servers:
your-server-name:
path: D:\Path\To\Server\Missions\Saves
description: "Your server description"Problem: Campaign files don't match expected patterns
Solution:
- Check that files follow Foothold naming conventions (
foothold_name*.lua,FootHold_Name*.csv) - Add campaign mapping in config if using custom names
Problem: Files found that aren't configured in config.yaml
Solution: The tool provides a helpful error with YAML snippet to add:
Unknown campaign files detected in source directory:
- foothold_newmap.lua
These files appear to be Foothold campaign files but are not configured.
To import this campaign, add it to your config.yaml under 'campaigns':
newmap:
display_name: "New Map"
files:
persistence:
- "foothold_newmap.lua"
ctld_save:
files: []
optional: true
ctld_farps:
files: []
optional: true
storage:
files: []
optional: true
Action: Copy the suggested YAML to your config.yaml and customize as needed.
Problem: Checkpoint file is corrupted
Solution: The checkpoint file may be corrupted. Try:
- Re-download if from remote storage
- Use a different checkpoint
- Import from original manual backup if available
Problem: Cannot read/write files
Solution:
- Run PowerShell as Administrator
- Check file/folder permissions
- Ensure DCS server is not running (files may be locked)
Override default checkpoint location in config.yaml:
checkpoints_dir: E:\VEAF\CheckpointsSuppress progress bars for automation:
poetry run foothold-checkpoint save --server prod-1 --campaign afghanistan --quietOutput: Just the checkpoint filename on success.
Get help for any command:
poetry run foothold-checkpoint --help
poetry run foothold-checkpoint save --help
poetry run foothold-checkpoint restore --help