Wonda CLI
Wonda CLI is a content creation toolkit for terminal-based agents. Use it to generate images, videos, music, and audio; edit and compose media; publish to social platforms; and research/automate across LinkedIn, Reddit, and X/Twitter.
Install
If wonda is not found on PATH, install it first:
# npm
npm i -g @degausai/wonda
# Homebrew
brew tap degausai/tap && brew install wonda
Setup
- Auth:
wonda auth login(opens browser, recommended) or setWONDA_API_KEYenv var - Verify:
wonda auth check
Access tiers
Not all commands are available to every account type:
| Tier | Access | | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | Anonymous (temporary account, no login) | Media upload/download, editing (video/edit, image/edit, audio/edit), transcription, social publishing, scraping, analytics | | Free (logged in, Basic/Free plan) | Everything above + generation (image/generate, video/generate, etc.), styles, recipes, brand | | Paid (Plus, Pro, or Absolute plan) | Everything above + video analysis (requires credits), skill commands (wonda skill install/list/get) |
If a command returns a 403 error, check your plan at https://app.wondercat.ai/settings/billing.
Social signups (Instagram, TikTok, etc.)
Drive them with the wonda device primitives + a throwaway mailbox from wonda email. The screenshot → decide → tap/type/swipe loop is how these flows work — there's no shortcut command, and that's fine: social apps change their UI constantly and any canned flow would drift faster than you could maintain it.
Standard loop:
wonda email account create --random→ save{email, password}. Persist the resulting platform login withwonda credentials create --website instagram.com --username <handle> --email <email> --password-stdin <<< "<pw>"(passwords are AES-256-GCM encrypted at rest; retrieve later withwonda credentials get <id>).wonda device create→ pick areadydevice (pollwonda device get <id> --fields status).wonda device launch <device-id> com.instagram.android(orcom.zhiliaoapp.musicallyfor TikTok). Fall back towonda device open-urlif you'd rather start in the web flow.- Loop:
wonda device screenshot <device-id> > s.json→ decode the base64 PNG → read → pick an action →tap | type | swipe | key→ screenshot again. Use--text "SomeButtonLabel"ontapbefore guessing coordinates; fall back to--x --yread off the screenshot for elements without matching text (number pickers, date spinners, etc.). - When the app sends a verification email,
wonda email inbox wait <email> --timeout 120— returns{codes: ["483921"], links: [...]}with the 6-digit code already extracted.wonda device type <device-id> --text "<code>"to feed it back. Race-safety: capture a timestamp _before_ triggering the signup (SINCE=$(date -u +%FT%TZ)) and pass--since "$SINCE"— otherwise a fast mail server can land the email before your wait call and the old snapshot filters it out. - For number/date spinners: tap on the highlighted cell, Android pops up a numeric or alphabetic keyboard,
wonda device type --text "<value>"replaces the selected text.wonda device key --code 4dismisses the keyboard when done.
Consent-like taps — anything that accepts Terms/Privacy/Cookies, grants permissions, or publishes something. Before starting an automation that may hit these, ask the user once in chat whether to auto-accept them. If they say yes, tap through without pausing; if they say no, stop at each one and confirm. This does not apply to CAPTCHAs or "prove you're human" puzzles — always hand those off via wonda device stream (see next section).
Rate-limit signals — if the app shows you a visual puzzle ("we want to make sure you're a real person"), stop and hand off to the user with wonda device stream <id> (see next section). Don't click through puzzles yourself.
Credentials vault
Persist logins created on external platforms (Instagram, TikTok, Twitter, etc.) so they can be reused on the next run. Passwords are AES-256-GCM encrypted with a server-side key and only decrypted on get.
# Create
wonda credentials create --website instagram.com --username myhandle \
--email me@example.com --password-stdin <<< "hunter2" \
--metadata '{"signup_source":"wonda-email"}'
# List (passwords omitted)
wonda credentials list --website instagram.com
# Get full record including decrypted password
wonda credentials get <id>
# Update any field (use --password-stdin to rotate; --username "" to clear)
wonda credentials update <id> --username newhandle
# Delete
wonda credentials delete <id>
# Fetch + record why you're using it in one call — POST, not GET, because
# it writes a 'used' event with the reason. Prefer this over `get` whenever
# you can articulate the reason.
wonda credentials use <id> --reason "instagram signup flow"
# See recent events (created / used / rotated / updated) for audit
wonda credentials events <id>
Fields: website (required — typed input like insta is canonicalized to instagram.com), username, email, password (required), metadata (arbitrary JSON). At least one of username / email must be present. Multiple records per (website, username) are allowed — dedupe on your side if you need to.
Event log: every credentials get/use, create, password rotate, and other updates are recorded as events on the credential (actor: cli | web | system). Use credentials events <id> or the web UI's history icon to audit. The event log is append-only and cascades on credential delete.
Handing off to a human
If automation hits a screen that requires a human to take over (consent flow you shouldn't auto-accept, ambiguous UI, step where the user prefers to act themselves), use wonda device stream <device-id> — returns a playerUrl signed with a short-lived JWT (1h). Give that URL to the user, they act in their own browser, and automation can resume afterward.
wonda device stream <device-id>
# → { "streamUrl": "wss://…", "playerUrl": "https://…", "deviceType": "social" }
Global output flags
All commands support these output control flags:
--json— Force JSON output (auto-enabled when stdout is piped)--quiet— Only output the primary identifier (job ID, media ID, etc.) — ideal for scripting-o <path>— Download output to file (implies--wait)--fields status,outputs— Select specific JSON fields--jq '.outputs[0].media.url'— Filter JSON output with a jq expression
How to think about content creation
You are a marketing director with access to a full production toolkit. Before touching any tool, think:
- What product category? (beauty, food, tech, fashion, fitness, etc.)
- What format performs for this category? (UGC memes for everyday products, cinematic for luxury, before/after for transformations, testimonial for services)
- What's the hook? (relatable scenario, surprising twist, aspirational lifestyle, social proof)
- What specific scene? (not "product on table" but "person discovering the product in a funny situation")
Decision flow
When asked to create content, follow this order:
Step 1: Gather context
wonda brand # Brand identity, colors, products, audience
wonda analytics instagram # What content performs well
wonda scrape social --handle @competitor --platform instagram --wait # Competitive research (if relevant)
# Cross-platform resea