Skip to content

Linux as a third platform, and releases on GitHub Actions - #8

Merged
patrickiel merged 14 commits into
mainfrom
linux-port
Oct 29, 2026
Merged

patrickiel merged 14 commits into
mainfrom
linux-port

Conversation

@patrickiel

Copy link
Copy Markdown
Owner

Summary

  • Linux (x86-64) as a third target beside Windows and macOS: the CMake branch (WebKitGTK, curl, JACK/ALSA), Linux paths (~/.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.
  • Our own Neural Amp Modeler for Linux (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.
  • A .deb for releases (scripts/release.linux.ts). It installs the app to /opt/plectrify, the VST3 to /usr/lib/vst3, and creates /var/lib/Plectrify with mode 1777.
  • Releases on GitHub Actions only. ci.yml builds and tests all three OSes. release.yml runs Windows first (tag and pre-release), then macOS and Linux. promote.yml marks the release latest and deploys the site. pnpm release now refuses to run outside Actions, and release:build and release:promote are removed.
  • Tooling and docs: the catalogue tooling accepts linux-x64, pnpm purge handles Linux, and the site, AGENTS.md and RELEASING.md are updated.

Test plan

  • Linux: Debug app and VST3 build, all 11 CTests pass, the app runs on PipeWire
  • NAM probe on Linux: state rewrite, read-back and processing for A1, A2 and LSTM captures
  • pnpm check at the root, packaging validate/check/test, site check/build
  • CI is green on Windows, macOS and Linux (this PR)
  • The UI looks right on Linux (pnpm app). I couldn't check it here: screenshots don't work on Wayland
  • First Release workflow run, then install each artifact

🤖 Generated with Claude Code

patrickiel and others added 9 commits October 28, 2026 21:17
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>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
plectrify-site 3c76679 Oct 28 2026, 10:03 PM

patrickiel and others added 5 commits October 28, 2026 22:13
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.
@patrickiel
patrickiel merged commit ce64d7a into main Oct 29, 2026
4 checks passed
@patrickiel
patrickiel deleted the linux-port branch October 29, 2026 05:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant