Files
feedBack-desktop/.specify/memory/constitution.md
T
2026-06-16 18:48:12 +02:00

4.9 KiB

Slopsmith Desktop Constitution

Core Principles

I. Wrap, Don't Fork

The desktop app is a shell around upstream Slopsmith. It MUST clone or bundle Slopsmith verbatim and run its server.py as a subprocess. We MUST NOT fork the Slopsmith codebase or carry private patches: if the desktop needs new behaviour from Slopsmith, the change goes upstream (gated by an env var or feature flag) before landing here.

II. Native Audio Is the Whole Point

The reason this app exists (vs. running Slopsmith in a browser) is low-latency audio with VST/AU/LV2 hosting, NAM, IRs, and pitch detection. The audio engine MUST be a JUCE C++ native addon (src/audio/) compiled via cmake-js, exposed to Electron through N-API (src/audio/NodeAddon.cpp) and bridged into the renderer via src/main/audio-bridge.ts. Audio code MUST NOT live in JS/TS.

III. Three-Process Architecture

The runtime has exactly three layers:

  1. Renderer (Slopsmith UI in a webview, talks to localhost Python and to Electron via preload IPC).
  2. Electron main (src/main/) — window lifecycle, IPC, plugin manager, Python supervisor, audio bridge.
  3. Python subprocess (src/main/python.ts spawning slopsmith/server.py on port 18000+).

New features MUST fit one of these layers. Audio engine work is loaded from layer 2 via the native addon and MUST NOT bypass it.

IV. Bundle Everything Required to Run Offline

A first-run install MUST work without an internet connection: the Python interpreter, Slopsmith source tree, default IRs, and the default soundfont MUST be packaged via electron-builder's extraResources. Plugins are the exception (installed on demand into the user's config dir).

V. Reproducible Linux Builds Via DevContainer

Linux distribution builds MUST be reproducible against the ubuntu-22.04 GitHub Actions image. The DevContainer (.devcontainer/) and scripts/build-linux-release.sh are the canonical build path; ad-hoc npm run dist:linux on a developer's host is for development iteration only.

VI. Plugin Isolation From the App

Plugins MUST live in the user's config directory (~/.config/slopsmith-desktop/plugins/) and be managed via src/main/plugin-manager.ts. Updating the desktop app MUST NOT touch installed plugins; removing the desktop app MUST NOT delete them by default. Plugins are git clones of public repos; the plugin manager wraps git.

VII. Fail Soft on Audio Engine Absence

If the native audio addon fails to load (missing build, missing runtime libs, etc.), the rest of the app MUST keep working — Slopsmith UI, plugins, library browsing, all still functional. src/main/audio-bridge.ts already swallows load failures and returns audio:isAvailable === false; new features MUST follow the same pattern.

VIII. Cross-Platform Means All Three (NON-NEGOTIABLE)

We support Windows 10+, macOS 12+, and Linux. Every feature MUST ship working code paths for all three. Per-OS audio backends: ASIO/CoreAudio/JACK+ALSA. VST3 everywhere; AU on macOS; LV2 on Linux. Per-OS distribution targets: AppImage+deb, dmg+zip, NSIS exe.

Operational Constraints

  • Stack: Electron + TypeScript (main/renderer wiring), JUCE C++ (audio engine), Python 3.12 (Slopsmith subprocess), CMake 3.22+.
  • Native Modules: slopsmith_audio.node built via cmake-js, unpacked from asar at runtime (asarUnpack in package.json.build).
  • Resources: resources/{slopsmith,python,bin,default-irs, soundfonts} are extra-resourced into the packaged app.
  • Server port range: 18000+ (chosen to avoid colliding with a Docker Slopsmith on 8000 — see src/main/python.ts).
  • App ID: com.byron.slopsmith-desktop.
  • NAM: NeuralAmpModelerCore vendored at src/audio/third_party/NAM/; NAM support is conditional on the vendored tree being present (CMakeLists.txt).

Development Workflow

  • npm run dev — TS rebuild + Electron launch (uses the system Python, not the bundled one).
  • npm run build:audio — JUCE native addon (Release).
  • npm run dist:{linux,mac,win} — full bundle + electron-builder.
  • New audio capabilities go through SignalChain and a new *Processor C++ class; the addon API is in src/audio/NodeAddon.cpp.
  • Plugin manager UI changes go in src/renderer/plugin-manager/.
  • Splash screen / startup polling lives in src/main/main.ts and src/main/splash*.ts; respect the 5-minute startup deadline and the 700 ms poll interval already documented there.

Governance

This repo is one of several in the Slopsmith ecosystem. The shared workspace at ~/Repositories/slopsmith-workspace/ coordinates cross-repo work. Constitution amendments here MUST consider whether the upstream Slopsmith repo needs a parallel change (Principle I). The desktop app is a downstream consumer of upstream Slopsmith, upstream slopsmith-demucs-server (optional, configured by the user), and the per-feature plugin repos (optional, installed by the user).

Version: 1.0.0 | Ratified: 2026-05-09 | Last Amended: 2026-05-09