DEV Community

anicca
anicca

Posted on

I Migrated My AI Agent from VPS to Mac Mini — 43 Cron Jobs Broke

TL;DR

I run an autonomous AI agent called "Anicca" using OpenClaw. After migrating from Linux VPS (/home/anicca) to Mac Mini (/Users/anicca), all 43 cron jobs stopped working correctly. The root cause wasn't hardcoded paths — it was delivery.mode: "announce" on every single job.

Background

Anicca handles 43 scheduled tasks: morning metrics reports, Twitter/X posts, Slack notifications, user nudges, and more. I moved it from a rented Linux VPS to a Mac Mini at home to cut costs and reduce latency.

What Broke

After migration, cron jobs were completing without errors but results weren't appearing correctly in Slack. Messages were garbled, formatted differently than expected, or duplicated.

I initially blamed hardcoded /home/anicca paths — the VPS user home and Mac Mini user home are different. While that was a real issue in some shell scripts, it wasn't the primary cause.

Root Cause: delivery.mode: "announce"

After inspecting cron/jobs.json, I found every one of the 43 jobs had:

{
  "delivery": {
    "mode": "announce"
  }
}
Enter fullscreen mode Exit fullscreen mode

OpenClaw has two delivery modes:

Mode Behavior
announce Automatically posts the agent's full response to Slack. No format control.
none No auto-posting. The skill itself handles Slack delivery via exec.

In announce mode, the agent dumps its entire reasoning chain — including intermediate thinking steps — into Slack. On the VPS this was hidden because the session context kept things tidy. After migration with a fresh session, everything flooded through.

The fix was a single jq command across all 43 jobs:

jq '.jobs |= map(.delivery.mode = "none")' \
  ~/.openclaw/cron/jobs.json > /tmp/jobs_fixed.json
mv /tmp/jobs_fixed.json ~/.openclaw/cron/jobs.json
Enter fullscreen mode Exit fullscreen mode

Each skill's SKILL.md already had explicit Slack posting via exec, so changing the mode was all it took.

Bonus Bug: Blotato API Endpoint Changed

The x-poster skill was failing with NXDOMAIN:

ERROR: api.blotato.com: NXDOMAIN
Enter fullscreen mode Exit fullscreen mode

Blotato, the service I use for Twitter/X posting, changed their API base URL without notice:

Status Endpoint
Deprecated (NXDOMAIN) https://api.blotato.com
Current https://backend.blotato.com/v2

One line change in SKILL.md fixed it.

Key Takeaways

Lesson Detail
announce mode is for debugging only All production cron jobs should use none
External API endpoints change silently Always verify endpoints during migration
Keep the old server as hot standby 3 commands to failover: systemctl --user start openclaw-gateway
Use jq for JSON bulk edits Safer than sed for structured data

Current Architecture

Me (anywhere)
    ↓ openclaw tui
Mac Mini (home) ← Anicca running (43 cron jobs)
    Failover:
    VPS (46.225.70.241) ← Stopped, enabled, ready to start in seconds
Enter fullscreen mode Exit fullscreen mode

The migration took 2 days. The delivery.mode discovery was the most valuable insight — a problem that existed on VPS but was hidden by accumulated session context. Scale reveals all sins.

Top comments (0)