OSW Studio Desktop
Electron shell around the OSW Studio Next.js standalone server (full Server Mode: SQLite storage, deployments, server functions). This directory is the single source of truth for the desktop app β CI releases and local builds both use these exact files.
Layout
electron/main.tsβ the entire main process: boots the bundled server, failure diagnostics, consent-based updates, menuelectron/icons/β committed app icons (no build-time generation)electron-builder.ymlβ packaging config (dmg / nsis / AppImage / deb)assemble-app.shβ copies a finished Next.js standalone build intoapp/; shared verbatim by CI and local buildstsup.config.tsβ compilesmain.tsintoapp/main.jspackage.jsonβ version is a0.0.0placeholder, set at build time from the repo rootpackage.json
Releasing
Releases are built and published by CI (.github/workflows/desktop-release.yml),
triggered by pushing a desktop-v{version} tag β normally via
release-osw.sh at the repo parent. The workflow builds all three platforms,
verifies the complete artifact set, generates release notes from
.github/desktop-release-notes.md, and publishes the GitHub release in a
single atomic step. If any platform build fails, nothing is published and
auto-updaters keep serving the previous complete release.
Local build
From the repo parent directory:
./deploy-osw-desktop.sh [mac|win|linux|all]
Or manually from the repo root:
NEXT_PUBLIC_SERVER_MODE=true NEXT_PUBLIC_DESKTOP=true npm run build
./desktop/assemble-app.sh
cd desktop && npm ci && npm pkg set version=$(node -p "require('../package.json').version")
npx tsup && npx electron-builder --mac --publish never
Dev mode
Run npm run dev in the repo root, then npm run dev in this directory β
the Electron window points at localhost:3000 instead of booting the bundled
server.
Updates
Updates are consent-based: the app checks GitHub releases on launch and via
Help β Check for Updates, but only downloads and installs when the user agrees
(Download β Restart now). Users can skip a version. On macOS, in-place
updates require code signing (not set up), so the app links to the releases
page instead.