Agent skill

Subwave Control

by perminder-klair in perminder-klair/subwave

Start or stop the SUB/WAVE radio stack (a personal internet radio station) in dev or production mode — no builds, no rebuilds, no config rendering.

MITAuto-check: notesDevelopment

Install Subwave Control

skills CLI
$ npx skills add perminder-klair/subwave --skill subwave-control -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install perminder-klair/subwave subwave-control --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/perminder-klair/subwave.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/subwave-control .claude/skills/subwave-control && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
subwave-control
GitHub stars
1.4k
Token cost
~1.6k tokens
SKILL.md length
680 words
Files
1
Skills in repo
7
Repo updated
First seen
Licence
MIT

At a glance

Start or stop the SUB/WAVE radio stack (a personal internet radio station) in dev or production mode — no builds, no rebuilds, no config rendering.

  • Works in 6 steps: Detect what's running → Start (dev) → Start (prod) → …
  • First-time setup
  • SKILL.md covers The three things you need to…, Workflow, Allowed without confirmation and Confirm before running, plus 1 more section
  • Calls docker, npm and git

What it does

Subwave Control is an agent skill from perminder-klair/subwave. Start or stop the SUB/WAVE radio stack (a personal internet radio station) in dev or production mode — no builds, no rebuilds, no config rendering. Use this skill any time the user wants to "start subwave", "stop subwave", "bring up the radio", "shut down the radio", "boot subwave in dev/prod", "turn subwave on/off", "is subwave running?", or otherwise just power the stack up or down. Detects which compose file (dev vs prod) is already running and matches it; if nothing is running, asks dev or prod. Dev mode also…

Its SKILL.md is about 1.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development. It works with Git, Next.js and Docker. The repository describes itself as: Personal internet radio: Agentic AI DJ. The licence is MIT.

When your agent uses it

  • First-time setup
  • Git pull + rebuilds
  • Jingle generation
  • Config changes — thats subwave-deploy

Example prompts

  • “start subwave”
  • “stop subwave”
  • “bring up the radio”
  • “/subwave-control”

Requirements

  • Node.js
  • Docker

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Detect what's running
  2. Start (dev)
  3. Start (prod)
  4. Verify on-air
  5. Stop (dev)
  6. Stop (prod)

What it can do on your machine

Read from SKILL.md and the folder at commit fc34e8a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • docker
    • npm
    • git
    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use docker, npm, git and curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Subwave Control loads about 1.6k tokens when it runs. Until then it costs about 212 tokens; SKILL.md has 680 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~212
