One-liner installer
The form on the home page generates a bash <(curl ...) command preconfigured with your engine selections. Copy it, paste into your homelab terminal, follow the Discord credential prompts.
sh
bash <(curl -fsSL https://raw.githubusercontent.com/powder-nomad/papercup/main/install.sh) \
--agent claude-code \
--stt whisper-small \
--tts auto \
--voice af_heartAll flags
--dir <path> Install location. Default: $HOME/papercup
--branch <name> Git branch. Default: main
--discord-token <token> Bot token (otherwise prompted)
--discord-client-id <id> Application ID (otherwise prompted)
--discord-guild-id <id> Server ID (otherwise prompted)
--agent <name> claude-code (default) | codex | anthropic-api
--model <name> haiku (default), sonnet, opus, gpt-5, etc.
--anthropic-api-key <k> Required only if --agent=anthropic-api
--vad <name> silero (default; only option today)
--stt <name> whisper-small (default for multilingual TTS) |
whisper-base (default for kokoro-only) |
whisper-small.en | whisper-base.en
--tts <name> auto (default — Kokoro + Korean engine routing) |
kokoro (no Korean) | melotts (Korean, monotone) |
xtts (Korean, ~58 speakers, voice cloning)
--voice <name> af_heart (default) — Kokoro voice. See voices below
--silence-ms <int> End-of-utterance silence (ms). Default: 600
--vad-threshold <float> Speech probability threshold. Default: 0.4
--skip-models Don't download voice models
--skip-venv Don't create the Python venv
--skip-register Don't push slash commands to Discord
--no-start Install only; don't start the daemon
--yes / -y Accept all defaults; never promptRuntime knobs are separate
The --model install flag sets the default model for new sessions. Each session can override it at runtime via /pickup model:<id> or /model name:<id> — same for reasoning effort (/effort), tool permissions (/permissions), and extension-completion alerts (/notify). See Slash commands for the full runtime surface.
What it does
The script is idempotent. Re-run it any time with different flags to reconfigure.
- Sanity check: node 20+, python3, espeak-ng, claude/codex CLI present (warns if not). Extra apt-deps check (libmecab-dev, libssl-dev, pkg-config) when MeloTTS is in scope.
- Clone or update
powder-nomad/papercupinto--dir - Discord credentials: takes from flags, then existing
.env, then prompts - Write
packages/bot/.envwith everything you specified npm installat the workspace root- Python venv at
packages/voice-stack/sidecar/.venv(slowest step, ~700MB of wheels) - MeloTTS install (only when
--tts autoor--tts melotts) viainstall-melotts.shhelper — adds ~1.3GB (torch+BERT). Handles upstream pin issues automatically. - Download models (Silero VAD, Kokoro TTS, Kokoro voices — ~355MB)
- Register slash commands with your Discord server
- Print capability matrix (which languages/voices actually work end-to-end)
- Start the daemon
After install
Manage the daemon:
sh
bash $HOME/papercup/packages/bot/bin/papercup status
bash $HOME/papercup/packages/bot/bin/papercup logs # tail -F
bash $HOME/papercup/packages/bot/bin/papercup tail 50
bash $HOME/papercup/packages/bot/bin/papercup stop
bash $HOME/papercup/packages/bot/bin/papercup restartIn Discord:
/pickup name:planning ← fresh named session
/hangup ← session preserved
/resume name:planning ← pick up later
/sessions ← list recent
/rename name:foo ← rename current session
/bind channel:#papercup ← admin: route all messages there to bot
/say text:hello ← speak text via TTS