Security

Cloud Backup

Encrypt, upload, verify, retain, and restore scoped OpenClaw backups in S3-compatible storage.

What it does

Create scoped OpenClaw backups, encrypt sensitive archives with GPG, and upload them to S3-compatible storage such as S3, R2, B2, or MinIO. Choose full, settings, workspace, or everything-inclusive coverage, then list, verify, retain, prune, or restore archives through confirmation-gated workflows. Restores are staged by default, and cron scheduling is strictly opt-in after a successful manual backup.

When to use it

  • Encrypted OpenClaw backups to S3-compatible storage
  • Workspace-only backup before changes
  • Verification of the latest cloud archive
  • Staged recovery of OpenClaw state

The skill document

OpenClaw Cloud Backup

The cloud layer for OpenClaw's native backup. Wraps openclaw backup create (config, credentials, consistent SQLite snapshots, workspace), then GPG-encrypts and uploads the archive to any S3-compatible bucket, with retention, verification, and staged restore.

All commands: bash "{baseDir}/scripts/cloud-backup.sh"

When to use this skill — and when not to

Act ONLY on an explicit user request about OpenClaw backups: "back up openclaw", "restore my openclaw state", "set up cloud backups for openclaw", "/cloud-backup", and similar.

  • Generic requests ("back up my project", "save this file", "restore the database") are NOT for this skill. Ask what the user means before touching it.
  • NEVER run this skill as a side effect of another task, proactively, or "while you're at it".
  • Read-only subcommands (status, list, verify, schedule, and any --dry-run) may run freely once the user has asked about backups. Everything else follows the gates below.

Confirmation gates

Before ANY state-changing action, show the user exactly what will happen and get an explicit yes. One gate per action — do not re-ask for things the user just confirmed, and never batch-confirm.

ActionWhat you MUST show before doing it
Write config (openclaw config patch)Every key=value you will write, verbatim. Never write secrets — see Credentials.
First backup to a new destinationOutput of backup --dry-run: scope, sensitivity verdict, encryption status, target s3://bucket/prefix.
Store/replace a credentialOnly the file path + storage method (AWS profile / passphrase file). The secret value itself should not transit this conversation — the user runs those commands themselves.
RestoreStep 1: always restore --dry-run and show the file list. Step 2: state which paths will be overwritten (staged restores write to a fresh directory; --in-place overwrites live state), then require an explicit yes. Never skip the dry run.
PruneOutput of prune --dry-run: which archives (local and remote) will be deleted, by name.
Schedule creationThe exact openclaw cron add ... command and full payload text (see Scheduling).

Repeat manual backups to an already-confirmed destination need no new gate — the user's request IS the confirmation. Still echo the one-line plan ("full backup, encrypted, → s3://bucket/prefix") before running.

Unattended runs (cron)

A scheduled job's payload marks the run as operator-preconfirmed for backup and prune ONLY. In unattended runs: never restore, never change config, never create or modify schedules, never store credentials.

Modes — what each backup contains

Echo this table when the user asks what gets backed up:

ModeIncludesExcludes by defaultSensitivity
backup full (default)openclaw.json, credentials/, secret stores, state + agent SQLite snapshots, agent memory, workspace, installed skillssession transcripts, codex caches/logs, qmd embedding caches (models + index), tools/, media/, logs/, old backupsSENSITIVE — encryption forced
backup full --everythingeverything above PLUS session transcripts and codex historyprevious backup archives onlySENSITIVE — encryption forced
backup settingsopenclaw.json, secret stores, credentials/, auth fileseverything elseSENSITIVE — always encrypted, no opt-out
backup workspaceworkspace directories (skills, memory files)all state/configencrypted by default; --no-encrypt allowed here only

"SENSITIVE — encryption forced" means the script refuses to produce a plaintext archive for that scope (exit 14). Do not work around it; if the user explicitly wants a plaintext-shareable archive, offer config.excludeSecrets=true instead. Users can tune scope with config.exclude / config.include (state-relative globs).

Subcommands

CommandWhat it doesGate?
backup [full|settings|workspace] [--everything] [--no-upload] [--dry-run] [--json]Create archive, encrypt, upload, apply retentiondry-run free; see gates
listLocal + remote backups; flags failure debrisno
statusHealth: last backup, credential sources, sensitivity verdict, schedule, reachabilityno
verify [name|--latest] [--deep]Checksum + decrypt + listing; --deep adds openclaw backup verifyno
restore [--target DIR | --in-place] [--only GLOB] [--dry-run] [--yes] [--force]Staged restore by defaultYES — two-step
prune [--dry-run]Apply retention; remove failure debrisYES
schedulePRINT the opt-in cron command (creates nothing)no
setupSetup checklist + connection test (never writes config)config writes gated individually

