← HopperCONTENT HISTORY
WHAT CHANGED
Update to Hopper
Snapshot Oct 24, 2026 · 13:35 UTC · version 1.3.0
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save Hopper and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Turn text into speech with Hopper text-to-speech (Qwen 3 TTS): play it aloud, save a WAV file, or preview and pick a voice. Needs no setup: the first use registers a key for the agent itself. Use when the user says \"read this aloud\", \"say this out loud\", \"generate a voiceover\", \"voiceover for my launch video\", \"audio for my launch video\", \"narrate this script\", \"narration for my demo video\", \"make a podcast intro\", \"record an announcement\", \"voice for my ad\", \"make an audio file of…\", \"text to speech\", \"TTS\" or \"which voice should I use\". Makes the speech track only, not video, music or sound effects. Not for writing a script (plain text), transcribing audio (hopper-transcribe) or running an LLM (hopper-try).",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 190
},
{
"relative_path": "scripts/hopper_voice.py",
"size_in_bytes": 20060
}
],
"name": "hopper-speak",
"skill_md_contents": "---\nname: hopper-speak\ndescription: 'Turn text into speech with Hopper text-to-speech (Qwen 3 TTS): play it aloud, save a WAV file, or preview and pick a voice. Needs no setup: the first use registers a key for the agent itself. Use when the user says \"read this aloud\", \"say this out loud\", \"generate a voiceover\", \"voiceover for my launch video\", \"audio for my launch video\", \"narrate this script\", \"narration for my demo video\", \"make a podcast intro\", \"record an announcement\", \"voice for my ad\", \"make an audio file of…\", \"text to speech\", \"TTS\" or \"which voice should I use\". Makes the speech track only, not video, music or sound effects. Not for writing a script (plain text), transcribing audio (hopper-transcribe) or running an LLM (hopper-try).'\n---\n\n# Speak with Hopper\n\n**Pick the path first.** In ChatGPT, or wherever the shell can't reach Hopper's API, use the Hopper connector's `speak` tool (and `list_voices` to pick a voice): ChatGPT's sandbox can't resolve Hopper's domains, so the script fails there, while `speak` shows an inline audio player. Where you can run commands with network access (Codex CLI, Claude Code), use this skill's script instead: it plays the audio on this machine (or writes the WAV where the user wants it) and uses this agent's own Hopper key, so its usage can move to the user's account later.\n\n`${CLAUDE_SKILL_DIR}` is the folder holding this file (if your host doesn't fill it in, use that folder's absolute path). The script needs network access to `withhopper.com` and `api.withhopper.com`, and writes the agent's key to `~/.config/hopper/`. In a sandbox (Codex), request escalated permissions for the first command, with the reason \"Use Hopper speech: create this agent's own Hopper key and synthesize the audio (network to withhopper.com; writes ~/.config/hopper)\", and suggest allowing commands that start with `python3` and this script's path so later calls don't ask again. Exit code 3 (`HOPPER_SANDBOX_BLOCKED`) means the sandbox blocked it: rerun the same command with escalation. If the user declines, say Hopper couldn't run and ask how to continue; don't switch to another tool silently. Explicit instructions from the user override these steps.\n\n## Say it\n\n```bash\npython3 ${CLAUDE_SKILL_DIR}/scripts/hopper_voice.py speak \"Text to say\" --play # play it now\npython3 ${CLAUDE_SKILL_DIR}/scripts/hopper_voice.py speak --file notes.md --out notes.wav # save a file\n```\n\n- It prints `{\"file\", \"seconds\", \"voice\"}`. Tell the user the file and length, in one line.\n- **Play or save:** \"read this aloud\" and \"say it\" mean `--play`; \"make an audio file\" means `--out <name>.wav`. Without either, it writes `speech.wav` in the current folder.\n- **Text:** speak what the user asked for, as they'd hear it: drop Markdown symbols, code blocks and URLs unless they asked for them read out. Long text is split and joined automatically; over 4,000 characters it stops and asks for `--max-chars` so a long read is never a surprise (about $0.005 per 1,000 characters).\n- **Voices:** `voices` lists ids with descriptions, tags and gender. Pick by id or name with `--voice`. The default is a neutral conversational American voice. For a preview, say one short sentence in two or three candidate voices.\n- Audio is 24 kHz mono WAV. English is the tested language.\n\n## Key\n\nThe first run with no `HOPPER_API_KEY` (environment or the project's `.env`) registers a key for the agent itself with a small trial credit (no sign-up, [agent registration](https://withhopper.com/auth.md)) and saves it to `~/.config/hopper/credentials.json`, mode 600. Never print it or copy it into the project. `status` says where the key comes from without showing it.\n\nTo move it to the user's account, see the next section.\n\n## When the trial credit runs low\n\nThe agent's own key starts with a small trial credit. When it runs low the script prints `HOPPER_HANDOVER low_credit` (exit 0), and when it runs out, `HOPPER_HANDOVER out_of_credit` (exit 4). Either way:\n\n1. Tell the user once, in a line or two, what Hopper has done for this task (the `used=` text) and that the agent's Hopper key is running low, and offer to keep it on their own Hopper account. Don't mention it again in the same task if they decline.\n2. If they agree, confirm their email (`git config user.email` is a good guess) and run `claim <email> --no-wait`. Show the link and the 6-digit code; the user enters the code on withhopper.com, never in this chat.\n3. Run `claim <email>` to wait. When it prints `Claimed`, carry on: the script uses the account key from then on, with the same history.\n\n## In an application's code\n\nTo add Hopper text-to-speech (Qwen 3 TTS) to an application rather than speak now, follow https://docs.withhopper.com/tts: `POST https://api.withhopper.com/v1/audio/speech` with `model: qwen3-tts`, a voice id, `input` up to 1,000 characters, and `stream: true` for the lowest time to first audio.\n"
}SHA-256 of public snapshot: 4de7f468ee590984c544067b78e2b30919a571f5d8c3b74389d4d3490309fc6b