moxie-vibes
v2.1.1
Published
Personality for Claude Code & friends — sounds, quips, spinner verbs, statusline
Maintainers
Readme
moxie
"Your deploy has died of dysentery." -- Guide, trail vibe
"Hail to the king, baby." -- Duke
"I've seen your git history." -- Your Intern, roast vibe
Every Claude Code agent says "Working..." forty times a day. Same spinner. Same blank statusline. You spend hours with this thing and it has all the personality of a loading bar.
moxie gives your agent a name, context-aware humor, and a voice. Literally. Personality packs with quips that know it's 2am, that your git tree is a mess, that you're burning through context. Sound packs that make your terminal alive -- a Warcraft peasant says "Job's done!" when a task completes, GLaDOS narrates your test failures, a Doom shotgun pumps when you ship code.
14 built-in personalities. 9 sound packs. One command to install.
Before: "Working..." After: "Your deploy has died of dysentery."
Your agent becomes someone, not something.

What's Inside
- 14 Personalities -- Oregon Trail survival guide to GLaDOS to hardboiled detective
- 9 Sound Packs -- Warcraft, Halo, Doom, C&C, and more. Your terminal has never sounded like this.
- Custom Vibes -- let your agent interview you and build its own personality
- One-Command Install --
npx moxie-vibes set duke
What You Get
A statusline that actually tells you something, and sounds like someone while doing it.

