A Projucer-inspired desktop GUI for one-shot generation of ready-to-build CMake-based JUCE starter projects.
💛 If you find this project useful, consider sponsoring its development — every contribution helps keep the work going!
Luthier is a self-contained PySide6 desktop app that generates ready-to-build, CMake-based JUCE plugin projects (AU / VST3 / Standalone): fill a form, validate inline, and generate a complete starter project once. After generation, continue development in your IDE — Luthier does not reload or reopen existing projects. Your defaults live in a persistent preferences file; each generate also writes a write-only .luthier.json sidecar as metadata for you or AI tools.
Further reading: User manual (EN) · Manuel utilisateur (FR) · Documentation index
- Project — one scrollable page for the whole plugin:
- identity: technical/display names, version, manufacturer, copyright, website, e-mail, plugin & manufacturer codes, auto-computed bundle ID, with live inline validation;
- plugin type (Instrument, Audio Effect, MIDI Effect), decoupled plugin characteristics (synth/MIDI flags, Audio I/O preset, VST MIDI channel counts), and plugin description (CMake
DESCRIPTION); - formats (AU, VST3, Standalone);
- compilation: C++ standard, preprocessor definitions, header search paths;
- workspace: per-OS destination and JUCE paths with tree-style grouping;
- artefacts: copy to system plugin folders and/or a central per-OS directory.
- Generate guard — blocked when the destination
{folder}/{projectName}/is non-empty (including hidden files like.git/or.DS_Store); session regenerate in the same app session rewrites the tree except.gitafter a destructive confirm. - Preferences — persistent defaults (identity, workspace, accent colour, default artefact settings) stored as JSON in the OS configuration directory.
- Templates — view, edit, replace, or reset the C++ source templates (
PluginProcessor/PluginEditor) used for new projects; overrides persist on disk. - Write-only
.luthier.json— configuration snapshot written at generate; optional reference for humans or tooling — Luthier never reads it back into the form.
- Python 3.11+
- Dev setup:
pip install -r requirements-dev.txt(includes PySide6, pytest, PyInstaller — see CONTRIBUTING.md) - Runtime-only install:
pip install -r requirements.txt(PySide6 only) - No external dependencies beyond PySide6: the CMake project templates ship inside Luthier (
templates/) and the generation engine is built in (core/).
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements-dev.txt
.venv/bin/python main.py # Windows: .venv\Scripts\python main.pyCheck that the bundled templates are reachable (headless):
.venv/bin/python main.py --check # Windows: .venv\Scripts\python main.py --checkSee CONTRIBUTING.md for full developer setup (venv, pytest, bundle build) and docs/dev/architecture.md for the three-layer design and module contracts.
PyInstaller bundles templates and resources into a self-contained app (build on each target OS — no cross-compilation):
.venv/bin/python publish/build-dist.pyOn Windows: .venv\Scripts\python.exe publish/build-dist.py
| OS | Output |
|---|---|
| macOS | dist/Luthier.app |
| Windows | dist/Luthier/Luthier.exe + _internal/ |
| Linux | dist/Luthier/Luthier + _internal/ |
Platform variants, headless bundle checks, and timings: see CONTRIBUTING.md.
Luthier is developed in my free time, alongside a day job as an instructional designer. Cursor has been a key part of my workflow for building this tool and related projects.
If you find Luthier useful, sponsoring on GitHub Sponsors is the most direct way to help cover tooling costs and keep development going. Every contribution, no matter the size, is genuinely appreciated.
Also see Matrix-Control — a cross-platform SysEx MIDI editor for the Oberheim Matrix-1000 (JUCE 8 plugin) from the same author.
Luthier is released under the MIT License.
Packaged builds are distributed with Qt (via PySide6) under the LGPLv3 — see THIRD-PARTY-NOTICES.md.
