Wails v3.1.0-nightly.20261028
Nightly preview of the upcoming v3.1.0.
- Improve changelog generation speed by reusing compiled regex patterns in PR by @taliesin-ai
- Reduce allocations when serving localized fallback pages in PR by @taliesin-ai
- Speed up AppImage runtime discovery by avoiding unnecessary metadata lookups in PR by @taliesin-ai
- Reuse compiled command routing patterns to improve wake performance in PR by @taliesin-ai
- Improve performance by avoiding rescanning of unfinished output lines in PR by @taliesin-ai
- Stream executable copies during MSIX package staging to reduce memory use and speed up builds in PR by @taliesin-ai
- Avoid copying unfinished command-output lines to improve performance in PR by @taliesin-ai
- Reduce allocations when generating name-based UUIDs in PR by @taliesin-ai
- Reduce allocations when formatting SQLite statement handles in PR by @taliesin-ai
- Reduce UUID string conversion to a single allocation in PR by @taliesin-ai
- Reduce allocations when formatting changelog bullet entries in PR by @taliesin-ai
- Reduce allocations when formatting terminal hyperlinks in PR by @taliesin-ai
- Reduce allocations when serving assets by sniffing MIME buffers lazily in PR by @taliesin-ai
- Skip debug log preparation in the asset server when debug logging is disabled in PR by @taliesin-ai
- Reduce allocations in webview request handling by avoiding discarded request contexts in PR by @taliesin-ai
- Speed up asset serving by skipping MIME sniffing for known file extensions in PR by @taliesin-ai
- Reduce allocations when serving assets by avoiding a reader for content sniffing in PR by @taliesin-ai
- Reduce allocations when serving non-seekable asset files in PR by @taliesin-ai
- Speed up asset server index root selection by avoiding candidate collection in PR by @taliesin-ai
- Improve asset server performance by formatting content lengths without fmt in PR by @taliesin-ai
- Reduce memory copying when reading desktop file explorer metadata in PR by @taliesin-ai
- Retain source file permissions when copying to new destination files in PR by @taliesin-ai
- Keep fullscreen and maximised windows from resizing when min or max size constraints change in PR by @taliesin-ai
- Publish scheduled star history updates for the wailsapp/wails repository in PR by @taliesin-ai
- Stop discarding invalid Go test count flags in wake in PR by @taliesin-ai
- Preserve Mac icons when encoding fails in PR by @taliesin-ai
- Fix build cache misses for Go outputs with quoted or escaped spaces in PR by @taliesin-ai
- Serialize notification category persistence on Linux to prevent concurrent write races in PR by @taliesin-ai
- Keep shell command chains out of the implicit Go build cache in PR by @taliesin-ai
- Fix notification category maps failing to load when saved data is null in PR by @taliesin-ai
- Show diagnostics from failed variable shell commands in PR by @taliesin-ai
- Fix wake template matching when multiple equality candidates exist in PR by @taliesin-ai
- Serialize concurrent cache-file saves to prevent corrupted cache writes in PR by @taliesin-ai
- Prevent races when replacing the active reporter in PR by @taliesin-ai
- Report resource-generation failures accurately in the CLI in PR by @taliesin-ai
- Recognize stable versions that include build metadata in the CLI in PR by @taliesin-ai
- Serve assets whose request paths contain repeated leading slashes in PR by @taliesin-ai
- Fix shell fallback execution for wake on each platform in PR by @taliesin-ai
- Preserve previous Linux packages when a build fails in PR by @taliesin-ai
- Route command chains and redirections through the shell in PR by @taliesin-ai
- Preserve quoted regex and path backslashes in wake command parsing in PR by @taliesin-ai
- Preserve existing DMG files when packaging builds fail in PR by @taliesin-ai
- Replace symlinks with generated regular files in bindings output in PR by @taliesin-ai
- Preserve literal percent signs in Linux explorer commands in PR by @taliesin-ai
- Align precondition and task command directories so they resolve consistently in PR by @taliesin-ai
- Run default tasks in the executor base directory in PR by @taliesin-ai
- Prevent legacy checks from hiding cache misses in PR by @taliesin-ai
- Fix CLI prerelease numbering to increment without integer overflow limits in PR by @taliesin-ai
- Avoid a panic when cache entries decode as null in PR by @taliesin-ai
- Probe ports once per check in the CLI in PR by @taliesin-ai
- Include the task directory in cache identity to avoid stale wake results in PR by @taliesin-ai
- Prevent data loss when packaging copies a file onto itself in PR by @taliesin-ai
- Make status checks respect task directories in PR by @taliesin-ai
- Detect TODO, FIXME and TBD placeholders in changelog entries in PR by @taliesin-ai
- Generate runtime assets from embedded bundles in the CLI in PR by @taliesin-ai
- Separate stderr from parsed HEAD output in git commands in PR by @taliesin-ai
- Preserve the default in-memory SQLite database under concurrent access in PR by @taliesin-ai
- Return correct responses to HEAD requests for the fallback index page in PR by @taliesin-ai
- Handle SQLite statement preparation racing with database close or reopen in PR by @taliesin-ai
- Release prepared-statement handles when SQLite database is closed or reopened in PR by @taliesin-ai
- Keep extraction destination paths literal when using gosod in PR by @taliesin-ai
- Propagate errors from SQLite queries after partial row iteration in PR by @taliesin-ai
- Return snapshots for whole-store reads in kvstore in PR by @taliesin-ai
- Prevent write panics in kvstore after loading a JSON null value in PR by @taliesin-ai
- Print plain terminal messages without interpreting format verbs in PR by @taliesin-ai
- Surface errors when looking up the latest stable release in the updater in PR by @taliesin-ai
- Ignore hidden entries and headers in changelog comment blocks in PR by @taliesin-ai
- Install wails3 once and surface installer errors in the updater in PR by @taliesin-ai
- Preserve literal bracketed template paths in gosod in PR by @taliesin-ai
- Reject failed GitHub tag responses before decoding them in the updater in PR by @taliesin-ai
- Preserve cancellation errors during parallel library searches in PR by @taliesin-ai
- Close HTTP response bodies on every return path to prevent resource leaks in PR by @taliesin-ai
- Preserve request bodies when the development proxy retries requests in PR by @taliesin-ai
- Honor the launch deadline during desktop file explorer discovery in PR by @taliesin-ai
- Reject HTTP errors before saving AppImage tooling downloads in PR by @taliesin-ai
- Order oversized numeric prerelease identifiers correctly in semver comparisons in PR by @taliesin-ai
- Preserve escaped paths when routing services in the asset server in PR by @taliesin-ai
- Handle HEAD requests for the bundled runtime in the asset server in PR by @taliesin-ai
- Return 404 for missing bundled assets instead of an incorrect response in PR by @taliesin-ai
- Stop dev proxy retries when a request is cancelled in PR by @taliesin-ai
- Avoid shared start URL mutation and stale ports in the asset server in PR by @taliesin-ai
- Honor the optional logger configuration in the asset server in PR by @taliesin-ai
- Remove data race in library path cache invalidation in PR by @taliesin-ai
- Avoid false library matches when searching ldconfig output in PR by @taliesin-ai
- Prevent asset server queue growth and shrink oscillation under load in PR by @taliesin-ai
- Release callback captures after the debounce timer fires to avoid retaining stale references in PR by @taliesin-ai
- Preserve file explorer targets found inside executable paths in PR by @taliesin-ai
- Skip directories that shadow desktop entries in file explorer in PR by @taliesin-ai
- Fix asset server headers not being sent when a response body is empty in PR by @taliesin-ai
- Respect XDG desktop-file search directories when locating application icons in PR by @taliesin-ai
- Preserve file paths during field expansion in the file explorer in PR by @taliesin-ai
- Avoid duplicating expanded URI targets in file explorer in PR by @taliesin-ai
- Commit successful empty non-seekable asset responses instead of leaving them pending in PR by @taliesin-ai
- Fill MIME sniffing prefix correctly across short reads in the asset server in PR by @taliesin-ai
- Avoid reading full response bodies for non-seekable HEAD requests in the asset server in PR by @taliesin-ai
- Only serve exact index files when resolving directory requests in the asset server in PR by @taliesin-ai
- Fix dismissed Linux notifications being reported as clicks on servers without action support in PR by @bercedev
- Stop dev processes when the terminal closes in PR by @xmasdev
- Hold Windows taskbar restart debounce for one second before clearing the flag in PR by @taliesin-ai
- Fix fallback response headers being lost in the asset server in PR by @taliesin-ai
- Honor header deletions before fallback selection in the asset server in PR by @taliesin-ai
- Release removed ring queue references in the asset server to avoid memory leaks in PR by @taliesin-ai
- Release consumed content-sniffer buffers in the asset server to reduce memory use in PR by @taliesin-ai
- Recognize mixed-case asset file extensions when serving assets in PR by @taliesin-ai
- Correctly detect content type in asset server without retaining filenames in PR by @taliesin-ai
- Fall back to a default when a desktop entry has no command in PR by @taliesin-ai
- Stop the liquid-glass example from showing a dialog before the app starts on non-macOS in PR by @taliesin-ai
- Keep window size constraints when fullscreen starts from a constrained size on Windows in PR by @taliesin-ai
- Fix dialogs called before Run blocking forever instead of returning in PR by @taliesin-ai
- Validate generated icon sizes before image allocation to prevent excessive memory use in PR by @taliesin-ai
- Validate release notes API responses before use in PR by @taliesin-ai
- Require complete hexadecimal statement handles in SQLite plugin in PR by @taliesin-ai
- Constrain filesystem library fallback matches to prevent loading unintended libraries in PR by @taliesin-ai
🤖 This is an automated nightly pre-release generated from the latest changes on master. It is not selected by @latest; install it by its exact tag.
Installation:
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.1.0-nightly.20261028
Tip: always pin an exact version (e.g. @v3.1.0-nightly.20261028) in go.mod and CI rather than @latest.
v5.6.0
lego is an independent, free, and open-source project, if you value it, consider supporting it! ❤️
Everybody thinks that the others will donate, but in the end, nobody does.
So if you think that lego is worth it, please consider donating.
For key updates, see the changelog.
- 28d85a793c285465d314705cfcd6b72908ccb0d1 Add DNS provider for CloudPress (#3326)
- 5e1b2fbbcc097818fb41d694961523ed9173492c Add DNS provider for GoDaddy v3 (#3315)
- 7cb485f75410efec1001ab45b11645e2cb18205c Add DNS provider for Netcup v1 (#3327)
- a787f6f1e5d79c85ed8156832732daad4eecae70 Add DNS provider for NordName (#3324)
- 6f7ab9d384e43a1f56dad9bff907d4a322c82b21 Add DNS provider for PrimeDNS (#3310)
- bbd3736f4f78967bfae3cb91022106c742d2b5f1 Add DNS provider for Selfhost v2 (#3298)
- 2e4cb1bdba3b6dc2bfa33f74a5c9e3245dcd8bfd curanet: use oAuth2 (#3333)
- d84578afc6becba57de9bdff0a79b3b1f7590a51 dnscale: fix zone endpoint response (#3294)
- 6bd887cb1c8263fb2c4172e2edac8c0eee0de58d docs: update sponsors section (#3318)
- 11ba36eadd21228e4e3d96c8215c249bec7034c7 feat(cli): use build tags to improve DCE (#3328)
- 9389f0e583e335e562b3f8b53b200ef4110a0c7e feat(dnspersist01): add workaround for Google Trust Services (#3317)
- 6e2d926baac3fdb5ead1a9097cd6d4489a9cc336 feat: experimental conditional DNS builder (#3305)
- f32809dcece7ba03843a898c25c72ac1470f3527 fix(cli): clean account when refusing ToS (#3301)
- 88c3d7d81f0a456ec7805be71bdc575a318f680b fix(cli): log flag supersede config file (#3300)
- 748e608a68442e91424a1f330a6dd16427c33d1e fix: add digitalSignature to TLSALPN01 temp certificate (#3304)
- 4f00c959d650c055c697d3662e0dccf93c4eb7d0 fix: ari return error when end <= start (#3292)
- 133369de0b0f4220ec4080a22bbe0fbef94c32e1 ionoscloud: fix zone detection (#3290)
- 871fe1ba02d0518d68fbbfcb968bfe2628f6fa0f simply: authenticate with a Bearer token (#3320)
- afd620edcb7ba5716676e4c82028f48c598d4dd4 simply: fix zone name encoding (#3322)
- d3f5b8ae5f335a6c407ee523b0885c10591b6a25 yandexcloud: extend zone detection
v0.16.4
This is a security update for crafted PDFs and form or create data that could cause excessive CPU or memory use or terminate a process.
Additive Go API Changes: types.DecodeStreamFunc and types.NewLazyObjectStreamObjectWithDecoder. Existing constructors and signatures remain unchanged. Requires Go 1.26 or later.
Release binaries were built with Go 1.27.3, which includes security fixes for crypto/x509.
1) Unbounded object traversal — GHSA-2623-w998-vcr4:
Long chains of PDF objects could exhaust the Go stack and terminate the process during optimization while reading, annotation removal, or page migration. These paths now use iterative traversal. The fix preserves long valid chains, handles objects whose value is another reference, and bounds error-path output.
Fix: 0bb00190.
2) Repeated stream data — GHSA-pr6x-vqwr-4hj2:
Shared or nested stream aliases and oversized declared lengths could make a small PDF retain unbounded encoded or decoded data. Encoded streams now count toward the existing per-read budget, lengths past the end of the input no longer size buffers, and compressed xref entries that share one current object-stream index are rejected.
Filtered decodes through XRefTable.DecodeStream and lazy object streams each receive a separate cumulative allowance A = max(1 GiB, 2 × MaxDecodeBytes); both default to 1 GiB. The allowances count cumulative decoding, not live memory. Object streams remain lazy, image extraction remains subject to its per-stream and image limits, and a negative MaxDecodeBytes disables these limits.
Fix: 82c88cec.
3) Poster tile grids — GHSA-g5q6-53hx-f68j:
A crafted page size could make poster create an unbounded number of tile definitions and output pages, consuming excessive CPU and memory. Poster output is now limited to 1,000 tiles per source page, and oversized grids are rejected before page content is transformed or tile objects are allocated. Zero, negative and non-finite page or tile dimensions are rejected.
Tiles produced by poster, cut and ndown now share one resource dictionary per source page instead of carrying a copy each. With a margin, each tile references the shared page content through a content array instead of embedding a copy of it. Rendered output is unchanged.
Fix: a9725db6.
4) Create table dimensions — GHSA-cphg-88q6-whwh:
Table rows and cols in a create template were unbounded, so a few hundred bytes of JSON could make create allocate and render without limit. All tables of a template now share a limit of 100,000 rows plus columns. A table whose anchor is invalid, or given together with pos, is now rejected; previously its remaining validation was skipped.
Fix: 5367e878.
5) Unbounded page numbers — GHSA-gx4m-7r76-vpww:
A large page number in a create template or form-fill data could make pdfcpu allocate excessive memory or stall. create now limits additions to 1,000 pages beyond the existing document; form fill and form multifill accept image page numbers only within the document. Both paths reject page numbers below 1.
Fix: ebac361a.
6) Bookmark split page numbers — GHSA-p2r6-9jcq-fp7v:
An outline destination with a very large page number could make split -m bookmark allocate memory proportional to that number, or panic for library callers. Bookmark page spans are now checked against the page count before their pages are listed; such files fail with the same "invalid page number" error as before.
Fix: 70f1a860.
7) Shared resource graphs — GHSA-vwmc-mhq7-fqhc:
Validation could repeatedly process the same shared object through different paths in resource, pattern, property-list and visibility-expression graphs. A small PDF could therefore keep validation busy for an extended time. The fix reuses successful validation results while preserving checks on deeper paths and existing cycle handling. Commands that validate PDFs during reading benefit from the fix.
Fix: 7653f158.
8) Shared object comparison graphs — GHSA-8pv5-h3hv-xhc9:
Object comparison could repeatedly process the same pair of indirect objects when font, image, form XObject or content-stream dictionaries contained shared reference graphs. The comparison is used by default for font, image and form XObject deduplication, validation's info-dictionary reconciliation and image reuse during create; content-stream deduplication is optional. A small PDF could therefore cause exponential comparison work. Object comparison now memoizes indirect-reference pairs for the duration of each comparison, limits distinct pairs to the document's object table size and enforces the existing recursion-depth limit. Reaching either limit conservatively treats the objects as different, so callers keep both objects instead of failing the command; the optimize log reports the cutoff.
Fix: d6abb27e.
Special thanks to Black Water (@Manyo9) for reporting these vulnerabilities.
- 0f5ac76def20e130ab8ffbf39d378613ff71ff91 bump version
- a9725db622f32c519fee90c1733b779ccd5dd598 fix GHSA-g5q6-53hx-f68j: bound poster tile grids
- d6abb27eb84361de96bcc5674ce361ab3b157509 fix GHSA-8pv5-h3hv-xhc9: memoize indirect-reference pairs in object comparison
- 5367e878f7766b94dd5f7e9e3128e1ab5f9b30b6 fix GHSA-cphg-88q6-whwh: bound create table rows and columns
- 70f1a8604f9529962486e75ba82d1e93f10e3cde fix GHSA-p2r6-9jcq-fp7v: check bookmark page spans before splitting
- 82c88cecdee7dac398bebf06d0bdd28728235a57 fix GHSA-pr6x-vqwr-4hj2: bound repeated stream data while reading
- ebac361ac40798d81a97299c8231e7248e0094ab fix GHSA-gx4m-7r76-vpww: bound page numbers in create and form fill
- 0bb001901ef160aa75e882d839ee2997d56fdcb2 fix GHSA-2623-w998-vcr4: walk object graphs without recursion
- 7653f15888400d02c97d933effbf8a4a128245c4 fix GHSA-vwmc-mhq7-fqhc: validate shared resource graphs once per depth
- 358a9a9f528ce1ba428c819683d25434f1caf4a4 add GHSA regression tests and use ghsa_ test naming
Wails v3.1.0-nightly.20261027
Nightly preview of the upcoming v3.1.0.
- Link the 404 page to matching Wails v2 documentation pages on v2.wails.io in PR by @taliesin-ai
- Move the v2 documentation site to v2.wails.io in PR by @taliesin-ai
- Serve v3 documentation from wails.io and v2 documentation from v2.wails.io in PR by @taliesin-ai
- Update v3.0.0 release notes and correct the security advisory claim in PR by @taliesin-ai
- Deliver Go event listener callbacks serially in emit order in PR by @DevLumuz
- Always advertise the tray Menu property so trays created after Run are not dropped on Linux in PR by @AlbinoGeek
- Hold main-thread work submitted before Run until the application starts in PR by @AlbinoGeek
- Use the correct asset API URL when downloading GitHub updater release assets in PR by @gavidroselj
- Fix screen bounds and positions on mixed-DPI macOS and Linux setups in PR by @julianstorer
- Preserve request bodies on Windows when WebView2 omits the Content-Length header in PR by @strraaa
- Fix data race in event hook emission by snapshotting hooks under lock in PR by @DevLumuz
- Fix
SystemTray.SetTooltip()doing nothing on Linux: the StatusNotifierItem tooltip description is now set (#6017) - Run changelog evidence check in the weekly release workflow in PR by @taliesin-ai
- Fix release changelog evidence check to map runs to squash-merge commits in PR by @taliesin-ai
- Fix Linux dark mode detection returning light on a dark desktop until the colour scheme changed, and
linux:SystemThemeChangednever firing on the GTK4 backend. Both backends now share one implementation, backed by theorg.freedesktop.appearanceportal namespace (#6072) Window.SetZoomno longer raises factors below 1.0 to 1.0 on framed windows (Windows, macOS, Linux): WebView2ZoomFactor, WKWebViewmagnificationand WebKitGTK's zoom level accept any positive value, and theZoomwindow option already passed such values through. Frameless windows keep the 1.0 floor because their drag and resize regions are not adjusted for zoom (#4590); non-positive, NaN and Inf factors are now ignored instead of being raised to 1.0 — by @APshenkin
🤖 This is an automated nightly pre-release generated from the latest changes on master. It is not selected by @latest; install it by its exact tag.
Installation:
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.1.0-nightly.20261027
Tip: always pin an exact version (e.g. @v3.1.0-nightly.20261027) in go.mod and CI rather than @latest.
Release 1.85.0
- stats: Expose the effective client authority (sent on the wire as the HTTP/2
:authorityheader) in clientstats.OutHeaderevents. (#9296)- Special Thanks: @aryansk
- metadata: Add
ValueFromOutgoingContext, which reads a single metadata value from outgoing context without copying the entire outgoing metadata into a new map. (#9282)- Special Thanks: @yuyangguo42
- transport: Refine control buffer throttling to only count peer-induced control frames, raise the default
GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMITfrom 100 to 10,000, and close client connections if reads remain throttled for10s. (#9563) - server: Ensure
Stop()forcefully terminates the server whileGracefulStop()is waiting for active handlers to complete. (#9394)- Special Thanks: @stanhu
- server: Unconditionally increment the highest-seen stream ID on when handling
HEADERSframes to comply with RFC 7540 §5.1.1. Previously, truncatedHEADERSframes left the connection in an inconsistent state and allowed stream IDs to be reused by clients without resulting in a protocol error. (#9414) - server: Terminate streams immediately when a
HEADERSframe includes theEndStreambit. Previously, this caused server handlers to hang when reading a message. (#9391) - server: Reject requests missing both
:authorityandHostheaders with HTTP 400 and statusInternal. (#9365) - xds: Fix a bug where route header matchers with non-lowercase names failed to match routes. (#9353)
- Special Thanks: @winklemad
- client: Ensure retried RPCs use the correct
:authorityvalue specified by the LB policy instead of inheriting it from a previous attempt. (#9277)- Special Thanks: @nvxbug
- transport: Fail streams with
io.ErrUnexpectedEOFinstead ofio.EOFupon receiving truncated message headers or bodies after partial data has already been received. (#9204)- Special Thanks: @buger
Wails v3.0.0
Wails v3 is here. Build desktop and mobile applications with Go and the web frontend you already know, using each platform's native WebView instead of a bundled browser.
v3 is a ground-up rework of Wails. Applications, windows, services, events and platform features are now explicit objects you create and talk to directly, so multiple windows, system trays and background services are a normal part of the model rather than workarounds. It has been nearly four years since the first v3 alpha in January 2023. Thank you to everyone who tested, reported, translated, reviewed and contributed along the way.
📣 Read the announcement: Wails v3.0.0 Released 📚 Documentation: wails.io · Migrating from v2: v2 to v3 guide
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0
wails3 setup # guided setup: checks your system and installs what Wails needs
wails3 init # create a new project
Wails v3 requires Go 1.26 or newer. We recommend Go 1.26.10 or 1.27.3 (or later), which include a crypto/x509 security fix. Run wails3 doctor at any time to check your setup.
- Multiple windows. Create, show, hide and close any number of windows at runtime, each with its own options, events and lifecycle.
- Services. Your backend is ordinary Go: register services with the application and their exported methods become callable from the frontend. Services can have startup and shutdown hooks and can serve HTTP routes.
- Manager APIs. Windows, menus, dialogs, events, screens, the clipboard and more are reached through clear manager objects on the application, instead of a single context-bound runtime package.
- Events. Application, window and custom events, with typed payloads, available from both Go and JavaScript, plus platform system events.
- Generated with static analysis.
wails3 generate bindingsreads your Go source, so doc comments and real parameter names carry through to the generated TypeScript or JavaScript. - Models and enums. Go structs become TypeScript classes or interfaces, and Go enums become TypeScript enums.
- Streams and raw messages. Stream data between Go and the frontend, or use raw messages and custom transports when you need full control.
- System tray. Tray icons with menus, light and dark icons, macOS template icons, and the option to attach a window to the tray icon.
- Menus. Application menus, context menus (including from HTML with WML attributes) and tray menus, all updatable at runtime.
- Dialogs. Native message, question, file open and save dialogs, plus custom dialogs.
- Frameless and custom windows. Frameless windows with native corners and shadows, custom title bars, drag regions and translucency, including native Liquid Glass on macOS 26 with a fallback on earlier versions.
- Notifications. Native desktop notifications with actions.
- Keyboard shortcuts. Window and application key bindings and global shortcuts; on macOS, letter accelerators follow the labelled key on AZERTY, QWERTZ, Dvorak and other layouts.
- And more:
- clipboard;
- file drag and drop, plus HTML drag and drop;
- screen and environment information;
- dock badges on macOS;
- start at login;
- opening URLs and files in the default browser;
- notch windows on macOS;
- a per-window permissions map for the camera, microphone, geolocation and notifications.
- Windows (amd64 and arm64), macOS (Intel and Apple Silicon) and Linux (amd64 and arm64).
- Linux uses GTK4 and WebKitGTK 6.0 by default. The legacy GTK3 stack is still available with
-tags gtk3until v3.1. - iOS and Android (experimental). The same
main.goand frontend can run on mobile. Try it and tell us what you find; it isn't yet covered by the stability promise. - Server builds. Run the same application and services as an HTTP server, with no native window.
- A build system you can see. Projects use a Taskfile-based build that you can read, extend and debug, instead of one opaque command.
- Cross-compilation, with platform guides for building on and for every desktop target.
- Code signing and installers. Signing for every platform, NSIS installers and MSIX packages for Windows, DMG and app bundles for macOS, and AppImage, deb, rpm and Arch packages for Linux.
- An in-app updater. Pluggable providers (including GitHub Releases), cryptographic verification, an atomic swap with rollback, and a default UI you can theme or replace.
- Single instance, file associations and custom URL protocols, so your app opens the files and links it owns.
- Obfuscated builds and access to private macOS APIs when you need them.
wails3 setup, a guided setup wizard that checks and installs dependencies.wails3 dev, live development with frontend hot reload and Go rebuilds, which stops its background processes when your app exits.- Templates for vanilla, React, Vue and Svelte, each in JavaScript or TypeScript, plus your own custom templates.
- Testing support, including end-to-end testing guides.
- An MCP service that lets AI tools drive and inspect a running Wails app.
- A new documentation site at wails.io, built with M-Press, with tutorials, guides and API reference translated into nine languages.
v3 is a new major version, so moving to it is a real port rather than a version bump. The main changes are:
- the application and window lifecycle;
- services in place of context-bound bindings;
- direct application and window APIs in place of the v2 runtime package;
- regenerated frontend bindings.
The migration guide covers each one with before-and-after examples.
Wails v2 isn't going away. It continues to receive critical updates, and its documentation is now at v2.wails.io. The two CLIs (wails and wails3) are separate binaries with different module paths, so you can install both.
This release fixes every published Wails v3 security advisory except one: GHSA-2p5f-2gx8-mh8m is only partly fixed. Cross-origin child frames on Linux are now blocked, and the cases that remain open are listed under Known limitations below. If you are on v3.0.0-beta.30 or earlier, please upgrade.
- Block reserved
wails:messages from cross-origin child frames on Linux (GTK3 and GTK4) by injecting a guard script into all frames, mitigating GHSA-2p5f-2gx8-mh8m - Update
github.com/klauspost/compressto 1.18.7 (GHSA-259r-337f-4rfw) andgolang.org/x/imageto 0.45.0, and build with Go 1.26.10 to pick up thecrypto/x509fix (GO-2026-6809) - Update
viteto 8.2.4 or later in the runtime package, setup wizard, examples and project templates (GHSA-9jrq-w75r-8gcw, GHSA-rq7h-c2jc-7f22, GHSA-vfpm-58rq-9qcg, GHSA-r825-w8mm-5pxw, GHSA-587h-7wmj-h5pm, GHSA-698v-4r3x-3vcv)
- Linux: the child-frame guard cannot stop a same-origin child frame (for example a
srcdocorabout:blankiframe) from reaching the native message handler through its parent, because WebKitGTK gives the handler no frame information. Cross-origin frames, and sandboxed frames withoutallow-same-origin, are blocked. Do not embed untrusted same-origin content in a Wails window. - Android (experimental): the
window.wailsJavaScript bridge is exposed to every frame in the WebView. Do not embed untrusted third-party content in the app's WebView. A fix is planned for 3.0.1. - All platforms: bound-method calls from child frames go over HTTP to
/wails/runtime, so the guard does not restrict them. Treat any iframe you embed as having access to your bound Go methods.
- Fix Windows apps crashing with
panic: SetTextColor failedwhen painting the application menu bar on some Windows builds (#6311) - Fix Windows apps crashing in
applyDarkModewhenuxtheme.dllwas unloaded while its functions were still in use (#6358) - Keep a staged update safe while a restart is pending, and validate an update before replacing the installed application, so a damaged update rolls back instead of breaking a working app (#6350, #6360)
- Fix
wails3 update clinot finding v3 releases - Project templates pin
@wailsio/runtimeto the version of the CLI that generated them
- Weekly releases bump the minor version (
v3.1.0,v3.2.0, ...). - Nightly pre-releases preview the next weekly (
v3.1.0-nightly.YYYYMMDD). - Hotfixes bump the patch version.
Go's @latest always resolves to the newest weekly or hotfix release, never a nightly. The @wailsio/runtime npm package always has the same version as the Wails release. Pin an exact version in production builds.
To propose a new feature or a change to public behaviour, open a draft WEP (Wails Enhancement Proposal) pull request rather than a feature-request issue.
Wails v3 exists because of the people who tested incomplete builds, reported hard bugs, translated documentation, answered questions and contributed code: see the credits page. Special thanks to Stffabi, Travis McLane, Atterpac, Lyimmi and fbbdev; to Valerio Tesei for his years of support; to our sponsors; and to JetBrains, ZSA and CodeRabbit.
If Wails is useful to you or your company, please consider sponsoring the project. 💙
Full changelog: changelog
v1.77.0
v1.77.0 strengthens static-file confinement, fixes hijacked connection handling, and improves HTTP and cookie compatibility. It also adds an opt-in bounded stream reader, configurable body-buffer retention, and deadline support for adapted net/http handlers.
Static-file symlink behavior changes by default. The default OS-backed FS now rejects symlinks that leave Root or CompressRoot, as well as absolute symlinks even when their targets are inside the root. Relative symlinks that stay inside the root continue to work. Set FS.AllowSymlinksOutsideRoot to restore the previous behavior when external symlinks are intentional. Custom FS.FS implementations are unaffected. #2490
- Default static-file operations stay within their configured roots. File reads and compressed-cache operations use
os.Rootto prevent symlink traversal outsideRootandCompressRoot. Each root is confined independently; empty roots withAllowEmptyRootand whole-volume roots retain their existing behavior. #2490 - Custom filesystems no longer trigger unrelated disk deletions. A stale compressed file in a custom
FS.FSpreviously caused anos.Removecall using its filesystem-relative name, potentially deleting a matching file in the process working directory. Custom filesystems now regenerate stale compressed content in memory without removing a disk file. #2489 - Kept hijacked connections no longer depend on a recycled request context. With both
KeepHijackedConnsandReduceMemoryUsageenabled, the hijacked reader is detached from the context before the hijack handler runs. This prevents later reads from panicking or accessing another client's connection after context reuse. #2495
- An opt-in stream reader bounds copied payload buffering.
NewBoundedStreamReaderworks withSetBodyStreamand applies backpressure when consumers fall behind. Active copied payload is limited to 160 KiB per bridge, or 320 KiB across the two bridges used by its bounded compression path. These limits exclude caller buffers, codecs, sockets, and other overhead; wrapping the reader loses the combined compression bound. ExistingNewStreamReaderandSetBodyStreamWriterbehavior is unchanged. #2488 - Request and response body buffers can be retained explicitly. The exported
Request.KeepBodyBufferandResponse.KeepBodyBufferfields preserve body buffers across resets for reuse. Releasing a request or response to the pool clears the retention setting. #2451 - Adapted handlers can configure connection deadlines.
RequestCtx.SetReadDeadlineandSetWriteDeadlineare also exposed throughfasthttpadaptor, enablinghttp.ResponseControllerdeadline calls. The adaptor still buffers the request body before invoking the handler, so a read deadline set inside an adapted handler cannot govern the preceding upload. #2452
- Weighted compression codings are recognized.
Accept-Encodingentries such asgzip;q=0.8now match, whileq=0makes a coding unacceptable. Matching remains case-insensitive and requires a complete coding token; quality-based preference ordering and wildcard matching are not added. #2491 - HTTP/1.0 clients no longer receive unsupported informational responses.
Expect: 100-continueis ignored for HTTP/1.0 requests, and103 Early Hintsis not sent to HTTP/1.0 clients. #2492, #2496 - Hijacking works with server keep-alive limits.
DisableKeepaliveand reachingMaxRequestsPerConnno longer suppress a registered hijack handler or add an unwantedConnection: closeto an upgrade response. Explicit connection-close requests and other existing close conditions still apply. #2494 - Pipe connection deadlines interrupt pending operations. Updating deadlines on
fasthttputil.PipeConnsnow affects blocked reads and writes, and write-deadline updates no longer race with writes. #2471 - Cookie parsing tolerates invalid attributes and handles names consistently. Invalid
Max-Ageattributes are ignored,Secure,HttpOnly, andPartitionedare recognized even with a value, and surrounding tabs are trimmed.Set-Cookievalues without=are stored under the same empty key returned byCookie.ParseBytes, keeping lookup and deletion consistent. #2497, #2498, #2500, #2501
Proxy authentication now uses decoded credentials in Proxy-Authorization, and static-file 416 Range Not Satisfiable responses include Content-Range. #2499, #2502
- fix(fs): resolve default FS paths with os.Root so they stay inside Root by @Thanatos9404 in https://github.com/valyala/fasthttp/pull/2490
- fix(fs): don't remove stale compressed files of a custom FS.FS from disk by @Thanatos9404 in https://github.com/valyala/fasthttp/pull/2489
- fix: detach kept hijacked connections from the request context's reader by @h2zi in https://github.com/valyala/fasthttp/pull/2495
- Add an opt-in bounded stream reader by @CSXizhang in https://github.com/valyala/fasthttp/pull/2488
- Export KeepBodyBuffer on Request and Response by @AdamMagued in https://github.com/valyala/fasthttp/pull/2451
- fasthttpadaptor: add support for ResponseController SetReadDeadline and SetWriteDeadline by @AdamMagued in https://github.com/valyala/fasthttp/pull/2452
- fix: accept Accept-Encoding codings that carry a quality value by @ybai08 in https://github.com/valyala/fasthttp/pull/2491
- fix: ignore Expect: 100-continue in HTTP/1.0 requests by @LuisFigueroaG in https://github.com/valyala/fasthttp/pull/2492
- fix: don't send 103 Early Hints to HTTP/1.0 clients by @LuisFigueroaG in https://github.com/valyala/fasthttp/pull/2496
- fix: run hijack handlers under DisableKeepalive and MaxRequestsPerConn by @h2zi in https://github.com/valyala/fasthttp/pull/2494
- make PipeConns deadlines interrupt pending reads and writes by @h2zi in https://github.com/valyala/fasthttp/pull/2471
- fix(cookie): ignore an invalid Max-Age attribute instead of failing to parse by @nk-batman21 in https://github.com/valyala/fasthttp/pull/2497
- fix(fasthttpproxy): send decoded proxy credentials in Proxy-Authorization by @nk-batman21 in https://github.com/valyala/fasthttp/pull/2499
- fix(cookie): recognize Secure, HttpOnly and Partitioned with a value by @LuisFigueroaG in https://github.com/valyala/fasthttp/pull/2498
- fix(cookie): trim tabs around cookie names, values and attributes by @LuisFigueroaG in https://github.com/valyala/fasthttp/pull/2500
- fix(cookie): store Set-Cookie without '=' under the key ParseBytes gives it by @LuisFigueroaG in https://github.com/valyala/fasthttp/pull/2501
- fix(fs): send Content-Range with 416 responses by @wleeaf in https://github.com/valyala/fasthttp/pull/2502
- @ybai08 made their first contribution in https://github.com/valyala/fasthttp/pull/2491
- @Thanatos9404 made their first contribution in https://github.com/valyala/fasthttp/pull/2489
- @AdamMagued made their first contribution in https://github.com/valyala/fasthttp/pull/2452
- @nk-batman21 made their first contribution in https://github.com/valyala/fasthttp/pull/2497
- @wleeaf made their first contribution in https://github.com/valyala/fasthttp/pull/2502
Full Changelog: https://github.com/valyala/fasthttp/compare/v1.76.0...v1.77.0
v6.16.0
- Publish the v6.15.1 service-to-agent walkthrough by @asim in https://github.com/micro/go-micro/pull/5007
- Give services, MCP and chat separate starting points by @asim in https://github.com/micro/go-micro/pull/5008
- Default the OpenAI image model to gpt-image-2 by @pcbeingused333 in https://github.com/micro/go-micro/pull/5009
- feat(model): prefer MiniMax M3.1 Flash for text requests by @octo-patch in https://github.com/micro/go-micro/pull/5010
- Default the Anthropic model to claude-sonnet-5-5 by @pcbeingused333 in https://github.com/micro/go-micro/pull/5011
- Accept Anthropic streamed tool calls that have no arguments by @pcbeingused333 in https://github.com/micro/go-micro/pull/5012
- Default the Gemini model to gemini-3.8-flash by @pcbeingused333 in https://github.com/micro/go-micro/pull/5013
- Report token usage from the native Ollama stream by @pcbeingused333 in https://github.com/micro/go-micro/pull/5014
- Keep streamed tool calls without an index apart by @pcbeingused333 in https://github.com/micro/go-micro/pull/5015
- Report the token usage of every request in a tool round by @pcbeingused333 in https://github.com/micro/go-micro/pull/5016
- Return follow-up errors and sum usage in the Ollama Cloud tool round by @pcbeingused333 in https://github.com/micro/go-micro/pull/5017
- Preserve live model catalogs and streamed tool-name fragments by @asim in https://github.com/micro/go-micro/pull/5018
- Fix CI vulnerability check and service smoke checksum lookup by @asim in https://github.com/micro/go-micro/pull/5020
- Fix scaffold contract test checksum failures by @asim in https://github.com/micro/go-micro/pull/5021
- fix(server): release each request's context once it is served, not when the connection closes by @joe-blink in https://github.com/micro/go-micro/pull/5026
- feat: add LiteLLM model provider by @prodmanpd in https://github.com/micro/go-micro/pull/5030
- Report token usage and skip thoughts in the Gemini provider by @pcbeingused333 in https://github.com/micro/go-micro/pull/5022
- Fail a tool call whose arguments are not valid JSON by @pcbeingused333 in https://github.com/micro/go-micro/pull/5023
- Report usage, finish reason and output limit from Mistral, Together, MiniMax and Groq responses by @pcbeingused333 in https://github.com/micro/go-micro/pull/5028
- Fix empty tool arguments and Anthropic usage accounting by @asim in https://github.com/micro/go-micro/pull/5031
- Decouple agent execution from flows by @asim in https://github.com/micro/go-micro/pull/5033
- Host agents on services: new → run → chat by @asim in https://github.com/micro/go-micro/pull/5034
- Fix docs tests after agent hosting and update Go to 1.26.10 by @asim in https://github.com/micro/go-micro/pull/5035
- Show New → Run → Chat on the landing page by @asim in https://github.com/micro/go-micro/pull/5036
- Simplify the landing page around services and agents by @asim in https://github.com/micro/go-micro/pull/5037
- @pcbeingused333 made their first contribution in https://github.com/micro/go-micro/pull/5009
- @prodmanpd made their first contribution in https://github.com/micro/go-micro/pull/5030
Full Changelog: https://github.com/micro/go-micro/compare/v6.15.1...v6.16.0
v2.4.0
- fix: treat IPv6 and shared-space addresses as internal by @SashaMIT in https://github.com/duke-git/lancet/pull/357
- Fix fileutil CI panic by serving ReadFile test fixtures from a local httptest server by @duke-git with @Copilot in https://github.com/duke-git/lancet/pull/358
- fix(package): [algorithm] handle empty iterative searches by @yuefdev in https://github.com/duke-git/lancet/pull/399
- fix(package): [netutil] bracket IPv6 dial addresses by @yuefdev in https://github.com/duke-git/lancet/pull/398
- fix(package): [structs] recognise directly embedded fields by @yuefdev in https://github.com/duke-git/lancet/pull/403
- fix(package): [random] handle non-positive unique slice lengths by @yuefdev in https://github.com/duke-git/lancet/pull/402
- fix(package): [netutil] skip invalid forwarded IP values by @yuefdev in https://github.com/duke-git/lancet/pull/397
- fix(package): [validator] accept supported hostless URL schemes by @yuefdev in https://github.com/duke-git/lancet/pull/395
- fix(package): [iterator] report available elements in HasNext by @yuefdev in https://github.com/duke-git/lancet/pull/392
- fix(package): [slice] report unreadable struct fields by @yuefdev in https://github.com/duke-git/lancet/pull/401
- fix(package): [stream] bound Limit capacity by source length by @yuefdev in https://github.com/duke-git/lancet/pull/400
- fix(package): [validator] match whole Chinese phone numbers by @yuefdev in https://github.com/duke-git/lancet/pull/396
- fix(package): [stream] avoid overflowing range arithmetic by @yuefdev in https://github.com/duke-git/lancet/pull/393
- fix(package): [queue] keep circular queues reusable after clear by @yuefdev in https://github.com/duke-git/lancet/pull/394
- fix(package): [list] preserve source storage during merge by @yuefdev in https://github.com/duke-git/lancet/pull/391
- fix(package): [netutil] handle upload responses by @yuefdev in https://github.com/duke-git/lancet/pull/389
- fix(package): [netutil] reject failed download responses by @yuefdev in https://github.com/duke-git/lancet/pull/388
- fix(package): [datetime] reject non-positive intervals by @yuefdev in https://github.com/duke-git/lancet/pull/386
- fix(package): [datetime] count calendar days across DST by @yuefdev in https://github.com/duke-git/lancet/pull/385
- fix(slice): return safely when DeleteAt receives no elements by @yuefdev in https://github.com/duke-git/lancet/pull/381
- fix(formatter): exclude leading plus signs from comma groups by @yuefdev in https://github.com/duke-git/lancet/pull/382
- fix(package): [queue] check membership only in active slots by @yuefdev in https://github.com/duke-git/lancet/pull/390
- fix(package): [convertor] preserve cloned scalar types by @yuefdev in https://github.com/duke-git/lancet/pull/383
- fix(package): [algorithm] keep duplicate CountSort entries by @yuefdev in https://github.com/duke-git/lancet/pull/387
- fix(package): [datetime] accept empty timezone options by @yuefdev in https://github.com/duke-git/lancet/pull/384
- fix(convertor): clone array values without slice reflection by @yuefdev in https://github.com/duke-git/lancet/pull/380
- fix(fileutil): reject copies onto the source file by @yuefdev in https://github.com/duke-git/lancet/pull/379
- fix(fileutil): preserve CSV fields and truncate replaced files by @yuefdev in https://github.com/duke-git/lancet/pull/378
- fix(strutil): clamp substring lengths before integer conversion by @yuefdev in https://github.com/duke-git/lancet/pull/377
- fix(mathutil): stop stepped ranges when values stop increasing by @yuefdev in https://github.com/duke-git/lancet/pull/376
- fix(maputil): validate MapToStruct inputs before reflection by @yuefdev in https://github.com/duke-git/lancet/pull/375
- fix(validator): reject backslashes in Base64 values by @yuefdev in https://github.com/duke-git/lancet/pull/374
- fix(slice): pass actual comparison indexes to DifferenceBy by @yuefdev in https://github.com/duke-git/lancet/pull/370
- fix(strutil): preserve IndexOffset not-found results by @yuefdev in https://github.com/duke-git/lancet/pull/367
- fix(strutil): validate Hamming distance by rune count by @yuefdev in https://github.com/duke-git/lancet/pull/368
- fix(strutil): encode default trim characters as runes by @yuefdev in https://github.com/duke-git/lancet/pull/369
- fix(mathutil): divide before multiplying LCM factors by @yuefdev in https://github.com/duke-git/lancet/pull/363
- fix(validator): correct JCB digit pattern escaping by @yuefdev in https://github.com/duke-git/lancet/pull/373
- fix(maputil): map slices into array destinations by @yuefdev in https://github.com/duke-git/lancet/pull/371
- fix(validator): exclude the correct GBK trail byte by @yuefdev in https://github.com/duke-git/lancet/pull/372
- fix(slice): handle Intersection without inputs by @yuefdev in https://github.com/duke-git/lancet/pull/366
- fix(mathutil): format TruncRound integer inputs as floats by @yuefdev in https://github.com/duke-git/lancet/pull/365
- fix(mathutil): honour Fibonacci seeds at the first positions by @yuefdev in https://github.com/duke-git/lancet/pull/362
- fix(mathutil): scale integer inputs after float conversion by @yuefdev in https://github.com/duke-git/lancet/pull/361
- fix(mathutil): preserve distances at extreme scales by @yuefdev in https://github.com/duke-git/lancet/pull/360
- fix(package): update LRU length after deletion by @yuefdev in https://github.com/duke-git/lancet/pull/359
- fix(mathutil): compute permutations without factorial division by @yuefdev in https://github.com/duke-git/lancet/pull/364
- @SashaMIT made their first contribution in https://github.com/duke-git/lancet/pull/357
- @duke-git with @Copilot made their first contribution in https://github.com/duke-git/lancet/pull/358
- @yuefdev made their first contribution in https://github.com/duke-git/lancet/pull/399
Full Changelog: https://github.com/duke-git/lancet/compare/v2.3.9...v2.4.0