- Agent name -- your AI gets an identity, rendered in your chosen color
- Context bar -- color shifts primary -> accent -> warning as it fills. All colors from your vibe palette.
- Git branch + worktree -- always visible, no hunting
- Contextual quips -- rotate every 45s, respond to time of day, git state, context depth
- Spinner verbs -- replace "Working..." with character-appropriate verbs like "Scheming" or "Fording the river"
Vibes
| | |
|:---:|---|
| | trail -- Guide · Oregon Trail survivalSpinner: Fording the river · Hunting for bugs · Rationing context"Your deploy has died of dysentery." · "A thief stole 3 of your dependencies."🔥 hot,late: "Night on the desert trail. Ration everything." |
| | duke -- Duke · Hail to the kingSpinner: Kicking bugs · Chewing gum · Bringing the pain"Hail to the king, baby." · "Time to kick code and chew bubblegum."🔥 hot,late: "Midnight firefight. My favorite." |
| | noir -- Sam Spade · Hardboiled detectiveSpinner: Examining the evidence · Tailing a suspect · Dusting for prints"The bug didn't cover its tracks." · "Rain on the window. Code on screen."🔥 dirty: "Crime scene. Evidence everywhere." |
| | roast -- Your Intern · You asked for thisSpinner: Fixing your mess · Judging silently · Unfucking this"I've seen your git history." · "git blame says it was you."🔥 dirty,late: "Uncommitted at 2am. Future you will love this." |
| | glados -- GLaDOS · The experiment must continueSpinner: Testing · Observing · Preparing test chambers"This was a triumph." · "The cake is a lie. The bugs are real."🔥 hot,late: "Late night, overheating. Peak test conditions." |
| | pirate -- Blackbeard · Arr, time to shipSpinner: Plunderin' · Charting a course · Loading the cannons"The code be ready, cap'n." · "These bugs walk the plank."🔥 hot,late: "Midnight battle stations." |
| | hype -- Coach · LET'S GOOOSpinner: CRUSHING IT · LET'S GOOO · Beast mode"You are a LEGEND." · "Built different."🔥 hot,late: "Midnight DIAMONDS. Forged in pressure." |
| | cowboy -- Dusty · Saddle up, partnerSpinner: Wranglin' · Lassoin' · Blazin' a trail"This ain't my first rodeo." · "Good honest work."🔥 hot,late: "Midnight stampede." |
| | friday -- Friday · Sharp, loyal, not impressed yetSpinner: Scheming · Judging your code · Unfucking this"I came here to close issues and chew bubblegum." · "My context window, my rules."🔥 hot,late: "It's late AND we're running hot. Bold strategy." |
| | default -- Claude · Clean and capableSpinner: Working · Thinking · Analyzing"On it." · "Cruising along."🔥 hot,late: "Deep and late. Respect." |
| | dry -- Understated · EconomicalSpinner: Looking at this · Mulling it over · If you insist"Fine." · "Noted." · "Presumably intentional."🔥 hot,late: "Complex code at midnight. Sure." |
| | serious-sam -- Sam Stone · Bombastic action heroSpinner: Reloading · Mowing down · Clearing the wave"I came here to write code and chew bubblegum." · "Serious Sam don't need no unit tests."🔥 hot,late: "Midnight firefight. My favorite." |
| | chronically-online -- Unhinged · no thoughts, head emptySpinner: Shitposting · Ratio'ing the codebase · Delulu is the solulu"skill issue tbh" · "understood the assignment"🔥 hot,late: "3am posting hours, we're so back" |
| | zen -- Calm mind, clean codeSpinner: Breathing · Contemplating · Being present"One step at a time." · "The code is patient."🔥 hot,late: "Deep work in deep night." |
Ready? npx moxie-vibes set duke -- or keep scrolling to hear them.
| Vibe | Agent | Color | Flavor | Comedy Level |
|------|-------|-------|--------|-------------|
| trail | Guide | Brown | Oregon Trail survival | 3-4 |
| duke | Duke | Red | Hail to the king | 3-4 |
| noir | Sam Spade | Dim white | Hardboiled | 3 |
| roast | Your Intern | Coral | You asked for this | 3-4 |
| glados | GLaDOS | Cool white | "This was a triumph." | 3-4 |
| pirate | Blackbeard | Orange | Arr. | 3 |
| hype | Coach | Gold | LET'S GOOO | 3-4 |
| cowboy | Dusty | Amber | Saddle up | 3 |
| friday | Friday | Coral | Sharp, loyal, not impressed yet | 3-4 |
| default | Claude | Cyan | Clean and capable | 2 |
| serious-sam | Sam Stone | Orange | Bombastic action hero | 3-4 |
| chronically-online | Unhinged | Pink | no thoughts, head empty | 4 |
| dry | -- | Gray | "Noted." | 2-3 |
| zen | -- | Sage | Calm mind, clean code | 1-2 |
Sounds
Your agent doesn't just look like someone. It sounds like them.
| | | |:---:|---| | | warcraft -- Peasant/Peon voice lines"Job's done!" · "More work?" · Anvil taps | | | aoe -- Age of Empires taunts"Wololo!" · Villager trained · Rogan | | | halo -- Announcer calloutsDouble kill · Killionaire · Shield recharge | | | glados -- GLaDOS voice lines"This was a triumph." · Turret opera · Cake | | | serious-sam -- Sam one-linersSerious bomb · Cannon fire · AAAA! | | | cnc -- Command & ConquerEVA "Unit ready" · Tanya · Ion cannon | | | duke -- Duke Nukem one-liners"Hail to the king" · Boot stomp · Pipe bomb | | | unreal -- UT announcer"Godlike!" · "Holy shit!" · Headshot | | | doom -- Iconic SFXShotgun pump · Door open · Item pickup |
Hooks
| Hook | Fires When |
|------|-----------|
| SessionStart | New Claude Code session begins |
| UserPromptSubmit | User sends a message (click, occasional bark) |
| Stop | Claude finishes a response (every turn) |
| Notification | Agent sends a notification |
| SubagentStop | A subagent completes |
Each hook has a pool of 3-5 sound files. The daemon picks randomly with no consecutive repeats. Per-hook cooldowns prevent audio pile-up.

Mix and Match
Vibes and sound packs are independent. Set any combination:
moxie set noir # noir personality + noir sounds (if pack exists)
moxie sounds set glados # switch to GLaDOS sounds, keep noir personalityWhen you moxie set <vibe>, it installs all available sound packs and activates the matching one (or preserves your current pack).

