Repository navigation
Linux as a third platform, and releases on GitHub Actions - #8
Merged
Merged
Conversation
Adds Linux (linux-x64) as a third platform beside Windows and macOS. The Debug app, the VST3 plugin and every native test now build and pass on Ubuntu, and `pnpm app` runs the same dev loop there. - CMake: WebKitGTK and libcurl on Linux (JUCE's socket fallback cannot do HTTPS), JACK for the standalone app - Paths: data root ~/.config/Plectrify, managed plugins in ~/.vst3 (shared with other vendors, like macOS), content root /var/lib/Plectrify (mode 1777, so patch packs' baked paths stay machine-independent) - Native title bar, JACK preferred over ALSA on first run, RSS readout from /proc, credentials file tightened to 0600 - First run opens at most 32 input channels: PipeWire's ALSA bridge advertises 128 and crashes its own audio thread if all are opened - UI: platform 'linux', file-manager wording, ASIO hints Windows-only - scripts/linux.ts + run.linux.ts, with an apt hint for missing build dependencies Still to come: catalogue tooling for linux-x64, release workflows, purge paths, docs, and a Linux build of Neural Amp Modeler. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream's plugin is built on iPlug2, which has no Linux target, so TONE3000 tones had nothing to play in on Linux. This wraps NAM's own DSP (NeuralAmpModelerCore and AudioDSPTools at the commits v0.7.15 pins, fetched as hash-checked archives) in a JUCE VST3 built with the rest of the tree. It reports upstream's name, parameters (Bypass first, as iPlug2 exports it) and state layout, so the TONE3000 knob template, NamStateCodec and existing patches work unchanged; manufacturer and class id are Plectrify's. Verified with NamStateProbe against WaveNet A1, WaveNet A2 and LSTM captures: the rewritten state loads, reads back and changes the sound. The NAM sources are linked as objects straight into the VST3 module, because their architecture registry lives in static initialisers that a static archive would drop. The Linux dev loop builds and stages the plugin itself instead of downloading the Windows/macOS archives. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
release.linux.ts builds, tests and packages Plectrify for Linux the way release.macos.ts does for the Mac, and uploads the .deb to the pre-release the Windows step created. The package installs the app under /opt/plectrify, the VST3 into /usr/lib/vst3 and creates the shared content root /var/lib/Plectrify. pnpm release dispatches to it on Linux, and promotion now waits for the Linux artifact as well as the macOS one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Releases for Windows, macOS and Linux are now built by workflows rather than on maintainers' machines. CI builds and tests all three platforms on every push and pull request. Release runs the Windows step, which tags and creates the pre-release, then the macOS and Linux steps at that tag. Promote flips the release to latest and deploys the site when the Cloudflare secrets exist. pnpm release now refuses to run outside GitHub Actions, and the release:build and release:promote commands are gone; pnpm app --dist remains the local build-and-test path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Teach the catalogue tooling the linux-x64 asset slug, so entries can offer Linux builds and check-updates can spot upstream Linux releases. pnpm purge now removes the .deb through dpkg and sweeps the Linux paths: the XDG data, WebKitGTK storage, ~/.vst3 markers and /var/lib/Plectrify. The site offers a Linux download, detects Linux visitors, and documents the install, JACK/ALSA choice and on-disk paths. AGENTS.md records the Linux build, paths and our own Neural Amp Modeler build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The site's version trails the newest promoted release, so the Linux button would link to a .deb that 0.1.0 does not have. It now appears from 0.1.1 on, with the promotion that publishes the file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Windows runner's git converts to CRLF on checkout, and the UI format check then flags every file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pin each project's own Linux release of PeakEater, Fire, FILT-R, GATE-12, TIME-12, Lupex Chorus, Lupex Delay, QDelay, Sirial, REEV-R and Cloud Reverb, from the same tag as the other platforms. All are mirrors: each zip unpacks to an x86-64 .vst3 whose libraries resolve and which needs at most glibc 2.38. validate --verify-assets passes. Surge XT and Dragonfly publish Linux builds only as tarballs, which the installer cannot unpack, and Open Spatial Delay has none, so those stay unavailable on Linux. Not yet published: publish-catalogue needs the offline signing key, and bumps the revision and .sig. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
plectrify-site | 3c76679 | Oct 28 2026, 10:03 PM |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add .den/commit-style.md, a new file for commit message style guidance. Its content was not included in the diff, so this message only records that the file was added.
JUCE's VST3 wrapper target still compiled as C++17 while the plugin's own code was C++20. std::atomic<float> differs between the two, so every JUCE parameter class had two definitions in one module, and LTO reported ODR violations. Give the wrapper the same standard. Also include the upstream NAM sources as system headers so their warnings stay out of our build, stamp the fetched archives with extraction time (CMP0135), and drop two deprecated calls: u8path and Display::userArea. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dev loop stages a Debug NAM, and at -O0 with Eigen's asserts on a model ran about 30 times slower than optimised, so it crackled at any playable buffer size. Compile the DSP with -O2 and EIGEN_NO_DEBUG in every configuration; it is third-party maths nobody steps through. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Native HTML5 drops never complete in the web view JUCE embeds on Linux. The web view sits in a GtkPlug inside JUCE's X11 window, GTK hands the drop to XDND, and the toplevel under the pointer is JUCE's, which is not XDND-aware. The drag image follows the pointer and the drop is lost. Add pointerDragShim, which lets the page's own dragstart handlers fill in the DataTransfer, then cancels the native drag. It drives dragenter, dragover, dragleave, drop and dragend from mouse events using the copied DataTransfer. A drop only lands where the last dragover was cancelled, as in a browser, so existing handlers work unchanged. The shim is installed from main.ts only when needsPointerDragShim matches a WebKitGTK user agent (Linux, no Android, Chrome or Firefox). Windows, macOS and other engines keep their native drags. A test covers the user agent check.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
~/.config/Plectrify,~/.vst3,/var/lib/Plectrify), a native title bar,platform: 'linux'in the UI, and a dev loop (scripts/run.linux.ts). First-run input channels are capped at 32, because PipeWire's ALSA bridge advertises 128 and crashes past 64.Source/namplugin/): a JUCE VST3 around NeuralAmpModelerCore. It keeps upstream's name, parameter order and iPlug2 state layout, so TONE3000 tones and patches work unchanged. Upstream is iPlug2, which has no Linux target..debfor releases (scripts/release.linux.ts). It installs the app to/opt/plectrify, the VST3 to/usr/lib/vst3, and creates/var/lib/Plectrifywith mode 1777.ci.ymlbuilds and tests all three OSes.release.ymlruns Windows first (tag and pre-release), then macOS and Linux.promote.ymlmarks the release latest and deploys the site.pnpm releasenow refuses to run outside Actions, andrelease:buildandrelease:promoteare removed.linux-x64,pnpm purgehandles Linux, and the site,AGENTS.mdandRELEASING.mdare updated.Test plan
pnpm checkat the root,packagingvalidate/check/test,sitecheck/buildpnpm app). I couldn't check it here: screenshots don't work on Wayland🤖 Generated with Claude Code