A starting point for a new JUCE audio-plugin project. Adds a CI sanitizer matrix (ASan, UBSan, TSan, RTSan), clang-tidy as a PR-comment bot, RTSan-aware attribute macros, and a clang-format pre-commit hook to the Pamplejuce template. The placeholder plugin name is Starty — see Rename for what to change when forking.
Pick names. Example values for a hypothetical "Spangle" plugin by "Acme Audio":
| Identifier | What it is | Example |
|---|---|---|
PROJECT_NAME |
Internal CMake target name (no spaces) | Spangle |
PRODUCT_NAME |
Display name shown in DAWs (spaces OK) | Spangle |
COMPANY_NAME |
Manufacturer | Acme Audio |
BUNDLE_ID |
macOS reverse-DNS bundle id | com.acmeaudio.spangle |
PLUGIN_MANUFACTURER_CODE |
4 chars, first uppercase | Acme |
PLUGIN_CODE |
4 chars, ≥1 uppercase, unique per plugin | Spgl |
Then update each of these locations:
| File | Change |
|---|---|
CMakeLists.txt |
PROJECT_NAME, PRODUCT_NAME, COMPANY_NAME, BUNDLE_ID, PLUGIN_MANUFACTURER_CODE, PLUGIN_CODE, PRODUCT_NAME_WITHOUT_VERSION |
tests/PluginBasics.cpp |
The expected name string in the Plugin instance test |
packaging/dmg.json |
title, icon, and the dmg/Starty.* paths |
packaging/resources/README |
Installer thank-you text |
packaging/starty.icns |
Rename file to match new product name and replace the image with your own. The macOS CI workflow uses this to brand the .vst3/.au/.clap bundles with a custom Finder icon — leave the placeholder and your plugins will look like the Starty template. Also update the sips/DeRez lines in .github/workflows/build_and_test.yml to point at the renamed file. |
packaging/icon.png |
Generic placeholder used as ICON_BIG for the Standalone app (referenced from CMakeLists.txt). Replace the image with your own; the filename can stay since it's not name-specific. |
.github/workflows/build_and_test.yml |
Workflow name: (line 1) |
README.md |
Build badge URL (point at your repo), License section copyright line, the title at the top |
LICENSE / README.md License section |
Update the copyright holder if appropriate |
Shortcut: editor-wide case-aware find-and-replace of Starty → Spangle and starty → spangle, then double-check that the .icns got renamed — most find/replace tools skip binary files.
brew install cmake ninja clang-format # Homebrew: https://brew.shsudo apt update
sudo apt install -y \
cmake ninja-build clang clang-format lld \
libasound2-dev libx11-dev libxinerama-dev libxext-dev \
libfreetype6-dev libwebkit2gtk-4.1-dev libglu1-mesa-devOne-time, per clone. Refuses commits whose staged C/C++ files aren't clang-format clean (see .githooks/pre-commit):
git config core.hooksPath .githookscmake -B Builds -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
cmake --build Builds
ctest --test-dir Builds --output-on-failureFor a universal macOS binary, add -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" to the configure step.
CI runs RealtimeSanitizer on Linux. To check locally on macOS, install Homebrew LLVM — Apple Clang doesn't ship the RTSan runtime:
brew install llvmConfigure a separate build dir using brew's clang and the realtime flags:
CC=/opt/homebrew/opt/llvm/bin/clang \
CXX=/opt/homebrew/opt/llvm/bin/clang++ \
cmake -B Builds-rtsan -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="-fsanitize=realtime" \
-DCMAKE_CXX_FLAGS="-fsanitize=realtime" \
-DCMAKE_EXE_LINKER_FLAGS="-fsanitize=realtime"Build and run:
cmake --build Builds-rtsan --target Tests
ctest --test-dir Builds-rtsan --output-on-failure --verbose -E NOT_BUILTEvery push and PR triggers:
build_and_test— Linux/macOS/Windows,pluginvalvalidation, artifact uploadsanitizers— ASan / UBSan / TSan / RTSan (clang-20 for the latter)clang-tidy— posts review comments on PRs
nightly.yml runs the same fan-out daily at 10:00 UTC, to catch external drift (JUCE submodule on develop, apt packages, GitHub runner images) between commits. Disable by commenting out the schedule: block in that file if you don't want the daily runs.
Starty is released under the GNU Affero General Public License, version 3 (AGPLv3). Copyright (C) 2026 Vincent Berthiaume.
This project links against JUCE, used under the AGPLv3 free-use option of JUCE Ltd's dual-license terms.
Portions of the build system and project scaffolding derive from the Pamplejuce template, which is distributed under the MIT License:
MIT License
Copyright (c) 2022 Sudara Williams
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.