Exit codes (report them precisely, especially from cron): 0 ok · 3 ok-with-warnings · 4 usage · 10 another run holds the lock · 11 missing dependency · 12 insufficient disk · 13 cloud unreachable/bad credentials · 14 encryption required but unavailable · 20-25 create/filter/encrypt/upload/ verify failures · 30 restore failure.

First-time setup

Follow references/setup-flow.md step by step. Summary: choose provider → user creates a least-privilege bucket-scoped key (per provider guide) → store credentials OUTSIDE OpenClaw config (AWS profile recommended) → write non-secret config (gate) → test connection → enable encryption with a generated passphrase file → first manual backup (gate) → only then offer scheduling (gate).

Credentials

Resolution order and storage rules: references/credentials.md. Hard rules:

  • NEVER write access keys or passphrases into openclaw.json (no skills.entries.cloud-backup.env.*). Backups archive that file: a plaintext credential in config is carried inside every archive it protects.
  • S3 credentials live in an AWS named profile (config.profile, recommended) or operator-managed process env. The passphrase lives in a chmod-600 passphrase file (config.passphraseFile).
  • Operators who run OpenClaw's secret store can point the skill at it instead: config.accessKeyRef / config.secretKeyRef / config.passphraseRef accept OpenClaw SecretRefs ({source: env|file|exec}) resolved against .secrets.providers — including 1Password-style exec providers. Configured-but-broken refs abort the run; they never fall back.
  • Prefer flows where the secret never appears in this conversation: the user runs aws configure --profile ... and the passphrase generator themselves.
  • If the script prints a DEPRECATED warning about plaintext config credentials, surface it to the user verbatim and offer the migration in references/credentials.md.

Scheduling — strictly opt-in

NEVER create, modify, or enable a cron job by default, implicitly, or because "backups should be scheduled". Skills document cron setup; only the user opts in.

Offer scheduling exactly once, AFTER the first successful manual backup:

"Backup verified. Want me to schedule this daily? I'd create this cron job — nothing is scheduled until you confirm:"

Then run schedule to print the exact command, adjust time/timezone/delivery to the user's setup, show it in full, and wait for an explicit yes before running it. If the user declines: drop it, and do not re-offer on later runs (check openclaw cron list first — if a cloud-backup job exists, never offer). To remove a schedule: openclaw cron rm .

Error handling (for you, the agent)

  • Surface script stderr to the user verbatim (trim to the relevant lines). Never summarize an error into vagueness, never hide a WARN.
  • Non-zero exit: diagnose using the exit-code table, explain, propose ONE fix. Never auto-retry restore, prune, or any openclaw cron mutation. backup may be retried once, only after the cause is fixed and the user agrees.
  • Never invent bucket names, endpoints, or passphrases. Missing value → ask.
  • Exit 14 (encryption required, no passphrase) fails hard by design — do not work around it with --no-encrypt or an ad-hoc passphrase. Run setup.
  • The script cleans its staging on failure; if it reports it could not, tell the user the exact leftover path.

Reference docs (read only when needed)

  • references/credentials.md — resolution chain, v1→v2 migration, warnings
  • references/setup-flow.md — guided first-time setup
  • references/providers/{aws-s3,cloudflare-r2,backblaze-b2,digitalocean-spaces,minio,other}.md
  • references/security.md — threat model, restore safety, incident response

Questions people ask

Which OpenClaw data can I back up?
Modes cover full state, settings and credentials, or workspace directories; `--everything` adds session transcripts and Codex history to a full backup. Scope can also be tuned with state-relative include and exclude globs.
How are credentials and sensitive archives protected?
Sensitive scopes require GPG encryption, while workspace-only backups may explicitly disable it. S3 credentials belong in an AWS profile, process environment, or OpenClaw SecretRefs, and passphrases belong in a chmod-600 file or SecretRef—not in openclaw.json.
Can it restore directly over my live OpenClaw state?
Staged restore to a fresh directory is the default; `--in-place` can overwrite live state. Every restore must first run a dry run showing the file list, followed by explicit confirmation of the paths that will be overwritten.

Related skills

Manage Nextcloud notes, tasks, calendars, files, contacts, shares, and Deck boards from one JSON CLI.

187 installs9 stars

Guide safe installation, operation, auditing, and extension of the read-only OpenClaw operations dashboard.

174 installs9 stars

Monitor NVD CVEs, community advisories, and pre-CVE GitHub advisories in one agent security feed.

by davida-ps103 installs1 stars

Upload, browse, search, organize, and share files through a personal Tencent Agent Storage drive.

63 installs

Install, switch, validate, export, restore, and publish Soul Spec personas from the CLI.

50 installs

Enforce least privilege and report host, network, and compliance violations with evidence and mitigations.

60 installs