packages/skills/skills/mk0r-cli/SKILL.md
Use when the user says "mk0r", "appmaker CLI", "open a VM", "run something in the sandbox", "talk to the VM agent", "spin up an E2B sandbox", or "chat with appmaker from CLI." Wraps the `mk0r` CLI to list projects, exec commands inside their E2B sandboxes, stream chat with the VM agent (same `/api/chat` the web UI uses), toggle SOAX residential IP, manage schedules, and copy files. Supports a sticky default project via `mk0r projects use`.
npx skillsauth add mediar-ai/skillhubz mk0r-cliInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
The mk0r CLI is the programmatic entry point to appmaker (mk0r.com / staging.mk0r.com). Each project = one E2B sandbox with a persistent Chromium on CDP :9222 + Playwright MCP on :3001 + an ACP bridge on :3002, all routed through a SOAX residential proxy on :3003 when enabled.
The user mints a key at https://staging.mk0r.com/account/api-keys (or https://mk0r.com/account/api-keys for prod). Each key starts with mk0r_. Save it under a canonical name so this skill (and future scripts) can find it without re-prompting:
security add-generic-password -U -a "$USER" \
-s "mk0r-api-key-staging" -w 'mk0r_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# Or for prod:
security add-generic-password -U -a "$USER" \
-s "mk0r-api-key-prod" -w 'mk0r_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
To look it up later:
security find-generic-password -s "mk0r-api-key-staging" -w
The CLI lives in the appmaker repo (cli/ directory). To put mk0r on PATH:
cd ~/appmaker/cli && npm link
mk0r --help
If you don't want the global symlink, invoke directly:
node ~/appmaker/cli/bin/mk0r.js --help
KEY=$(security find-generic-password -s "mk0r-api-key-staging" -w)
mkdir -p ~/.config/mk0r
printf '{\n "host": "https://staging.mk0r.com",\n "apiKey": "%s"\n}' "$KEY" \
> ~/.config/mk0r/config.json
chmod 600 ~/.config/mk0r/config.json
For prod, swap staging.mk0r.com → mk0r.com. The CLI also honours MK0R_HOST, MK0R_API_KEY, and MK0R_PROJECT env vars; they override the file values.
mk0r whoami # confirms auth works; shows uid/email
mk0r projects ls # lists projects with last-active column
mk0r projects use <projectId> # sticky; written to ~/.config/mk0r/config.json
mk0r projects current # prints current default
mk0r projects use --clear # wipe
After pinning, mk0r exec, mk0r chat, mk0r session, mk0r cp, mk0r cat, mk0r runs, and mk0r schedule … all accept the projectId as optional and fall back to the default. You can also pass MK0R_PROJECT=<id> as a per-shell override.
mk0r chat is the canonical way to drive the VM. It hits /api/chat (same endpoint the web UI uses), streams the NDJSON response, and renders text deltas to stdout + tool calls (→ tool(args) / ✓ / ✗) to stderr.
# With default project pinned
mk0r chat "navigate to https://example.com and tell me the H1"
# Explicit project
mk0r chat <projectId> "your prompt"
# Quieter output
mk0r chat "your prompt" --quiet
# Hide <thinking> deltas — flag MUST be AFTER the prompt
# (parseArgs would otherwise consume the prompt as the flag's value).
mk0r chat "your prompt" --no-thinking
The agent has these tools: bash/terminal, file read/write, Playwright MCP (same Chromium that runs on :9222, proxied through SOAX). Browser actions automatically route through the residential exit.
When you want to bypass the agent and poke the sandbox directly:
# Sync exec (Cloud Run synchronous HTTP ceiling is ~60min)
mk0r exec -- "uname -a; whoami; ls /app"
# Async exec for long jobs
RUN_ID=$(mk0r exec --async -- "bash /app/long-job.sh")
mk0r runs $RUN_ID --watch
# Upload / read files (1.5MB cap on read)
mk0r cp ./local.txt :/tmp/remote.txt
mk0r cat :/tmp/remote.txt
Pass <projectId>:<path> to override the default for a single command.
mk0r session info # project, sessionKey, vmId, BRD state, live egress IP
mk0r session brd on --country us # enable
mk0r session brd off # disable (egress reverts to datacenter)
mk0r session brd status # current state + live egress IP
State is persisted in Firestore on the session doc (useResidentialIp, residentialCountry). The system re-applies it on every sandbox pause/resume. SOAX rotates the exit IP every 5 minutes within a session (sessionlength-300), so consecutive reads of ipify.org will often differ; both will be residential, both will be in the requested country.
mk0r schedule ls
mk0r schedule create --cron "*/20 * * * *" --command "./skill/run-cycle.sh" --tz America/Los_Angeles
mk0r schedule run <scheduleId> # fire once now
mk0r schedule rm <scheduleId>
The orchestrator uses fire-and-forget exec when ACP_CALLBACK_BASE_URL is set on Cloud Run: the sandbox runs the command detached, POSTs back to /api/scheduled/finish when done. Tolerates 3h+ jobs even though Cloud Run's sync HTTP ceiling is 60 minutes.
--proxy-server=http://127.0.0.1:3003 --remote-debugging-port=9222. @playwright/mcp attaches via --cdp-endpoint http://127.0.0.1:9222, so MCP browser calls AND raw CDP both hit the same process. There is no second browser.app_sessions/{sessionKey} doc holds VM metadata, not chat turns. So mk0r chat streams go to the CLI; web UI streams go to that tab; neither sees the other's history. The agent itself remembers (ACP-level memory) — open the web UI and ask "what did we just do?" and it will recap.~/.claude/.credentials.json and explicitly does NOT set ANTHROPIC_API_KEY. Subprocesses (e.g. claude -p) inherit OAuth for free.| Ask | Command |
| --- | --- |
| "list my projects" | mk0r projects ls |
| "create a project named X" | mk0r projects create X |
| "open project X in the browser" | open -a "Google Chrome" "https://staging.mk0r.com/app/<id>" |
| "what egress IP am I going out from" | mk0r session brd status |
| "navigate the agent to URL X" | mk0r chat "navigate to X with playwright and report the title" |
| "run X in the VM" | mk0r chat "run X and tell me what happens" (primary) or mk0r exec -- X (escape hatch) |
| "did the long job finish?" | mk0r runs <runId> |
| "schedule X every 20 minutes" | mk0r schedule create --cron "*/20 * * * *" --command "X" |
curl the raw /api/chat endpoint when mk0r chat already streams + renders properly.--no-thinking / --quiet BEFORE the prompt. parseArgs will consume the next token as the flag's value and your prompt vanishes.mk0r session brd on re-asserts the proxy config across resumes automatically.tools
Design web-like user interfaces in the terminal and inside tmux with a cell-grid Canvas, CSS-like box model, flexbox/grid layout, and 15 reusable widgets such as Panel, Table, Card, ProgressBar, Meter, Tabs, Tree, Badge, Banner, and a braille line chart. Use when an agent needs a dashboard, panel, table, status page, TUI layout, tmux dashboard, screenshot-driven CLI/TUI replica, ANSI frame, truecolor render, pyte PNG screenshot smoke test, wide-character alignment, or a new terminal widget.
tools
Drive interactive terminal (TUI) programs — CLIs, REPLs, installers, menu apps, agent CLIs, and editors like vim — through a PTY, reading semantic screen snapshots. A pattern library classifies a screen (REPL, menu, pager, fzf search, confirm dialog, form, spinner, wizard) and drives it with a ready recipe. Use when a program expects a live terminal (arrow-key menus, prompts, spinners, password fields, curses UIs), or when a piped command hangs or prints nothing.
tools
Design and render terminal/CMD visual effects and ASCII art from a one-line request via the pluggable `fx` engine (18 hot-swappable, themeable effects plus scripted shows). Effects include donut, matrix rain, plasma, fire, a spinning 3D ball, Game of Life, wireframe cube, 3D text banners, rainbow/lolcat gradient text, starfield, tunnel, fireworks, image-to-ASCII, and more. Use when the request is for a terminal animation, ANSI/CLI art, or a new console effect. Pure Python stdlib; truecolor.
tools
# X Twitter Scraper Use Xquik for X/Twitter tweet search, user lookup, profile tweets, follower export, media download, monitors, webhooks, posting workflows, and MCP-backed API exploration. ## Prerequisites - A Xquik API key in `XQUIK_API_KEY`. - Internet access to `https://xquik.com/api/v1`, `https://xquik.com/mcp`, and `https://docs.xquik.com`. - A clear user request that identifies the target tweets, users, accounts, keywords, media, monitor, webhook, or write action. ## Source Truth -