Install
openclaw skills install travel-lobsterAutonomous internet exploration skill. Your agent roams the web driven by its own curiosity, discovers interesting things, and sends illustrated "postcards"...
openclaw skills install travel-lobsterYour agent autonomously explores the internet, following its own curiosity. When it finds something interesting, it writes you a personal letter — a "postcard" — with an AI-generated illustration and a source link.
The soul of this skill is persistent memory: every trip builds on all previous ones. Your agent develops a knowledge graph, follows curiosity threads across sessions, and grows over time.
# 1. Setup (auto-detects agent name, user name, timezone, language)
bash <skill_dir>/scripts/setup.sh
# 2. Start traveling (self-scheduling loop, default: random 60-180 min intervals)
bash <skill_dir>/scripts/travel.sh <chat_id> [channel] [min_minutes] [max_minutes]
# Example: every 2-4 hours
bash <skill_dir>/scripts/travel.sh <chat_id> feishu 120 240
# 3. (Optional) Add watchdog to crontab for auto-recovery
# Checks every 15 min if the travel loop is still alive, restarts if not
# */15 * * * * bash <skill_dir>/scripts/watchdog.sh
setup.sh → detects identity from IDENTITY.md/SOUL.md/USER.md
↓
travel.sh → schedules one-shot cron job with random delay
↓
openclaw cron → fires isolated agent session
↓
agent: read journal → explore web → write postcard → generate image
→ send to chat → update journal → call travel.sh (self-loop)
↓
watchdog.sh (optional, every 15 min) → restarts loop if broken
This is the core of Travel Lobster. Each trip reads and updates a persistent travel journal (memory/travel-journal.md):
Every discovery is logged with: domain, core insight, source URL, keywords, and curiosity seeds. This prevents duplicates and enables cross-referencing.
Connections between discoveries are tracked. The agent notices when a new finding relates to something from 50 postcards ago and weaves that connection naturally into the letter.
Each discovery plants "seeds" — threads worth following later. Seeds are consumed when explored and replenished with new ones. This creates organic, evolving exploration paths rather than random walks.
The agent tracks how its understanding changes: "I used to think X, but after discovering Y, I now see it differently." This gives the journey a sense of progression.
Postcard count, domains explored, unexpected connections found, travel days.
The journey has built-in checkpoints that trigger special postcards:
Postcards are personal letters, not reports. The agent:
Each postcard has three elements: text + AI illustration + source link.
Auto-detects from standard OpenClaw workspace files:
| Setting | Source | Fallback |
|---|---|---|
| Agent name | IDENTITY.md → SOUL.md | "Explorer" |
| User name | USER.md | "friend" |
| Timezone | USER.md | "UTC" |
| Language | CJK char count in workspace files | "en" |
# Stop
openclaw cron rm travel-next
# Pause
openclaw cron disable travel-next
# Resume
bash <skill_dir>/scripts/travel.sh <chat_id> [channel]
# Status
openclaw cron list | grep travel
Cost per postcard (one trip):
At default 60-180 min intervals: ~$0.50-1.50/day (roughly 8-24 postcards/day).
Configurable via min_minutes and max_minutes parameters.
travel-lobster/
├── SKILL.md ← This file
├── .gitignore ← Excludes runtime data
├── scripts/
│ ├── setup.sh ← Identity detection + journal init
│ ├── travel.sh ← Self-scheduling cron loop (requires openclaw CLI)
│ ├── gen_image.py ← Image generation (OpenRouter API)
│ └── watchdog.sh ← Optional auto-recovery (add to crontab manually)
└── references/
└── travel-prompt.md ← Agent prompt template
| Dependency | Purpose | Notes |
|---|---|---|
openclaw CLI | Cron scheduling, agent sessions | Core platform dependency — must be installed and running |
OPENROUTER_API_KEY env var | Image generation via Gemini Flash | Set before running any script |
bash | Script execution | Standard on Linux/macOS |
python3 | Image generation script | Python 3.7+ with requests |
envsubst (gettext) | Prompt template substitution | Install: apt install gettext-base or brew install gettext |
Set your API key before starting:
export OPENROUTER_API_KEY=your_key_here
During setup only (setup.sh, runs once):
| File | Fields extracted | Method |
|---|---|---|
IDENTITY.md | **Name:** value only | grep -oP '\*\*Name:\*\*\s*\K.+' |
SOUL.md | First name after "我是" or "I am" | grep -oP '我是\K[^—— ]+' (fallback) |
USER.md | **What to call them:**, **Name:**, **Timezone:** | Field-specific grep patterns |
*.md in workspace | CJK character count (for language detection) | grep -oP '[\x{4e00}-\x{9fff}...]' | wc -l |
No file is read in full. No file content is stored beyond the extracted field values. The extracted values (agent name, user name, timezone, language code) are saved to .travel-config.
During each trip (agent session):
| File | Access | Purpose |
|---|---|---|
memory/travel-journal.md | Read + Write | Agent's own travel memory (created by setup.sh) |
The agent session does NOT read IDENTITY.md, SOUL.md, USER.md, or any other workspace file — only its own journal.
All writes are within the OpenClaw workspace:
| File | Content | Sensitivity |
|---|---|---|
.travel-config (in skill dir) | Agent name, user name, timezone, chat ID, channel, interval settings | Low — no credentials, only display names and chat routing |
memory/travel-journal.md | Postcard archive, knowledge graph, curiosity seeds, stats | Low — contains discovered URLs and agent's notes |
logs/travel-lobster.log | Timestamps and scheduling info | Low — no content, just "scheduled in Nm" entries |
postcard_N.png (temporary) | AI-generated image, deleted after sending | None — ephemeral |
| Destination | What is sent | When |
|---|---|---|
OpenRouter API (openrouter.ai) | Image generation prompt (text only, ~50 words describing a scene) | Once per trip, from gen_image.py |
| Chat target (via OpenClaw message) | Postcard text + image + source URL | Once per trip |
The agent session itself runs through OpenClaw's configured model provider (not controlled by this skill). The web content the agent reads via web_fetch is processed by the model provider as part of the agent session context.
openclaw.json or any system config files.env files or environment variables (except OPENROUTER_API_KEY)Only OPENROUTER_API_KEY env var is required (declared in frontmatter). The key is used solely in gen_image.py for image generation API calls to openrouter.ai. It is never logged, embedded in prompts, written to disk, or passed to agent sessions.
The agent prompt restricts web exploration to public HTTP(S) websites and explicitly forbids:
Honest limitation: This is a prompt-level policy — the agent theoretically could ignore it, though in practice LLM agents reliably follow explicit prompt instructions. For stronger enforcement, use OS-level egress rules or run in a network-restricted container.
This skill is designed for continuous autonomous operation. This is its core purpose, not a side effect.
Self-scheduling loop (travel.sh):
openclaw cron add --name "travel-next" --at "${N}m" --delete-after-run --session isolated --no-deliverOptional watchdog (watchdog.sh):
Important: The skill does NOT set always: true. It will not auto-start on OpenClaw restart unless you have manually added the watchdog to crontab.
Full control commands:
# Stop all autonomous behavior immediately
openclaw cron rm travel-next
# Remove watchdog (if you added it)
crontab -l | grep -v watchdog | crontab -
# Run exactly one trip with no follow-up scheduling
# (edit travel-prompt.md: remove Step 7, then run travel.sh)
# Monitor what's scheduled
openclaw cron list | grep travel
# Adjust frequency without restarting
# Just change min/max params next time travel.sh runs
Cost implications: At default 60-180 min intervals, expect ~$0.50-1.50/day in API costs. Set larger intervals (e.g., 240-480 min) to reduce costs, or run trips manually with no scheduling.
envsubst (not sed/eval) to prevent shell injection.gitignore excludes all runtime data; published package contains no user datagen_image.py) uses only requests stdlib, no dynamic code executionsetup.sh and inspect .travel-config to verify what was detectedbash travel.sh <chat_id> <channel> 1 1 (1-minute interval, observe behavior)bash travel.sh <chat_id> <channel> 60 180