When it runs · the whole SKILL.md, loaded when a task matches
~1.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:75
    te goes to `<repo>/state` unless `docker/.env` (or the environment) sets `STATE_DIR` — compose picks that up on its own,
  • NoteMentions a .env fileSKILL.md:124
    state/icecast-secrets.env`) or the root `.env`

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from perminder-klair/subwave at commit fc34e8a, republished under its MIT licence (© perminder-klair). 680 words, ~1,620 tokens.

Download SKILL.mdSave it as .claude/skills/subwave-control/SKILL.md (or your agent's skills folder).
name
subwave-control
description
Start or stop the SUB/WAVE radio stack (a personal internet radio station) in dev or production mode — no builds, no rebuilds, no config rendering. Use this skill any time the user wants to "start subwave", "stop subwave", "bring up the radio", "shut down the radio", "boot subwave in dev/prod", "turn subwave on/off", "is subwave running?", or otherwise just power the stack up or down. Detects which compose file (dev vs prod) is already running and matches it; if nothing is running, asks dev or prod. Dev mode also launches the Next.js web dev server on :7700 in the background. Always verifies the stream is on-air after a start. Do NOT use this skill for first-time setup, `git pull` + rebuilds, jingle generation, or config changes — that's `subwave-deploy`. If the user asks for any of those, hand off rather than starting.

SUB/WAVE control

Bring the SUB/WAVE stack up or down. Nothing more. No builds, no pulls, no setup — if any of those are needed, hand off to the subwave-deploy skill.

This skill is checked into the SUB/WAVE repo. The repo root is the git repository that contains this skill — derive it once, don't hardcode it:

bash
REPO=$(git -C "<this skill's base directory>" rev-parse --show-toplevel)

<this skill's base directory> is the absolute path shown as "Base directory for this skill" when the skill loads. All docker compose invocations run from docker/ inside $REPO. Shell state does not persist between commands, so re-derive $REPO (or substitute its value) in each command block below.

The three things you need to know

  1. Two compose files = two modes.

    • Dev — docker-compose.dev.yml: Icecast + Liquidsoap + Controller only. Web runs separately as npm run dev on the host (port 7700).
    • Prod — docker-compose.yml: adds web (built image) and caddy (edge router). Only Caddy binds a host port. State defaults to <repo>/state (override with the STATE_DIR env).
  2. Service ports (post-renumber): Web 7700, Controller 7701, Icecast 7702. The controller's /health endpoint returns {"status":"on-air"} once Liquidsoap is connected to Icecast — that's the canonical "is it up?" check.

  3. Web dev is hot-reloaded but must be launched separately in dev mode. npm run dev in web/ is a long-running foreground process; in this skill, always run it as a background task. The Next.js port 7700 collides with macOS AirPlay Receiver in some setups — if you get EADDRINUSE on :7700, check lsof -nP -iTCP:7700 -sTCP:LISTEN and surface the conflict to the user rather than guessing.

Workflow

Step 0 — Detect what's running
bash
cd "$REPO"
RUNNING_DEV=$(docker compose -f docker-compose.dev.yml ps -q 2>/dev/null)
RUNNING_PROD=$(docker compose -f docker-compose.yml ps -q 2>/dev/null)
WEB_DEV_PID=$(lsof -nP -iTCP:7700 -sTCP:LISTEN -t 2>/dev/null | head -1)
StateRUNNING_DEVRUNNING_PRODWEB_DEV_PID
Nothing upemptyemptymaybe (AirPlay)
Dev upnon-emptyemptynon-empty (next dev)
Prod upemptynon-emptyempty
Both upnon-emptynon-empty— (anomaly; ask user)

For start: if neither is up, ask the user which mode. If one is already up, treat the request as a no-op and just verify health.

For stop: target whichever is currently up. If nothing is up, say so and stop.

Step 1 — Start (dev)
bash
cd "$REPO/docker" && docker compose up -d

Then start the web dev server (run it in the background — do not block waiting for it):

bash
cd "$REPO/web" && npm run dev

If web/node_modules is missing, run npm install first. If :7700 is already taken by something other than a prior next dev (e.g. macOS ControlCenter for AirPlay), surface the conflict to the user — do not try to kill ControlCenter.

Step 1 — Start (prod)
bash
cd "$REPO"
docker compose -f docker-compose.yml up -d

State goes to <repo>/state unless docker/.env (or the environment) sets STATE_DIR — compose picks that up on its own, no need to pass it.

No host-side web dev server in prod — Caddy serves the built web container.

Show full SKILL.md (253 more words)Show less
Step 2 — Verify on-air

Give Liquidsoap ~5 seconds to connect to Icecast, then probe the controller:

bash
sleep 5
curl -sf http://localhost:7701/health    # dev — controller exposed directly
# or, in prod, via the Caddy port (read from `docker compose -f docker-compose.yml port caddy 80`)

Expect {"status":"on-air"}. In dev also verify the web UI: curl -sf -o /dev/null -w "%{http_code}\n" http://localhost:7700 → expect 200.

If the health probe fails, peek at docker compose logs --tail=30 controller broadcast and surface the relevant error. Do not rebuild — that's subwave-deploy's territory.

Step 1 — Stop (dev)
bash
# Stop the web dev server first (it holds :7700)
WEB_DEV_PID=$(lsof -nP -iTCP:7700 -sTCP:LISTEN -t 2>/dev/null | head -1)
[ -n "$WEB_DEV_PID" ] && kill "$WEB_DEV_PID"
cd "$REPO/docker" && docker compose down

If :7700 is held by ControlCenter (AirPlay) and not node, skip the kill — don't kill ControlCenter. Confirm with lsof -nP -iTCP:7700 -sTCP:LISTEN and check the COMMAND column before sending the signal.

Step 1 — Stop (prod)
bash
cd "$REPO" && docker compose -f docker-compose.yml down

Do not add -v (would wipe the named volumes for Caddy data/config) unless the user explicitly asks. State at ${STATE_DIR} is a host bind mount and is not affected by down either way.

Allowed without confirmation

  • docker compose up -d and docker compose down against either compose file
  • npm run dev / killing the foreground next dev process on :7700
  • npm install --prefix web if node_modules is missing
  • Reading logs, running curl health probes

Confirm before running

  • docker compose down -v (wipes volumes — Caddy data/config in prod)
  • Any rm/docker volume rm/docker system prune
  • Killing a non-node process holding :7700
  • Anything that touches state/ (including state/icecast-secrets.env) or the root .env

When to hand off to subwave-deploy

If the user wants any of these, this skill is not the right one — invoke subwave-deploy instead:

  • First-time setup, scripts/setup.sh
  • git pull + rebuild + recreate
  • Source changes in controller/, liquidsoap/, or web/ that need up -d --build
  • Generating jingles
  • Editing env or config

© perminder-klair, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/subwave-control of perminder-klair/subwave.

Open the folder on GitHubat commit fc34e8a

Compare with similar skills

Subwave Control next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Subwave Control compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Subwave Control this skillperminder-klair/subwave1.4k—~1.6kAutomated safety check: NotesMIT
Deploy To Tempsgotempsh/temps828—~1.3kAutomated safety check: NotesApache-2.0
Build Px4 macOSPX4/PX4-Autopilot13k—~1.1kAutomated safety check: PassBSD-3-Clause
Git Conventionswerf/werf4.7k—~1.3kAutomated safety check: PassApache-2.0
Clean Vmaxeldelafosse/loop281—~906Automated safety check: PassMIT
Burla Parallel Dev ClustersBurla-Cloud/burla263—~1.6kAutomated safety check: PassCustom licence

Similar skills

  • Deploy To Temps

    gotempsh/temps

    Deploy applications to the Temps platform with automatic framework detection, Dockerfile generation, and container orchestration.

    828 GitHub stars~1.3k tokensUpdated today
    DevOps & CloudAuto-check: notes
  • Build Px4 macOS

    PX4/PX4-Autopilot

    Build PX4 board firmware on macOS in the px4-dev Docker container, including git worktrees, and stage commit-labeled artifacts without flashing hardware.

    13k GitHub stars~1.1k tokensUpdated today
    DevelopmentAuto-check passed
  • werf conventions for branch names and commit messages. An agent skill from werf/werf.

    4.7k GitHub stars~1.3k tokensUpdated today
    DevelopmentAuto-check passed
  • Clean Vm

    axeldelafosse/loop

    Safely clean the local loop VM by reporting and removing stale loop runs, inactive Next.js or Storybook servers, optional browser windows, and unused loop-created worktrees without disturbing active…

    281 GitHub stars~906 tokensUpdated 6 mo ago
    DevelopmentAuto-check passed
  • Sets up an isolated Burla dev cluster per git worktree so several agents can work in parallel, and explains when to use local-dev or remote-dev.

    263 GitHub stars~1.6k tokensUpdated 16 days ago
    DevelopmentAuto-check passed
  • Clean Code Refactorer

    fike/fastapi-blog

    Skill for identifying code smells and refactoring code using Clean Code, SOLID, and DRY principles.

    101 GitHub stars~402 tokensUpdated today
    DevelopmentAuto-check passed

More from perminder-klair/subwave

  • Subwave LLM Bench

    perminder-klair/subwave

    Benchmark and compare LLM models for SUB/WAVE's on-air calls — track picks, segments, listener requests, DJ scripts, banter, and programme beats — in both candidate-pool and agent modes, using…

    1.4k GitHub stars~2.4k tokensUpdated today
    Auto-check: notes
  • Subwave Worktree Dev

    perminder-klair/subwave

    Stage a SUB/WAVE git worktree so the dev stack can run from it, then start it.

    1.4k GitHub stars~2.1k tokensUpdated today
    Auto-check: notes
  • Subwave Discord Release

    perminder-klair/subwave

    Draft a Discord release announcement for SUB/WAVE from a release PR, tag, or version number.

    1.4k GitHub stars~2.3k tokensUpdated today
    Auto-check passed
  • Subwave Release PR

    perminder-klair/subwave

    Open a release pull request from develop to main for SUB/WAVE, and keep develop from drifting behind main.

    1.4k GitHub stars~4k tokensUpdated today
    Auto-check passed
  • Subwave News Dispatch

    perminder-klair/subwave

    Write a news post for the SUB/WAVE "Dispatches" page, a short human-friendly tutorial about a feature, fix, or release.

    1.4k GitHub stars~1.6k tokensUpdated today
    Auto-check: warnings
  • Verify

    perminder-klair/subwave

    Drive a controller/admin-UI change end-to-end from a worktree without touching the live station — isolated controller on a spare port + temp STATEDIR, worktree Next dev server, Playwright against…

    1.4k GitHub stars~451 tokensUpdated today
    Auto-check passed

Categories

Questions about Subwave Control

What does Subwave Control do?

Start or stop the SUB/WAVE radio stack (a personal internet radio station) in dev or production mode — no builds, no rebuilds, no config rendering. Subwave Control is an agent skill from perminder-klair/subwave. Start or stop the SUB/WAVE radio stack (a personal internet radio station) in dev or production mode — no builds, no rebuilds, no config rendering.

When should I use Subwave Control?

Subwave Control fits situations like: first-time setup; Git pull + rebuilds; jingle generation; config changes — thats subwave-deploy.

How do I install Subwave Control in Claude Code?

Run `npx skills add perminder-klair/subwave --skill subwave-control -a claude-code`. Or copy the skill folder (.claude/skills/subwave-control in perminder-klair/subwave) into .claude/skills/subwave-control in your project. Claude Code loads it when a task matches its description.

How do I install Subwave Control in Codex?

Run `npx skills add perminder-klair/subwave --skill subwave-control -a codex`. Or copy the skill folder (.claude/skills/subwave-control in perminder-klair/subwave) into .agents/skills/subwave-control in your project. Codex loads it when a task matches its description.

Can I use Subwave Control in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add perminder-klair/subwave --skill subwave-control -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/subwave-control, .gemini/skills/subwave-control, .github/skills/subwave-control and .opencode/skills/subwave-control in your project.

What does Subwave Control need to run?

Going by SKILL.md and its folder, Subwave Control needs the command-line tools its instructions call (docker, npm, git and curl). Our summary lists: Node.js; Docker.

Does Subwave Control access the network?

SKILL.md contains no URLs. Its commands use docker, npm, git and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Subwave Control safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Subwave Control use?

Subwave Control is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Subwave Control use?

About 1.6k tokens (SKILL.md is roughly 6.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Subwave Control?

Skills that share tags, products or a category with Subwave Control: Deploy To Temps (gotempsh/temps, 828 stars), Build Px4 macOS (PX4/PX4-Autopilot, 13k stars), Git Conventions (werf/werf, 4.7k stars) and Clean Vm (axeldelafosse/loop, 281 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Subwave Control?

perminder-klair (a GitHub user) maintains it in perminder-klair/subwave, which has 1,417 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 9, 2026.

Source: perminder-klair/subwave on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.