Your one-stop shop for JUCE modules, tools, assets and resources
Moonbase SDK for C++ & JUCE
License activation for JUCE 8 plugins and apps, with a polished activation UI built in. Add the module, fill in three fields and show one component. Your customers get online and offline activation, trials, license management and in-app updates, all backed by Moonbase.

The repository contains two things: moonbase_licensing, a drop-in JUCE module, and the header-only C++17 SDK it is built on, which you can also use on its own in any C++ application.
juce::Animator. A reduceMotion flag turns them off.ActivationComponent as a modal over your editor, or open ActivationDialog as a standalone window.
JucePlugin_Name and JucePlugin_Manufacturer.Drawable, or go further: config.palette exposes every colour in the UI as its own token, and config.fonts takes your typefaces for headings, body text and monospace.ActivationController owns the logic. Network calls run on a background thread pool, state changes arrive on the message thread, and a slow response can never overwrite a newer state.licensedFlag(), or use LicenseGate to fade to silence and back without clicks.refreshLicense() to pick up a mid-session purchase without a restart.When a customer's license covers a newer release than the one installed, an Update available screen shows your release notes and downloads the right installer for their platform, with progress. It follows your download rules (a trial can't fetch an owners-only release and is offered an unlock button instead), and "Skip this update" is remembered until the next version ships. One flag turns it off.

HTTP goes through juce::WebInputStream, JSON uses a bundled nlohmann/json, and signatures are verified with the operating system's own crypto: Security.framework on macOS and iOS, CNG on Windows and libcrypto on Linux. There is nothing to install with brew, vcpkg or apt.
onDiagnostic callback.Every license is bound to one machine through an open, versioned device fingerprint spec computed from stable hardware identifiers. It spawns no subprocesses, needs no admin rights, works inside a sandboxed plugin host, and gives the same id with or without elevated privileges.
Because the spec is shared across Moonbase SDKs, a license activated in an Electron or web app built on @moonbase.sh/licensing (3.0 or later) validates in your plugin, and the other way round. iOS and Android use a platform-scoped identity. describeDevice() returns diagnostics you can safely attach to a support ticket, without exposing any hardware serial numbers.
LicenseGate stays silent until a license is confirmed.The README includes practical guidance on hardening a plugin on top of these guarantees.
Not on JUCE? The same licensing engine is a header-only C++17 library for Windows, macOS and Linux. Pull it in with find_package or FetchContent; it uses libcurl and OpenSSL.
OnlineUnlockStatus bridge for projects already built on juce::OnlineUnlockStatus, including JUCE 7. It is a single header you copy in and pair with your own UI.juce_add_module(external/moonbase-cpp/modules/moonbase_licensing)
target_link_libraries(MyPlugin PRIVATE moonbase_licensing)
target_compile_definitions(MyPlugin PRIVATE JUCE_USE_CURL=0)
In Projucer, choose Modules > Add a module from a specified folder and select modules/moonbase_licensing.
#include <moonbase_licensing/moonbase_licensing.h>
using namespace moonbase::juce_integration;
ActivationConfig config;
config.endpoint = "https://your-tenant.moonbase.sh";
config.productId = "your-product";
config.publicKey = embeddedPublicKeyPem;
activation = std::make_unique<ActivationComponent>(config);
addAndMakeVisible(*activation);
MIT
Something wrong with this product?
ReportAre you the owner of this product?
Request Ownership