---
name: scaffold-vst
description: Use when the user asks to "scaffold a vst", "make a vst plugin", "new vst project", "create a synth plugin", or similar. Walks the user through interactive questions (name, plugin type, aesthetic, fonts, AI features, parameters, output dir) and generates a complete buildable JUCE/C++ VST project.
---


# Scaffold VST

## When to use

Trigger whenever the user wants to create a new VST/audio plugin project from scratch and wants the scaffolder to guide the setup. Do NOT trigger for modifying an existing plugin project — that's out of scope for v1.

## Process

Ask the questions below ONE AT A TIME. Use multiple-choice form when possible. Do not skip ahead. After all answers are collected, present a summary and ask for confirmation before writing any files.

### Questions

1. **Project name** (human-readable, e.g., "Vicky Synth") and **4-character plugin code** (unique identifier, e.g., "Vcky"). JUCE requires exactly 4 characters for the code.
2. **Company name** and **company URL** (used in the generated plist / `JucePlugin_Manufacturer`).
3. **Plugin type** — one of: `synth`, `effect`, `sampler`, `midi-effect`, `analyzer`.
4. **Aesthetic preset** — `dark`, `light`, or `custom`. If `custom`, ask for 3–5 hex colors with semantic roles: `background`, `surface`, `primary`, `accent`, `text`.
5. **Fonts** — either a path to a local `.ttf` file, or a Google Font name (e.g., "Inter", "Space Grotesk"). Accept multiple fonts with roles (heading, body).
6. **Background image/SVG** (optional) — path to a local file. Skip if not provided.
7. **AI features** (multi-select) — `preset-generator`, `neural-inference`, `param-morph`, or `none`.
8. **Parameters** — suggest defaults based on plugin type (see table below), then ask if the user wants to override, add, or remove any.
9. **Output directory** — absolute path. Refuse to overwrite an existing directory.

### Default parameter sets

- **synth**: `osc1_shape`, `osc2_shape`, `osc_mix`, `filter_cutoff`, `filter_resonance`, `amp_attack`, `amp_decay`, `amp_sustain`, `amp_release`, `master_gain`.
- **effect**: `drive`, `tone`, `dry_wet`, `output_gain`.
- **sampler**: `sample_start`, `sample_end`, `pitch`, `amp_attack`, `amp_release`, `master_gain`.
- **midi-effect**: `transpose`, `velocity_curve`, `channel_filter`.
- **analyzer**: `fft_size`, `smoothing`, `db_floor`, `db_ceiling`.

## Generation

After the user confirms the summary:

1. Create the output directory at the user's chosen path. Fail if it already exists.
2. Copy the files from `templates/<plugin-type>/` into the output directory.
3. For every file, substitute placeholders:
   - `{{PROJECT_NAME}}` — the human-readable project name.
   - `{{PROJECT_SLUG}}` — lowercase, hyphenated (e.g., "vicky-synth").
   - `{{PLUGIN_CODE}}` — 4-char code.
   - `{{COMPANY_NAME}}` and `{{COMPANY_URL}}`.
   - `{{COLOR_BACKGROUND}}`, `{{COLOR_SURFACE}}`, `{{COLOR_PRIMARY}}`, `{{COLOR_ACCENT}}`, `{{COLOR_TEXT}}` — hex values (with `0xff` prefix when emitted to C++).
   - `{{FONT_PRIMARY_FILENAME}}`, `{{FONT_SECONDARY_FILENAME}}` — basenames of TTF files.
   - `{{PARAMETER_DEFS}}` — C++ code block registering the user's APVTS parameters.
   - `{{AI_INCLUDES}}`, `{{AI_MEMBERS}}`, `{{AI_INIT}}` — injected blocks if AI modules are selected.
4. Copy `theming/CustomLookAndFeel.h.tmpl` and `.cpp.tmpl` into `Source/Theme/`, substituting placeholders.
5. Copy each selected AI module's files from `ai-modules/<module>/` into `Source/AI/`.
6. If the user provided font paths, copy them to `Source/BinaryData/`. For Google Fonts, fetch via `https://fonts.googleapis.com/css2?family=<Name>` resolution to a `.ttf` URL and download.
7. If a background image was provided, copy it to `Source/BinaryData/`.
8. Generate `Source/BinaryData/CMakeLists-files.txt` listing all embedded assets for `juce_add_binary_data`.
9. Emit `README.md` using the `README.md.tmpl` in the templates, listing build instructions and any required external deps (Claude API key file location, ONNX Runtime install).
10. Emit `.gitignore`.
11. Print a final summary showing the output directory and the exact commands to build:

```
cd <output-dir>
cmake -B build
cmake --build build
```

## Error handling

- If plugin code is not exactly 4 characters, re-prompt.
- If project name is empty, re-prompt.
- If output directory exists, abort with a clear message listing its contents.
- If a specified font file is missing, fall back to JUCE's default font and print a warning.
- If AI features are selected, ensure the generated README clearly documents the extra setup.
