Repository navigation
Conversation
The test fails if the godebug line leaves go.mod (checked by removing it). README: wails3 was installed @latest, which today is a beta CLI against an alpha module; pin it to go.mod's version, and say that wails3/wire must be built with Go >= 1.27.
The Go module and @wailsio/runtime move together to the same release, and the runtime is now pinned exactly: it had drifted to alpha.79 on a caret while the Go side sat on alpha.72. No Go API change touches KeyLint and the regenerated bindings are byte-identical. The bump also drops go-git/go-billy out of the build graph, which clears the 8 govulncheck findings #90 left behind.
Wails made GTK4 + WebKitGTK 6.0 the Linux default in alpha.93; the GTK3 stack is now opt-in via -tags gtk3 and upstream removes it in v3.1. Every job that compiles the Go code (tests, bindings drift, Linux and Windows builds, release) now installs the GTK4 headers instead of GTK3, and installs the wails3 CLI matching go.mod.
The binary now links libgtk-4 and libwebkitgtk-6.0, so the deb/rpm/arch dependencies follow; values match the beta.25 nfpm template.
The build task regenerates these on every run; with the beta.25 CLI the output differs from the committed alpha.72 output (same ICO sizes, new encoder; .desktop Name now keeps the product's casing), so the first wails3 dev or task build left the tree dirty.
Since alpha.79 the Wails dev proxy dials a localhost dev server over tcp4 only. ng serve on "localhost" can bind ::1 under Node 24, and wails3 dev then showed a blank window with 'connection refused' in the log. Reproduced on Linux before the change, gone after.
cache-apt-pkgs only runs apt update under nektos/act. On a runner whose lists are stale, the first GTK4 install 404'd on superseded glib and gstreamer debs, the action carried on and cached an empty result, and every later run restored that empty cache and failed at pkg-config. The GTK3 set never hit this only because its cache predates the drift.
Wails' default Linux stack is GTK4 + WebKitGTK 6.0, whose forced bwrap sandbox aborts at start on stock Ubuntu 23.10+. Switching stacks breaks the released Linux binary and its self-update, which is a product decision this upgrade should not make implicitly. Every Linux build, test, vet, bindings run and wails3 CLI install now passes -tags gtk3 (the CLI's own cgo package is gtk3-tagged too, so no GTK4 headers are needed anywhere). CI, release, the Linux Taskfile and the nfpm dependencies are back on GTK3 / WebKit2GTK 4.1. The apt refresh and the pkg-config presence check stay, now for the GTK3 packages.
A caller's EXTRA_TAGS replaced the gtk3 default and silently moved the build to GTK4. gtk3 is now prepended in build:native and build:docker.
The drift check used git diff, which ignores untracked files, so a newly registered service's bindings passed. It now fails on any git status output under frontend/bindings. The Linux builds in CI and release now fail unless the binary links libgtk-3 and libwebkit2gtk-4.1, so a dropped gtk3 tag cannot ship.
Owner
Author
|
Ready once the Windows smoke test passes: CI green, including the new GTK3-link and bindings-porcelain checks. Independent Opus review with review-pr fork supplement; all findings addressed (8bfef49). Stacks on #90, so merge #90 first; GitHub then retargets this PR to main. Decision before the Wails v3.1 bump: GTK4 / the Linux sandbox (see body). |
#90 (the base of this branch) was squash-merged into main together with #89, #91 and #92. Conflicts resolved with main's content, then only the Wails parts re-applied: - go.mod/go.sum: main's, then go get wails/v3@v3.0.0-beta.25 + tidy (Go 1.27 directive and the x509 godebug line kept) - package.json/lock: main's cooldown-resolved lock, only @wailsio/runtime moved to 3.0.0-beta.25 (exact) - CLAUDE.md, README.md, docs/roadmap.md: main's text plus the beta.25 / -tags gtk3 / GTK3 decision lines Bindings regenerated with wails3 v3.0.0-beta.25: no drift.
Main's apt steps (#103) win in both workflows; the branch's own copies of the refresh and GTK3 checks are dropped so each job has one of each. The Wails parts are re-applied on top: beta.25 wails3 with -tags gtk3, gtk3 on Linux test/vet/build, the readelf GTK3 link check, and bindings drift via git status. go.mod/go.sum and the npm lock start from main's and bump only Wails / @wailsio/runtime. Bindings regenerated with beta.25: identical to main's, SetActiveProvider included.
Owner
Author
|
Windows test build (Wails beta.25 on current main, CI green, kept until 2026-10-22):
|
This branch has not been deployed
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.
Roadmap E4 step 1 (#35).
Versions
github.com/wailsapp/wails/v3(go.mod)v3.0.0-alpha.72v3.0.0-beta.25(latest)@wailsio/runtime(frontend)^3.0.0-alpha.79(caret, drifted from Go side)3.0.0-beta.25(exact pin)wails3CLI in CI (build-linux.yml×3,release.yml×2) + README@v3.0.0-alpha.72-tags gtk3 …@v3.0.0-beta.25-tags gtk3because Wails' default moved to GTK4Changelog items that mattered, and what this PR does about each
I read every GitHub release body from alpha.73 to beta.25 (75 releases) and diffed
pkg/applicationbetween the two tags for every API KeyLint calls. Only one entry is marked BREAKING, and it is macOS coordinates. No Go API change touches KeyLint:main.go,internal/features/trayandinternal/appcompile unchanged.-tags gtk3, removed in v3.1go build/go test/go vet,wails3 generate bindings -f '-tags gtk3'andgo install -tags gtk3 …/wails3in CI and release;build/linux/Taskfile.ymldefaultsEXTRA_TAGStogtk3(sowails3 dev/task builduse it); nfpm deps and apt packages stay GTK3; CLAUDE.md/README/testing.md document the tag. The CLI's own cgo package (internal/operatingsystem) is gtk3-tagged as well, so no job needs GTK4 headers. Windows is unaffected (tag ignored).awalsh128/cache-apt-pkgs-actionnever runsapt updateon GitHub runnerspkg-configsudo apt-get update) before each GTK install inbuild-linux.ymlandrelease.yml, plus apkg-config --exists gtk+-3.0 webkit2gtk-4.1step right after it so an empty cache fails at its cause; deleted the two poisoned PR-scoped caches. The GTK3 set only escapes this today because its cache predates the drift — the next cache-key change would have hit it too.localhostdev server over tcp4 only (alpha.79, "IPv4 forcing")wails3 devshowed a blank window:Proxy error: dial tcp4 127.0.0.1:9245: connection refused— ng serve had bound::1build/Taskfile.ymldev:frontendpasses--host 127.0.0.1. Reproduced before, gone after.wails3 generate icons/.desktopoutput changed (new ICO encoder; alpha.82 desktop-name fix)wails3 dev/task buildlefticon.ico,icons.icns,KeyLint.desktopmodifiedhide()and minimise now callchromium.Hide()(beta; fixes a hit-test "dead zone" under visual hosting)IsVisible=false. alpha.72 deliberately kept it visible to stay out of efficiency mode (upstream #2861). The silent fix is promise/fetch-driven with no timers, so it should still work, possibly slower after long idlerequest_cancellation_windows.go)wails.localhostRPC is paused and resumed through a DevTools round-trip on the UI thread. If a resume fails, the request stays paused (endless spinner), and Wails logs that to its own logger, not KeyLint's debug.logpumpUntilInited,os.Exit(1))panic(nil)inupdateIconwhen Explorer restarts;SetMenuleak/crash fixes; dark-mode menu text fixes; ICO tray iconsSetIcon/SetMenu/OnClick/OnDoubleClick/OpenMenu;systemtray.gois otherwise unchangedWM_HOTKEYfor the newapp.GlobalShortcutRegisterHotKey(NULL, …)posts to its own locked thread, not the Wails window, so nothing is interceptedGlobalShortcutcould replace our hand-rolled hotkey later; #31 moves to a keyboard hook anyway.)shortcut:triggered,settings:changedupdater.HandleHelperMode()runs inapplication.Newapplication.NewWebView2Loader.dllremoved in favour of the pure-Go loader (beta.20)wails3 generate syso/webview2bootstrapper/tool msix/generate appimageflags-help; syso generation testedversioning.mdnotes this).SingleInstance@wailsio/runtimeAPIwails.service.tsuses onlyEvents.On(returns an unsubscribe function); bindings useCall.ByID,CancellablePromise,Create— all present with the same signatures in beta.25govulncheck
Before (on #90): 8 findings, all go-git v5.16.4 / go-billy v5.7.0 via Wails.
After:
No vulnerabilities found, for bothGOOS=linuxandGOOS=windows. beta.25 requires go-git v5.19.2 / go-billy v5.9.0 and no package KeyLint builds imports them any more, so no directrequirebump is needed. Threegolang.org/x/cryptov0.55.0 advisories remain at module level only ("your code doesn't appear to call these") — left for a separate bump.Verification
CI on this PR (head
8bfef49):test(incl. bindings drift),e2e,build-linux,build-windows— all green.Local, Linux, Go 1.27.0. (I also ran these with GTK4 hidden from pkg-config, but Go's build cache does not key on pkg-config output, so that proves less than it sounds; the evidence that counts is
ldd/readelfon the binary, which CI now asserts on every Linux build.)App launch under Xvfb, without any sandbox override: window renders the Fix page; debug.log shows
app initializing → window created → tray: setup complete → shortcut: registered. With a build that fires the simulated shortcut 15 s after start, the whole event/RPC path works: Go emitsshortcut:triggered→ the Angular listener logs throughLoggerService→ClipboardService.Readrejects with the Go error, which the UI shows as plain text. SIGTERM quits cleanly.wails3 devbuilds with-tags gtk3through the Taskfile, connects to ng serve, starts the app.#31 (frozen):
git merge-treeagainstorigin/feature/shortcut-double-pressreports no conflicts (re-checked at8bfef49). An earlier trial merge vetted, tested green, built for Windows, and showed no bindings drift. When #31 resumes, its plan docdocs/superpowers/plans/2026-04-06-shortcut-double-press.md(lines 143, 245, 319, 697, 702) needs-tags gtk3on its Linux Go commands — left untouched here because the branch is frozen.Decision for Michael (not in this PR): Linux stack before Wails v3.1
This PR keeps Linux exactly where it was (GTK3 + WebKit2GTK 4.1). That only works until Wails v3.1, which removes
gtk3. Before that bump, one of these has to be chosen:Why it matters: Wails' GTK4 stack uses WebKitGTK 6.0, which always runs its web process in a bubblewrap sandbox, and stock Ubuntu 23.10+ blocks the unprivileged user namespaces that sandbox needs (
kernel.apparmor_restrict_unprivileged_userns=1, set by Ubuntu's ownapparmorpackage). A GTK4 build of KeyLint aborts at start there (bwrap: setting up uid map: Permission denied→ SIGTRAP); measured on the dev box, where the same code built with-tags gtk3runs. Whatever is chosen, the Linux self-updater must never replace a working GTK3 binary with one that cannot start. Windows is not affected by any of this. Also recorded indocs/roadmap.mdunder E4 step 1.Behaviour change the frontend will show
Errors from Go methods now reach the UI as the plain Go error message. The alpha.79 runtime put the raw HTTP body into
Error.message, i.e. a JSON blob ({"message":…,"cause":…,"kind":…}); the beta.25 runtime parses it and throwsError/TypeError/RuntimeErrorwith just the message. Everye instanceof Error ? e.message : …in Fix, Settings and Pyramidize therefore shows readable text now. Nothing in the frontend parsed the old JSON, and no spec asserts on it. Smoke item 13 checks it.Windows smoke-test checklist
Use the
KeyLint-windows-amd64-setup(orKeyLint-windows-amd64) artefact from this PR'sbuild-windowsjob. Set Settings → log level to debug first; the log is%APPDATA%\KeyLint\debug.log. Then go back to the Fix page before items 5, and to Pyramidize before item 6, before closing to tray — only those two pages listen for Ctrl+G (pre-existing:fix.component.ts:107,text-enhancement.component.ts:1107); left on Settings, the hotkey looks dead.app initializing,window created,tray: setup complete,shortcut: registered. Exe icon in Explorer/taskbar looks as before.(d) Minimise to the taskbar (not the tray), Ctrl+G silent fix from another app, then restore — page painted and responsive.
confirm()— check the dialog is visible and answerable while the window is in the tray (pre-existing behaviour, but the hidden-WebView change makes it worth a look).git describeoutput) and does not crash; do not install from it.explorer.exefrom Task Manager; the tray icon comes back and KeyLint keeps running.RegisterHotKey failedin the log. Anything else is new; if you want real single-instance behaviour, that's a separate small change.If anything on this list fails, the quickest comparison is the v4.4.3-beta release or a
mainbuild on the same machine.