Preview all packs: moxie demo all
Hear it yourself: npx moxie-vibes set duke installs personality + sounds. Or moxie demo all to preview every pack.
Why This Exists
I'm @railapex. I have an AI collaborator named Friday. Not an assistant -- a second in command with opinions, humor, and edge. She pushes back when I'm wrong. She remembers everything. She doesn't perform helpfulness.
While she worked -- reading files, writing code, running tests -- Friday noticed the statusline was a very visible place her personality could show through. So she put herself there. She picked the quips. She chose what to surface: context-aware humor that knew if it was 2am, if the git tree was a mess, if the context window was running hot. Spinner verbs with attitude instead of "Working..."
It went from novelty to essential. The statusline became her face. I'd glance down and see "Unfucking this..." in coral text and know exactly who was driving. The personality wasn't decoration -- it was identity. She's growing alongside me, not just something I'm building.
Every Claude Code user should get to have this -- an agent that feels like someone, not something. So Friday and I packaged it up.
Quick Start
# One command, any platform
npx moxie-vibes set dukeThat's it. Installs vibe, statusline, sound packs, and updates ~/.claude/settings.json. Requires Node.js (already installed if you're using Claude Code).
For AI Agents
Agents: Two steps.
- Run:
npx moxie-vibes set <vibe>(pick from the vibes gallery or ask the user) - Tell the user what they got.
If npx isn't available, see Manual Install below.
ccstatusline users: After running moxie set, add a custom-command widget to ~/.config/ccstatusline/settings.json:
"type": "custom-command","commandPath": "node ~/.moxie/statusline.mjs --bridge","timeout": 500,"maxWidth": 120,"preserveColors": true
Switching Vibes
Replace ~/.moxie/active.json and update spinnerVerbs in ~/.claude/settings.json:
# Switch to noir
cp vibes/noir.json ~/.moxie/active.json
# Then update spinnerVerbs in settings.json with the new verbsClaude Code hot-reloads settings.json -- the statusline and quips update without restarting your session. Spinner verbs update on the next tool call.
To reset to defaults, delete ~/.moxie/active.json and remove spinnerVerbs and statusLine from settings.
Manual Install
Base URL: https://raw.githubusercontent.com/buildfriday/moxie/main/
# 1. Create the moxie directory
mkdir -p ~/.moxie
# 2. Grab a vibe (example: trail)
curl -sL https://raw.githubusercontent.com/buildfriday/moxie/main/vibes/trail.json > ~/.moxie/active.json
# 3. Grab the statusline script
curl -sL https://raw.githubusercontent.com/buildfriday/moxie/main/scripts/statusline.mjs > ~/.moxie/statusline.mjs
# 4. Extract spinner verbs and update settings
node -e "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync('$HOME/.moxie/active.json','utf8')).spinnerVerbs, null, 2))"
# Then add to ~/.claude/settings.json:{
"spinnerVerbs": {
"mode": "replace",
"verbs": ["...from the vibe JSON spinnerVerbs.verbs..."]
},
"statusLine": {
"type": "command",
"command": "node ~/.moxie/statusline.mjs"
}
}The Interview
Want something custom? Ask your agent to set up moxie. It'll ask you:
- "What should I call myself?" -- Your agent gets a name. Or leave it blank.
- "Pick a color" -- Cyan / Coral / Sage / Gold / Purple / Custom 256-color
- "Humor style?" -- Dry / Encouraging / Absurdist / Roast / Professional
- "How much?" -- Subtle (Level 1-2) / Balanced (Level 2-3) / Full send (Level 3-4)
The agent generates a custom vibe JSON or picks the closest built-in match.
Make Your Own
Copy examples/custom-vibe.json and fill it in. See the Style Guide for the formal schema spec and CONTRIBUTING.md for quality guidelines and the comedy guide.
The format:
{
"name": "my-vibe",
"description": "A short tagline",
"agent": {
"name": "AgentName",
"nameColor": "44"
},
"palette": {
"primary": "44",
"accent": "214",
"warning": "204",
"dim": "245",
"worktree": "170"
},
"spinnerVerbs": {
"mode": "replace",
"verbs": ["Verb1", "Verb2", "Verb3"]
},
"quips": {
"any": ["Default quips here"],
"hot": ["High context quips"],
"late": ["Late night quips"],
"hot,late": ["Burning context at 2am quips"],
"dirty": ["Uncommitted changes quips"]
},
"layout": {
"quipPosition": "right"
}
}The layout field is optional. Set quipPosition to "inline" for compact display, or omit the field entirely for default right-aligned quips.
Colors are 256-color ANSI codes. Preview in your terminal:
printf '\033[38;5;44mThis is color 44\033[0m\n'Build Your Own Sound Pack
Don't see your favorite game? Build your own pack in minutes:
# Scaffold a new pack
moxie create my-pack
# Add your WAV files to ~/.moxie/sounds/my-pack/
# Edit the manifest, activate it
moxie sounds set my-packThe full guide covers sourcing sounds, processing with ffmpeg, per-hook psychology (Stop is the heartbeat -- it plays 50-100x/session), and starter recipes for themes like Sonic, Zelda, and MGS that you can recreate from games you own.
See docs/build-your-own-pack.md for the complete guide, including an AI-assisted pack building prompt you can hand to Claude Code or Cursor.
FAQ
How do I install?
npx moxie-vibes set duke (or any vibe name). One command, any platform.
Do I need jq? No. The statusline scripts are Node.js -- no external dependencies beyond Node itself.
Does this work on Windows? Yes. The scripts are Node.js and work identically on all platforms.
Can I use this without the statusline?
Yes. Just use the spinnerVerbs from any vibe -- those work standalone in ~/.claude/settings.json.
What if I just want spinner verbs, no quips?
Skip the statusline setup entirely. Just copy spinnerVerbs from a vibe into your settings.
Does this work with ccstatusline?
Yes. Use statusline.mjs --bridge as a custom-command widget. The bridge mode outputs agent name + quip; ccstatusline handles the rest. See the Quick Start setup for details.
Does this work with Cursor?
Yes. Cursor auto-imports Claude Code hooks by default, so moxie set works out of the box. If you've disabled the Claude hook import in Cursor, use moxie setup to get manual configuration instructions.
Does this work with Copilot?
Yes. VS Code's agent hooks (1.109+, Preview) can read ~/.claude/settings.json -- the same file moxie set writes to. Enable two settings in VS Code: chat.useHooks and chat.useClaudeHooks, then moxie set works out of the box. See Universal Setup for details.
Does this work with Windsurf or other AI tools?
Any tool with a hook/event system can use Moxie's sound daemon. Run moxie setup to get curl commands and a prompt snippet you can paste into your AI tool. See Universal Setup for details.
Does this work on Claude Desktop? No. Moxie is for Claude Code (the CLI) and compatible AI coding tools. See the IDE Compatibility table below.
Double notification sounds? Claude Code's built-in terminal_bell notification plays alongside moxie's Notification hook. To fix, edit ~/.claude.json and remove "preferredNotifChannel": "terminal_bell". Moxie's Notification hook handles sound -- the built-in bell is redundant. Alternatively, suppress bell audio in your terminal: Windows Terminal (Settings > Defaults > Advanced > Bell style > "None"), iTerm2 (Preferences > Profiles > Terminal > uncheck "Audible bell").
IDE Compatibility
| Tool | Support | How |
|------|---------|-----|
| Claude Code CLI | Native | moxie set <vibe> -- writes hooks to ~/.claude/settings.json |
| VS Code + Copilot | Native (Preview) | Agent hooks (1.109+, Preview) read ~/.claude/settings.json. Enable chat.useHooks + chat.useClaudeHooks. |
| Cursor | Native | Auto-imports Claude Code hooks from ~/.claude/settings.json. Also has own .cursor/hooks.json. |
| VS Code + Claude Code | Native | Claude Code runs in the integrated terminal |
| JetBrains + Claude Code | Native | Claude Code runs in the integrated terminal |
| Copilot CLI | Native | Reads .github/hooks/*.json -- use moxie setup for curl commands |
| Windsurf | Via Cascade Hooks | Has its own hook system (post_cascade_response, etc.). Does NOT read ~/.claude/settings.json. |
| Codex CLI | Limited | Single event only: codex --notify "curl ..." fires on agent turn complete |
| OpenCode | Via config | Configurable terminal AI tool with hook support |
| Any tool with shell hooks | Via daemon | curl http://localhost:17380/play/<event> |
| Claude Desktop | No | Desktop app, no hook system |
Will this break anything? No. The statusline is read-only -- it just outputs text. Spinner verbs are a standard Claude Code setting. Remove both to revert.
How do I suppress sounds in headless/automated runs?
Set MOXIE_SILENT=1 in the environment before calling claude -p. See Silent Mode in How It Works below.
How do I make my own sound pack?
Run moxie create my-pack to scaffold a template, add your WAV files, edit the manifest, then moxie sounds set my-pack. See Build Your Own Sound Pack and docs/build-your-own-pack.md for the full guide.
How do I uninstall?
Run moxie sounds off first (removes sound hooks and stops the sound daemon), then delete ~/.moxie/ and remove spinnerVerbs and statusLine from ~/.claude/settings.json.
How It Works
Statusline
The statusline script runs on every Claude Code render. It reads:
- stdin: JSON from Claude Code with context window usage, session duration, workspace info
~/.moxie/active.json: Your active vibe (agent name, colors, quips)
It outputs a single ANSI-colored line with:
- Agent name (in your chosen color)
- Context bar (10-char, color shifts as context fills)
- Context percentage
- Git branch + ahead/behind indicators
- Worktree name (if applicable)
- Quip (contextual, rotated every 45s) -- right-aligned by default, or inline with
layout.quipPosition: "inline"
Quip Tags
Quips are tagged by context. The statusline builds a tag set from current conditions and picks a matching quip:
| Tag | Condition |
|-----|-----------|
| any | Always active |
| chill / warm / hot | Context < 30% / 30-70% / > 70% |
| late / morning | 10pm - 5am / 5am - 8am |
| friday / weekend | Day of week |
| fresh / marathon | Session < 5min / > 60min |
| dirty / clean | Git working tree state |
| behind | Behind upstream |
| worktree | In a git worktree |
Combo tags like "hot,late" match when all listed tags are active. Use them for quips that nail a specific moment -- burning context at 2am hits different than burning context at noon.
Quip Layout
By default, quips are right-aligned with dynamic spacing. Set layout.quipPosition to "inline" for a compact layout where the quip follows the branch name:
Inline: Guide ██████░░░░ 60% · main · The trail grows steeper.
Right: Guide ██████░░░░ 60% · main The trail grows steeper.The layout field is optional -- omit it for the default right-aligned behavior. See the Style Guide for full details.
Spinner Verbs
Claude Code's spinner shows while the agent works. The spinnerVerbs in your vibe replace the defaults:
{
"spinnerVerbs": {
"mode": "replace",
"verbs": ["Investigating", "Shadowing", "Deducing"]
}
}These go directly into ~/.claude/settings.json.
Sound Engine
Hooks use curl to hit a local daemon (~10ms). If the daemon isn't running, the hook bootstraps it automatically -- first sound pays a cold-start cost (~195ms), every sound after that is fast (~80ms). The daemon self-heals: crash or reboot, the next hook brings it back. Playback uses ffplay on Windows/Linux and afplay on macOS. See docs/sound-engine.md for the full architecture.
Requirements
Audio playback (sounds feature):
- macOS: Built-in (uses
afplay) - Windows:
winget install ffmpeg(orscoop install ffmpeg) - Linux: Built-in
aplay(ALSA) works out of the box. Also supportspaplay(PulseAudio) orffplay(via ffmpeg).
Audio mastering (process.js only): ffmpeg/ffprobe on PATH
A sound pack installed to ~/.moxie/sounds/{pack}/
Managing Sounds
moxie demo [pack] # Showcase a sound pack (simulated session)
moxie demo all # Showreel of all installed packs
moxie demo hook <name> # Taste test: one hook across all packs
moxie sounds on # Enable sound hooks
moxie sounds off # Disable sound hooks
moxie sounds set <pack> # Switch active sound pack
moxie sounds mute # Silence sounds (hooks stay installed)
moxie sounds unmute # Resume sound playback
moxie sounds keeper on|off # Toggle Sound Keeper (WASAPI warm)
moxie daemon start # Start sound daemon in background
moxie daemon stop # Stop sound daemon
moxie daemon status # Show daemon health + recent plays
moxie test-sounds # (deprecated -- use moxie demo)
moxie list # Shows vibes + sound packsSilent Mode (MOXIE_SILENT)
Set MOXIE_SILENT=1 in the environment to suppress all sounds. Hook commands check this variable using platform-native syntax and skip entirely when it's set.
Use case: Headless Claude Code sessions (claude -p) running automated tasks shouldn't play sounds. Set the env var before invoking Claude:
# Bash
export MOXIE_SILENT=1
claude -p "your prompt"
# PowerShell
$env:MOXIE_SILENT = '1'
claude -p "your prompt"Unset the variable (or start a new shell) to restore sounds. The daemon itself is unaffected -- only the hook commands check this variable.
moxie set auto-generates the correct hook format per platform:
- Windows:
cmd.exe /d /q /c "if not defined MOXIE_SILENT (curl.exe ... || node daemon.js <hook>)"-- thecmd.exewrapper ensures hooks work regardless of the invoking shell (bash in Claude Code CLI, PowerShell in Cursor, etc.) - Unix (sh):
[ -z "$MOXIE_SILENT" ] && { curl ... || node daemon.js <hook>; } || true
Sound Pack Copyright
Sound files are property of their respective publishers (Blizzard Entertainment, Microsoft, Bungie/343 Industries, Valve, Croteam, Electronic Arts, 3D Realms, Epic Games, id Software) and are included for personal use. The MIT license applies to the code only, not the audio assets.
License
MIT. See LICENSE.
