Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e2b8943
migrate tray from fyne systray to wails v3
nik9play Jul 12, 2026
cc15ac4
add gui config write path with settings dto and validation
nik9play Jul 12, 2026
a62dc86
add settings service and generated bindings
nik9play Jul 12, 2026
fec106a
add svelte settings frontend and tray menu entry
nik9play Jul 12, 2026
547e4a3
build frontend in build scripts and ci
nik9play Jul 12, 2026
628c658
use png tray icon on windows, wails cannot load ico containers
nik9play Jul 12, 2026
a0717bb
emit live slider and connection events and add status service method
nik9play Jul 12, 2026
31547ae
add tailwind and bits-ui, restyle settings into dialog with frameless…
nik9play Jul 12, 2026
87506f5
replace mapping editor with live mixer and target dialog
nik9play Jul 12, 2026
b074b54
use bits-ui controls throughout the settings dialog
nik9play Jul 13, 2026
3841012
add friendly target names and tabbed target picker
nik9play Jul 13, 2026
955694d
split audio devices into their own target picker tab
nik9play Jul 13, 2026
40a32ed
show raw target name when no matching session is running
nik9play Jul 13, 2026
bf3f7b5
build with the Task system and add a cgo-free headless linux build
nik9play Jul 13, 2026
de1d595
warn when the webview2 runtime is missing during install
nik9play Jul 13, 2026
887df8c
build headless linux binaries in the release workflow
nik9play Jul 13, 2026
1288a0f
replace hand-rolled frontend i18n with paraglide-js
nik9play Jul 13, 2026
41f9e81
polish settings GUI layout and let blank VID/PID fall back to defaults
nik9play Jul 15, 2026
2dae68d
implement wails3 dev-mode support
nik9play Jul 15, 2026
ecf05e4
fix binding generation
nik9play Jul 16, 2026
62978f2
rewrite app config handling for better control
nik9play Jul 17, 2026
c974b73
ui/ux improvements
nik9play Jul 18, 2026
1b53120
add prod tags
nik9play Jul 18, 2026
d30d71f
suffix linux input devices with (input) to control them separately fr…
nik9play Jul 18, 2026
d2de023
display all procceses in list
nik9play Jul 19, 2026
7103ab5
add icons to process (only Windows for now) and device lists
nik9play Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 93 additions & 15 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ jobs:
with:
go-version: "1.25.7"

# the wails linux backend is cgo and needs GTK/WebKitGTK headers
- name: Install GTK dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y libgtk-4-dev libwebkitgtk-6.0-dev

- name: Run tests
run: go test ./...

Expand All @@ -40,6 +47,20 @@ jobs:
with:
go-version: "1.25.7"

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: frontend/package-lock.json

# the build scripts delegate to the Task build system (Taskfile.yml)
- name: Install Task
uses: arduino/setup-task@v2
with:
version: 3.x
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Build deej (amd64)
run: scripts/windows/build-all.bat
shell: cmd
Expand Down Expand Up @@ -70,9 +91,18 @@ jobs:
name: deej-windows
path: build/

