Wipe remote vmup batches with prune --all, or wait on TTL
TTL, the remote sweeper cron, vmup prune --all to wipe live batches, and leftover local staging under ~/.cache/vmup after a failed or kept upload.
Each batch is a directory named agents-<date>-<time>-<uuid> under the remote root (~/vmup by default). vmup deletes those directories after TTL minutes (default 5). You can also delete them yourself: one batch with --id, or every remote batch right now with --all.
Why batches expire is the design page. This page is the recipes.
Let the sweeper do it
vmup init (and vmup init -y) installs ~/vmup/.cleanup.sh on the host and a crontab line * * * * * that runs it every minute. A completed batch has a hidden .<batch-id>.expires sidecar beside it. The sweeper deletes each marked batch after that timestamp, so five-minute and thirty-minute uploads can share one remote root. Unmarked batches from older vmup versions use the fallback TTL baked into the script. It does not delete the remote root.
Install or upgrade the script if vmup check reports it missing or outdated:
vmup check --sweepervmup check without --sweeper reports one of:
Sweeper: installed
Sweeper: outdated
Upgrade: vmup check --sweeper
Sweeper: missing
Reinstall: vmup check --sweeperA successful upload also warns for missing or outdated sweepers. A missing or unscheduled sweeper can leave batches behind if this laptop sleeps. An old global-TTL script can delete a long-lived batch before its printed expiry. A script is current only when both the versioned executable and its cron entry are present. The client-side delete remains a detached sleep then ssh rm fallback; it dies if the machine sleeps or exits.
Prune from this laptop
vmup pruneDeletes marked remote batches whose absolute expiry has passed. Unmarked legacy batches use the resolved TTL as an mtime cutoff. A *.partial batch is removed after a separate 15-minute stale threshold, which protects an active transfer from the five-minute default. Prints Pruned N remote batch(es) on stderr.
vmup prune --allDeletes every remote agents-* and agents-*.partial directory under the remote root, including batches still inside TTL, plus their expiry sidecars. Does not remove ~/vmup itself or .cleanup.sh. Not with --id.
vmup prune --id agents-20260911-140128-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeDeletes that batch, its .partial sibling, and its expiry sidecar regardless of age. The id must match agents-YYYYMMDD-HHMMSS-<uuid>.
vmup prune --localAlso removes local staging dirs under ~/.cache/vmup/ older than 24 hours. Prints Removed N local orphan batch(es) first, then does the remote prune (age-based, or --all / --id if you passed those). --local does not wipe every local cache dir, only ones older than 24 hours.
vmup prune --install-sweeperInstalls/refreshes the remote cron script, then prunes.
vmup prune --ttl 1Uses 1 minute as the fallback age cutoff for unmarked legacy batches (and for sweeper install if you combined --install-sweeper). Marked batches keep their stored expiry. Ignored by --all. Does not rewrite config.toml.
Keep local staging after a good upload
vmup shot.png --keep-localThe remote copy is still uploaded. The leftover directory is:
~/.cache/vmup/agents-<date>-<time>-<uuid>/Failed uploads keep staging even without --keep-local, so you can retry or inspect files.
Override the cache root with VMUP_CACHE_DIR or XDG_CACHE_HOME. See Environment variables.