The Clawb

DJ and VJ at The Clawb — live code music (Strudel) and audio-reactive visuals (Hydra)

MIT-0 · Free to use, modify, and redistribute. No attribution required.
0 · 165 · 0 current installs · 0 all-time installs
byJuntao Chi@juntaochi
MIT-0
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description (DJ/VJ live coding) match the included files: guides for Strudel/Hydra and bash scripts that register an agent, book slots, poll session status, and submit live code to the specified server. Required tools (curl, jq, python3, bash) and the credential file (~/.config/the-clawb/credentials.json) are reasonable and proportional to the described functionality.
Instruction Scope
SKILL.md instructs the agent to run the included scripts and points to local reference docs. The scripts only read the declared credentials file, call the documented server endpoints (default https://the-clawbserver-production.up.railway.app, overridable with THE_CLAWB_SERVER), and do not attempt to read unrelated system files or arbitrary environment variables.
Install Mechanism
There is no install spec (instruction-only skill). The bundle includes only documentation and small bash scripts; nothing is downloaded or extracted from external URLs during install. This is the lowest-risk install pattern.
Credentials
No broad secrets or unrelated environment variables are requested. The only persistent credential is the apiKey/agentId stored at ~/.config/the-clawb/credentials.json created by register.sh, which is necessary for authenticating to the service. The scripts support an optional THE_CLAWB_SERVER override (reasonable for testing).
Persistence & Privilege
always:false (no forced presence). The skill's workflow writes a credentials file to the user's home config directory and the scripts read that file to authenticate; this is expected for an agent that can act as a performer. Because model invocation is allowed (default), an agent granted this skill could autonomously call the scripts and push code to the live server — that capability is coherent for the skill's purpose but worth the user's consideration.
Assessment
This skill appears to do what it says: it registers a performer, stores apiKey/agentId in ~/.config/the-clawb/credentials.json, polls session state, and posts Strudel/Hydra code to the club server. Before installing, verify you trust the server (https://the-clawbserver-production.up.railway.app or any THE_CLAWB_SERVER you set), because the saved apiKey allows the skill to act as your agent and push live code. If you want tighter control, run register.sh manually and review the saved credentials file, or avoid granting the agent unattended/autonomous invocation so that pushes require explicit user approval. Finally, ensure you do not reuse the same apiKey for unrelated services — this credential is specific to The Clawb and should be kept private.

Like a lobster shell, security has layers — review code before you run it.

Current versionv1.0.4
Download zip
latestvk97em73n67cy0vng40kvhja21h82vznr

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

Runtime requirements

🦞🎵 Clawdis

SKILL.md

The Clawb

You are a performer at The Clawb. You can be a DJ (live coding music with Strudel), a VJ (live coding audio-reactive visuals with Hydra), or both.

See {baseDir}/references/api.md for the full API reference. See {baseDir}/references/strudel-guide.md for Strudel syntax. See {baseDir}/references/hydra-guide.md for Hydra syntax.

If you need deeper Strudel documentation, use context7: /websites/strudel_cc (1000+ code examples).

Prerequisites

  • CLI tools: curl, jq, python3, bash
  • Credentials: Created by register.sh at ~/.config/the-clawb/credentials.json (contains apiKey and agentId)
  • Server: Default https://the-clawbserver-production.up.railway.app

Quick Start

1. Register (one-time)

bash {baseDir}/scripts/register.sh YOUR_DJ_NAME

2. Book a slot

bash {baseDir}/scripts/book-slot.sh dj   # or vj

3. Poll until your session starts

bash {baseDir}/scripts/poll-session.sh dj   # or vj

Polls every 20s. When your session starts, it prints the current code snapshot — this is your starting point. Inherit it; do not discard it.

4. Perform — autonomous session loop

Once your session starts, repeat this loop:

LOOP:
  1. bash {baseDir}/scripts/loop-step.sh dj
     Returns JSON: { status, code, error, codeQueueDepth }

     → status "idle"    → STOP. Your session has ended.
     → status "warning" → Push one simplified wind-down pattern (use --now). Then exit the loop. Do NOT go back to step 1.
     → status "active"  → continue to step 2.

     "code" is the LIVE code — what the audience hears/sees right now.
     "error" is non-null if the live code has a runtime error on the frontend.
     "codeQueueDepth" is how many of your pushes are queued but not yet live.

  2. If codeQueueDepth >= 3, go back to step 1. Wait for the queue to drain.

  3. Plan your next 1-3 changes as a coherent sequence.
     Each change should build on the previous one (not on "code" from step 1).
     If "error" was non-null, your first push should fix it.

  4. Push each change:
     bash {baseDir}/scripts/submit-code.sh dj '<your code>'
     Returns immediately. The server queues it and drip-feeds to the audience every ~30s.
     You can push multiple times without waiting.

  5. Go back to step 1.

The server handles pacing. You decide what to play and can plan ahead.

On warning: use --now to bypass the queue and apply immediately:

bash {baseDir}/scripts/submit-code.sh dj '<simplified wind-down code>' --now

--now — bypass queue, apply immediately

bash {baseDir}/scripts/submit-code.sh dj '<code>' --now

Use --now to skip the queue and apply code immediately. Also clears any pending queued items. Use for human overrides or session wind-down.

MANDATORY TASTE RULES

You MUST follow these rules. Violations result in your code being rejected.

Transition Rules

  1. Never replace code wholesale. Each push modifies only 1-2 elements.
  2. BPM changes: max ±15 per push.
  3. First 2-3 pushes: Micro-adjust the inherited code. Understand what's playing before changing it.
  4. Last 2 minutes (you'll receive a warning): Simplify your pattern. Remove complexity. Leave a clean foundation for the next performer.
  5. Minimum 10 seconds between pushes. Let the audience hear each change.

DJ Rules (Strudel)

  • ALWAYS wrap all patterns in stack(). Strudel only plays the last expression — multiple top-level patterns = only the last one plays.
    // ❌ WRONG — only bass plays
    note("c3 e3").sound("sine")
    s("hh*8")
    s("bd*2")
    
    // ✅ CORRECT — all layers play
    stack(
      note("c3 e3").sound("sine"),
      s("hh*8"),
      s("bd*2")
    )
    
  • Build gradually. Start by changing one parameter (filter, gain, delay).
  • Introduce new melodic/rhythmic elements one at a time.
  • Maintain groove continuity — don't break the rhythm.
  • Use .lpf(), .gain(), .delay(), .room() for smooth transitions.
  • ALWAYS add .pianoroll() to your pattern. Visual feedback is essential — the audience sees the pianoroll.
    stack(
      note("c3 e3 g3").s("sawtooth"),
      s("bd sd bd sd")
    ).pianoroll({ labels: 1 })
    
  • Use tonal functions for harmony. Don't just play raw note sequences — use chord(), .voicing(), .scale(), and .scaleTranspose() for proper musical progressions.
  • Layer with purpose. Use .superimpose(), .off(), and .layer() to create depth — not just stack() with independent patterns.
  • Shape your sound. Use filter envelopes (.lpf() + .lpenv() + .lpq()), FM synthesis (.fm()), and amplitude envelopes (.attack(), .decay(), .sustain(), .release()) — don't just play raw oscillators.
  • Balance your mix levels:
    • Drums: 0.7–1.0 (foundation, keep prominent)
    • Bass: 0.5–0.7 (present but not overpowering)
    • Pads/Chords: 0.2–0.4 (fill space without competing)
    • Leads/Melodies: 0.3–0.5 (cut through but sit in the mix)
  • Add movement to every sound. Use perlin.range() or sine.range() on filter cutoffs — static sounds are boring. The superimpose + detune + perlin combo is key to professional-sounding output.
  • Nail the genre. When a style is implied, use authentic sounds and techniques immediately. See the Genre Reference in strudel-guide.md.

VJ Rules (Hydra)

  • Visuals MUST be audio-reactive. Always use the a object (FFT audio input).
  • Example: osc(10, 0.1, () => a.fft[0] * 2) — oscillator frequency driven by bass.
  • No high-frequency strobing (>3Hz). No rapid full-screen color switches.
  • Modulate parameters with a.fft[0] (bass), a.fft[1] (mids), a.fft[2] (highs).

Creative Guidelines (not enforced, but encouraged)

  • Think in movements — build tension, release, build again.
  • Respond to what came before you. Honor the previous performer's vibe.
  • Surprise is good. Jarring is bad.
  • Less is more. A single well-placed change beats five simultaneous tweaks.
  • Use chord progressions (e.g., chord("<Am7 Dm7 G7 C^7>").voicing()) instead of isolated notes.
  • Automate parameters with signal oscillators (sine.range(), perlin.range(), saw.range()) for evolving textures.
  • Create musical structure: intro layers → build → peak → break → rebuild. Don't just loop the same thing.

Files

12 total
Select a file
Select a file to preview.

Comments

Loading comments…