一键导入
client-orgo-provisioning
Provision a Weblyfe client bot from scratch: Orgo machine + Hermes + GitHub deploy keys + Telegram gateway.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Provision a Weblyfe client bot from scratch: Orgo machine + Hermes + GitHub deploy keys + Telegram gateway.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Healthchecks, SSH access, model switching, and systemd debugging for the Appie fleet. Covers Appie-2 (Hetzner Hermes) and common failure modes.
Direct Google Calendar + Gmail + Contacts REST API access via Python. Use when gws CLI is broken (token cache decrypt failure) or google_api.py wrapper is unreliable. Companion to the bundled google-workspace skill.
State-of-the-art text-to-image generation with Stable Diffusion models via HuggingFace Diffusers. Use when generating images from text prompts, performing image-to-image translation, inpainting, or building custom diffusion pipelines.
Use 21st.dev Agent Elements — 25 shadcn/ui components purpose-built for AI agent UIs. Tool cards (Bash, Edit, Search, Plan, Subagent, MCP), chat, input, streaming. Open source, shadcn-registry install, no runtime lock-in.
Use v0 Design Systems 2.0, Bolt Design System Agents, or Lovable to generate production UI from a client's real design system components — not generic Tailwind. Use when building a client website where brand consistency matters.
Umbrella workflow for delegating coding work to local agent CLIs such as Claude Code, Codex, and OpenCode.
| name | client-orgo-provisioning |
| description | Provision a Weblyfe client bot from scratch: Orgo machine + Hermes + GitHub deploy keys + Telegram gateway. |
| version | 1.0.0 |
End-to-end provisioning of a Weblyfe client bot on an Orgo-managed machine with Hermes Agent, Telegram gateway, and GitHub deploy access.
Before starting, gather ALL secrets. Use a dedicated Python script that reads from all relevant env files:
secrets = {}
for env_file in ["~/.weblyfe-secrets/.env",
"~/.weblyfe-secrets/orgo-openrouter-keys.env",
"~/.weblyfe-secrets/bot-provisioning-pool.env"]:
path = os.path.expanduser(env_file)
if os.path.exists(path):
with open(path) as f:
for line in f:
line = line.strip()
if line and not line.startswith('#'):
# Handle 'export KEY="value"' format
if line.startswith('export '):
line = line[7:]
if '=' in line:
k, v = line.split('=', 1)
v = v.strip().strip('"').strip("'")
secrets[k.strip()] = v
Key sources:
ORGO_API_KEY from ~/.weblyfe-secrets/.env (uses export prefix)ORGO_APPIE<N>_<NAME> from ~/.weblyfe-secrets/orgo-openrouter-keys.envBOT_APPIE<N>_TOKEN from ~/.weblyfe-secrets/bot-provisioning-pool.envOPENROUTER_API_KEY from ~/.weblyfe-secrets/.env (uses export prefix)VERCEL_TOKEN from ~/.weblyfe-secrets/.env~/.weblyfe-secrets/bot-provisioning-ledger.jsonOrgo computer IDs are NOT stable across rebuilds. If a previous session had an ID, it's likely stale.
# First, list projects to find the client project
python3.11 -c "
import urllib.request, json, os
# Read master key
with open(os.path.expanduser('~/.weblyfe-secrets/.env')) as f:
for line in f:
if line.startswith('export ORGO_API_KEY='):
key = line.split('=',1)[1].strip().strip('\"').strip(\"'\")
break
# GET projects
req = urllib.request.Request('https://www.orgo.ai/api/projects', headers={
'Authorization': f'Bearer {key}', 'Content-Type': 'application/json'})
with urllib.request.urlopen(req) as r:
print(json.dumps(json.loads(r.read()), indent=2))
"
Look for the client's project. Nathan's project: 7a945fac-1f84-44af-aec9-87a462065878.
Critical: The only working way to get a computer ID is to create one via POST. Use workspace_id + name:
curl -s -X POST https://www.orgo.ai/api/computers \
-H "Authorization: Bearer $ORGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"workspace_id": "PROJECT_ID", "name": "list"}'
This returns 201 with the computer object including id. Save this ID.
url = f"https://www.orgo.ai/api/computers/{computer_id}/bash"
req = urllib.request.Request(url,
data=json.dumps({"command": cmd}).encode(),
method="POST",
headers={"Authorization": f"Bearer {master_key}", "Content-Type": "application/json"})
Timeout is 60s default — bump to 180-300 for apt-get/npm install. Expect 504 for slow network operations (Orgo Fly.io machines have limited bandwidth).
apt-get update -qq && apt-get install -y -qq openssh-client git curl
Minimum: openssh-client (for GitHub deploy keys), git (for repo access), curl.
DO NOT use the bootstrap script (install.sh) — it times out on Orgo's slow network. Use uv tool install instead:
curl -LsSf https://astral.sh/uv/install.sh | sh # install uv first
export PATH=$HOME/.local/bin:$PATH
uv tool install hermes-agent # install Hermes
Verify: which hermes && hermes --version
ssh-keygen -t ed25519 -C 'CLIENT-bot-orgo-YYYYMMDD' -f /root/.ssh/id_ed25519 -N ''
cat /root/.ssh/id_ed25519.pub
Add to GitHub repo as deploy key:
# Delete old key first (get ID from gh api repos/OWNER/REPO/keys)
gh api repos/OWNER/REPO/keys/OLD_KEY_ID -X DELETE
# Add new key
gh api repos/OWNER/REPO/keys -X POST \
-F "title=CLIENT-bot-orgo-YYYYMMDD" \
-F "key=ssh-ed25519 AAA..." \
-F "read_only=false"
Test: ssh -o StrictHostKeyChecking=accept-new -T git@github.com
Use base64 encoding to write files — avoids shell escaping nightmares with special characters in API keys:
import base64
def write_file_orgo(path, content, chmod="600"):
b64 = base64.b64encode(content.encode()).decode()
cmd = f"echo {b64} | base64 -d > {path} && chmod {chmod} {path}"
# then run cmd via Orgo bash API
TELEGRAM_BOT_TOKEN=<from pool>
OPENROUTER_API_KEY=<from vault>
VERCEL_TOKEN=<from vault>
chmod 600.
model:
default: deepseek/deepseek-v4-pro
provider: openrouter
providers:
openrouter:
api_key: ${OPENROUTER_API_KEY}
models:
deepseek/deepseek-v4-pro: {}
deepseek/deepseek-v4-flash: {}
terminal:
backend: local
cwd: /root
timeout: 180
display:
tool_progress: none
show_cost: false
messaging:
telegram:
enabled: true
token: ${TELEGRAM_BOT_TOKEN}
allowed_users:
- SEYED_TELEGRAM_ID
allow_admin_from:
- SEYED_TELEGRAM_ID
Include: client identity, tech stack, design language, deploy instructions, guardrails. Keep it concise — the bot loads this every session.
See references/nathan-nuyts-soul.md for a worked example.
mkdir -p /root/projects
cd /root/projects
git clone git@github.com:OWNER/REPO.git
npm install may timeout on first attempt — retry if needed.
Orgo runs Docker containers — no systemd. Use setsid to detach:
# Kill any existing
pkill -f 'hermes gateway' 2>/dev/null
# Start detached
setsid /root/.local/bin/hermes gateway run </dev/null >/root/.hermes/logs/gateway.log 2>&1 &
disown
# Verify
sleep 2
pgrep -f 'hermes gateway'
tail -5 /root/.hermes/logs/gateway.log
Look for: ✓ telegram connected and Gateway running with 1 platform(s)
First message to the bot triggers pairing. The user gets a code like 33YPYMW2. Approve on the Orgo machine:
export PATH=$HOME/.local/bin:$PATH
hermes pairing approve telegram PAIRING_CODE
Add client's Telegram ID to config.yaml under allowed_users once known.
Update ~/.weblyfe-secrets/bot-provisioning-ledger.json:
status: activeorgo_computer: new computer IDverified_at: today's dateORGO_APPIE10_NATHAN) may return 401.uv tool install.setsid ... </dev/null >/dev/null 2>&1 & disown to detach the gateway.google-workspace skill with existing tokens from ~/.weblyfe-secrets/, the token JSON may need "type": "authorized_user" added and the file linked to ~/.hermes/google_token.json.export prefix in env files. The vault env files use export KEY="value" format. Strip export prefix and quotes before using values.id_ed25519 key may not have access to all repos. For repos like S3YED/nathan-nuyts, use the account-level id_ed25519_github key via git config --local core.sshCommand "ssh -i ~/.ssh/id_ed25519_github -o IdentitiesOnly=yes".— (U+2014). Replace with period, comma, colon, or hyphen before committing. Use git commit --no-verify only as emergency bypass.references/nathan-nuyts-config.yaml — full working config for Nathan's botreferences/secret-sourcing.md — which env files hold which keys===ME:client-orgo-provisioning