원클릭으로
setup
Run initial NanoClaw setup for Codex. Use for first-time install, WhatsApp auth, main channel registration, and launchd service start.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Run initial NanoClaw setup for Codex. Use for first-time install, WhatsApp auth, main channel registration, and launchd service start.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Legacy compatibility wrapper. Canonical skill lives in .codex/skills/add-gmail/SKILL.md.
Legacy compatibility wrapper. Canonical skill lives in .codex/skills/add-parallel/SKILL.md.
Legacy compatibility wrapper. Canonical skill lives in .codex/skills/add-telegram/SKILL.md.
Legacy compatibility wrapper. Canonical skill lives in .codex/skills/add-telegram-swarm/SKILL.md.
Legacy compatibility wrapper. Canonical skill lives in .codex/skills/add-voice-transcription/SKILL.md.
Legacy compatibility wrapper. Canonical skill lives in .codex/skills/convert-to-docker/SKILL.md.
| name | setup |
| description | Run initial NanoClaw setup for Codex. Use for first-time install, WhatsApp auth, main channel registration, and launchd service start. |
Run commands directly. Pause only when user action is required (QR scan, runtime install, auth choice).
npm install
echo "Platform: $(uname -s)"
which container && echo "Apple Container: installed" || echo "Apple Container: not installed"
which docker && docker info >/dev/null 2>&1 && echo "Docker: installed and running" || echo "Docker: not installed or not running"
/convert-to-docker workflow before continuing).If Apple Container is missing, ask user to install from:
Then verify:
container system start
container --version
Ask user which path they want:
.envTell user to run in another terminal:
codex login
Then proceed. NanoClaw will copy host ~/.codex/auth.json into each isolated group session directory automatically.
Create .env with one of:
echo 'OPENAI_API_KEY=' > .env
# or
echo 'CODEX_API_KEY=' > .env
Optional overrides (only if needed):
cat >> .env << 'EOF_ENV'
OPENAI_BASE_URL=
OPENAI_ORG_ID=
OPENAI_PROJECT_ID=
EOF_ENV
Validate:
grep -E '^(OPENAI_API_KEY|CODEX_API_KEY)=' .env || echo "No key configured"
./container/build.sh
Smoke test:
if which docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
echo '{}' | docker run -i --entrypoint /bin/echo nanoclaw-agent:latest "Container OK"
else
echo '{}' | container run -i --entrypoint /bin/echo nanoclaw-agent:latest "Container OK"
fi
User action required:
npm run auth
Wait for successful auth output.
Ask user for trigger word (default Andy).
requiresTrigger: false.Build once and briefly run app so WhatsApp groups are synced:
npm run build
npm run dev
If user uses group main channel, query recent groups:
sqlite3 store/messages.db "SELECT jid, name FROM chats WHERE jid LIKE '%@g.us' AND jid != '__group_sync__' ORDER BY last_message_time DESC LIMIT 40"
Write/update data/registered_groups.json with the selected main chat JID and trigger.
Use this shape for personal chat (no trigger required):
{
"JID_HERE": {
"name": "main",
"folder": "main",
"trigger": "@ASSISTANT_NAME",
"added_at": "CURRENT_ISO_TIMESTAMP",
"requiresTrigger": false
}
}
Ensure folders exist:
mkdir -p groups/main/logs
If assistant name changed, update both files:
groups/global/AGENTS.mdgroups/main/AGENTS.md(Keep legacy CLAUDE.md files aligned if they exist.)
If user wants external folder access, create/update:
~/.config/nanoclaw/mount-allowlist.json
Default safe template:
mkdir -p ~/.config/nanoclaw
cat > ~/.config/nanoclaw/mount-allowlist.json << 'EOF_ALLOW'
{
"allowedRoots": [],
"blockedPatterns": [],
"nonMainReadOnly": true
}
EOF_ALLOW
NODE_PATH=$(which node)
PROJECT_PATH=$(pwd)
HOME_PATH=$HOME
cat > ~/Library/LaunchAgents/com.nanoclaw.plist << EOF_PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.nanoclaw</string>
<key>ProgramArguments</key>
<array>
<string>${NODE_PATH}</string>
<string>${PROJECT_PATH}/dist/index.js</string>
</array>
<key>WorkingDirectory</key>
<string>${PROJECT_PATH}</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:${HOME_PATH}/.local/bin</string>
<key>HOME</key>
<string>${HOME_PATH}</string>
</dict>
<key>StandardOutPath</key>
<string>${PROJECT_PATH}/logs/nanoclaw.log</string>
<key>StandardErrorPath</key>
<string>${PROJECT_PATH}/logs/nanoclaw.error.log</string>
</dict>
</plist>
EOF_PLIST
npm run build
mkdir -p logs
launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist
launchctl list | grep nanoclaw
Tell user to send:
hello@ASSISTANT_NAME helloWatch logs:
tail -f logs/nanoclaw.log
logs/nanoclaw.error.loggroups/main/logs/container-*.logcodex login or add OPENAI_API_KEY/CODEX_API_KEY in .envnpm run auth, then restart service:launchctl kickstart -k gui/$(id -u)/com.nanoclaw