VOL. I  ·  NO. 
SUB/WAVE
ON AIR

SETUP · 02

The easy way in.

Two hands-off paths to a running stack. The interactive wizard asks a few questions and does the rest; the agent skill does the same from one sentence in your AI coding tool. Either one ends with the radio on the air.

PATH A · INTERACTIVE WIZARD

Answer a few questions, get a running stack.

A terminal wizard that writes the env files, brings up the right compose file, and renders the station jingles. Requires Node 20+ and Docker.

git clone https://github.com/perminder-klair/subwave.git
cd subwave
npm install
npm run setup

Its first question is dev or production? Then it prompts for Navidrome and Ollama, runs scripts/setup.sh, boots the stack, and generates jingles.

  • Dev — uses docker-compose.yml, keeps state in ./state, and optionally launches next dev on :7700.
  • Production — uses docker-compose.prod.yml with --build, Caddy on :4800, state in ./state (or wherever STATE_DIR points). Re-run with sudo if the state directory isn't writable.
SAFE TO RE-RUN

Existing env values are kept unless you explicitly ask to reconfigure — so the wizard doubles as a way to bring an existing stack back up.

PATH B · AI CODING AGENT

One sentence in your coding agent.

The repo ships an agent skill that handles setup, deploy, and update — it pings Navidrome and Ollama, boots the stack, generates jingles, and verifies the stream is on-air. It works with Claude Code, Codex, Cursor, or anything else that reads AGENTS.md.

Clone the repo, open your agent in it, and say one of:

git clone https://github.com/perminder-klair/subwave.git
cd subwave
# then in your agent of choice, ask:
# "set up subwave"
# "deploy subwave"
# "pull and restart"
WHY USE THE SKILL

On updates the same skill detects which services actually changed and rebuilds only those. Liquidsoap and the Controller COPY their source at build time, so a plain docker compose restart silently runs stale code — the skill won't make that mistake.