Commit graph

5,396 commits

Author SHA1 Message Date
Lea Anthony
e6bf084197 fix(build): use Zig for Linux cross-arch compilation in Docker
Add Zig CC wrappers for Linux ARM64 and AMD64 targets. The build script
now detects if host architecture matches target architecture:
- If match: use native GCC (faster, better optimization)
- If different: use Zig for cross-compilation

This allows building Linux ARM64 binaries from an x86_64 Docker host
without requiring multi-arch images or QEMU emulation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:12:09 +11:00
Lea Anthony
985ce8deed fix(build): remove --platform flag from Linux cross-compile Docker
The wails-cross image is an x86_64 image that uses Zig for cross-compilation.
It doesn't need to run ON the target platform - it cross-compiles TO it.
Remove the --platform flag that was causing Docker to try pulling a
non-existent arm64 version of the image.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:05:00 +11:00
Lea Anthony
d5cd33d4fb fix(build): use Docker for cross-arch Linux compilation
When building Linux binaries with a different target architecture than
the host (e.g., arm64 on x86_64), use Docker-based cross-compilation
instead of native build. The native GCC cannot compile ARM64 assembly
on an x86_64 host.

Adds a third condition to the build task selection: target architecture
must match host architecture to use native build.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 23:53:41 +11:00
Lea Anthony
259c33dfda fix(ci): use absolute path for replace directive in Docker build
The Docker mounts v3 at the same absolute path, so change the replace
directive to use the absolute workspace path instead of removing it.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 23:45:05 +11:00
Lea Anthony
513669bf13 fix(ci): remove replace directive before Docker cross-compile
The project created by wails3 init has a replace directive pointing
to the local v3 source. This doesn't work inside Docker containers.
Remove it before running the cross-compile tasks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 23:38:18 +11:00
Lea Anthony
4af09b43a8 fix(ci): use correct task names for cross-compilation
- common:setup:docker instead of setup:docker
- darwin:build, linux:build, windows:build instead of build:darwin, etc.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 23:24:42 +11:00
Lea Anthony
72fcf2fa1c fix(ci): use Go 1.25 and go install for wails3 CLI
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:57:56 +11:00
Lea Anthony
fb0f10ca70 fix(ci): add Linux dependencies for wails3 CLI build
The wails3 CLI requires webkit2gtk, gtk, and other Linux libraries
to compile due to CGO dependencies.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:57:16 +11:00
Lea Anthony
46d27c526b fix(ci): use wails3 init and task-based cross-compile workflow
Instead of building Docker images from scratch, the workflow now:
- Installs wails3 CLI
- Creates a test project with wails3 init
- Runs setup:docker to build the cross-compile image
- Uses task build:<platform> for cross-compilation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:49:52 +11:00
Lea Anthony
df2175b950 fix(docker): add BuildKit syntax directive for heredoc support
The Dockerfiles use heredoc syntax which requires BuildKit's
dockerfile:1 syntax directive to parse correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:48:41 +11:00
Lea Anthony
403be215a2 feat(ci): add cross-compile test workflow for v3 PRs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:45:13 +11:00
Lea Anthony
cf42f57592 ci: add registry caching for faster Docker builds
Adds registry-based cache alongside GHA cache to improve build times
when GHA cache is evicted (7-day retention limit).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 08:50:48 +11:00
Lea Anthony
9742aec9af ci: add linux/amd64 to cross-compile tests
Always use linux:build:docker for Linux targets to properly test
the Docker image for both amd64 and arm64 architectures.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 08:41:53 +11:00
drc5521
679e4843d2
Update 03-notes-vanilla.mdx (#4917)
* Update 03-notes-vanilla.mdx

The API has been hanged.
application.SaveFileDialog() -> application.Get().Dialog.SaveFile()
application.OpenFileDialog() -> application.Get().Dialog.OpenFile()
application.InfoDialog() -> application.Get().Dialog.Info()

Please refer to the document.
https://v3alpha.wails.io/reference/dialogs/

* Update docs/src/content/docs/tutorials/03-notes-vanilla.mdx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-01-29 06:04:45 +11:00
Lea Anthony
ec78af1fee ci: remove darwin/amd64 from cross-compile tests
Intel Macs are EOL (last released 2020, support ending ~2027).
Focus testing on darwin/arm64 which is the current/future platform.
The Dockerfile still supports amd64 if needed.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:59:15 +11:00
Lea Anthony
c8b4d8534b ci: pull correct platform variant for Docker image
The task uses --platform flag which requires the matching architecture
variant. Pull arm64 variant explicitly for Linux arm64 test.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:38:07 +11:00
Lea Anthony
bc13f7377a ci: force Docker build for Linux arm64 cross-compilation
The linux:build task chooses native build when gcc is available,
but native x86_64 gcc can't cross-compile to arm64 (assembly errors).
Explicitly call linux:build:docker for Linux arm64 target.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:30:09 +11:00
Lea Anthony
c8fc68a66b ci: pull and tag Docker image as 'wails-cross' for task system
The wails3 task system expects a locally tagged 'wails-cross' image.
Pull from ghcr.io and tag it appropriately before running tasks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:23:15 +11:00
Lea Anthony
2f534f0a5e ci: fix conflicting replace directive in test project
wails3 init already adds a replace directive with relative path.
Use sed to update it to absolute path instead of adding a duplicate.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:18:23 +11:00
Lea Anthony
282854a964 ci: add amd64 cross-compile tests for darwin and windows
Tests 5 cross-compilation targets from Linux/amd64 runner:
- darwin/amd64, darwin/arm64 (cross-platform)
- windows/amd64, windows/arm64 (cross-platform)
- linux/arm64 (cross-architecture)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:17:40 +11:00
Lea Anthony
65b1b838f2 ci: use wails3 task system for cross-compile tests
- Use `wails3 task {os}:build` instead of manual Docker commands
- Test actual cross-compilation only (skip host-to-host):
  - darwin/arm64 from Linux/amd64
  - windows/arm64 from Linux/amd64
  - linux/arm64 from Linux/amd64
- Let task system handle frontend build, bindings, etc.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:10:27 +11:00
Lea Anthony
7bbfc52ca7 ci: generate bindings before frontend build
The frontend build requires Go bindings to be generated first.
Run `wails3 generate bindings` on the host before building frontend.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 09:07:15 +11:00
Lea Anthony
39e5d47477 ci: install Linux dev dependencies for wails3 CLI build
The wails3 CLI requires GTK3/WebKit2GTK dev packages to build on
the GitHub runner (for CGO).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 08:58:43 +11:00
Lea Anthony
7b7c27271d ci: simplify cross-compile tests to 3 parallel platform jobs
- Use 3 parallel jobs (darwin, linux, windows) instead of 6
- Each job builds both amd64 and arm64 architectures
- Use real wails3 projects via `wails3 init` instead of fake test programs
- Remove pointless non-CGO tests
- Keep library dependency verification for Linux binaries

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 08:55:37 +11:00
Lea Anthony
6592db81cb ci: add cross-compiler image build workflow
Adds workflow to build and test the wails-cross Docker image:
- Builds multi-arch image (amd64/arm64)
- Tests cross-compilation for all 6 platform/arch combinations
- Tests both CGO and non-CGO builds
- Verifies Linux binary library dependencies with readelf
- Publishes to ghcr.io/wailsapp/wails-cross

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 08:37:45 +11:00
Lea Anthony
70c969bf3b feat(build): use GCC for Linux cross-compilation
- Switch from Alpine to Debian (golang:1.25-bookworm)
- Install GTK3/GTK4 and WebKit2GTK 4.1/6.0 dev packages
- Use native GCC for Linux targets instead of Zig
- Add --platform flag to Docker run for architecture matching
- Remove unused zcc-linux-* wrappers (Zig had glibc header issues)
- Keep Zig for Darwin (macOS SDK) and Windows (bundled mingw)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 08:36:45 +11:00
Lea Anthony
f91b8cfeb1 feat: support ARM64 hosts in cross-compiler Docker image
Add TARGETARCH detection to download the correct Zig binary for
the host architecture (aarch64 vs x86_64). This enables native
performance on Apple Silicon Macs instead of requiring emulation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 06:32:47 +11:00
github-actions[bot]
279eea9799 chore(v3): bump to v3.0.0-alpha.64 and update changelog [skip ci] v3.0.0-alpha.64 2026-01-26 02:56:39 +00:00
GitHub Actions
a23c3c4e87 [skip ci] Publish @wailsio/runtime v3.0.0-alpha.79 2026-01-25 03:34:50 +00:00
Lea Anthony
9a363d7be5
feat(v3): add server mode for headless HTTP deployment (#4903)
* feat(v3): add server mode for headless HTTP deployment

Server mode allows Wails applications to run as pure HTTP servers
without native GUI dependencies. Enable with `-tags server` build tag.

Features:
- HTTP server with configurable host/port via ServerOptions
- WAILS_SERVER_HOST and WAILS_SERVER_PORT env var overrides
- WebSocket event broadcasting to connected browsers
- Browser clients represented as BrowserWindow (Window interface)
- Health check endpoint at /health
- Graceful shutdown with configurable timeout
- Docker support with Dockerfile.server template and tasks

Build and run:
  wails3 task build:server
  wails3 task run:server
  wails3 task build:docker
  wails3 task run:docker

Documentation at docs/guides/server-build.mdx

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat(v3): add server mode for headless HTTP deployment

Server mode allows Wails applications to run as pure HTTP servers
without native GUI dependencies. Enable with `-tags server` build tag.

Features:
- HTTP server with configurable host/port via ServerOptions
- WAILS_SERVER_HOST and WAILS_SERVER_PORT env var overrides
- WebSocket event broadcasting to connected browsers
- Browser clients represented as BrowserWindow (Window interface)
- Health check endpoint at /health
- Graceful shutdown with configurable timeout
- Docker support with Dockerfile.server template and tasks

Build and run:
  wails3 task build:server
  wails3 task run:server
  wails3 task build:docker
  wails3 task run:docker

Documentation at docs/guides/server-build.mdx

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: address CodeRabbit review comments

- Fix corrupted test file with embedded terminal output
- Fix module name mismatch in gin-routing (was gin-example)
- Fix replace directive version mismatch in gin-service
- Fix placeholder module name in ios example (was changeme)
- Fix Dockerfile COPY path to work from both build contexts
- Fix bare URL in README (MD034 compliance)
- Fix comment accuracy in getScreens (returns error, not empty slice)
- Remove deprecated docker-compose version field
- Add port documentation in Taskfile template

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: address CodeRabbit review comments

- Add note about healthcheck wget not being available in distroless images
- Add !server build constraint to menu_windows.go and menu_darwin.go
- Downgrade window-visibility-test go.mod from 1.25 to 1.24 to match CI

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 14:33:44 +11:00
github-actions[bot]
103ff347e0 chore(v3): bump to v3.0.0-alpha.63 and update changelog [skip ci] v3.0.0-alpha.63 2026-01-25 02:55:49 +00:00
Lea Anthony
537c74327d
fix(darwin): make Position() and SetPosition() use consistent coordinate systems (#4818)
* fix(darwin): make Position() and SetPosition() use consistent coordinate systems

On macOS, windowGetPosition() was returning raw Cocoa coordinates (Y=0 at
bottom of screen) while windowSetPosition() expected coordinates with Y=0
at the top of the screen. This caused window positions to drift when saving
and restoring window state across application sessions.

The fix updates windowGetPosition() to:
1. Convert Y coordinates to top-origin (matching windowSetPosition)
2. Apply DPI scale factor (matching windowSetPosition)

This ensures Position() returns values that can be directly passed back to
SetPosition() for consistent round-trip behavior.

Fixes #4816

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(darwin): make Position() and SetPosition() use consistent coordinate systems

On macOS, windowGetPosition() was returning raw Cocoa coordinates (Y=0 at
bottom of screen) while windowSetPosition() expected coordinates with Y=0
at the top of the screen. This caused window positions to drift when saving
and restoring window state across application sessions.

The fix updates windowGetPosition() to:
1. Convert Y coordinates to top-origin (matching windowSetPosition)
2. Apply DPI scale factor (matching windowSetPosition)

This ensures Position() returns values that can be directly passed back to
SetPosition() for consistent round-trip behavior.

Fixes #4816

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-25 12:40:25 +11:00
github-actions[bot]
9a131a049d chore(v3): bump to v3.0.0-alpha.62 and update changelog [skip ci] v3.0.0-alpha.62 2026-01-22 02:51:17 +00:00
Lea Anthony
8d28e2d06b
fix(windows): skip DPI awareness API call when already set via manifest (#4811)
Check current DPI awareness before calling SetProcessDpiAwarenessContext.
Windows only allows setting DPI awareness once per process - either via
manifest or API, not both. If already set (e.g., via application manifest
in built binaries), skip the API call to avoid "Access is denied" errors.

Fixes #4803

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-21 19:23:56 +11:00
github-actions[bot]
a0d2e03f64 chore(v3): bump to v3.0.0-alpha.61 and update changelog [skip ci] v3.0.0-alpha.61 2026-01-20 02:48:15 +00:00
Ndianabasi Udonkang
8598034942
Change Window Type from WebviewWindow to Window (#4829)
* fix: change window type from WebviewWindow to Window

* docs: update `UNRELEASED_CHANGELOG`

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-20 10:42:54 +11:00
Abdelhadi Seddar
9158c49e30
docs: fixed incorrect tag in Custom Output Directory of Bindings (#4873)
* docs: fixed incorrect tag in Custom Output Directory of Bindings

After some usage of wails I found out that

```bash
wails3 generate bindings -o ./src/bindings
``` 
does not work and according to 
```bash
$ wails3 generate bindings --help 
```
it uses the `-d string` tag instead

* Update UNRELEASED_CHANGELOG.md

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-20 10:41:46 +11:00
github-actions[bot]
d7d6720d54 chore(v3): bump to v3.0.0-alpha.60 and update changelog [skip ci] v3.0.0-alpha.60 2026-01-14 02:50:25 +00:00
Zach Botterman
37fb9b9ba5
fix(v3/linux): Fix menu update by clearing menu (#4875)
* clear menu

* update changelog

* free list

* register glistfree
2026-01-13 21:42:09 +11:00
github-actions[bot]
9db2f74c44 chore(v3): bump to v3.0.0-alpha.59 and update changelog [skip ci] v3.0.0-alpha.59 2026-01-11 02:54:04 +00:00
Ndianabasi Udonkang
897479d52b
Enhance Drag-N-Drop README with Internal Drag and Drop Info (#4869)
* Enhance README with internal drag and drop info

Added details about internal drag and drop functionality.

* Update UNRELEASED_CHANGE.md
2026-01-10 20:00:52 +11:00
github-actions[bot]
be0e9bab9b chore(v3): bump to v3.0.0-alpha.58 and update changelog [skip ci] v3.0.0-alpha.58 2026-01-09 02:46:28 +00:00
Lea Anthony
0abad1ffb2
fix(v3/linux): fix crash on panic in JS-bound Go methods (#4856)
* fix(v3/linux): fix crash on panic in JS-bound Go methods

WebKit2GTK installs signal handlers after gtk_main() starts, overriding
our SA_ONSTACK fix. This causes Go panics (e.g., nil pointer dereference)
in JS-bound methods to crash with 'non-Go code set up signal handler
without SA_ONSTACK flag'.

Fix by deferring signal handler installation via g_idle_add() to run
after GTK main loop starts, ensuring we fix handlers AFTER WebKit
has installed its own.

Fixes #3965

* test(v3/linux): add test case for signal handler fix

Adds a test application that can trigger panics from JS-bound Go methods
to verify the signal handler fix for issue #3965 works correctly.

The test app has buttons to:
- Trigger a panic in a goroutine
- Trigger an immediate panic
- Call a safe method

Before the fix, clicking 'Trigger Panic' would crash the app.
After the fix, panics are recovered and logged.

* chore: remove test case from PR

* fix(linux): call signal handler fix after WebKit init, not in idle callback

Move install_signal_handlers() call to after webkit_web_view_new_with_user_content_manager()
to ensure WebKit has finished setting up its signal handlers before we add SA_ONSTACK.

The previous g_idle_add approach was still too early - WebKit initialization continues
after GTK init. This matches the v2 approach which waits for actual webview creation.

Also add documentation about the known Go limitation (golang/go#7227) where signals
may still be delivered on the wrong stack in some C interop scenarios.
2026-01-08 21:20:13 +11:00
Lea Anthony
1fb60abdc9
docs(v3): update API references to new Manager API pattern (#4863)
* docs(v3): update API references to new Manager API pattern

Update documentation to reflect the Manager API refactoring from alpha.10:

Window API:
- app.NewWebviewWindow() -> app.Window.New()
- app.NewWebviewWindowWithOptions() -> app.Window.NewWithOptions()
- app.CurrentWindow() -> app.Window.Current()
- app.GetAllWindows() -> app.Window.GetAll()
- app.WindowByName() -> app.Window.GetByName()

Event API:
- app.EmitEvent() -> app.Event.Emit()
- app.OnEvent() -> app.Event.On()
- app.OnApplicationEvent() -> app.Event.OnApplicationEvent()

Dialog API:
- app.OpenFileDialog() -> app.Dialog.OpenFile()
- app.SaveFileDialog() -> app.Dialog.SaveFile()
- app.InfoDialog() -> app.Dialog.Info()
- app.ErrorDialog() -> app.Dialog.Error()
- app.WarningDialog() -> app.Dialog.Warning()
- app.QuestionDialog() -> app.Dialog.Question()

Other APIs:
- app.NewSystemTray() -> app.SystemTray.New()
- app.SetApplicationMenu() -> app.Menu.Set()
- app.GetPrimaryScreen() -> app.Screen.GetPrimary()
- app.GetAllScreens() -> app.Screen.GetAll()
- app.ClipboardGetText() -> app.Clipboard.Text()
- app.ClipboardSetText() -> app.Clipboard.SetText()
- app.BrowserOpenURL() -> app.Browser.OpenURL()

Fixes outdated code examples across 31 documentation files.

* chore(v3): add docs fix to unreleased changelog
2026-01-08 21:16:45 +11:00
github-actions[bot]
862e2e8d6c chore(v3): bump to v3.0.0-alpha.57 and update changelog [skip ci] v3.0.0-alpha.57 2026-01-05 02:55:08 +00:00
mbaklor
93c307b4b2
V3/fix debug logs (#4857)
* fix(v3): replace various debug logs from Info to Debug

* fix(v3): fixed logging on linux as well as windows

* fix(v3): add format directive for warning log argument

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-05 08:48:29 +11:00
Lea Anthony
4dce80d887
fix(v3): revert goccy/go-json to stdlib encoding/json to fix Windows panic (#4859)
* fix(v3): warm up dialog types in go-json cache to prevent Windows panic

Add FileFilter, OpenFileDialogOptions, SaveFileDialogOptions, and
MessageDialogOptions to the init() warmup to prevent index out of bounds
panic on Windows when these types are first unmarshaled.

Fixes goccy/go-json#474 for Wails internal dialog types.

* fix(v3): revert goccy/go-json to stdlib encoding/json to fix Windows panic

goccy/go-json has a type address calculation bug on Windows that causes
index out of bounds panic when decoding user-defined types for the first time.

This reverts all runtime usages of goccy/go-json back to stdlib encoding/json.
Test and benchmark files are left unchanged.

Partially reverts PR #4843.
2026-01-05 08:26:35 +11:00
Lea Anthony
23b3424415
fix(v3): use correct JSON field names for drop coordinates in example (#4858)
* fix(v3): use correct JSON field names for drop coordinates in example

The DropTargetDetails struct uses lowercase JSON tags (x, y), but the
example frontend was accessing uppercase (X, Y).

* docs(v3): add coordinates fix to changelog
2026-01-05 06:51:41 +11:00
Lea Anthony
ee7e95af52
fix(v3): fix macOS mkdir brace expansion when APP_NAME contains spaces (#4850)
fix(v3): fix macOS mkdir when APP_NAME contains spaces

Replace brace expansion {MacOS,Resources} with two separate mkdir commands.
Brace expansion doesn't work inside quoted strings and is shell-dependent.

Adds integration test to verify mkdir works with spaces in paths.
2026-01-04 15:48:03 +11:00
samstanier
9039051fd3
[v3] Fix save dialog filename not pre-populated on Linux (#4841) (#4842)
The SaveFileDialog.SetFilename() option had no effect on Linux because
the filename was never passed to the GTK file chooser.

This adds a currentName parameter to runChooserDialog and calls
gtk_file_chooser_set_current_name() for save dialogs when a filename
is specified.

Changes:
- linux_cgo.go: Add currentName parameter and GTK call
- linux_purego.go: Add gtkFileChooserSetCurrentName binding and same fix

Fixes the Linux implementation to match the behaviour on Windows and macOS.

Co-authored-by: sas229 <sas229@cam.ac.uk>
Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2026-01-04 14:40:10 +11:00