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"
}
}
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
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
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
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)