Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Backup and restore ClawdBot configuration, skills, commands, and settings. Sync across devices, version control with git, automate backups, and migrate to new machines.
Backup and restore ClawdBot configuration, skills, commands, and settings. Sync across devices, version control with git, automate backups, and migrate to new machines.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Backup, restore, and sync your ClawdBot configuration across devices directly from Clawdbot.
This skill helps you: Backup all ClawdBot data and settings Restore from backups Sync between multiple machines Version control your configuration Automate backup routines Migrate to new devices
~/.claude/ # Main ClawdBot directory โโโ settings.json # Global settings โโโ settings.local.json # Local overrides (machine-specific) โโโ projects.json # Project configurations โโโ skills/ # Your custom skills โ โโโ skill-name/ โ โ โโโ SKILL.md โ โ โโโ supporting-files/ โ โโโ another-skill/ โโโ commands/ # Custom slash commands (legacy) โ โโโ command-name.md โโโ contexts/ # Saved contexts โโโ templates/ # Response templates โโโ mcp/ # MCP server configurations โโโ servers.json ~/projects/ # Your projects (optional backup) โโโ project-1/ โ โโโ .claude/ # Project-specific config โ โโโ settings.json โ โโโ skills/ โโโ project-2/
ESSENTIAL (Always backup): โ ~/.claude/skills/ # Custom skills โ ~/.claude/commands/ # Custom commands โ ~/.claude/settings.json # Global settings โ ~/.claude/mcp/ # MCP configurations RECOMMENDED (Usually backup): โ ~/.claude/contexts/ # Saved contexts โ ~/.claude/templates/ # Templates โ Project .claude/ folders # Project configs OPTIONAL (Case by case): โ ~/.claude/settings.local.json # Machine-specific โ Cache directories # Can be rebuilt โ Log files # Usually not needed
# Create timestamped backup BACKUP_DIR="$HOME/clawdbot-backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_NAME="clawdbot_backup_$TIMESTAMP" mkdir -p "$BACKUP_DIR" tar -czvf "$BACKUP_DIR/$BACKUP_NAME.tar.gz" \ -C "$HOME" \ .claude/skills \ .claude/commands \ .claude/settings.json \ .claude/mcp \ .claude/contexts \ .claude/templates \ 2>/dev/null echo "Backup created: $BACKUP_DIR/$BACKUP_NAME.tar.gz"
# Backup just skills tar -czvf ~/clawdbot_skills_$(date +%Y%m%d).tar.gz \ -C "$HOME" .claude/skills .claude/commands
# Restore full backup BACKUP_FILE="$HOME/clawdbot-backups/clawdbot_backup_20260129.tar.gz" # Preview contents first tar -tzvf "$BACKUP_FILE" # Restore (will overwrite existing) tar -xzvf "$BACKUP_FILE" -C "$HOME" echo "Restore complete!"
#!/bin/bash # clawdbot-backup.sh - Comprehensive ClawdBot backup tool set -e # Configuration BACKUP_ROOT="${CLAWDBOT_BACKUP_DIR:-$HOME/clawdbot-backups}" CLAUDE_DIR="$HOME/.claude" MAX_BACKUPS=10 # Keep last N backups TIMESTAMP=$(date +%Y%m%d_%H%M%S) # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # Check if ClawdBot directory exists check_claude_dir() { if [ ! -d "$CLAUDE_DIR" ]; then log_error "ClawdBot directory not found: $CLAUDE_DIR" exit 1 fi } # Create backup create_backup() { local backup_type="${1:-full}" local backup_name="clawdbot_${backup_type}_${TIMESTAMP}" local backup_path="$BACKUP_ROOT/$backup_name.tar.gz" mkdir -p "$BACKUP_ROOT" log_info "Creating $backup_type backup..." case $backup_type in full) tar -czvf "$backup_path" \ -C "$HOME" \ .claude/skills \ .claude/commands \ .claude/settings.json \ .claude/settings.local.json \ .claude/projects.json \ .claude/mcp \ .claude/contexts \ .claude/templates \ 2>/dev/null || true ;; skills) tar -czvf "$backup_path" \ -C "$HOME" \ .claude/skills \ .claude/commands \ 2>/dev/null || true ;; settings) tar -czvf "$backup_path" \ -C "$HOME" \ .claude/settings.json \ .claude/settings.local.json \ .claude/mcp \ 2>/dev/null || true ;; *) log_error "Unknown backup type: $backup_type" exit 1 ;; esac if [ -f "$backup_path" ]; then local size=$(du -h "$backup_path" | cut -f1) log_info "Backup created: $backup_path ($size)" else log_error "Backup failed!" exit 1 fi } # List backups list_backups() { log_info "Available backups in $BACKUP_ROOT:" echo "" if [ -d "$BACKUP_ROOT" ]; then ls -lh "$BACKUP_ROOT"/*.tar.gz 2>/dev/null | \ awk '{print $9, $5, $6, $7, $8}' || \ echo "No backups found." else echo "Backup directory doesn't exist." fi } # Restore backup restore_backup() { local backup_file="$1" if [ -z "$backup_file" ]; then log_error "Please specify backup file" list_backups exit 1 fi if [ ! -f "$backup_file" ]; then # Try relative path in backup dir backup_file="$BACKUP_ROOT/$backup_file" fi if [ ! -f "$backup_file" ]; then log_error "Backup file not found: $backup_file" exit 1 fi log_warn "This will overwrite existing configuration!" read -p "Continue? (y/N) " confirm if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then log_info "Restore cancelled." exit 0 fi log_info "Restoring from: $backup_file" tar -xzvf "$backup_file" -C "$HOME" log_info "Restore complete!" } # Clean old backups cleanup_backups() { log_info "Cleaning old backups (keeping last $MAX_BACKUPS)..." cd "$BACKUP_ROOT" 2>/dev/null || return local count=$(ls -1 *.tar.gz 2>/dev/null | wc -l) if [ "$count" -gt "$MAX_BACKUPS" ]; then local to_delete=$((count - MAX_BACKUPS)) ls -1t *.tar.gz | tail -n "$to_delete" | xargs rm -v log_info "Removed $to_delete old backup(s)" else log_info "No cleanup needed ($count backups)" fi } # Show backup stats show_stats() { log_info "ClawdBot Backup Statistics" echo "" echo "=== Directory Sizes ===" du -sh "$CLAUDE_DIR"/skills 2>/dev/null || echo "Skills: N/A" du -sh "$CLAUDE_DIR"/commands 2>/dev/null || echo "Commands: N/A" du -sh "$CLAUDE_DIR"/mcp 2>/dev/null || echo "MCP: N/A" du -sh "$CLAUDE_DIR" 2>/dev/null || echo "Total: N/A" echo "" echo "=== Skills Count ===" find "$CLAUDE_DIR/skills" -name "SKILL.md" 2>/dev/null | wc -l | xargs echo "Skills:" find "$CLAUDE_DIR/commands" -name "*.md" 2>/dev/null | wc -l | xargs echo "Commands:" echo "" echo "=== Backup Directory ===" if [ -d "$BACKUP_ROOT" ]; then du -sh "$BACKUP_ROOT" ls -1 "$BACKUP_ROOT"/*.tar.gz 2>/dev/null | wc -l | xargs echo "Backup files:" else echo "No backups yet" fi } # Usage usage() { cat << EOF ClawdBot Backup Tool Usage: $(basename $0) <command> [options] Commands: backup [type] Create backup (types: full, skills, settings) restore <file> Restore from backup file list List available backups cleanup Remove old backups (keep last $MAX_BACKUPS) stats Show backup statistics help Show this help Examples: $(basename $0) backup # Full backup $(basename $0) backup skills # Skills only $(basename $0) restore latest.tar.gz $(basename $0) list $(basename $0) cleanup Environment: CLAWDBOT_BACKUP_DIR Backup directory (default: ~/clawdbot-backups) EOF } # Main main() { check_claude_dir case "${1:-help}" in backup) create_backup "${2:-full}" ;; restore) restore_backup "$2" ;; list) list_backups ;; cleanup) cleanup_backups ;; stats) show_stats ;; help|--help|-h) usage ;; *) log_error "Unknown command: $1" usage exit 1 ;; esac } main "$@"
# Save script cat > ~/.local/bin/clawdbot-backup << 'SCRIPT' # Paste script content here SCRIPT chmod +x ~/.local/bin/clawdbot-backup # Usage clawdbot-backup backup # Full backup clawdbot-backup backup skills # Skills only clawdbot-backup list # List backups clawdbot-backup restore <file> # Restore
cd ~/.claude # Initialize git git init # Create .gitignore cat > .gitignore << 'EOF' # Machine-specific settings settings.local.json # Cache and temp files cache/ *.tmp *.log # Large files *.tar.gz *.zip # Sensitive data (if any) *.pem *.key credentials/ EOF # Initial commit git add . git commit -m "Initial ClawdBot configuration backup"
# Add remote (GitHub, GitLab, etc) git remote add origin git@github.com:username/clawdbot-config.git # Push git push -u origin main
# After making changes to skills/settings cd ~/.claude git add . git commit -m "Updated skill: trading-bot" git push
#!/bin/bash # auto-commit-claude.sh - Auto commit changes cd ~/.claude || exit 1 # Check for changes if git diff --quiet && git diff --staged --quiet; then echo "No changes to commit" exit 0 fi # Get changed files for commit message CHANGED=$(git status --short | head -5 | awk '{print $2}' | tr '\n' ', ') git add . git commit -m "Auto-backup: $CHANGED ($(date +%Y-%m-%d))" git push 2>/dev/null || echo "Push failed (offline?)"
# On new device git clone git@github.com:username/clawdbot-config.git ~/.claude # Pull latest changes cd ~/.claude && git pull # Push local changes cd ~/.claude && git add . && git commit -m "Update" && git push
# Sync to remote server rsync -avz --delete \ ~/.claude/ \ user@server:~/clawdbot-backup/ # Sync from remote server rsync -avz --delete \ user@server:~/clawdbot-backup/ \ ~/.claude/
# Backup to cloud folder (Dropbox, Google Drive, etc) CLOUD_DIR="$HOME/Dropbox/ClawdBot" # Sync skills rsync -avz ~/.claude/skills/ "$CLOUD_DIR/skills/" rsync -avz ~/.claude/commands/ "$CLOUD_DIR/commands/" # Copy settings cp ~/.claude/settings.json "$CLOUD_DIR/"
#!/bin/bash # sync-clawdbot.sh - Sync ClawdBot config between devices SYNC_DIR="${CLAWDBOT_SYNC_DIR:-$HOME/Dropbox/ClawdBot}" CLAUDE_DIR="$HOME/.claude" sync_to_cloud() { echo "Syncing to cloud..." mkdir -p "$SYNC_DIR" rsync -avz --delete "$CLAUDE_DIR/skills/" "$SYNC_DIR/skills/" rsync -avz --delete "$CLAUDE_DIR/commands/" "$SYNC_DIR/commands/" rsync -avz "$CLAUDE_DIR/mcp/" "$SYNC_DIR/mcp/" 2>/dev/null cp "$CLAUDE_DIR/settings.json" "$SYNC_DIR/" 2>/dev/null echo "Sync complete!" } sync_from_cloud() { echo "Syncing from cloud..." rsync -avz "$SYNC_DIR/skills/" "$CLAUDE_DIR/skills/" rsync -avz "$SYNC_DIR/commands/" "$CLAUDE_DIR/commands/" rsync -avz "$SYNC_DIR/mcp/" "$CLAUDE_DIR/mcp/" 2>/dev/null # Don't overwrite local settings by default if [ ! -f "$CLAUDE_DIR/settings.json" ]; then cp "$SYNC_DIR/settings.json" "$CLAUDE_DIR/" 2>/dev/null fi echo "Sync complete!" } case "$1" in push) sync_to_cloud ;; pull) sync_from_cloud ;; *) echo "Usage: $0 {push|pull}" echo " push - Upload local config to cloud" echo " pull - Download cloud config to local" ;; esac
# Edit crontab crontab -e # Add daily backup at 2 AM 0 2 * * * /home/user/.local/bin/clawdbot-backup backup full # Add weekly cleanup on Sundays 0 3 * * 0 /home/user/.local/bin/clawdbot-backup cleanup # Add git auto-commit every 6 hours 0 */6 * * * cd ~/.claude && git add . && git commit -m "Auto-backup $(date +\%Y-\%m-\%d)" && git push 2>/dev/null
# Create service: ~/.config/systemd/user/clawdbot-backup.service cat > ~/.config/systemd/user/clawdbot-backup.service << 'EOF' [Unit] Description=ClawdBot Backup [Service] Type=oneshot ExecStart=/home/user/.local/bin/clawdbot-backup backup full EOF # Create timer: ~/.config/systemd/user/clawdbot-backup.timer cat > ~/.config/systemd/user/clawdbot-backup.timer << 'EOF' [Unit] Description=Daily ClawdBot Backup [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target EOF # Enable systemctl --user enable clawdbot-backup.timer systemctl --user start clawdbot-backup.timer
# Create plist: ~/Library/LaunchAgents/com.clawdbot.backup.plist cat > ~/Library/LaunchAgents/com.clawdbot.backup.plist << 'EOF' <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.clawdbot.backup</string> <key>ProgramArguments</key> <array> <string>/Users/username/.local/bin/clawdbot-backup</string> <string>backup</string> <string>full</string> </array> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>2</integer> <key>Minute</key> <integer>0</integer> </dict> </dict> </plist> EOF # Load launchctl load ~/Library/LaunchAgents/com.clawdbot.backup.plist
# === On OLD machine === # 1. Create full backup clawdbot-backup backup full # 2. Copy backup file to new machine scp ~/clawdbot-backups/clawdbot_full_*.tar.gz newmachine:~/ # Or use git cd ~/.claude git add . && git commit -m "Pre-migration backup" git push # === On NEW machine === # Method A: From backup file tar -xzvf ~/clawdbot_full_*.tar.gz -C ~ # Method B: From git git clone git@github.com:username/clawdbot-config.git ~/.claude # 3. Verify ls -la ~/.claude/skills/
# Export one skill for sharing SKILL_NAME="my-awesome-skill" tar -czvf "${SKILL_NAME}.tar.gz" -C ~/.claude/skills "$SKILL_NAME" # Import skill tar -xzvf "${SKILL_NAME}.tar.gz" -C ~/.claude/skills/
# Create shareable skills bundle (no personal settings) tar -czvf clawdbot-skills-share.tar.gz \ -C ~/.claude \ skills \ --exclude='*.local*' \ --exclude='*personal*'
# Test backup without extracting tar -tzvf backup.tar.gz > /dev/null && echo "Backup OK" || echo "Backup CORRUPT" # List contents tar -tzvf backup.tar.gz # Verify specific file exists tar -tzvf backup.tar.gz | grep "skills/my-skill/SKILL.md"
# Extract to temp dir TEMP_DIR=$(mktemp -d) tar -xzf backup.tar.gz -C "$TEMP_DIR" # Compare diff -rq ~/.claude/skills "$TEMP_DIR/.claude/skills" # Cleanup rm -rf "$TEMP_DIR"
# Issue: Permission denied chmod -R u+rw ~/.claude # Issue: Backup too large # Exclude cache and logs tar --exclude='cache' --exclude='*.log' -czvf backup.tar.gz ~/.claude # Issue: Restore overwrote settings # Keep settings.local.json for machine-specific config # It won't be overwritten if using proper backup # Issue: Git conflicts after sync cd ~/.claude git stash git pull git stash pop # Resolve conflicts manually if needed
# If ~/.claude is corrupted # 1. Move corrupted dir mv ~/.claude ~/.claude.corrupted # 2. Restore from backup clawdbot-backup restore latest.tar.gz # 3. Or restore from git git clone git@github.com:username/clawdbot-config.git ~/.claude # 4. Compare and recover anything missing diff -rq ~/.claude ~/.claude.corrupted/
# Backup tar -czvf ~/clawdbot-backup.tar.gz -C ~ .claude/skills .claude/commands .claude/settings.json # Restore tar -xzvf ~/clawdbot-backup.tar.gz -C ~ # List backup contents tar -tzvf ~/clawdbot-backup.tar.gz # Git backup cd ~/.claude && git add . && git commit -m "Backup" && git push # Git restore cd ~/.claude && git pull
Before major changes: โก Create backup โก Verify backup integrity โก Note what you're changing Regular maintenance: โก Weekly full backup โก Daily git commits (if using) โก Monthly cleanup of old backups โก Test restore procedure quarterly
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.