juce-framework/JUCE
JUCE is an open-source cross-platform C++ application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, LV2 and AAX audio plug-ins.
Mixed signals — read the receipts
worst of 4 axesnon-standard license (Other)
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 1d ago
- ✓8 active contributors
- ✓Other licensed
Show 4 more →Show less
- ✓CI configured
- ✓Tests present
- ⚠Concentrated ownership — top contributor handles 56% of recent commits
- ⚠Non-standard license (Other) — review terms
What would change the summary?
- →Use as dependency Concerns → Mixed if: clarify license terms
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/juce-framework/juce)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/juce-framework/juce on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: juce-framework/JUCE
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/juce-framework/JUCE shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Mixed signals — read the receipts
- Last commit 1d ago
- 8 active contributors
- Other licensed
- CI configured
- Tests present
- ⚠ Concentrated ownership — top contributor handles 56% of recent commits
- ⚠ Non-standard license (Other) — review terms
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live juce-framework/JUCE
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/juce-framework/JUCE.
What it runs against: a local clone of juce-framework/JUCE — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in juce-framework/JUCE | Confirms the artifact applies here, not a fork |
| 2 | License is still Other | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 31 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of juce-framework/JUCE. If you don't
# have one yet, run these first:
#
# git clone https://github.com/juce-framework/JUCE.git
# cd JUCE
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of juce-framework/JUCE and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "juce-framework/JUCE(\\.git)?\\b" \\
&& ok "origin remote is juce-framework/JUCE" \\
|| miss "origin remote is not juce-framework/JUCE (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
&& ok "license is Other" \\
|| miss "license drift — was Other at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "CMakeLists.txt" \\
&& ok "CMakeLists.txt" \\
|| miss "missing critical file: CMakeLists.txt"
test -f "README.md" \\
&& ok "README.md" \\
|| miss "missing critical file: README.md"
test -f ".github/workflows/juce_private_build.yml" \\
&& ok ".github/workflows/juce_private_build.yml" \\
|| miss "missing critical file: .github/workflows/juce_private_build.yml"
test -f "BREAKING_CHANGES.md" \\
&& ok "BREAKING_CHANGES.md" \\
|| miss "missing critical file: BREAKING_CHANGES.md"
test -f "CODE_OF_CONDUCT.md" \\
&& ok "CODE_OF_CONDUCT.md" \\
|| miss "missing critical file: CODE_OF_CONDUCT.md"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 31 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/juce-framework/JUCE"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
JUCE is a production-grade C++ framework for building cross-platform desktop and mobile applications, with native support for VST3, AU, AUv3, LV2, and AAX audio plug-ins. It eliminates the need to write platform-specific code by providing unified APIs that compile to macOS, Windows, Linux, iOS, and Android from a single codebase, and includes the Projucer—a visual project configuration tool that generates Xcode, Visual Studio, and Android Studio projects. Monolithic modular structure: core JUCE framework lives in modules/ (audio, core, gui, etc. as separate compilable units), extras/Projucer contains the visual IDE, examples/ provides runnable CMake and Projucer demos, and Builds/ contains platform-specific project files (xcode/, visualstudio/, linux/ makefiles). Architecture separates concerns by module (e.g., juce_audio_processors for plugin APIs, juce_gui_basics for UI) that can be compiled together or as a static library.
👥Who it's for
Audio software developers and plugin creators who need to ship professional VST/AU/AAX plugins and desktop applications across multiple platforms without maintaining separate platform codebases. Also used by game developers and enterprise application builders who require cross-platform C++ GUI frameworks with strong multimedia capabilities.
🌱Maturity & risk
Extremely mature and production-ready. JUCE has been actively developed since ~2004 with thousands of professional audio plugins built on it (Serum, Sylenth1, Spire, etc.). The repo shows active CI/CD pipelines (GitHub Actions workflows), extensive test infrastructure, and a stable release cadence with tagged releases on the master branch. Last activity is ongoing with develop and master branches actively maintained.
Low risk for production use, but integration complexity is non-trivial: requires C++17, platform-specific SDKs (Xcode 12.4+, VS2019+), and careful audio API selection (VST3 vs VST2, AU vs AUv3). The codebase is large (40M+ lines of C++) with deep platform-specific code (Objective-C++ for macOS/iOS, Java for Android), creating high cognitive load for first-time contributors. No major breaking changes visible in BREAKING_CHANGES.md, though upgrading between major versions requires attention.
Active areas of work
Active development on CMake integration (CMake 3.22+ support documented in docs/CMake API.md), Android native build support (NDK 28.1.13356709 configured in gradle files), and plugin standards support (VST3, AUv3, LV2). GitHub workflows show automated testing and artifact publishing. The develop branch receives ongoing fixes while master maintains stable releases.
🚀Get running
Clone the repository and build examples: cd /path/to/JUCE && cmake . -B cmake-build -DJUCE_BUILD_EXAMPLES=ON -DJUCE_BUILD_EXTRAS=ON && cmake --build cmake-build --target DemoRunner. Alternatively, build the Projucer from source: navigate to extras/Projucer/Builds and open the platform-specific project (Xcode.xcodeproj, VisualStudio.sln, or Makefile).
Daily commands:
For CMake projects: cmake . -B build && cmake --build build. For Projucer-generated projects: open the .sln (VS), .xcodeproj (Xcode), or Makefile directly. For Android: cmake . -B android-build -DANDROID_TOOLCHAIN=clang -DANDROID_PLATFORM=android-24 -DCMAKE_CXX_STANDARD=17. All require platform SDKs (Xcode, Visual Studio, Android NDK, Linux dev tools) installed.
🗺️Map of the codebase
CMakeLists.txt— Master build configuration for the entire JUCE framework; defines all module dependencies, compilation targets, and platform-specific build rules.README.md— Primary entry point documenting JUCE's purpose, supported formats (VST/AU/AAX/LV2), and getting-started guidance for Projucer and CMake workflows..github/workflows/juce_private_build.yml— CI/CD pipeline orchestrating cross-platform builds for Windows, macOS, Linux, iOS, and Android; critical for maintaining stability.BREAKING_CHANGES.md— Documents API-breaking changes across releases; essential reading for version upgrades and maintenance planning.CODE_OF_CONDUCT.md— Community guidelines and contribution standards; sets expectations for all project interactions and pull requests.docs/CMake API.md— Authoritative reference for CMake integration patterns; required for anyone building JUCE-based projects.CHANGE_LIST.md— Comprehensive version history and feature logs; necessary for understanding feature availability and deprecation timelines.
🛠️How to make changes
Add a New Audio Module Format Example
- Create a new example header under examples/Assets/ following the pattern of ADSRComponent.h and AudioLiveScrollingDisplay.h (
examples/Assets/NewAudioComponent.h) - Register the example in a main demo orchestrator (typically in examples/Assets/DemoUtilities.h) to expose it in the example runner (
examples/Assets/DemoUtilities.h) - Add accompanying assets (images, sounds) to examples/Assets/Notifications/images or examples/Assets/Notifications/sounds (
examples/Assets/Notifications/images/) - Document the new component in docs/README.md, linking to relevant plugin format docs (VST3, AUv3, etc.) (
docs/README.md)
Document a New Platform or Breaking Change
- Add entry to BREAKING_CHANGES.md with version number, description, and migration guidance (
BREAKING_CHANGES.md) - Update CHANGE_LIST.md with the corresponding feature/fix details and affected modules (
CHANGE_LIST.md) - If platform-specific (e.g., Linux), create or update docs/Linux Dependencies.md (
docs/Linux Dependencies.md) - Update CMakeLists.txt if platform detection or new build targets are required (
CMakeLists.txt)
Add a New Box2D Physics Simulation Example
- Create a new test class file under examples/Assets/Box2DTests/ following existing patterns (e.g., AddPair.h, Bridge.h) (
examples/Assets/Box2DTests/YourNewTest.h) - Register the test in examples/Assets/Box2DTests/TestEntries.cpp to add it to the test menu (
examples/Assets/Box2DTests/TestEntries.cpp) - Import Box2D headers and JUCE UI components; implement setup(), Step(), and render() methods (
examples/Assets/Box2DTests/YourNewTest.h) - Verify the example builds via CMakeLists.txt and runs in the demo runner (
CMakeLists.txt)
Enhance CI/CD Workflow for New Platform
- Update .github/workflows/juce_private_build.yml to add a new job matrix entry for the target platform (
.github/workflows/juce_private_build.yml) - If custom build logic is needed, extend .github/workflows/configure_logger.py or add a new Python utility (
.github/workflows/configure_logger.py) - Use .github/actions/upload_artifact/action.yaml to capture build outputs for the new platform (
.github/actions/upload_artifact/action.yaml) - Document platform-specific dependencies and build steps in docs/Linux Dependencies.md or equivalent (
docs/Linux Dependencies.md)
🪤Traps & gotchas
Platform SDKs are non-negotiable: Xcode 12.4+ for macOS/iOS (including Apple Silicon support), Visual Studio 2019+ with Windows SDK for Windows, NDK 28.1+ for Android. Audio plugin development requires downloading plugin SDKs (Steinberg VST3 SDK, Apple AU headers, Pace AAX SDK) which JUCE expects in specific locations—this is documented but easy to miss. CMake version ≥3.22 is strictly required; older versions will fail silently. Android builds have complex ABI configuration (.abi filters) in gradle—ARM NEON must be explicitly enabled. Projucer is the only way to export for iOS; CMake iOS support is limited. Finally, the framework uses C++17 features heavily; C++14 or older will not compile.
🏗️Architecture
💡Concepts to learn
- Audio Plugin API Abstraction — JUCE provides a single plugin architecture (AudioProcessor base class) that compiles to VST3, AU, AUv3, AAX, and LV2 with no code changes; understanding this unified abstraction is core to productive plugin development in JUCE.
- Cross-Platform Native API Abstraction — JUCE's entire value proposition depends on hiding Win32, Cocoa, ALSA, and Android NDK APIs behind uniform C++ classes (e.g., juce::Graphics, juce::File); understanding which platform code runs where is essential for debugging and performance.
- MessageThread and AudioThread Isolation — JUCE enforces strict separation between audio processing (real-time, no allocations) and GUI updates (message queue-driven); violating this causes dropouts and crashes—critical to understand before writing audio callbacks.
- VST3 Parameter Automation and Gestures — VST3 (and JUCE's wrapper) separates parameter value changes from user interaction state (gesture begin/end); essential for accurate automation recording and host undo/redo integration.
- JUCE Module Compilation Model — Unlike typical C++ libraries, JUCE modules are header-heavy and expect inclusion via a single amalgamation header (e.g., #include <juce_core/juce_core.h>); misunderstanding this leads to linker errors and ODR violations.
- Real-Time Audio DSP in Fixed Memory — Audio processing callbacks must avoid malloc/new, exceptions, and blocking I/O to prevent digital audio dropouts; JUCE's juce_dsp module and related APIs enforce this discipline through stack-only allocations and pre-allocated buffers.
- Projucer Project Serialization — Projucer stores project metadata as .jucer XML files that are version-specific; understanding the format and regeneration process is essential for CI/CD and team workflows.
🔗Related repos
steinberg/vst3sdk— Official VST3 plugin SDK that JUCE wraps; needed to understand the plugin API contract and optional features JUCE abstracts away.iPlug2/iPlug2— Lightweight C++ audio plugin framework and direct competitor solving the same problem with smaller footprint but less platform coverage and fewer plugin standards.surge-synthesizer/surge— Production open-source synth built entirely on JUCE; reference implementation showing advanced audio DSP and parameter automation patterns.Tracktion/engine— DAW engine built on top of JUCE modules; demonstrates how professional audio applications compose JUCE components for session management, mixing, and plugin hosting.free-audio/clap-juce-extensions— Community library adding CLAP (Clever Audio Plugin) standard support to JUCE, bridging JUCE to the emerging plugin format beyond VST/AU/AAX.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive CI workflow for Android NDK/CMake build validation
The repo has Android configuration in build.gradle (NDK 28.1.13356709, CMake 3.22.1, API 24-35) but no GitHub Actions workflow validates Android builds. Given the complexity of Android NDK toolchain setup and the critical nature of Android support in JUCE, adding a dedicated workflow would catch regressions early. The .github/workflows directory has private build workflows but no public Android CI.
- [ ] Create .github/workflows/android-build.yml that runs on PRs touching CMakeLists.txt, build.gradle, or juce_* modules
- [ ] Configure the workflow to download NDK 28.1.13356709 and build example projects for armeabi-v7a and arm64-v8a targets using the exact CMake arguments from build.gradle
- [ ] Add status checks to catch Android-specific build failures (e.g., incorrect STL=c++_static linking, NEON/ARM mode issues)
- [ ] Document expected setup in docs/Linux Dependencies.md with Android NDK prerequisites
Add comprehensive unit tests for Audio I/O and VST3/AU module interactions
JUCE supports 6 major audio plugin formats (VST, VST3, AU, AUv3, LV2, AAX) and desktop/mobile audio I/O, but the repo lacks visible test coverage for these critical subsystems. The file structure shows extensive module architecture but no dedicated test/ directory entries for audio processing pipelines, plugin format implementations, or platform-specific audio backends.
- [ ] Create tests/juce_audio_plugin_client/ directory with unit tests for VST3 parameter handling, AU AudioComponentDescription validation, and format-specific edge cases
- [ ] Add tests/juce_audio_basics/ for AudioBuffer operations, sample rate conversion, and cross-platform audio device enumeration logic
- [ ] Ensure tests run on CMake builds (integrate with CMakeLists.txt via find_package(Catch2) or GoogleTest) and validate against known VST3/AU SDK versions
- [ ] Document test execution in docs/README.md with example commands for running audio subsystem tests
Create missing documentation for CMake API integration patterns with examples
The docs/CMake API.md file exists but the repo has extensive CMake configuration (CMakeLists.txt at root, Android CMake 3.22.1, various build configurations) without concrete integration examples. New contributors struggle to understand how to embed JUCE into existing CMake projects, especially for plugin formats. docs/ lacks step-by-step guides for common scenarios.
- [ ] Expand docs/CMake API.md with 3-4 complete, runnable examples: (1) basic desktop app linking JUCE, (2) VST3 plugin with juce_add_plugin(), (3) Android build with NDK toolchain, (4) iOS build targeting AUv3
- [ ] Reference specific modules in examples/ (e.g., examples/AudioLiveScrollingDisplay.h) and show corresponding CMakeLists.txt snippets
- [ ] Add troubleshooting section addressing common CMake errors (e.g., JUCE module not found, STL mismatches on Android, code signing on macOS)
- [ ] Include links to docs/Linux Dependencies.md, docs/ARA.md, docs/Accessibility.md for format-specific requirements
🌿Good first issues
- Add missing CMake documentation for VST3 plugin template. The docs/CMake API.md covers basic module integration but lacks a worked example of minimal VST3 plugin with both parameters and audio I/O (see examples/CMake/ directories—no plugin example exists there).: Medium
- Create unit tests for juce_core file I/O classes on Linux. The test infrastructure exists (see GitHub workflows) but File::readEntireFileAsString and File::replaceWithText lack comprehensive tests for symlink handling and permission errors on POSIX systems.: Medium
- Add accessibility (JUCE_LINUX_ACCESSIBILITY) examples and tests. The Accessibility.md documentation exists but no example code demonstrates screen reader integration for Linux; examples/CMake/ has no accessibility demo despite macOS and Windows having deep a11y support.: High
⭐Top contributors
Click to expand
Top contributors
- @reuk — 56 commits
- @Anthony-Nicholls — 16 commits
- @tpoole — 13 commits
- @szarvas — 9 commits
- @szkkng — 2 commits
📝Recent commits
Click to expand
Recent commits
501c076— Docs: Add a course link to the Doxygen layout (tpoole)c74f40e— Docs: Add some missing code formatting (tpoole)0e949ff— Docs: Include a course link in the header (tpoole)10e119a— Docs: Include a marketplace link in the header (tpoole)29396c2— JUCE version 8.0.12 (tpoole)2e72048— Projucer: Enable ARM64EC for Visual Studio 2026 exporter (reuk)edeb175— Resave all projects (tpoole)acc4b9c— Bump version number to 8.0.12 (tpoole)7617f6b— Projucer: Fix a module path in provided projects (tpoole)1957950— DrawableText: 0-initialise fontHeight and fontHScale variables (aggniesz)
🔒Security observations
- High · Hardcoded Android Keystore Credentials —
Dependencies/Package file (build.gradle) - signingConfigs section. The build.gradle file contains hardcoded credentials for Android keystore signing configuration. The storePassword, keyAlias, and keyPassword are hardcoded as 'android' and 'androiddebugkey', which are default Android debug credentials. While these are typically for debug builds, storing credentials in version control (even debug credentials) is a security anti-pattern and could lead to unauthorized signing of release builds if the configuration is reused. Fix: 1. Move keystore credentials to external configuration files or environment variables. 2. Use Gradle's signing config from local.properties or system environment variables. 3. Never commit actual keystore files or passwords to version control. 4. Implement separate signing configurations for debug and release builds using environment-based credential injection. 5. Consider using Android's Play App Signing service for production releases. - Medium · Debug Configuration in Release Build Type —
Dependencies/Package file (build.gradle) - buildTypes section. The build.gradle shows both debug and release build types configured with the same signingConfig (juceSigning), and debuggable/jniDebuggable flags are explicitly set. While jniDebuggable is false for release, having consistent signing configuration across build types could be problematic if credentials are compromised. Fix: 1. Use different signing configurations for debug and release builds. 2. Ensure release builds never use debug keystore. 3. Implement build variant-specific signing configurations. 4. Add build-time verification to prevent accidental release builds with debug credentials. - Medium · CMake Version Pinning with Potential Supply Chain Risk —
Dependencies/Package file (build.gradle) - externalNativeBuild section. The build configuration specifies CMake version 3.22.1 and NDK version 28.1.13356709. While version pinning is good for reproducibility, there's no evidence of verification checksums or signed releases being validated, creating a potential supply chain attack vector if the download source is compromised. Fix: 1. Implement checksum verification for downloaded CMake and NDK versions. 2. Use gradle.properties or verified repositories to manage dependency versions. 3. Consider using Android Gradle Plugin's built-in dependency verification. 4. Periodically audit and update to latest stable versions while maintaining security patches. - Medium · Permissive ABI Filters in Debug Flavor —
Dependencies/Package file (build.gradle) - debug_ productFlavor section. The debug_ flavor includes 4 different ABI architectures (armeabi-v7a, x86, arm64-v8a, x86_64). Including x86 and armeabi-v7a in production or when not necessary increases the attack surface. These older architectures may have known vulnerabilities. Fix: 1. Limit ABI filters to only necessary architectures (typically arm64-v8a for modern apps). 2. Remove legacy architectures (armeabi-v7a, x86) unless specifically required. 3. For release builds, use only arm64-v8a unless supporting older devices is critical. 4. Document why each ABI is included if they are necessary. - Low · Missing Release Flavor Configuration Details —
Dependencies/Package file (build.gradle) - release_ productFlavor section. The release_ productFlavor configuration appears incomplete in the provided file (text cuts off at 'externalNativ'). Incomplete configuration could lead to inconsistent build behavior or unintended defaults being applied. Fix: 1. Complete and review the release_ flavor configuration. 2. Ensure it specifies appropriate optimization flags and feature flags. 3. Remove any debug symbols or logging from release builds. 4. Verify minification/obfuscation is enabled for release builds. - Low · Insufficient Input Validation Framework Considerations —
Repository-wide - particularly audio processing modules. JUCE is a C++ framework for audio plugins and desktop applications. While the static structure doesn't show specific vulnerability patterns, audio plugin frameworks handling external audio data should implement strict bounds checking and validation, particularly for VST/AU plugin parameter handling. Fix: 1. Implement comprehensive input validation for all audio plugin parameter inputs. 2. Use safe integer arithmetic libraries for audio calculations. 3. Implement buffer overflow protection (bounds checking) for all audio buffer operations. 4. Regular security audits of audio processing code, particularly for integer overflows in DSP calculations.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.