Waifu Scold
A VS Code extension. When your Python code fails at runtime, an anime image appears
beside your editor and a voice scolds you about the specific kind of mistake you made.
It watches two places:
- Terminal runs — anything matching the command pattern (
python, pytest,
uv run, …) that exits nonzero. Uses VS Code's shell-integration API, so it sees
the ▶ Run button, the debug console, and anything you type at a prompt.
- Notebook cells — reads cell error outputs directly, since those never reach a
terminal.
The exception is sorted into one of 15 categories and the scold is written for that
category, so a KeyError on a mistyped dataframe column gets a different line than a
numpy broadcast failure.
Install it for real
npm install
npm run install-local # packages a .vsix and installs it
Then reload the window (Ctrl+Shift+P →
"Developer: Reload Window"). The extension activates on onStartupFinished, so it is
live in every window from then on.
Re-run npm run install-local and reload after any code change. To remove it:
code --uninstall-extension local.waifu-scold
Or run it in a sandbox
Press F5 for an Extension Development Host with fixtures/ open. Changes
need only a rebuild plus a restart of that window, and nothing touches your real
editor — better while editing the code.
First run
In whichever window it is running:
- Waifu Scold: Set Fish Audio API Key — get a key from fish.audio.
It is stored in VS Code's SecretStorage, never in
settings.json.
- Waifu Scold: Choose Voice — searches the Fish Audio voice library and plays a
sample of whatever you pick.
- Run
fixtures/missing_key.py.
The first scold of a session shows a "Click to hear it" button: browsers block audio
until you have interacted with the panel once. One click and it stays unlocked.
Without an API key the extension still works — you get the image and the written
line, just no voice.
Settings
| Setting |
Default |
|
waifuScold.enabled |
true |
Master switch |
waifuScold.muted |
false |
Image and text, no speech |
waifuScold.commandPattern |
\b(python3?\|py\|pytest\|uv run\|…)\b |
Which terminal commands to watch |
waifuScold.cooldownSeconds |
30 |
Suppress repeats of the same category |
waifuScold.watchNotebooks |
true |
Watch .ipynb cell errors |
waifuScold.waifu.tags |
["waifu"] |
See https://api.waifu.im/tags |
waifuScold.waifu.allowNsfw |
false |
|
waifuScold.fishAudio.referenceId |
98655a12… (E-girl) |
Change via the Choose Voice command |
waifuScold.fishAudio.model |
s2.1-pro-free |
TTS backbone. Only the -free one costs nothing |
waifuScold.audioCacheSize |
100 |
Clips kept on disk |
Editing the personality
All the lines live in media/scolds.json, keyed by category. Edit
them and reload the window — no rebuild needed. Run Waifu Scold: Test a Scold
Category to hear one on demand.
Synthesized clips are cached on disk by sha256(model + voice + text), so repeat
scolds cost nothing and play instantly. Editing a line just produces a new cache key.
Waifu Scold: Clear Audio Cache wipes it.
Tests
npm test
Covers the traceback parser and the category mapper against real captured tracebacks,
including ANSI-coloured pytest output, chained pandas exceptions, and cases that must
not be treated as errors.
Notes
- waifu.im needs no API key.
is_nsfw=false is sent unless you opt in, and the
response is re-checked before display.
- Fish Audio
/v1/tts is called with a plain JSON body; the response is chunked
mp3. A failure there never blocks the image — you still get the text.
- Ctrl+C is not scolded. A shell reporting no exit code is treated as a cancellation,
not a failure.