# linux builds are cgo (wails GTK backend), so each architecture builds
# natively on a matching runner instead of cross-compiling
build-linux:
name: Build (linux)
runs-on: ubuntu-latest
name: Build (linux ${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
strategy:
matrix:
include:
- arch: amd64
runner: ubuntu-latest
- arch: arm64
runner: ubuntu-24.04-arm
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -84,34 +114,78 @@ jobs:
with:
go-version: "1.25.7"

- name: Build deej (amd64)
run: scripts/linux/build-all.sh
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Rename binaries (amd64)
- name: Install GTK dependencies
run: |
mv build/deej-release build/deej-linux-amd64
mv build/deej-dev build/deej-linux-amd64-dev
sudo apt-get update
sudo apt-get install -y libgtk-4-dev libwebkitgtk-6.0-dev

- name: Build deej (arm64)
# the build scripts delegate to the Task build system (Taskfile.yml)
- name: Install Task
uses: arduino/setup-task@v2
with:
version: 3.x
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Build deej
run: scripts/linux/build-all.sh
env:
GOARCH: arm64

- name: Rename binaries (arm64)
- name: Rename binaries
run: |
mv build/deej-release build/deej-linux-${{ matrix.arch }}
mv build/deej-dev build/deej-linux-${{ matrix.arch }}-dev

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: deej-linux-${{ matrix.arch }}
path: build/

# the headless build compiles Wails out (-tags headless), so it is cgo-free and
# a single runner cross-compiles every arch without GTK/WebKit or Node
build-linux-headless:
name: Build (linux headless)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.25.7"

- name: Install Task
uses: arduino/setup-task@v2
with:
version: 3.x
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Build deej (headless, amd64 + arm64)
run: |
mv build/deej-release build/deej-linux-arm64
mv build/deej-dev build/deej-linux-arm64-dev
GOARCH=amd64 task linux:build:headless
mv build/deej-headless build/deej-linux-amd64-headless
GOARCH=arm64 task linux:build:headless
mv build/deej-headless build/deej-linux-arm64-headless

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: deej-linux
name: deej-linux-headless
path: build/

release:
name: Create release draft
if: startsWith(github.ref, 'refs/tags/')
needs: [build-windows, build-linux]
needs: [build-windows, build-linux, build-linux-headless]
runs-on: ubuntu-latest
permissions:
contents: write
Expand All @@ -137,9 +211,13 @@ jobs:
| Windows portable | arm64 | [deej-windows-arm64.exe](https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/deej-windows-arm64.exe) |
| Linux | amd64 | [deej-linux-amd64](https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/deej-linux-amd64) |
| Linux | arm64 | [deej-linux-arm64](https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/deej-linux-arm64) |
| Linux (headless, no GUI) | amd64 | [deej-linux-amd64-headless](https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/deej-linux-amd64-headless) |
| Linux (headless, no GUI) | arm64 | [deej-linux-arm64-headless](https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/deej-linux-arm64-headless) |
files: |
artifacts/deej-windows-amd64.exe
artifacts/deej-windows-arm64.exe
artifacts/deej-linux-amd64
artifacts/deej-linux-arm64
artifacts/deej-linux-amd64-headless
artifacts/deej-linux-arm64-headless
artifacts/deej_setup.exe
10 changes: 8 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,15 @@ venv/
*.exe
deej-dev
deej-release
build/
build/*
!build/config.yml
releases/
*.bin
logs/
preferences.yaml
config.yaml
config.yaml
frontend/node_modules/
frontend/dist/*
!frontend/dist/.gitkeep
# paraglide-js generated output (regenerated by the vite plugin on build)
frontend/src/paraglide/
59 changes: 59 additions & 0 deletions Taskfile.linux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
version: "3"

# Linux build tasks. Included by the root Taskfile.yml, which passes BIN_DIR,
# LDFLAGS and VERSION_TAG. All tasks run from the repo root (dir: {{.ROOT_DIR}}).
#
# Two flavours of build exist:
# build - the full GUI app; links the Wails GTK4/WebKitGTK backend via
# cgo, so it needs a C compiler and the GTK/WebKit -dev packages
# (or Docker) and cannot be cross-compiled with CGO_ENABLED=0.
# build:headless - a GUI-less daemon built with -tags headless. Compiles Wails
# out entirely, so it is pure Go (CGO_ENABLED=0) and
# cross-compilable to any GOOS/GOARCH. Controlled by config.yaml
# only (no tray, no settings window).

tasks:
frontend:
internal: true
dir: frontend
cmds:
- cmd: test -d node_modules || npm ci
- npm run build

build:
desc: Build the full GUI app (cgo, GTK4/WebKitGTK) -> deej-release
deps: [frontend]
env:
CGO_ENABLED: "1"
cmds:
- go build -tags production -o {{.BIN_DIR}}/deej-release -ldflags "-s -w {{.LDFLAGS}} -X main.buildType=release" ./pkg/deej/cmd

build:dev:
desc: Build the full GUI app with debug symbols -> deej-dev
deps: [frontend]
env:
CGO_ENABLED: "1"
cmds:
- go build -o {{.BIN_DIR}}/deej-dev -ldflags "{{.LDFLAGS}} -X main.buildType=dev" ./pkg/deej/cmd

build:dev:live:
desc: Build deej-dev without rebuilding the embedded frontend (for `wails3 dev`)
# No `frontend` dep: in dev mode assets are served by Vite via
# FRONTEND_DEVSERVER_URL, and the //go:embed only needs dist/.gitkeep to exist.
env:
CGO_ENABLED: "1"
cmds:
- go build -o {{.BIN_DIR}}/deej-dev -ldflags "{{.LDFLAGS}} -X main.buildType=dev" ./pkg/deej/cmd

run:dev:
desc: Run the already-built dev binary (inherits FRONTEND_DEVSERVER_URL under `wails3 dev`)
cmds:
- "{{.BIN_DIR}}/deej-dev"

build:headless:
desc: Build a GUI-less, cgo-free daemon (cross-compilable) -> deej-headless
env:
GOOS: linux
CGO_ENABLED: "0"
cmds:
- go build -tags headless -o {{.BIN_DIR}}/deej-headless -ldflags "-s -w {{.LDFLAGS}} -X main.buildType=release" ./pkg/deej/cmd
52 changes: 52 additions & 0 deletions Taskfile.windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
version: "3"

# Windows build tasks. Included by the root Taskfile.yml, which passes BIN_DIR,
# LDFLAGS and VERSION_TAG. All tasks run from the repo root (dir: {{.ROOT_DIR}}).

tasks:
syso:
desc: Generate winres icon/manifest .syso files (idempotent)
internal: true
cmds:
- go generate ./...
status:
- test -f pkg/deej/cmd/rsrc_windows_amd64.syso
- test -f pkg/deej/cmd/rsrc_windows_arm64.syso

frontend:
internal: true
dir: frontend
cmds:
- cmd: test -d node_modules || npm ci
- npm run build

build:
desc: Build deej-release.exe (optimized, no console window)
deps: [syso, frontend]
cmds:
- go build -tags production -o {{.BIN_DIR}}/deej-release.exe -ldflags "-H=windowsgui -s -w {{.LDFLAGS}} -X main.buildType=release" ./pkg/deej/cmd

build:dev:
desc: Build deej-dev.exe (debug symbols, console window)
deps: [syso, frontend]
cmds:
- go build -o {{.BIN_DIR}}/deej-dev.exe -gcflags=all="-N -l" -ldflags "{{.LDFLAGS}} -X main.buildType=dev" ./pkg/deej/cmd

build:dev:live:
desc: Build deej-dev.exe without rebuilding the embedded frontend (for `wails3 dev`)
# No `frontend` dep: in dev mode assets are served by Vite via
# FRONTEND_DEVSERVER_URL, and the //go:embed only needs dist/.gitkeep to exist.
deps: [syso]
cmds:
- go build -o {{.BIN_DIR}}/deej-dev.exe -gcflags=all="-N -l" -ldflags "{{.LDFLAGS}} -X main.buildType=dev" ./pkg/deej/cmd

run:dev:
desc: Run the already-built dev exe (inherits FRONTEND_DEVSERVER_URL under `wails3 dev`)
cmds:
- "{{.BIN_DIR}}/deej-dev.exe"

package:
desc: Build the release exe and the Inno Setup installer
deps: [build]
cmds:
- ISCC /O{{.BIN_DIR}} "/DAppVersion={{.VERSION_TAG}}" /Qp scripts/windows/installer.iss
84 changes: 84 additions & 0 deletions Taskfile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
version: "3"

# deej build orchestration. This is the Task (https://taskfile.dev) build system
# that also underpins `wails3 build`/`wails3 task`. It keeps deej's own bits that
# don't fit the default wails3 layout: the Inno Setup installer
# (scripts/windows/installer.iss), winres dual-arch resources, and the custom
# version ldflags. Invoke with `task <name>` or `wails3 task <name>`.

includes:
windows:
taskfile: ./Taskfile.windows.yml
dir: "{{.ROOT_DIR}}"
vars: &platformvars
BIN_DIR: "{{.BIN_DIR}}"
LDFLAGS: "{{.LDFLAGS}}"
VERSION_TAG: "{{.VERSION_TAG}}"
linux:
taskfile: ./Taskfile.linux.yml
dir: "{{.ROOT_DIR}}"
vars: *platformvars

vars:
APP_NAME: deej
BIN_DIR: build
# git-derived build metadata, injected into the binary via ldflags
GIT_COMMIT:
sh: git rev-list -1 --abbrev-commit HEAD
VERSION_TAG:
sh: git describe --tags --always
LDFLAGS: -X main.gitCommit={{.GIT_COMMIT}} -X main.versionTag={{.VERSION_TAG}}

tasks:
default:
desc: List the available tasks
cmds:
- cmd: echo "Run 'task --list' (or 'wails3 task --list') to see available tasks."
silent: true

frontend:build:
desc: Build the embedded Svelte settings UI (frontend/dist)
dir: frontend
cmds:
- cmd: test -d node_modules || npm ci
- npm run build

generate:bindings:
desc: Regenerate the Wails Go->TS bindings (requires the wails3 CLI)
cmds:
- wails3 generate bindings -ts -silent ./pkg/...

build:
desc: Build deej for the current OS (release)
cmds:
- task: "{{OS}}:build"

test:
desc: Run the Go test suite
cmds:
- go test ./...

dev:
desc: Run deej in Wails dev mode (Go rebuild-on-change + Vite HMR for the settings UI)
cmds:
# reads build/config.yml; sets FRONTEND_DEVSERVER_URL + WAILS_VITE_PORT and
# drives the dev:* tasks below. Needs the wails3 CLI on PATH.
- wails3 dev

dev:frontend:
desc: Start the Vite dev server for the settings UI (invoked by `wails3 dev`)
dir: frontend
cmds:
- cmd: test -d node_modules || npm ci
# honours WAILS_VITE_PORT (set by `wails3 dev`); vite.config.ts reads it
- npm run dev

dev:app:build:
desc: Build the dev binary WITHOUT re-embedding the frontend (invoked by `wails3 dev`)
cmds:
- task: "{{OS}}:build:dev:live"

dev:app:run:
desc: Run the dev binary; inherits FRONTEND_DEVSERVER_URL so assets load from Vite (invoked by `wails3 dev`)
cmds:
- task: "{{OS}}:run:dev"
Loading
Loading