Not-Happy-Jan
Multi-sensory feedback MCP server for AI coding agents, providing audio, visual, haptic, and physical notifications with customizable characters and modes.
README
Not-Happy-Jan
<p align="center"> <img src="NHJ_icon.png" alt="Not-Happy-Jan — the three-tier call-centre cast: Karren (the manager) raging up top, Bazza (middle management) stressed in the middle, Jan (reception) on the headset, ringed by the feedback devices" width="320"> </p>
Multi-sensory feedback for AI coding agents. When your agent finishes a task, Jan tells you. When something goes wrong, Karren lets you know — loudly.
"Not happy Jan, the issue is…"
☎️ The Call-Centre Experience
Ever feel like you're on hold, waiting for your agent to finish processing?
<p align="center"> <img src="NHJ_working.png" alt="A developer head-in-hands as the CRT flashes [Jan:err] in a retro call-centre — the Not-Happy-Jan experience" width="560"> </p>
Not-Happy-Jan makes Claude Code feel like a genuine call to a government department — multiple tiers of staff, hold music, and constant feedback delivered with a customisable level of competence and boganism — all while you wait for your token quota to fill back up.
- 🎷 Hold music plays while the agent's busy, pauses the instant someone picks up
- 👩 Jan — reception. Handles the routine stuff. Cheerful, occasionally scatty.
- 🧑💼 Bazza — middle management. Escalates when things get warm. Apathetic to anxious, your call.
- 📣 Karren — the manager. Takes over when it all goes wrong. She is NOT. HAPPY. JAN.
- 🎚️ Dial in each character's competence, boganism and chaos to taste — by just asking.
What it does
By default NHJ generates its voices with a local TTS model, running right on your own machine — building on earlier agent-feedback work, but going much further. NHJ is extensible to a whole range of feedback tools: from the haptic Logitech MX Master mouse to $60 Ulanzi pixel displays, LaMetric Time, the Divoom Times Gate / Frame — or anything you can POST to, like a Vestaboard. When Karren's not happy, Jan and you are going to know about it.
When Claude Code (or any MCP-compatible agent) completes a task, NHJ fires across every output channel you have configured:
| Channel | Device | What happens |
|---|---|---|
| Haptic | Logitech MX Master 4 mouse | Distinct firmware waveform per intent (completed, angry_alert, firework…), escalating insistence — opt-in, talks straight to the mouse (no Logitech software) — setup |
| Visual | LaMetric Time | Icon + text + built-in sound |
| Visual | ULANZI TC001 (AWTRIX 3) | Random icon + effect + in-character text, to one or many over MQTT |
| Visual | Divoom Times Gate / Frame | Coloured text notification |
| Audio | TTS (local or cloud) | Character speaks a phrase |
| Physical | ESP32 push bell | Electromechanical bell rings |
The cast & modes
Three tiers answer the phone depending on severity — Jan (reception), Bazza (middle management), Karren (the manager). Each has its own zero-shot-cloned voice and live dials (boganism, competence, chaos) you tune just by asking Claude. One-word modes (rave, call-centre, quiet, special-forces, went-full-bogan…) reconfigure the whole vibe — music, voice, displays, haptics — at once.
Install
curl -fsSL https://raw.githubusercontent.com/guruswami-ai/not-happy-jan/main/install.sh | bash
Or install from a checkout:
git clone https://github.com/guruswami-ai/not-happy-jan
cd not-happy-jan
bash install.sh
One command, non-interactive. It downloads the source and bootstraps uv plus a
managed Python runtime when required. The default profile installs the full
experience — venv, Qwen3-TTS voice model, the ocker-bogan-nano LLM, bundled
media, Claude Code hooks, and MCP server (stdio, localhost-only) — using
on-demand model loading (no always-on daemon, so no resident RAM cost at idle).
👉 Just run
bash install.sh— and go for the full experience. The default is the full experience, and it's what Not-Happy-Jan is for: Jan, Bazza and Karren in their own live, cloned voices, the dynamicocker-bogan-nanobrain writing a fresh in-character line every time, and 4+ hours of hold music ducking under it all — 100% local, loaded on demand (nothing resident at idle). It's a one-off ~5 GB download on an Apple Silicon Mac, then it just works.
--minimal(pre-recorded bank, zero downloads) is there for CI and RAM-tight machines — the cast still speaks, but you miss the live voices, the dynamic lines, and the music. Don't reach for it unless you have to.
| Profile | Command | What you get |
|---|---|---|
| Default | bash install.sh |
Full experience — Qwen3-TTS + the ocker-bogan-nano LLM + hold music, on-demand loading; hooks + MCP wired |
| Full | bash install.sh --full |
The default, plus persistent TTS / LLM / MCP LaunchAgents and warm model servers (macOS) for sub-second responses |
| Minimal | bash install.sh --minimal |
Hooks + MCP + the bundled voice bank — the cast speaks pre-recorded in-character lines; no model downloads (CI / low-RAM) |
The MCP server always binds to 127.0.0.1. LAN access requires an explicit opt-in: bash install.sh --full --listen 0.0.0.0.
Uninstall — one command stops the TTS/LLM/MCP services, then removes everything (runtime, config, downloaded models/media, the nhj launcher, and NHJ's Claude hooks/MCP/markers/skill); your Claude install is left intact. Like the install, it runs entirely in your user account — no sudo (user-domain LaunchAgents, files under $HOME):
nhj uninstall # add --yes to skip the confirmation
The dynamic brain — included in the default install. bash install.sh (and --full)
download ocker-bogan-nano, NHJ's own fine-tuned LLM, so every line is freshly generated
in character instead of replayed from the bundled bank. It needs llama.cpp
(brew install llama.cpp); if that's missing the installer notes it as a follow-up and the
bundled bank still works. To (re)install or point at your own model:
nhj install-model # ~940 MB Q4_K_M GGUF, runs as a local llama.cpp server — 100% local, sub-second
Why it's worth it, the BYO-model path, and the swearing/bleep behaviour are all in Dynamic voices.
Requirements: macOS Apple Silicon (M1+), Python 3.10+, ~8 GB RAM (16 recommended), ~5 GB disk. The initial alpha supports Apple Silicon macOS only. TTS_ENGINE=none runs text-only; low-spec machines can run from pre-recorded samples. The three ways to run it (silent · pre-recorded · full live experience) → Minimum specs; install profiles → Install profiles; settings → Configuration & requirements.
Quick start
# Test all configured adapters
nhj test ok
nhj test err --message "something broke"
# List available voices
nhj voices
# List configured devices
nhj devices
# Pre-render audio bank for faster playback
nhj build-bank --voice jan
# Live settings — no restart needed (or just ask Claude in plain language)
nhj muzak on # inference muzak while the agent works
nhj set jan.ockerism 11 # tune any character dial (jan.competence, bazza.stress, …)
nhj mute # silence everything; nhj unmute to restore
nhj status # show current settings
Documentation
| Guide | What's inside |
|---|---|
| Architecture | The serious technical design — custom LLM, fine-tuned TTS, hooks, queue + sequencing, multi-sensory dispatch, and the latency/resource tradeoffs behind it all |
| Characters & dials | The cast, the dials, tuning live, adding your own voice |
| Modes | One-word vibe switches (rave, call-centre, quiet, special-forces…) |
| Dynamic voices | The ocker-bogan-nano brain — why/what/install, BYO model, swearing & the bleep |
| Minimum specs | The three tiers: silent · pre-recorded samples · the full live bogan call-centre |
| Configuration & requirements | .env, devices, inference muzak, TTS backends, specs |
| Integration | Claude Code hooks, legacy-hook supersession, other agents, the secret guard, adding a device |
| Audio Standard | The single-stream mixer, fidelity tiers, gapless hold, every audio control |
| AWTRIX display setup | A Ulanzi pixel clock running in ~10 minutes |
| Haptic mouse setup | MX Master 4 firmware haptics |
| Devices overview | Supported hardware + where to start |
Your new friends
NHJ is fully customisable: 72 HR-approved hold-music tracks (over 4 hours of on-hold listening pleasure), replaceable personalities, and zero-shot voice cloning — drop in any voice you like. But we reckon that once you've got to know Jan, tuned her competence and bogan settings to your liking, and met anxious Bazza and cranky Karren, you won't want to code with Claude without your new friends.
Credits
Evolved from an earlier personal agent-feedback project by Paul Nevin. TTS powered by Qwen3-TTS via mlx-audio.
License
Code is available under the MIT License. Downloadable media and voice assets are licensed separately from the code and have mixed provenance — mostly AI-generated (released CC0) or procedurally synthesised, with hold music generated under a licensed Suno plan. See Media provenance for per-asset terms. Do not assume the code license grants rights to media, and use only voice references you own or have documented consent to use.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。