First-time GhostClaw setup. Handles dependencies, authentication, channel configuration, main chat registration, soul building, and service setup. Run this instead of NanoClaw's /setup.
Interactive setup for a fresh GhostClaw install. Handles everything from dependencies to personality.
npm install
Check Node.js version:
node --version # Must be 20+
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>
AskUserQuestion: Which model should the bot use?
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."
AskUserQuestion: What should the bot be called?
Add to .env:
ASSISTANT_NAME=<name>
AskUserQuestion: Which channels do you want?
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
If WhatsApp selected:
npm run build && node dist/index.js
npm run build
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 of which 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 .envWrite 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.
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.
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:"
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?"
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:
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.
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 preferencesThe heartbeat is core to GhostClaw — it's what makes the agent proactive rather than reactive.
Create groups/main/HEARTBEAT.md with a basic checklist. Ask the user what they'd like monitored — suggest:
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."
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."
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.
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer