name: setup-ghostclaw description: First-time GhostClaw setup. Handles dependencies, authentication, channel configuration, main chat registration, soul building, and service setup. Use this for all new installs.
GhostClaw Setup
Interactive setup for a fresh GhostClaw install. Handles everything from dependencies to personality.
Phase 1: Dependencies
npm install
Check Node.js version:
node --version # Must be 20+
Phase 2: Authentication
Claude Code token
Ask: "Do you have a Claude Max subscription or an API key?"
Claude Max (recommended): Tell the user to run this in a separate terminal (not inside Claude Code):
claude setup-token
Then ask them to paste the token. Add to .env:
CLAUDE_CODE_OAUTH_TOKEN=<token>
API key:
ANTHROPIC_API_KEY=<key>
Model selection
AskUserQuestion: Which model should the bot use?
- Sonnet (Recommended) — fast, capable, cost-effective for most tasks
- Opus — most capable, slower, higher cost
- Haiku — fastest, cheapest, good for simple tasks
Add to .env based on choice:
GHOSTCLAW_MODEL=claude-sonnet-4-6 # Sonnet (recommended)
# GHOSTCLAW_MODEL=claude-opus-4-6 # Opus
# GHOSTCLAW_MODEL=claude-haiku-4-5-20251001 # Haiku
If they skip or aren't sure, default to Sonnet. Tell them: "You can change this any time by editing GHOSTCLAW_MODEL in .env and restarting."
Bot name
AskUserQuestion: What should the bot be called?
Add to .env:
ASSISTANT_NAME=<name>
Phase 3: Channels
AskUserQuestion: Which channels do you want?
- Telegram only (recommended — bot gets own identity)
- WhatsApp only
- Both
Telegram setup
If Telegram selected:
Tell the user:
Create a Telegram bot:
- Open @BotFather in Telegram
- Send /newbot
- Pick a name and username
- Copy the token
Add to
.env:TELEGRAM_BOT_TOKEN=<token>If Telegram-only, add:
TELEGRAM_ONLY=true
WhatsApp setup
If WhatsApp selected:
- Run the app temporarily to get QR code:
npm run build && node dist/index.js - Scan QR code with WhatsApp
- Stop the process (Ctrl+C)
Phase 4: Build and start
npm run build
Service setup
AskUserQuestion: Set up as a background service? (Yes / No, I'll run it manually)
If yes, detect OS:
macOS:
Read the template from launchd/com.ghostclaw.plist. Replace the {{...}} placeholders with actual values:
{{NODE_PATH}}→ result ofwhich node{{PROJECT_ROOT}}→ absolute path to the GhostClaw directory (e.g./Users/username/ghostclaw){{HOME}}→ user's home directory (e.g./Users/username){{ASSISTANT_NAME}}→ the bot name from.env
Write the resolved plist to ~/Library/LaunchAgents/com.ghostclaw.plist.
mkdir -p PROJECT_ROOT/logs
launchctl load ~/Library/LaunchAgents/com.ghostclaw.plist
Linux: Create systemd user service and enable it.
Phase 5: Register main chat
Start the service and wait for connection.
Telegram: Tell the user to send /chatid to their bot. They'll get back tg:XXXXXXX. Register it:
node -e "
const { initDatabase, setRegisteredGroup } = require('./dist/db.js');
initDatabase();
setRegisteredGroup('CHAT_JID', {
name: 'BOTNAME Main',
folder: 'main',
trigger: '@BOTNAME',
added_at: new Date().toISOString(),
requiresTrigger: false,
});
console.log('Main group registered');
"
Create group directory:
mkdir -p groups/main/logs
Restart the service.
Phase 6: Soul building (onboarding)
This is what makes GhostClaw different. After the bot is running, build its personality.
AskUserQuestion: "Tell me about yourself — what do you do, what are you building, what matters to you? (A few sentences is fine)"
AskUserQuestion: "How do you like AI to communicate? Pick what resonates:"
- Direct and short — no fluff
- Detailed and thorough
- Casual and conversational
- Technical and precise
AskUserQuestion: "Any words, phrases, or patterns you hate in AI responses? (e.g. 'leverage', emoji, 'Great question!')"
AskUserQuestion: "What should the bot proactively help with?"
- Email monitoring
- News/trend watching
- Code review reminders
- Morning briefings
- Nothing — just respond when asked
Generate the soul
If groups/main/CLAUDE.md doesn't exist yet, copy the template first:
cp groups/main/CLAUDE.md.template groups/main/CLAUDE.md
Then customise groups/main/CLAUDE.md based on the user's answers. The template provides the base structure — overwrite the placeholder sections with:
- Identity section — bot name, what it does
- Soul section — communication style, banned patterns, user context
- Capabilities section — what it can do (tools, scheduling, web access)
- Admin section — file paths, group management, IPC instructions
Use the answers to craft specific instructions. Examples:
If "direct and short":
Don't over-explain. Short answers. Show the work, don't narrate it. Two lines, not ten.
If banned words provided:
Never use these words: [list]. No filler. Write like Orwell.
Write memory seed files
Based on user description, create initial memory files:
groups/main/about-user.md— what they told you about themselvesgroups/main/preferences.md— communication and tool preferences
Phase 7: Heartbeat (always set up)
The heartbeat is core to GhostClaw — it's what makes the agent proactive rather than reactive.
Create HEARTBEAT.md
Create groups/main/HEARTBEAT.md with a basic checklist. Ask the user what they'd like monitored — suggest:
- GhostClaw error log checks
- Disk space monitoring
- Email checks (if Gmail is set up)
- Any URLs or services they want pinged
Register the heartbeat task
mkdir -p data/ipc/main/tasks
cat > "data/ipc/main/tasks/heartbeat_$(date +%s).json" << 'EOF'
{
"type": "schedule_task",
"prompt": "Read $GHOSTCLAW_GROUP_DIR/HEARTBEAT.md (or ./HEARTBEAT.md in the current directory) and run each check listed. Only message the user if something needs attention. If everything is fine, respond with <internal>All checks passed</internal> and nothing else.",
"schedule_type": "cron",
"schedule_value": "*/30 * * * *",
"context_mode": "isolated"
}
EOF
Tell the user: "Heartbeat is running. It checks every 30 minutes and only messages you if something needs attention. Edit groups/main/HEARTBEAT.md any time to add or remove checks."
Phase 8: Verify
Tell the user to send a message to the bot. Check logs to confirm it responds.
tail -20 logs/ghostclaw.log | grep -E "Processing|Agent output|error"
If working: "You're set. Talk to BOTNAME — it knows who you are."
Phase 9: Optional extras
After core setup, offer optional extras. Use AskUserQuestion with multiSelect:
/add-update-check— weekly check for GhostClaw updates (recommended)/add-morning-briefing— scheduled daily/weekly briefings/add-gmail-agent— email access for the bot (needs Google Cloud OAuth)/add-voice-transcription— voice note transcription (needs ElevenLabs key)/add-voice-reply— bot replies with voice notes via ElevenLabs (needs ElevenLabs key)
Run each selected skill in sequence. If none selected, skip — they can always add these later.
After setup, let the user know about the community:
Join the OpenClawOS community on Telegram to share feedback, get help, or see what others are building.