diff --git a/docs/ref/wails-v3/changelog.mdx b/docs/ref/wails-v3/changelog.mdx
new file mode 100644
index 0000000..36cb864
--- /dev/null
+++ b/docs/ref/wails-v3/changelog.mdx
@@ -0,0 +1,1208 @@
+---
+title: Changelog
+---
+
+
+Legend:
+- - macOS
+- ⊞ - Windows
+- 🐧 - Linux
+
+/*--
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+- `Added` for new features.
+- `Changed` for changes in existing functionality.
+- `Deprecated` for soon-to-be removed features.
+- `Removed` for now removed features.
+- `Fixed` for any bug fixes.
+- `Security` in case of vulnerabilities.
+
+*/
+
+/*
+ ** PLEASE DO NOT UPDATE THIS FILE **
+ Updates should be added to `v3/UNRELEASED_CHANGELOG.md`
+ Thank you!
+*/
+## [Unreleased]
+
+## v3.0.0-alpha.74 - 2026-03-01
+
+## Added
+- Add support for modal sheets (macOS)
+
+## Fixed
+- Fix system tray menu highlight state on macOS - icon now shows selected state when menu is open (#4910)
+- Fix system tray attached window appearing behind other windows on macOS - now uses proper popup window level (#4910)
+- Fix incorrect `@wailsio/runtime` import examples across documentation (#4989)
+
+## v3.0.0-alpha.73 - 2026-02-27
+
+## Fixed
+- Fix frameless window cannot be minimized on darwin (#4294)
+
+## v3.0.0-alpha.72 - 2026-02-16
+
+## Fixed
+- Fix 20-30 minute hangs during `wails3 build` and `wails3 dev` by excluding `node_modules/` from go-task's up-to-date checking. Previously, the `sources: "**/*"` glob caused go-task to enumerate and checksum every file in `node_modules/` (50-100k+ files with heavy dependencies like MUI), especially slow on Windows/NTFS (#4939)
+
+## v3.0.0-alpha.71 - 2026-02-10
+
+## Added
+- Bumped ghw version for better Apple device support by @leaanthony (#4977)
+- Add `GetBadge` method to the dock service
+
+## Fixed
+- Fix GTK4 build failure caused by C `Screen` typedef colliding with X11 Xlib.h (#4957)
+- Fix dock badge methods consistency on macOS
+
+## v3.0.0-alpha.70 - 2026-02-09
+
+## Added
+- Add `-tags` flag to `wails3 build` command for passing custom Go build tags (e.g., `wails3 build -tags gtk4`) (#4957)
+- Add documentation for automatic enum generation in binding generator, including dedicated Enums page and sidebar navigation (#4972)
+
+## Fixed
+- Fix `InvisibleTitleBarHeight` being applied to all macOS windows instead of only frameless or transparent title bar windows (#4960)
+- Fix window shaking/jitter when resizing from top corners with `InvisibleTitleBarHeight` enabled, by skipping drag initiation near window edges (#4960)
+- Fix generation of mapped types with enum keys in JS/TS bindings (#4437) by @fbbdev
+
+## v3.0.0-alpha.69 - 2026-02-08
+
+## Added
+- Add `-tags` flag to `wails3 build` command for passing custom Go build tags (e.g., `wails3 build -tags gtk4`) (#4957)
+
+## Fixed
+- Fix file drag-and-drop on Windows not working at non-100% display scaling
+- Fix HTML5 internal drag-and-drop being broken when file drop was enabled on Windows
+- Fix file drop coordinates being in wrong pixel space on Windows (physical vs CSS pixels)
+- Fix file drag-and-drop on Linux not working reliably with hover effects
+- Fix HTML5 internal drag-and-drop being broken when file drop was enabled on Linux
+- Fix window show/hide on Linux/GTK4 sometimes restoring to minimized state by using `gtk_window_present()` (#4957)
+- Fix window position get/set on Linux/GTK4 always returning 0,0 by adding X11-conditional support via `XTranslateCoordinates`/`XMoveWindow` (#4957)
+- Fix max window size not being enforced on Linux/GTK4 by adding signal-based size clamping to replace removed `gtk_window_set_geometry_hints` (#4957)
+- Fix DPI scaling on Linux/GTK4 by implementing proper PhysicalBounds calculation and fractional scaling support via `gdk_monitor_get_scale` (GTK 4.14+)
+- Fix menu items duplicating when creating new windows on Linux/GTK4
+- Fix generation of mapped types with enum keys in JS/TS bindings (#4437) by @fbbdev
+
+## v3.0.0-alpha.68 - 2026-02-07
+
+## Added
+- Add Web API examples in `v3/examples/web-apis/` demonstrating 41 browser APIs including Storage (localStorage, sessionStorage, IndexedDB, Cache API), Network (Fetch, WebSocket, XMLHttpRequest, EventSource, Beacon), Media (Canvas, WebGL, Web Audio, MediaDevices, MediaRecorder, Speech Synthesis), Device (Geolocation, Clipboard, Fullscreen, Device Orientation, Vibration, Gamepad), Performance (Performance API, Mutation Observer, Intersection/Resize Observer), UI (Web Components, Pointer Events, Selection, Dialog, Drag and Drop), and more
+- Add WebView API compatibility checker example (`v3/examples/webview-api-check/`) that tests 200+ browser APIs across platforms
+- Add `internal/libpath` package for finding native library paths on Linux with parallel search, caching, and support for Flatpak/Snap/Nix
+- **WIP:** Add experimental WebKitGTK 6.0 / GTK4 support for Linux, available via `-tags gtk4` (GTK3/WebKit2GTK 4.1 remains the default)
+ - Note: On tiling window managers (e.g., Hyprland, Sway), Minimize/Maximize operations may not work as expected since the WM controls window geometry
+
+## Changed
+- **BREAKING**: Map keys in generated JS/TS bindings are now marked optional to accurately reflect Go map semantics. Map value access in Typescript now returns `T | undefined` instead of `T`, requiring null checks or assertions (#4943) by `@fbbdev`
+
+## Fixed
+- Fix file drag-and-drop on Windows not working at non-100% display scaling
+- Fix HTML5 internal drag-and-drop being broken when file drop was enabled on Windows
+- Fix file drop coordinates being in wrong pixel space on Windows (physical vs CSS pixels)
+- Fix file drag-and-drop on Linux not working reliably with hover effects
+- Fix HTML5 internal drag-and-drop being broken when file drop was enabled on Linux
+- Fix DPI scaling on Linux/GTK4 by implementing proper PhysicalBounds calculation and fractional scaling support via `gdk_monitor_get_scale` (GTK 4.14+)
+- Fix menu items duplicating when creating new windows on Linux/GTK4
+- Fix generation of mapped types with enum keys in JS/TS bindings (#4437) by @fbbdev
+
+## v3.0.0-alpha.67 - 2026-02-04
+
+## Added
+- Added how to do `One Time Handlers` in the docs for `Listening to Events in JavaScript` by @AbdelhadiSeddar
+
+## Changed
+- Changed the use of `Event` into `Events` according to changes in `@wailsio/runtime` and appropriate function calls in the docs in `Features/Events/Event System` by @AbdelhadiSeddar
+
+## Fixed
+- Fix "ghost windows" issue on macOS caused by not accessing AppKit APIs from the Main Thread in App.Window.Current() (#4947) by @wimaha
+- Fix HTML `` not working on macOS by implementing WKUIDelegate runOpenPanelWithParameters (#4862)
+- Fix native file drag-and-drop not working when using `@wailsio/runtime` npm module on macOS/Linux (#4953) by @leaanthony
+- Fix binding generation for cross-package type aliases (#4578) by @fbbdev
+
+## v3.0.0-alpha.66 - 2026-02-03
+
+## Added
+- Add `UseApplicationMenu` option to `WebviewWindowOptions` allowing windows on Windows/Linux to inherit the application menu set via `app.Menu.Set()` by @leaanthony
+
+## Changed
+- Move `EnabledFeatures`, `DisabledFeatures`, and `AdditionalBrowserArgs` from per-window options to application-level `Options.Windows` (#4559) by @leaanthony
+
+## Fixed
+- Fix OpenFileDialog crash on Linux due to GTK thread safety violation (#3683) by @ddmoney420
+- Fix SIGSEGV crash when calling `Focus()` on a hidden or destroyed window (#4890) by @ddmoney420
+- Fix potential panic when setting empty icon or bitmap on Linux (#4923) by @ddmoney420
+- Fix ErrorDialog crash when called from service binding on macOS (#3631) by @leaanthony
+- Make menus to be displayed on Windows OS in `v3\examples\dialogs` by @ndianabasi
+- Fix race condition causing TypeError during page reload (#4872) by @ddmoney420
+- Fix incorrect output from binding generator tests by removing global state in the `Collector.IsVoidAlias()` method (#4941) by @fbbdev
+- Fix `` file picker not working on macOS (#4862) by @leaanthony
+
+## Removed
+- **BREAKING**: Remove `EnabledFeatures`, `DisabledFeatures`, and `AdditionalLaunchArgs` from per-window `WindowsWindow` options. Use application-level `Options.Windows.EnabledFeatures`, `Options.Windows.DisabledFeatures`, and `Options.Windows.AdditionalBrowserArgs` instead. These flags apply globally to the shared WebView2 environment (#4559) by @leaanthony
+
+## v3.0.0-alpha.65 - 2026-02-01
+
+## Added
+- Add support for using `.icon` files (Apple Icon Composer format) for generating Liquid Glass icons and asset catalogs (macOS) (#4934) by @wimaha
+
+## v3.0.0-alpha.64 - 2026-01-26
+
+## Added
+- Add experimental server mode for headless/web deployments (`-tags server`). Enables running Wails apps as HTTP servers without native GUI dependencies. Build with `wails3 task build:server`. See `examples/server` for details.
+
+## v3.0.0-alpha.63 - 2026-01-25
+
+## Fixed
+- Fix `Position()` and `SetPosition()` using inconsistent coordinate systems on macOS, causing window position drift when saving/restoring state (#4816) by @leaanthony
+
+## v3.0.0-alpha.62 - 2026-01-22
+
+## Fixed
+- Fix SetProcessDpiAwarenessContext "Access is denied" error when DPI awareness is already set via application manifest (#4803)
+
+## v3.0.0-alpha.61 - 2026-01-20
+
+## Fixed
+- Update the docs page for keyboard shortcuts and corrects the type of the callback parameter for `KeyBinding.Add` by @ndianabasi
+- Fix documentation regarding generating custom binding, must use `-d String` instead of `-o String`
+
+## v3.0.0-alpha.60 - 2026-01-14
+
+## Fixed
+- Fix menu not clearing children on `menu.Update()`
+
+## v3.0.0-alpha.59 - 2026-01-11
+
+## Changed
+- Update the README for the `Drag N Drop` example and highlights that `Internal Drag and Drop` is demonstrated with the example @ndianabasi
+
+## v3.0.0-alpha.58 - 2026-01-09
+
+## Fixed
+- Fix outdated Manager API references in documentation (31 files updated to use new pattern like `app.Window.New()`, `app.Event.Emit()`, etc.) by @leaanthony
+- Fix Linux crash on panic in JS-bound Go methods due to WebKit overriding signal handlers (#3965) by @leaanthony
+
+## v3.0.0-alpha.57 - 2026-01-05
+
+## Changed
+- Replace various debug logs from Info to Debug (by @mbaklor)
+
+## Fixed
+- Fix SaveFileDialog.SetFilename() having no effect on Linux (#4841) by @samstanier
+- Fix drop coordinates showing as undefined in drag-n-drop example
+- Fix macOS app bundle creation failing when APP_NAME contains spaces (brace expansion issue)
+- Fix index out of bounds panic on Windows when calling service methods (revert goccy/go-json)
+
+## v3.0.0-alpha.56 - 2026-01-04
+
+## Added
+- Add `internal/libpath` package for finding native library paths on Linux with parallel search, caching, and support for Flatpak/Snap/Nix
+
+## Changed
+- **BREAKING:** Rename `EnableDragAndDrop` to `EnableFileDrop` in window options
+- **BREAKING:** Rename `DropZoneDetails` to `DropTargetDetails` in event context
+- **BREAKING:** Rename `DropZoneDetails()` method to `DropTargetDetails()` on `WindowEventContext`
+- **BREAKING:** Remove `WindowDropZoneFilesDropped` event, use `WindowFilesDropped` instead
+- **BREAKING:** Change HTML attribute from `data-wails-dropzone` to `data-file-drop-target`
+- **BREAKING:** Change CSS hover class from `wails-dropzone-hover` to `file-drop-target-active`
+- **BREAKING:** Remove `DragEffect`, `OnEnterEffect`, `OnOverEffect` options from Windows (were part of removed IDropTarget)
+
+## Fixed
+- Fix file drag-and-drop on Windows not working at non-100% display scaling
+- Fix HTML5 internal drag-and-drop being broken when file drop was enabled on Windows
+- Fix file drop coordinates being in wrong pixel space on Windows (physical vs CSS pixels)
+- Fix file drag-and-drop on Linux not working reliably with hover effects
+- Fix HTML5 internal drag-and-drop being broken when file drop was enabled on Linux
+
+## Removed
+- Remove native `IDropTarget` implementation on Windows in favor of JavaScript-based approach (matches v2 behavior)
+
+## v3.0.0-alpha.55 - 2026-01-02
+
+## Changed
+- Switch to goccy/go-json for all runtime JSON processing (method bindings, events, webview requests, notifications, kvstore), improving performance by 21-63% and reducing memory allocations by 40-60%
+- Optimize BoundMethod struct layout and cache isVariadic flag to reduce per-call overhead
+- Use stack-allocated argument buffer for methods with `<=8` arguments to avoid heap allocations
+- Optimize result collection in method calls to avoid slice allocation for single return values
+- Use sync.Map for MIME type cache to improve concurrent performance
+- Use buffer pool for HTTP transport request body reading
+- Lazily allocate CloseNotify channel in content type sniffer to reduce per-request allocations
+- Remove debug CSS logging from asset server
+- Expand MIME type extension map to cover 50+ common web formats (fonts, audio, video, etc.)
+
+## Fixed
+- Update all commands in Taskfile.yml files for all operating systems to accommodate spaces in variables such as `APP_NAME` by @ndianabasi
+
+## Removed
+- Remove github.com/wailsapp/mimetype dependency in favor of expanded extension map + stdlib http.DetectContentType, reducing binary size by ~1.2MB
+- Remove gopkg.in/ini.v1 dependency by implementing minimal .desktop file parser for Linux file explorer, saving ~45KB
+- Remove samber/lo from runtime code by using Go 1.21+ stdlib slices package and minimal internal helpers, saving ~310KB
+
+## v3.0.0-alpha.54 - 2025-12-29
+
+## Added
+- Add `CollectionBehavior` option to `MacWindow` for controlling window behavior across macOS Spaces and fullscreen (#4756) by @leaanthony
+
+## Fixed
+- Fix command argument error when executing 'build:universal:lipo:go' task on Linux by @wux1an
+- Fix Docker error "undefined symbol: ___ubsan_handle_xxxxxxx" when running 'wails3 build GOOS=darwin GOARCH=arm64' on Linux by @wux1an
+
+## Removed
+- Remove debug printf statements from Darwin URL scheme handler (#4834)
+
+## v3.0.0-alpha.53 - 2025-12-27
+
+## Added
+- Add unit tests for pkg/application by @leaanthony
+- Add custom protocol support to MSIX packaging by @leaanthony
+
+## Fixed
+- Consolidate custom protocol documentation and add Universal Links sections by @leaanthony
+
+## v3.0.0-alpha.52 - 2025-12-26
+
+## Fixed
+- Fix Windows systray menu crash when clicking icon repeatedly by adding guard against concurrent TrackPopupMenuEx calls (#4151) by @leaanthony
+
+## v3.0.0-alpha.51 - 2025-12-23
+
+## Fixed
+- Prevent app crashing when calling systray.Run() before app.Run() by @leaanthony
+
+## v3.0.0-alpha.50 - 2025-12-21
+
+## Changed
+- Update the documentation for Window `X/Y` options @ruhuang2001
+
+## v3.0.0-alpha.49 - 2025-12-18
+
+## Changed
+- Update the `Frontend Runtime` documentation by adding more options for generating frontend bindings by @ndianabasi
+
+## v3.0.0-alpha.48 - 2025-12-16
+
+## Added
+- Add desktop environment detection on linux [PR #4797](https://github.com/wailsapp/wails/pull/4797)
+
+## Changed
+- Update the documentation page for Wails v3 Asset Server by @ndianabasi
+- **BREAKING**: Remove package-level dialog functions (`application.InfoDialog()`, `application.QuestionDialog()`, etc.). Use the `app.Dialog` manager instead: `app.Dialog.Info()`, `app.Dialog.Question()`, `app.Dialog.Warning()`, `app.Dialog.Error()`, `app.Dialog.OpenFile()`, `app.Dialog.SaveFile()`
+- Update dialogs documentation to match actual API: use `app.Dialog.*`, `AddButton()` with callbacks (not `SetButtons()`), `SetDefaultButton(*Button)` (not string), `AddFilter()` (not `SetFilters()`), `SetFilename()` (not `SetDefaultFilename()`), and `app.Dialog.OpenFile().CanChooseDirectories(true)` for folder selection
+
+## Fixed
+- Fix crash on macOS when toggling window visibility via Hide()/Show() with ApplicationShouldTerminateAfterLastWindowClosed enabled (#4389) by @leaanthony
+- Fix memory leak in context menus on macOS and Windows when repeatedly opening menus (#4012) by @leaanthony
+- Fix context menu native resources not being reused on macOS, causing fresh menu creation on each display (#4012) by @leaanthony
+
+## v3.0.0-alpha.47 - 2025-12-15
+
+## Added
+- Add `Window.Print()` method to JavaScript runtime for triggering print dialog from frontend (#4290) by @leaanthony
+
+## Fixed
+- Fix macOS dock icon click not showing hidden windows when app started with `Hidden: true` (#4583) by @leaanthony
+- Fix macOS print dialog not opening due to incorrect window pointer type in CGO call (#4290) by @leaanthony
+
+## v3.0.0-alpha.46 - 2025-12-14
+
+## Added
+- Add `XDG_SESSION_TYPE` to `wails3 doctor` output on Linux by @leaanthony
+- Add additional WebKit2 load-change events for Linux: `WindowLoadStarted`, `WindowLoadRedirected`, `WindowLoadCommitted`, `WindowLoadFinished` (#3896) by @leaanthony
+
+## Removed
+- **BREAKING**: Remove `linux:WindowLoadChanged` event - use `linux:WindowLoadFinished` instead for detecting when WebView has finished loading (#3896) by @leaanthony
+
+## v3.0.0-alpha.45 - 2025-12-13
+
+## Added
+- Add `XDG_SESSION_TYPE` to `wails3 doctor` output on Linux by @leaanthony
+- Generate `.desktop` file during Linux build, not just packaging (#4575)
+- Add Linux runtime dependencies documentation with distro-specific package names and nfpm packaging examples (#4339) by @leaanthony
+
+## Fixed
+- Fix window menu crash on Wayland caused by appmenu-gtk-module accessing unrealized window (#4769) by @leaanthony
+- Fix GTK application crash when app name contains invalid characters (spaces, parentheses, etc.) by @leaanthony
+- Fix "not enough memory" error when initializing drag and drop on Windows (#4701) by @overlordtm
+- Fix file explorer opening wrong directory on Linux due to incorrect URI escaping (#4397) by @leaanthony
+- Fix AppImage build failure on modern Linux distributions (Arch, Fedora 39+, Ubuntu 24.04+) by auto-detecting `.relr.dyn` ELF sections and disabling stripping (#4642) by @leaanthony
+- Fix `wails doctor` falsely reporting webkit packages as installed on Fedora/DNF-based systems (#4457) by @leaanthony
+
+## v3.0.0-alpha.44 - 2025-12-12
+
+## Added
+- Add NVIDIA driver version info to `wails3 doctor` output on Linux by @leaanthony
+
+## Changed
+- **BREAKING**: Production builds are now the default. To create dev builds, set `DEV=true` in your Taskfiles. Generate a new project for examples by @leaanthony
+
+## Fixed
+- Fix default `config.yml` would run `wails3 dev` with a production build by @mbaklor
+- Fix iOS service stubs causing build failures due to non-existent package import by @leaanthony
+- Fix structured logging in debug/info methods causing "no formatting directives" errors by @leaanthony
+- Remove temporary debug print statements accidentally included from mobile platform merge by @leaanthony
+- Fix WebKitGTK crash on Wayland with NVIDIA GPUs (Error 71 Protocol error) by auto-disabling DMA-BUF renderer by @leaanthony
+
+## v3.0.0-alpha.43 - 2025-12-11
+
+## Added
+- Add origin to raw message handler by @APshenkin in [PR](https://github.com/wailsapp/wails/pull/4710)
+- Add universal link support for macOS by @APshenkin in [PR](https://github.com/wailsapp/wails/pull/4712)
+- Refactor binding transport layer by @APshenkin in [PR](https://github.com/wailsapp/wails/pull/4702)
+- Add aria-label identifiers to the helloworld templates so that the example app can be easily tested by Appium test clients by @chinenual in [PR](https://github.com/wailsapp/wails/pull/4760)
+
+## v3.0.0-alpha.42 - 2025-12-10
+
+## Added
+- Add origin to raw message handler by @APshenkin in [PR](https://github.com/wailsapp/wails/pull/4710)
+- Add universal link support for macOS by @APshenkin in [PR](https://github.com/wailsapp/wails/pull/4712)
+- Refactor binding transport layer by @APshenkin in [PR](https://github.com/wailsapp/wails/pull/4702)
+
+## v3.0.0-alpha.41 - 2025-11-23
+
+## Fixed
+- Resolve alpha value being ignored in `application.WebviewWindowOptions.BackgroundColour` on Linux ([#4722](https://github.com/wailsapp/wails/pull/4722), @BradHacker)
+
+## v3.0.0-alpha.40 - 2025-11-13
+
+## Fixed
+- Fix Windows systray icon not defaulting to application icon when no custom icon is provided (#4704)
+
+## v3.0.0-alpha.39 - 2025-11-12
+
+## Added
+- Typed Events by @fbbdev and @ianvs in [#4633](https://github.com/wailsapp/wails/pull/4633)
+
+## Changed
+- When emitting a custom event with zero or one data argument, the data value will be assigned directly to the Data field without wrapping it in a slice by [@fbbdev](https://github.com/fbbdev) in [#4633](https://github.com/wailsapp/wails/pull/4633)
+
+## v3.0.0-alpha.38 - 2025-11-04
+
+## Added
+- Add `systray-clock` example showing a headless tray with live tooltip updates (#4653).
+
+## Changed
+- Windows trays now honor `SystemTray.Show()`/`Hide()` by toggling `NIS_HIDDEN`, so apps can truly disappear and return (#4653).
+- Tray registration reuses resolved icons, sets `NOTIFYICON_VERSION_4` once, and enables `NIF_SHOWTIP` so tooltips recover after Explorer restarts (#4653).
+
+## Fixed
+- Track `HICON` ownership so only user-created handles are destroyed, preventing Explorer recycling crashes (#4653).
+- Release the Windows system-theme listener and retained tray icons during destroy to stop leaking goroutines and device contexts (#4653).
+- Truncate tray tooltips at 127 UTF-16 units to avoid corrupting surrogate pairs and multi-byte glyphs (#4653).
+
+## v3.0.0-alpha.37 - 2025-11-02
+
+## Fixed
+- Fix Windows package task failure (#4667)
+
+## v3.0.0-alpha.36 - 2025-10-15
+
+## Fixed
+- Fix Linux appimage appicon variable in Linux taskfile [PR #4644](https://github.com/wailsapp/wails/pull/4644)
+- Fix Windows build error caused by go-webview2 v1.0.22 signature change (#4513, #4645)
+
+## v3.0.0-alpha.35 - 2025-10-14
+
+## Fixed
+- Fix Linux appimage appicon variable in Linux taskfile [PR #4644](https://github.com/wailsapp/wails/pull/4644)
+
+## v3.0.0-alpha.34 - 2025-10-06
+
+## Added
+- Added NSIS Protocol template for Windows by @Tolfx in #4510
+- Added tests for build-assets by @Tolfx in #4510
+
+## Fixed
+- Fixed linux desktop.tmpl protocol range, by removing `<.Info.Protocol>` to `<.Protocol>` by @Tolfx in #4510
+- Fixed redefinition error for liquid glass demo in [#4542](https://github.com/wailsapp/wails/pull/4542) by @Etesam913
+
+## v3.0.0-alpha.33 - 2025-10-04
+
+## Fixed
+- Fixed systray menu updates on Linux [#4604](https://github.com/wailsapp/wails/issues/4604) by [@JackDoan](https://github.com/JackDoan)
+
+## v3.0.0-alpha.32 - 2025-10-02
+
+## Fixed
+- Fix the white window appearing on Windows when creating a hidden window by @leaanthony in [#4612](https://github.com/wailsapp/wails/pull/4612)
+- Fix notifications package import path in documentation by @rxliuli in [#4617](https://github.com/wailsapp/wails/pull/4617)
+- Fix drag-and-drop not working when using npm package @wailsio/runtime (#4489) by @leaanthony in #4616
+
+## v3.0.0-alpha.31 - 2025-09-27
+
+## Fixed
+- Windows: Flicker of window at start and hidden windows being shown incorrectly in [PR](https://github.com/wailsapp/wails/pull/4600) by @leaanthony.
+- Fixed Wayland window size maximising issues (https://github.com/wailsapp/wails/issues/4429) by [@samstanier](https://github.com/samstanier)
+
+## v3.0.0-alpha.30 - 2025-09-26
+
+## Fixed
+- Fixed Wayland window size maximising issues (https://github.com/wailsapp/wails/issues/4429) by [@samstanier](https://github.com/samstanier)
+
+## v3.0.0-alpha.29 - 2025-09-25
+
+## Added
+- macOS: Shows native window controls in the menu bar in [#4588](https://github.com/wailsapp/wails/pull/4588) by @nidib
+- Add macOS Dock service to hide/show app icon in the dock @popaprozac in [PR](https://github.com/wailsapp/wails/pull/4451)
+
+## Changed
+- macOS: Use `visibleFrame` instead of `frame` for window centering to exclude menu bar and dock areas
+
+## Fixed
+- Fixed redefinition error for liquid glass demo in [#4542](https://github.com/wailsapp/wails/pull/4542) by @Etesam913
+- Fixed issue where AssetServer can crash on MacOS in [#4576](https://github.com/wailsapp/wails/pull/4576) by @jghiloni
+- Fixed compilation issue when building with NextJs. Fixed in [#4585](https://github.com/wailsapp/wails/pull/4585) by @rev42
+- Fixed pipelines for nightly release in [#4597](https://github.com/wailsapp/wails/pull/4597) by @riadafridishibly
+
+## v3.0.0-alpha.29 - 2025-09-25
+
+## Added
+- Add macOS Dock service to hide/show app icon in the dock @popaprozac in [PR](https://github.com/wailsapp/wails/pull/4451)
+
+## Changed
+- macOS: Use `visibleFrame` instead of `frame` for window centering to exclude menu bar and dock areas
+
+## Fixed
+- Fixed redefinition error for liquid glass demo in [#4542](https://github.com/wailsapp/wails/pull/4542) by @Etesam913
+- Fixed issue where AssetServer can crash on MacOS in [#4576](https://github.com/wailsapp/wails/pull/4576) by @jghiloni
+- Fixed compilation issue when building with NextJs. Fixed in [#4585](https://github.com/wailsapp/wails/pull/4585) by @rev42
+- Fixed pipelines for nightly release in [#4597](https://github.com/wailsapp/wails/pull/4597) by @riadafridishibly
+
+## v3.0.0-alpha.27 - 2025-09-07
+
+## Fixed
+- Fixed redefinition error for liquid glass demo in [#4542](https://github.com/wailsapp/wails/pull/4542) by @Etesam913
+
+
+## v3.0.0-alpha.26 - 2025-08-24
+
+## Added
+- Add native Liquid Glass effect support for macOS with NSGlassEffectView (macOS 15.0+) and NSVisualEffectView fallback, including comprehensive material customization options by @leaanthony in [#4534](https://github.com/wailsapp/wails/pull/4534)
+
+## v3.0.0-alpha.25 - 2025-08-16
+
+## Changed
+- When running `wails3 update build-assets` with the `-config` parameter, values set via the `-product*` parameters are
+ no longer ignored, and override the config value.
+
+## v3.0.0-alpha.24 - 2025-08-13
+
+## Added
+- Browser URL Sanitisation by @leaanthony in [#4500](https://github.dev/wailsapp/wails/pull/4500). Based on [#4484](https://github.com/wailsapp/wails/pull/4484) by @APShenkin.
+
+## v3.0.0-alpha.23 - 2025-08-11
+
+## Fixed
+- Fix SetBackgroundColour on Windows by @PPTGamer in [PR](https://github.com/wailsapp/wails/pull/4492)
+
+## v3.0.0-alpha.22 - 2025-08-10
+
+## Added
+- Add Content Protection on Windows/Mac by [@leaanthony](https://github.com/leaanthony) based on the original work of [@Taiterbase](https://github.com/Taiterbase) in this [PR](https://github.com/wailsapp/wails/pull/4241)
+- Add support for passing CLI variables to Task commands through `wails3 build` and `wails3 package` aliases (#4422) by @leaanthony in [PR](https://github.com/wailsapp/wails/pull/4488)
+
+## Changed
+- `window.NativeWindowHandle()` -> `window.NativeWindow()` by @leaanthony in [#4471](https://github.com/wailsapp/wails/pull/4471)
+- Refactor internal window handling by @leaanthony in [#4471](https://github.com/wailsapp/wails/pull/4471)
++ Fix extra-broad Linux package dependencies, fix outdated RPM dependencies.
+
+## v3.0.0-alpha.21 - 2025-08-07
+
+## Fixed
+- Update docs to reflect changes from Manager API Refactoring by @yulesxoxo in [PR #4476](https://github.com/wailsapp/wails/pull/4476)
+- Fix Linux .desktop file appicon variable in Linux taskfile [PR #4477](https://github.com/wailsapp/wails/pull/4477)
+
+## v3.0.0-alpha.20 - 2025-08-06
+
+## Fixed
+- Update docs to reflect changes from Manager API Refactoring by @yulesxoxo in [PR #4476](https://github.com/wailsapp/wails/pull/4476)
+
+## v3.0.0-alpha.19 - 2025-08-05
+
+## Added
+- Support for dropzones with event sourcing dropped element data [@atterpac](https://github.com/atterpac) in [#4318](https://github.com/wailsapp/wails/pull/4318)
+- Added `AdditionalLaunchArgs` to `WindowsWindow` options to allow for additional command line arguments to be passed to the WebView2 browser. in [PR](https://github.com/wailsapp/wails/pull/4467)
+- Added Run go mod tidy automatically after wails init [@triadmoko](https://github.com/triadmoko) in [PR](https://github.com/wailsapp/wails/pull/4286)
+- Windows Snapassist feature by @leaanthony in [PR](https://github.dev/wailsapp/wails/pull/4463)
+
+## Fixed
+- Fix Windows nil pointer dereference bug reported in [#4456](https://github.com/wailsapp/wails/issues/4456) by @leaanthony in [#4460](https://github.com/wailsapp/wails/pull/4460)
+- Add support for `allowsBackForwardNavigationGestures` in macOS WKWebView to enable two-finger swipe navigation gestures (#1857)
+- Fixes issue where onClick didn't work for menu items initially set as disabled by @leaanthony in [PR #4469](https://github.com/wailsapp/wails/pull/4469). Thanks to @IanVS for the initial investigation.
+- Fix Vite server not being cleaned up when build fails (#4403)
+- Fixed panic when closing or cancelling a `SaveFileDialog` on windows. Fixed in [PR](https://github.com/wailsapp/wails/pull/4284) by @hkhere
+- Fixed HTML level drag and drop on Windows by [@mbaklor](https://github.com/mbaklor) in [#4259](https://github.com/wailsapp/wails/pull/4259)
+
+## v3.0.0-alpha.18 - 2025-08-03
+
+## Added
+- Added `AdditionalLaunchArgs` to `WindowsWindow` options to allow for additional command line arguments to be passed to the WebView2 browser. in [PR](https://github.com/wailsapp/wails/pull/4467)
+- Added Run go mod tidy automatically after wails init [@triadmoko](https://github.com/triadmoko) in [PR](https://github.com/wailsapp/wails/pull/4286)
+- Windows Snapassist feature by @leaanthony in [PR](https://github.dev/wailsapp/wails/pull/4463)
+
+## Fixed
+- Add support for `allowsBackForwardNavigationGestures` in macOS WKWebView to enable two-finger swipe navigation gestures (#1857)
+- Fixes issue where onClick didn't work for menu items initially set as disabled by @leaanthony in [PR #4469](https://github.com/wailsapp/wails/pull/4469). Thanks to @IanVS for the initial investigation.
+- Fix Vite server not being cleaned up when build fails (#4403)
+
+## v3.0.0-alpha.17 - 2025-07-31
+
+## Fixed
+- Fixed notification parsing on Windows @popaprozac in [PR](https://github.com/wailsapp/wails/pull/4450)
+
+## v3.0.0-alpha.16 - 2025-07-25
+
+## Added
+- Add Windows `getAccentColor` implementation by [@almas-x](https://github.com/almas-x) in [PR](https://github.com/wailsapp/wails/pull/4427)
+
+## v3.0.0-alpha.15 - 2025-07-25
+
+## Added
+- Add Windows `getAccentColor` implementation by [@almas-x](https://github.com/almas-x) in [PR](https://github.com/wailsapp/wails/pull/4427)
+
+## v3.0.0-alpha.14 - 2025-07-25
+
+## Added
+- Windows dark theme menus + menubar. By @leaanthony in [a29b4f0861b1d0a700e9eb213c6f1076ec40efd5](https://github.com/wailsapp/wails/commit/a29b4f0861b1d0a700e9eb213c6f1076ec40efd5)
+- Rename built-in services for clearer JS/TS bindings by @popaprozac in [PR](https://github.com/wailsapp/wails/pull/4405)
+
+## v3.0.0-alpha.12 - 2025-07-15
+
+### Added
+- `app.Env.GetAccentColor` to get the accent color of a user's system. Works on MacOS. by [@etesam913](https://github.com/etesam913)
+- Add `window.ToggleFrameless()` api by [@atterpac](https://github.com/atterpac) in [#4137](https://github.com/wailsapp/wails/pull/4137)
+
+### Fixed
+- Fixed doctor command to check for Windows SDK dependencies by [@kodumulo](https://github.com/kodumulo) in [#4390](https://github.com/wailsapp/wails/issues/4390)
+
+
+## v3.0.0-alpha.11 - 2025-07-12
+
+## Added
+- Add distribution-specific build dependencies for Linux by @leaanthony in [PR](https://github.com/wailsapp/wails/pull/4345)
+- Added bindings guide by @atterpac in [PR](https://github.com/wailsapp/wails/pull/4404)
+
+## v3.0.0-alpha.10 - 2025-07-06
+
+### Breaking Changes
+- **Manager API Refactoring**: Reorganized application API from flat structure to organized managers for better code organization and discoverability by [@leaanthony](https://github.com/leaanthony) in [#4359](https://github.com/wailsapp/wails/pull/4359)
+ - `app.NewWebviewWindow()` → `app.Window.New()`
+ - `app.CurrentWindow()` → `app.Window.Current()`
+ - `app.GetAllWindows()` → `app.Window.GetAll()`
+ - `app.WindowByName()` → `app.Window.GetByName()`
+ - `app.EmitEvent()` → `app.Event.Emit()`
+ - `app.OnApplicationEvent()` → `app.Event.OnApplicationEvent()`
+ - `app.OnWindowEvent()` → `app.Event.OnWindowEvent()`
+ - `app.SetApplicationMenu()` → `app.Menu.SetApplicationMenu()`
+ - `app.OpenFileDialog()` → `app.Dialog.OpenFile()`
+ - `app.SaveFileDialog()` → `app.Dialog.SaveFile()`
+ - `app.MessageDialog()` → `app.Dialog.Message()`
+ - `app.InfoDialog()` → `app.Dialog.Info()`
+ - `app.WarningDialog()` → `app.Dialog.Warning()`
+ - `app.ErrorDialog()` → `app.Dialog.Error()`
+ - `app.QuestionDialog()` → `app.Dialog.Question()`
+ - `app.NewSystemTray()` → `app.SystemTray.New()`
+ - `app.GetSystemTray()` → `app.SystemTray.Get()`
+ - `app.ShowContextMenu()` → `app.ContextMenu.Show()`
+ - `app.RegisterKeybinding()` → `app.KeyBinding.Register()`
+ - `app.UnregisterKeybinding()` → `app.KeyBinding.Unregister()`
+ - `app.GetPrimaryScreen()` → `app.Screen.GetPrimary()`
+ - `app.GetAllScreens()` → `app.Screen.GetAll()`
+ - `app.BrowserOpenURL()` → `app.Browser.OpenURL()`
+ - `app.Environment()` → `app.Env.GetAll()`
+ - `app.ClipboardGetText()` → `app.Clipboard.Text()`
+ - `app.ClipboardSetText()` → `app.Clipboard.SetText()`
+- Renamed Service methods: `Name` -> `ServiceName`, `OnStartup` -> `ServiceStartup`, `OnShutdown` -> `ServiceShutdown` by [@leaanthony](https://github.com/leaanthony)
+- Moved `Path` and `Paths` methods to `application` package by [@leaanthony](https://github.com/leaanthony)
+- The application menu is now macOS only by [@leaanthony](https://github.com/leaanthony)
+
+### Added
+
+- **Organized Testing Infrastructure**: Moved Docker test files to dedicated `test/docker/` directory with optimized images and enhanced build reliability by [@leaanthony](https://github.com/leaanthony) in [#4359](https://github.com/wailsapp/wails/pull/4359)
+- **Improved Resource Management Patterns**: Added proper event handler cleanup and context-aware goroutine management in examples by [@leaanthony](https://github.com/leaanthony) in [#4359](https://github.com/wailsapp/wails/pull/4359)
+- Support aarch64 AppImage builds by [@AkshayKalose](https://github.com/AkshayKalose) in [#3981](https://github.com/wailsapp/wails/pull/3981)
+- Add diagnostics section to `wails doctor` by [@leaanthony](https://github.com/leaanthony)
+- Add window to context when calling a service method by [@leaanthony](https://github.com/leaanthony)
+- Add `window-call` example to demonstrate how to know which window is calling a service by [@leaanthony](https://github.com/leaanthony)
+- New Menu guide by [@leaanthony](https://github.com/leaanthony)
+- Better panic handling by [@leaanthony](https://github.com/leaanthony)
+- New Menu guide by [@leaanthony](https://github.com/leaanthony)
+- Add doc comments for Service API by [@fbbdev](https://github.com/fbbdev) in [#4024](https://github.com/wailsapp/wails/pull/4024)
+- Add function `application.NewServiceWithOptions` to initialise services with additional configuration by [@leaanthony](https://github.com/leaanthony) in [#4024](https://github.com/wailsapp/wails/pull/4024)
+- Improved menu control by [@FalcoG](https://github.com/FalcoG) and [@leaanthony](https://github.com/leaanthony) in [#4031](https://github.com/wailsapp/wails/pull/4031)
+- More documentation by [@leaanthony](https://github.com/leaanthony)
+- Support cancellation of events in standard event listeners by [@leaanthony](https://github.com/leaanthony)
+- Systray `Hide`, `Show` and `Destroy` support by [@leaanthony](https://github.com/leaanthony)
+- Systray `SetTooltip` support by [@leaanthony](https://github.com/leaanthony). Original idea by [@lujihong](https://github.com/wailsapp/wails/issues/3487#issuecomment-2633242304)
+- Report package path in binding generator warnings about unsupported types by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Add binding generator support for generic aliases by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Add binding generator support for `omitzero` JSON flag by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Add `//wails:ignore` directive to prevent binding generation for chosen service methods by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Add `//wails:internal` directive on services and models to allow for types that are exported in Go but not in JS/TS by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Add binding generator support for constants of alias type to allow for weakly typed enums by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Add binding generator tests for Go 1.24 features by [@fbbdev](https://github.com/fbbdev) in [#4068](https://github.com/wailsapp/wails/pull/4068)
+- Add support for macOS 15 "Sequoia" to `OSInfo.Branding` for improved OS version detection in [#4065](https://github.com/wailsapp/wails/pull/4065)
+- Add `PostShutdown` hook for running custom code after the shutdown process completes by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Add `FatalError` struct to support detection of fatal errors in custom error handlers by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Standardise and document service startup and shutdown order by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Add test harness for application startup/shutdown sequence and service startup/shutdown tests by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Add `RegisterService` method for registering services after the application has been created by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Add `MarshalError` field in application and service options for custom error handling in binding calls by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Add cancellable promise wrapper that propagates cancellation requests through promise chains by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100)
+- Add the ability to tie binding call cancellation to an `AbortSignal` by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100)
+- Support `data-wml-*` attributes for WML alongside the usual `wml-*` attributes by [@leaanthony](https://github.com/leaanthony)
+- Add `Configure` method on all services for late configuration/dynamic reconfiguration by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- `fileserver` service sends a 503 Service Unavailable response when unconfigured by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- `kvstore` service provides an in-memory key-value store by default when unconfigured by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Add `Load` method on `kvstore` service to reload data from file after config changes by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Add `Clear` method on `kvstore` service to delete all keys by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Add type `Level` in `log` service to provide JS-side log-level constants by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Add `Log` method on `log` service to specify log-level dynamically by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- `sqlite` service provides an in-memory DB by default when unconfigured by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Add method `Close` on `sqlite` service to close the DB manually by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Add cancellation support for query methods on `sqlite` service by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Add prepared statement support to `sqlite` service with JS bindings by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Gin support by [Lea Anthony](https://github.com/leaanthony) in [PR](https://github.com/wailsapp/wails/pull/3537) based on the original work of [@AnalogJ](https://github.com/AnalogJ) in this [PR](https://github.com/wailsapp/wails/pull/3537)
+- Fix auto save and password auto save always enabled by [@oSethoum](https://github.com/osethoum) in [#4134](https://github.com/wailsapp/wails/pull/4134)
+- Add `SetMenu()` on window to allow for setting a menu on a window by [@leaanthony](https://github.com/leaanthony)
+- Add Notification support by [@popaprozac](https://github.com/popaprozac) in [#4098](https://github.com/wailsapp/wails/pull/4098)
+- Add File Association support for mac by [@wimaha](https://github.com/wimaha) in [#4177](https://github.com/wailsapp/wails/pull/4177)
+- Add `wails3 tool version` for semantic version bumping by [@leaanthony](https://github.com/leaanthony)
+- Add badging support for macOS and Windows by [@popaprozac](https://github.com/popaprozac) in [#](https://github.com/wailsapp/wails/pull/4234)
+- Add support for registered/strictly-typed events by [@fbbdev](https://github.com/fbbdev) and [@IanVS](https://github.com/IanVS) in [#4161](https://github.com/wailsapp/wails/pull/4161)
+- Add the ability to register hooks for custom events by [@fbbdev](https://github.com/fbbdev) and [@IanVS](https://github.com/IanVS) in [#4161](https://github.com/wailsapp/wails/pull/4161)
+
+### Fixed
+
+- Fixed nil pointer dereference in processURLRequest for Mac by [@etesam913](https://github.com/etesam913) in [#4366](https://github.com/wailsapp/wails/pull/4366)
+- Fixed a linux bug preventing filtered dialogs by [@bh90210](https://github.com/bh90210) in [#4287](https://github.com/wailsapp/wails/pull/4287)
+- Fixed Windows+Linux Edit Menu issues by [@leaanthony](https://github.com/leaanthony) in [#3f78a3a](https://github.com/wailsapp/wails/commit/3f78a3a8ce7837e8b32242c8edbbed431c68c062)
+- Updated the minimum system version in macOS .plist files from 10.13.0 to 10.15.0 by [@AkshayKalose](https://github.com/AkshayKalose) in [#3981](https://github.com/wailsapp/wails/pull/3981)
+- Window ID skip issue by [@leaanthony](https://github.com/leaanthony)
+- Fix nil menu issue when calling RegisterContextMenu by [@leaanthony](https://github.com/leaanthony)
+- Fixed dependency cycles in binding generator output by [@fbbdev](https://github.com/fbbdev) in [#4001](https://github.com/wailsapp/wails/pull/4001)
+- Fixed use-before-define errors in binding generator output by [@fbbdev](https://github.com/fbbdev) in [#4001](https://github.com/wailsapp/wails/pull/4001)
+- Pass build flags to binding generator by [@fbbdev](https://github.com/fbbdev) in [#4023](https://github.com/wailsapp/wails/pull/4023)
+- Change paths in windows Taskfile to forward slashes to ensure it works on non-Windows platforms by [@leaanthony](https://github.com/leaanthony)
+- Mac + Mac JS events now fixed by [@leaanthony](https://github.com/leaanthony)
+- Fixed event deadlock for macOS by [@leaanthony](https://github.com/leaanthony)
+- Fixed a `Parameter incorrect` error in Window initialisation on Windows when HTML provided but no JS by [@leaanthony](https://github.com/leaanthony)
+- Fixed size of response prefix used for content type sniffing in asset server by [@fbbdev](https://github.com/fbbdev) in [#4049](https://github.com/wailsapp/wails/pull/4049)
+- Fixed handling of non-404 responses on root index path in asset server by [@fbbdev](https://github.com/fbbdev) in [#4049](https://github.com/wailsapp/wails/pull/4049)
+- Fixed undefined behaviour in binding generator when testing properties of generic types by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Fixed binding generator output for models when underlying type has not the same properties as named wrapper by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Fixed binding generator output for map key types and preprocessing by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Fixed binding generator output for structs that implement marshaler interfaces by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Fixed detection of type cycles involving generic types in binding generator by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Fixed invalid references to unexported models in binding generator output by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Moved injected code to the end of service files by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Fixed handling of errors from file close operations in binding generator by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Suppressed warnings for services that define lifecycle or http methods but no other bound methods by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Fixed non-React templates failing to display Hello World footer when using light system colour scheme by [@marcus-crane](https://github.com/marcus-crane) in [#4056](https://github.com/wailsapp/wails/pull/4056)
+- Fixed hidden menu items on macOS by [@leaanthony](https://github.com/leaanthony)
+- Fixed handling and formatting of errors in message processors by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Fixed skipped service shutdown when quitting application by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Ensure menu updates occur on the main thread by [@leaanthony](https://github.com/leaanthony)
+- The dragging and resizing mechanism is now more robust and matches expected platform behaviour more closely by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100)
+- Fixed [#4097](https://github.com/wailsapp/wails/issues/4097) Webpack/angular discards runtime init code by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100)
+- Fixed initially-hidden menu items by [@IanVS](https://github.com/IanVS) in [#4116](https://github.com/wailsapp/wails/pull/4116)
+- Fixed assetFileServer not serving `.html` files when non-extension request when `[request]` doesn't exist but `[request].html` does
+- Fixed icon generation paths by [@robin-samuel](https://github.com/robin-samuel) in [#4125](https://github.com/wailsapp/wails/pull/4125)
+- Fixed `fullscreen`, `unfullscreen`, `unminimise` and `unmaximise` events not being emitted by [@oSethoum](https://github.com/osethoum) in [#4130](https://github.com/wailsapp/wails/pull/4130)
+- Fixed NSIS Error because of incorrect prefix on default version in config by [@robin-samuel](https://github.com/robin-samuel) in [#4126](https://github.com/wailsapp/wails/pull/4126)
+- Fixed Dialogs runtime function returning escaped paths on Windows by [TheGB0077](https://github.com/TheGB0077) in [#4188](https://github.com/wailsapp/wails/pull/4188)
+- Fixed Webview2 detection path in HKCU by [@leaanthony](https://github.com/leaanthony).
+- Fixed input issue with macOS by [@leaanthony](https://github.com/leaanthony).
+- Fixed Windows icon generation task file name by [@yulesxoxo](https://github.com/yulesxoxo) in [#4219](https://github.com/wailsapp/wails/pull/4219).
+- Fixed transparency issue for frameless windows by [@leaanthony](https://github.com/leaanthony) based on work by @kron.
+- Fixed focus calls when window is disabled or minimised by [@leaanthony](https://github.com/leaanthony) based on work by @kron.
+- Fixed system trays not showing after taskbar restarts by [@leaanthony](https://github.com/leaanthony) based on work by @kron.
+- Fixed fallbackResponseWriter not implementing Flush() in [#4245](https://github.com/wailsapp/wails/pull/4245)
+- Fixed fallbackResponseWriter not implementing Flush() by [@superDingda] in [#4236](https://github.com/wailsapp/wails/issues/4236)
+- Fixed macOS window close with pending async Go-bound function call crashes by [@joshhardy](https://github.com/joshhardy) in [#4354](https://github.com/wailsapp/wails/pull/4354)
+- Fixed Windows Efficiency mode startup race condition by [@leaanthony](https://github.com/leaanthony)
+- Fixed Windows icon handle cleanup by [@leaanthony](https://github.com/leaanthony).
+- Fixed `OpenFileManager` on Windows by [@PPTGamer](https://github.com/PPTGamer) in [#4375](https://github.com/wailsapp/wails/pull/4375).
+
+### Changed
+
+- Removed `application.WindowIDKey` and `application.WindowNameKey` (replaced by `application.WindowKey`) by [@leaanthony](https://github.com/leaanthony)
+- ContextMenuData now returns a string instead of any by [@leaanthony](https://github.com/leaanthony)
+- In JS/TS bindings, class fields of fixed-length array types are now initialized with their expected length instead of being empty by [@fbbdev](https://github.com/fbbdev) in [#4001](https://github.com/wailsapp/wails/pull/4001)
+- ContextMenuData now returns a string instead of any by [@leaanthony](https://github.com/leaanthony)
+- `application.NewService` does not accept options as an optional parameter anymore (use `application.NewServiceWithOptions` instead) by [@leaanthony](https://github.com/leaanthony) in [#4024](https://github.com/wailsapp/wails/pull/4024)
+- Removed `nanoid` dependency by [@leaanthony](https://github.com/leaanthony)
+- Updated Window example for mica/acrylic/tabbed window styles by [@leaanthony](https://github.com/leaanthony)
+- In JS/TS bindings, `internal.js/ts` model files have been removed; all models can now be found in `models.js/ts` by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- In JS/TS bindings, named types are never rendered as aliases for other named types; the old behaviour is now restricted to aliases by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- In JS/TS bindings, in class mode, struct fields whose type is a type parameter are marked optional and never initialised automatically by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045)
+- Remove ESLint from templates by by [@IanVS](https://github.com/IanVS) in [#4059](https://github.com/wailsapp/wails/pull/4059)
+- Update copyright date to 2025 by [@IanVS](https://github.com/IanVS) in [#4037](https://github.com/wailsapp/wails/pull/4037)
+- Add docs for event.Sender by [@IanVS](https://github.com/IanVS) in [#4075](https://github.com/wailsapp/wails/pull/4075)
+- Go 1.24 support by [@leaanthony](https://github.com/leaanthony)
+- `ServiceStartup` hooks are now invoked when `App.Run` is called, not in `application.New` by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- `ServiceStartup` errors are now returned from `App.Run` instead of terminating the process by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Binding and dialog calls from JS now reject with error objects instead of strings by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066)
+- Improved systray menu positioning on Windows by [@leaanthony](https://github.com/leaanthony)
+- The JS runtime has been ported to TypeScript by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100)
+- The runtime initialises as soon as it is imported, no need to wait for the window to load by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100)
+- The runtime does not export an init method anymore. A side effects import can be used to initialise it by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100)
+- Bound methods now return a `CancellablePromise` that rejects with a `CancelError` if cancelled. The actual result of the call is discarded by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100)
+- Built-in service types are now consistently called `Service` by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Built-in service creation functions with options are now consistently called `NewWithConfig` by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- `Select` method on `sqlite` service is now named `Query` for consistency with Go APIs by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067)
+- Templates: moved runtime to "dependencies", organized package.json files by [@IanVS](https://github.com/IanVS) in [#4133](https://github.com/wailsapp/wails/pull/4133)
+- Creates and ad-hoc signs app bundles in dev to enable certain macOS APIs by [@popaprozac](https://github.com/popaprozac) in [#4171](https://github.com/wailsapp/wails/pull/4171)
+
+## v3.0.0-alpha.9 - 2025-01-13
+
+### Added
+
+- `app.OpenFileManager(path string, selectFile bool)` to open the system file manager to the path `path` with optional highlighting via `selectFile` by [@Krzysztofz01](https://github.com/Krzysztofz01) [@rcalixte](https://github.com/rcalixte)
+- New `-git` flag for `wails3 init` command by [@leaanthony](https://github.com/leaanthony)
+- New `wails3 generate webview2bootstrapper` command by [@leaanthony](https://github.com/leaanthony)
+- Added `init()` method in runtime to allow manual initialisation of the runtime by [@leaanthony](https://github.com/leaanthony)
+- Added `WindowDidMoveDebounceMS` option to Window's WindowOptions by [@leaanthony](https://github.com/leaanthony)
+- Added Single Instance feature by [@leaanthony](https://github.com/leaanthony). Based on the [v2 PR](https://github.com/wailsapp/wails/pull/2951) by @APshenkin.
+- `wails3 generate template` command by [@leaanthony](https://github.com/leaanthony)
+- `wails3 releasenotes` command by [@leaanthony](https://github.com/leaanthony)
+- `wails3 update cli` command by [@leaanthony](https://github.com/leaanthony)
+- `-clean` option for `wails3 generate bindings` command by [@leaanthony](https://github.com/leaanthony)
+- Allow for aarch64 (arm64) AppImage Linux builds by [@AkshayKalose](https://github.com/AkshayKalose) in [#3981](https://github.com/wailsapp/wails/pull/3981)
+
+### Fixed
+
+- Fixed min/max width options for linux by @atterpac in [#3979](https://github.com/wailsapp/wails/pull/3979)
+- Typescript templates types definitions via npm version bump by @atterpac in [#3966](https://github.com/wailsapp/wails/pull/3966)
+- Fix Sveltekit template CSS referance by @atterpac in [#3945](https://github.com/wailsapp/wails/pull/3945)
+- Ensure key callbacks in window run() are called on the main thread by [@leaanthony](https://github.com/leaanthony)
+- Fix dialog directory chooser examples by [@leaanthony](https://github.com/leaanthony)
+- Created new Chinese error page when index.html is missing by [@leaanthony](https://github.com/leaanthony)
+- Ensure `windowDidBecomeKey` callback is running on main thread by [@leaanthony](https://github.com/leaanthony)
+- Support fullscreen for frameless windows by [@leaanthony](https://github.com/leaanthony)
+- Improved window destroying logic by [@leaanthony](https://github.com/leaanthony)
+- Fix window position logic when attached to system trays by [@leaanthony](https://github.com/leaanthony)
+- Support fullscreen for frameless windows by [@leaanthony](https://github.com/leaanthony)
+- Fix event handling by [@leaanthony](https://github.com/leaanthony)
+- Fixed window shutdown logic by [@leaanthony](https://github.com/leaanthony)
+- Common taskfile now defaults to generating Typescript bindings for Typescript templates by [@leaanthony](https://github.com/leaanthony)
+- Fix Close application on WM_CLOSE message when no windows are open/systray only by [@mmalcek](https://github.com/mmalcek) in [#3990](https://github.com/wailsapp/wails/pull/3990)
+- Fixed garble build by @5aaee9 in [#3192](https://github.com/wailsapp/wails/pull/3192)
+- Fixed windows nsis builds by [@leaanthony](https://github.com/leaanthony)
+
+### Changed
+
+- Moved build assets to platform specific directories by [@leaanthony](https://github.com/leaanthony)
+- Moved and renamed Taskfiles to platform specific directories by [@leaanthony](https://github.com/leaanthony)
+- Created a much better experience when `index.html` is missing by [@leaanthony](https://github.com/leaanthony)
+- [Windows] Improved performance of minimise and restore by [@leaanthony](https://github.com/leaanthony). Based on original [PR](https://github.com/wailsapp/wails/pull/3955) by [562589540](https://github.com/562589540)
+- Removed `ShouldClose` option (Register a hook for events.Common.WindowClosing instead) by [@leaanthony](https://github.com/leaanthony)
+- [Windows] Reduced flicker when opening a window by [@leaanthony](https://github.com/leaanthony)
+- Removed `Window.Destroy` as this was intended to be an internal function by [@leaanthony](https://github.com/leaanthony)
+- Renamed `WindowClose` events to `WindowClosing` by [@leaanthony](https://github.com/leaanthony)
+- Frontend builds now use vite environment "development" or "production" depending on build type by [@leaanthony](https://github.com/leaanthony)
+- Update to go-webview2 v1.19 by [@leaanthony](https://github.com/leaanthony)
+
+## v3.0.0-alpha.8.3 - 2024-12-07
+
+### Changed
+
+- Ensure fork of taskfile is used by @leaanthony
+
+## v3.0.0-alpha.8.2 - 2024-12-07
+
+### Changed
+
+- Update fork of Taskfile to fix version issues when installing using
+ `go install` by @leaanthony
+
+## v3.0.0-alpha.8.1 - 2024-12-07
+
+### Changed
+
+- Using fork of Taskfile to fix version issues when installing using
+ `go install` by @leaanthony
+
+## v3.0.0-alpha.8 - 2024-12-06
+
+### Added
+
+- Added hyperlink for sponsor by @ansxuman in [#3958](https://github.com/wailsapp/wails/pull/3958)
+- Support of linux packaging of deb,rpm, and arch linux packager builds by
+ @atterpac in [#3909](https://github.com/wailsapp/wails/3909)
+- Added Support for darwin universal builds and packages by
+ [ansxuman](https://github.com/ansxuman) in
+ [#3902](https://github.com/wailsapp/wails/pull/3902)
+- Events documentation to the website by
+ [atterpac](https://github.com/atterpac) in
+ [#3867](https://github.com/wailsapp/wails/pull/3867)
+- Templates for sveltekit and sveltekit-ts that are set for non-SSR development
+ by [atterpac](https://github.com/atterpac) in
+ [#3829](https://github.com/wailsapp/wails/pull/3829)
+- Update build assets using new `wails3 update build-assets` command by
+ [leaanthony](https://github.com/leaanthony)
+- Example to test the HTML Drag and Drop API by
+ [FerroO2000](https://github.com/FerroO2000) in
+ [#3856](https://github.com/wailsapp/wails/pull/3856)
+- File Association support by [leaanthony](https://github.com/leaanthony) in
+ [#3873](https://github.com/wailsapp/wails/pull/3873)
+- New `wails3 generate runtime` command by
+ [leaanthony](https://github.com/leaanthony)
+- New `InitialPosition` option to specify if the window should be centered or
+ positioned at the given X/Y location by
+ [leaanthony](https://github.com/leaanthony) in
+ [#3885](https://github.com/wailsapp/wails/pull/3885)
+- Add `Path` & `Paths` methods to `application` package by
+ [ansxuman](https://github.com/ansxuman) and
+ [leaanthony](https://github.com/leaanthony) in
+ [#3823](https://github.com/wailsapp/wails/pull/3823)
+- Added `GeneralAutofillEnabled` and `PasswordAutosaveEnabled` Windows options
+ by [leaanthony](https://github.com/leaanthony) in
+ [#3766](https://github.com/wailsapp/wails/pull/3766)
+- Added the ability to retrieve the window calling a service method by
+ [leaanthony](https://github.com/leaanthony) in
+ [#3888](https://github.com/wailsapp/wails/pull/3888)
+- Added `EnabledFeatures` and `DisabledFeatures` options for Webview2 by
+ [leaanthony](https://github.com/leaanthony).
+-
+
+### Changed
+
+- `service.OnStartup` now shutdowns the application on error and runs
+ `service.OnShutdown`for any prior services that started by @atterpac in
+ [#3920](https://github.com/wailsapp/wails/pull/3920)
+- Refactored systray click messaging to better align with user interactions by
+ @atterpac in [#3907](https://github.com/wailsapp/wails/pull/3907)
+- Asset embed to include `all:frontend/dist` to support frameworks that generate
+ subfolders by @atterpac in
+ [#3887](https://github.com/wailsapp/wails/pull/3887)
+- Taskfile refactor by [leaanthony](https://github.com/leaanthony) in
+ [#3748](https://github.com/wailsapp/wails/pull/3748)
+- Upgrade to `go-webview2` v1.0.16 by
+ [leaanthony](https://github.com/leaanthony)
+- Fixed `Screen` type to include `ID` not `Id` by
+ [etesam913](https://github.com/etesam913) in
+ [#3778](https://github.com/wailsapp/wails/pull/3778)
+- Update `go.mod.tmpl` wails version to support `application.ServiceOptions` by
+ [northes](https://github.com/northes) in
+ [#3836](https://github.com/wailsapp/wails/pull/3836)
+- Fixed service name determination by [windom](https://github.com/windom/) in
+ [#3827](https://github.com/wailsapp/wails/pull/3827)
+- mkdocs serve now uses docker by [leaanthony](https://github.com/leaanthony)
+- Consolidated dev config into `config.yml` by
+ [leaanthony](https://github.com/leaanthony)
+- Systray dialog now defaults to the application icon if available (Windows) by
+ [@leaanthony](https://github.com/leaanthony)
+- Better reporting of GPU + Memory for macOS by
+ [@leaanthony](https://github.com/leaanthony)
+- Removed `WebviewGpuIsDisabled` and `EnableFraudulentWebsiteWarnings`
+ (superseded by `EnabledFeatures` and `DisabledFeatures` options) by
+ [leaanthony](https://github.com/leaanthony)
+
+### Fixed
+
+- Fixed deadlock in Linux dialog for multiple selections caused by unclosed
+ channel variable by @michael-freling in
+ [#3925](https://github.com/wailsapp/wails/pull/3925)
+- Fixed cross-platform cleanup for .syso files during Windows build by
+ [ansxuman](https://github.com/ansxuman) in
+ [#3924](https://github.com/wailsapp/wails/pull/3924)
+- Fixed amd64 appimage compile by @atterpac in
+ [#3898](https://github.com/wailsapp/wails/pull/3898)
+- Fixed build assets update by @ansxuman in
+ [#3901](https://github.com/wailsapp/wails/pull/3901)
+- Fixed Linux systray `OnClick` and `OnRightClick` implementation by @atterpac
+ in [#3886](https://github.com/wailsapp/wails/pull/3886)
+- Fixed `AlwaysOnTop` not working on Mac by
+ [leaanthony](https://github.com/leaanthony) in
+ [#3841](https://github.com/wailsapp/wails/pull/3841)
+- Fixed `application.NewEditMenu` including a duplicate
+ `PasteAndMatchStyle` role in the edit menu on Darwin by
+ [johnmccabe](https://github.com/johnmccabe) in
+ [#3839](https://github.com/wailsapp/wails/pull/3839)
+- 🐧 Fixed aarch64 compilation
+ [#3840](https://github.com/wailsapp/wails/issues/3840) in
+ [#3854](https://github.com/wailsapp/wails/pull/3854) by
+ [kodflow](https://github.com/kodflow)
+- ⊞ Fixed radio group menu items by
+ [@leaanthony](https://github.com/leaanthony)
+- Fix error on building runnable .app on MacOS when 'name' and 'outputfilename'
+ are different. by @nickisworking in
+ [#3789](https://github.com/wailsapp/wails/pull/3789)
+
+## v3.0.0-alpha.7 - 2024-09-18
+
+### Added
+
+- ⊞ New DIP system for Enhanced High DPI Monitor Support by
+ [mmghv](https://github.com/mmghv) in
+ [#3665](https://github.com/wailsapp/wails/pull/3665)
+- ⊞ Window class name option by [windom](https://github.com/windom/) in
+ [#3682](https://github.com/wailsapp/wails/pull/3682)
+- Services have been expanded to provide plugin functionality. By
+ [atterpac](https://github.com/atterpac) and
+ [leaanthony](https://github.com/leaanthony) in
+ [#3570](https://github.com/wailsapp/wails/pull/3570)
+
+### Changed
+
+- Events API change: `On`/`Emit` -> user events, `OnApplicationEvent` ->
+ Application Events `OnWindowEvent` -> Window Events, by
+ [leaanthony](https://github.com/leaanthony)
+- Fix for Events API on Linux by [TheGB0077](https://github.com/TheGB0077) in
+ [#3734](https://github.com/wailsapp/wails/pull/3734)
+- [CI] improvements to actions & enable to run actions also in forks and
+ branches prefixed with `v3/` or `v3-` by
+ [stendler](https://github.com/stendler) in
+ [#3747](https://github.com/wailsapp/wails/pull/3747)
+
+### Fixed
+
+- Fixed bug with usage of customEventProcessor in drag-n-drop example by
+ [etesam913](https://github.com/etesam913) in
+ [#3742](https://github.com/wailsapp/wails/pull/3742)
+- 🐧 Fixed linux compile error introduced by IgnoreMouseEvents addition by
+ [atterpac](https://github.com/atterpac) in
+ [#3721](https://github.com/wailsapp/wails/pull/3721)
+- ⊞ Fixed syso icon file generation bug by
+ [atterpac](https://github.com/atterpac) in
+ [#3675](https://github.com/wailsapp/wails/pull/3675)
+- 🐧 Fix to run natively in wayland incorporated from
+ [#1811](https://github.com/wailsapp/wails/pull/1811) in
+ [#3614](https://github.com/wailsapp/wails/pull/3614) by
+ [@stendler](https://github.com/stendler)
+- Do not bind internal service methods in
+ [#3720](https://github.com/wailsapp/wails/pull/3720) by
+ [leaanthony](https://github.com/leaanthony)
+- ⊞ Fixed system tray startup panic in
+ [#3693](https://github.com/wailsapp/wails/issues/3693) by
+ [@DeltaLaboratory](https://github.com/DeltaLaboratory)
+- Do not bind internal service methods in
+ [#3720](https://github.com/wailsapp/wails/pull/3720) by
+ [leaanthony](https://github.com/leaanthony)
+- ⊞ Fixed system tray startup panic in
+ [#3693](https://github.com/wailsapp/wails/issues/3693) by
+ [@DeltaLaboratory](https://github.com/DeltaLaboratory)
+- Major menu item refactor and event handling. Mainly improves macOS for now. By
+ [leaanthony](https://github.com/leaanthony)
+- Fix tests after plugins and event refactor in
+ [#3746](https://github.com/wailsapp/wails/pull/3746) by
+ [@stendler](https://github.com/stendler)
+- ⊞ Fixed `Failed to unregister class Chrome_WidgetWin_0` warning. By
+ [leaanthony](https://github.com/leaanthony)
+
+## v3.0.0-alpha.6 - 2024-07-30
+
+### Fixed
+
+- Module issues
+
+## v3.0.0-alpha.5 - 2024-07-30
+
+### Added
+
+- 🐧 WindowDidMove / WindowDidResize events in
+ [#3580](https://github.com/wailsapp/wails/pull/3580)
+- ⊞ WindowDidResize event in
+ [#3580](https://github.com/wailsapp/wails/pull/3580)
+- add Event ApplicationShouldHandleReopen to be able to handle dock
+ icon click by @5aaee9 in [#2991](https://github.com/wailsapp/wails/pull/2991)
+- add getPrimaryScreen/getScreens to impl by @tmclane in
+ [#2618](https://github.com/wailsapp/wails/pull/2618)
+- add option for showing the toolbar in fullscreen mode on macOS by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3282](https://github.com/wailsapp/wails/pull/3282)
+- 🐧 add onKeyPress logic to convert linux keypress into an accelerator
+ @[Atterpac](https://github.com/Atterpac)
+ in[#3022](https://github.com/wailsapp/wails/pull/3022])
+- 🐧 add task `run:linux` by
+ [@marcus-crane](https://github.com/marcus-crane) in
+ [#3146](https://github.com/wailsapp/wails/pull/3146)
+- Export `SetIcon` method by [@almas-x](https://github.com/almas-x) in
+ [PR](https://github.com/wailsapp/wails/pull/3147)
+- Improve `OnShutdown` by [@almas-x](https://github.com/almas-x) in
+ [PR](https://github.com/wailsapp/wails/pull/3189)
+- Restore `ToggleMaximise` method in `Window` interface by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3281](https://github.com/wailsapp/wails/pull/3281)
+- Added more information to `Environment()`. By @leaanthony in
+ [aba82cc](https://github.com/wailsapp/wails/commit/aba82cc52787c97fb99afa58b8b63a0004b7ff6c)
+ based on [PR](https://github.com/wailsapp/wails/pull/2044) by @Mai-Lapyst
+- Expose the `WebviewWindow.IsFocused` method on the `Window` interface by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3295](https://github.com/wailsapp/wails/pull/3295)
+- Support multiple space-separated trigger events in the WML system by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3295](https://github.com/wailsapp/wails/pull/3295)
+- Add ESM exports from the bundled JS runtime script by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3295](https://github.com/wailsapp/wails/pull/3295)
+- Add binding generator flag for using the bundled JS runtime script instead of
+ the npm package by [@fbbdev](https://github.com/fbbdev) in
+ [#3334](https://github.com/wailsapp/wails/pull/3334)
+- Implement `setIcon` on linux by [@abichinger](https://github.com/abichinger)
+ in [#3354](https://github.com/wailsapp/wails/pull/3354)
+- Add flag `-port` to dev command and support environment variable
+ `WAILS_VITE_PORT` by [@abichinger](https://github.com/abichinger) in
+ [#3429](https://github.com/wailsapp/wails/pull/3429)
+- Add tests for bound method calls by
+ [@abichinger](https://github.com/abichinger) in
+ [#3431](https://github.com/wailsapp/wails/pull/3431)
+- ⊞ add `SetIgnoreMouseEvents` for already created window by
+ [@bruxaodev](https://github.com/bruxaodev) in
+ [#3667](https://github.com/wailsapp/wails/pull/3667)
+- Add ability to set a window's stacking level (order) by
+ [@OlegGulevskyy](https://github.com/OlegGulevskyy) in
+ [#3674](https://github.com/wailsapp/wails/pull/3674)
+
+### Fixed
+
+- Fixed resize event messaging by [atterpac](https://github.com/atterpac) in
+ [#3606](https://github.com/wailsapp/wails/pull/3606)
+- 🐧Fixed theme handling error on NixOS by
+ [tmclane](https://github.com/tmclane) in
+ [#3515](https://github.com/wailsapp/wails/pull/3515)
+- Fixed cross volume project install for windows by
+ [atterpac](https://github.com/atterac) in
+ [#3512](https://github.com/wailsapp/wails/pull/3512)
+- Fixed react template css to show footer by
+ [atterpac](https://github.com/atterpac) in
+ [#3477](https://github.com/wailsapp/wails/pull/3477)
+- Fixed zombie processes when working in devmode by updating to latest refresh
+ by [Atterpac](https://github.com/atterpac) in
+ [#3320](https://github.com/wailsapp/wails/pull/3320).
+- Fixed appimage webkit file sourcing by [Atterpac](https://github.com/atterpac)
+ in [#3306](https://github.com/wailsapp/wails/pull/3306).
+- Fixed Doctor apt package verify by [Atterpac](https://github.com/Atterpac) in
+ [#2972](https://github.com/wailsapp/wails/pull/2972).
+- Fixed application frozen when quit (Darwin) by @5aaee9 in
+ [#2982](https://github.com/wailsapp/wails/pull/2982)
+- Fixed background colours of examples on Windows by
+ [mmghv](https://github.com/mmghv) in
+ [#2750](https://github.com/wailsapp/wails/pull/2750).
+- Fixed default context menus by [mmghv](https://github.com/mmghv) in
+ [#2753](https://github.com/wailsapp/wails/pull/2753).
+- Fixed hex values for arrow keys on Darwin by
+ [jaybeecave](https://github.com/jaybeecave) in
+ [#3052](https://github.com/wailsapp/wails/pull/3052).
+- Set drag-n-drop for windows to working. Added by
+ [@pylotlight](https://github.com/pylotlight) in
+ [PR](https://github.com/wailsapp/wails/pull/3039)
+- Fixed bug for linux in doctor in the event user doesn't have proper drivers
+ installed. Added by [@pylotlight](https://github.com/pylotlight) in
+ [PR](https://github.com/wailsapp/wails/pull/3032)
+- Fix dpi scaling on start up (windows). Changed by [@almas-x](https://github.com/almas-x) in
+ [PR](https://github.com/wailsapp/wails/pull/3145)
+- Fix replace line in `go.mod` to use relative paths. Fixes Windows paths with
+ spaces - @leaanthony.
+- Fix MacOS systray click handling when no attached window by
+ [thomas-senechal](https://github.com/thomas-senechal) in PR
+ [#3207](https://github.com/wailsapp/wails/pull/3207)
+- Fix failing Windows build due to unknown option by
+ [thomas-senechal](https://github.com/thomas-senechal) in PR
+ [#3208](https://github.com/wailsapp/wails/pull/3208)
+- Fix crash on windows left clicking the systray icon when not having an
+ attached window [tw1nk](https://github.com/tw1nk) in PR
+ [#3271](https://github.com/wailsapp/wails/pull/3271)
+- Fix wrong baseURL when open window twice by @5aaee9 in PR
+ [#3273](https://github.com/wailsapp/wails/pull/3273)
+- Fix ordering of if branches in `WebviewWindow.Restore` method by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3279](https://github.com/wailsapp/wails/pull/3279)
+- Correctly compute `startURL` across multiple `GetStartURL` invocations when
+ `FRONTEND_DEVSERVER_URL` is present.
+ [#3299](https://github.com/wailsapp/wails/pull/3299)
+- Fix the JS type of the `Screen` struct to match its Go counterpart by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3295](https://github.com/wailsapp/wails/pull/3295)
+- Fix the `WML.Reload` method to ensure proper cleanup of registered event
+ listeners by [@fbbdev](https://github.com/fbbdev) in
+ [#3295](https://github.com/wailsapp/wails/pull/3295)
+- Fix custom context menu closing immediately on linux by
+ [@abichinger](https://github.com/abichinger) in
+ [#3330](https://github.com/wailsapp/wails/pull/3330)
+- Fix the output path and extension of model files produced by the binding
+ generator by [@fbbdev](https://github.com/fbbdev) in
+ [#3334](https://github.com/wailsapp/wails/pull/3334)
+- Fix the import paths of model files in JS code produced by the binding
+ generator by [@fbbdev](https://github.com/fbbdev) in
+ [#3334](https://github.com/wailsapp/wails/pull/3334)
+- Fix drag-n-drop on some linux distros by
+ [@abichinger](https://github.com/abichinger) in
+ [#3346](https://github.com/wailsapp/wails/pull/3346)
+- Fix missing task for macOS when using `wails3 task dev` by
+ [@hfoxy](https://github.com/hfoxy) in
+ [#3417](https://github.com/wailsapp/wails/pull/3417)
+- Fix registering events causing a nil map assignment by
+ [@hfoxy](https://github.com/hfoxy) in
+ [#3426](https://github.com/wailsapp/wails/pull/3426)
+- Fix unmarshaling of bound method parameters by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3431](https://github.com/wailsapp/wails/pull/3431)
+- Fix handling of multiple return values from bound methods by
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3431](https://github.com/wailsapp/wails/pull/3431)
+- Fix doctor detection of npm that is not installed with system package manager
+ by [@pekim](https://github.com/pekim) in
+ [#3458](https://github.com/wailsapp/wails/pull/3458)
+- Fix missing MicrosoftEdgeWebview2Setup.exe. Thanks to
+ [@robin-samuel](https://github.com/robin-samuel).
+- Fix random crash on linux due to window ID handling by @leaanthony. Based on
+ PR [#3466](https://github.com/wailsapp/wails/pull/3622) by
+ [@5aaee9](https://github.com/5aaee9).
+- Fix systemTray.setIcon crashing on Linux by
+ [@windom](https://github.com/windom/) in
+ [#3636](https://github.com/wailsapp/wails/pull/3636).
+- Fix Ensure Window Frame is Applied on First Call in `setFrameless` Function on
+ Windows by [@bruxaodev](https://github.com/bruxaodev/) in
+ [#3691](https://github.com/wailsapp/wails/pull/3691).
+
+### Changed
+
+- Renamed `AbsolutePosition()` to `Position()` by
+ [mmghv](https://github.com/mmghv) in
+ [#3611](https://github.com/wailsapp/wails/pull/3611)
+- Update linux webkit dependency to webkit2gtk-4.1 over webkitgtk2-4.0 to
+ support Ubuntu 24.04 LTS by [atterpac](https://github.com/atterpac) in
+ [#3461](https://github.com/wailsapp/wails/pull/3461)
+- The bundled JS runtime script is now an ESM module: script tags importing it
+ must have the `type="module"` attribute. By
+ [@fbbdev](https://github.com/fbbdev) in
+ [#3295](https://github.com/wailsapp/wails/pull/3295)
+- The `@wailsio/runtime` package does not publish its API on the `window.wails`
+ object, and does not start the WML system. This has been done to improve
+ encapsulation. The WML system can be started manually if desired by calling
+ the new `WML.Enable` method. The bundled JS runtime script still performs both
+ operations automatically. By [@fbbdev](https://github.com/fbbdev) in
+ [#3295](https://github.com/wailsapp/wails/pull/3295)
+- The Window API module `@wailsio/runtime/src/window` now exposes the containing
+ window object as a default export. It is not possible anymore to import
+ individual methods through ESM named or namespace import syntax.
+- The JS window API has been updated to match the current Go `WebviewWindow`
+ API. Some methods have changed name or prototype, specifically: `Screen`
+ becomes `GetScreen`; `GetZoomLevel`/`SetZoomLevel` become `GetZoom`/`SetZoom`;
+ `GetZoom`, `Width` and `Height` now return values directly instead of wrapping
+ them within objects. By [@fbbdev](https://github.com/fbbdev) in
+ [#3295](https://github.com/wailsapp/wails/pull/3295)
+- The binding generator now uses calls by ID by default. The `-id` CLI option
+ has been removed. Use the `-names` CLI option to switch back to calls by name.
+ By [@fbbdev](https://github.com/fbbdev) in
+ [#3468](https://github.com/wailsapp/wails/pull/3468)
+- New binding code layout: output files were previously organised in folders
+ named after their containing package; now full Go import paths are used,
+ including the module path. By [@fbbdev](https://github.com/fbbdev) in
+ [#3468](https://github.com/wailsapp/wails/pull/3468)
+- The struct field `application.Options.Bind` has been renamed to
+ `application.Options.Services`. By [@fbbdev](https://github.com/fbbdev) in
+ [#3468](https://github.com/wailsapp/wails/pull/3468)
+- New syntax for binding services: service instances must now be wrapped in a
+ call to `application.NewService`. By [@fbbdev](https://github.com/fbbdev) in
+ [#3468](https://github.com/wailsapp/wails/pull/3468)
+- Disable spinner on Non-Terminal or CI Environment by
+ [@DeltaLaboratory](https://github.com/DeltaLaboratory) in
+ [#3574](https://github.com/wailsapp/wails/pull/3574)
diff --git a/docs/ref/wails-v3/community/links.md b/docs/ref/wails-v3/community/links.md
new file mode 100644
index 0000000..9507991
--- /dev/null
+++ b/docs/ref/wails-v3/community/links.md
@@ -0,0 +1,27 @@
+---
+title: Links
+---
+
+This page serves as a list for community related links.
+
+:::tip[How to Submit a Link]
+
+You can click the `Edit page` at the bottom of this page to submit a PR.
+
+:::
+
+## Awesome Wails
+
+The [definitive list](https://github.com/wailsapp/awesome-wails) of links
+related to Wails.
+
+## Support Channels
+
+- [Wails Discord Server](https://discord.gg/bdj28QNHmT)
+- [Github Issues](https://github.com/wailsapp/wails/issues)
+
+## Social Media
+
+- [Twitter](https://x.com/wailsapp)
+- [Wails Chinese Community QQ Group](https://qm.qq.com/cgi-bin/qm/qr?k=PmIURne5hFGNd7QWzW5qd6FV-INEjNJv&jump_from=webapi) -
+ Group number: 1067173054
diff --git a/docs/ref/wails-v3/community/templates.md b/docs/ref/wails-v3/community/templates.md
new file mode 100644
index 0000000..855b70c
--- /dev/null
+++ b/docs/ref/wails-v3/community/templates.md
@@ -0,0 +1,132 @@
+---
+title: Templates
+---
+
+:::caution
+
+This page might be outdated for Wails v3.
+
+:::
+
+
+
+This page serves as a list for community supported templates. To build your own
+template, please see the [Templates](https://wails.io/docs/guides/templates)
+guide.
+
+:::tip[How to Submit a Template]
+
+You can click `Edit this page` at the bottom to include your templates.
+
+:::
+
+To use these templates, run
+`wails init -n "Your Project Name" -t [the link below[@version]]`
+
+If there is no version suffix, the main branch code template is used by default.
+If there is a version suffix, the code template corresponding to the tag of this
+version is used.
+
+Example:
+`wails init -n "Your Project Name" -t https://github.com/misitebao/wails-template-vue`
+
+:::danger[Attention]
+
+**The Wails project does not maintain, is not responsible nor liable for 3rd
+party templates!**
+
+If you are unsure about a template, inspect `package.json` and `wails.json` for
+what scripts are run and what packages are installed.
+
+:::
+
+## Vue
+
+- [wails-template-vue](https://github.com/misitebao/wails-template-vue) - Wails
+ template based on Vue ecology (Integrated TypeScript, Dark theme,
+ Internationalization, Single page routing, TailwindCSS)
+- [wails-template-quasar-js](https://github.com/sgosiaco/wails-template-quasar-js) -
+ A template using JavaScript + Quasar V2 (Vue 3, Vite, Sass, Pinia, ESLint,
+ Prettier)
+- [wails-template-quasar-ts](https://github.com/sgosiaco/wails-template-quasar-ts) -
+ A template using TypeScript + Quasar V2 (Vue 3, Vite, Sass, Pinia, ESLint,
+ Prettier, Composition API with <script setup>)
+- [wails-template-naive](https://github.com/tk103331/wails-template-naive) -
+ Wails template based on Naive UI (A Vue 3 Component Library)
+- [wails-template-nuxt](https://github.com/gornius/wails-template-nuxt) - Wails
+ template using clean Nuxt3 and TypeScript with auto-imports for wails js
+ runtime
+- [Wails-Tool-Template](https://github.com/xisuo67/Wails-Tool-Template) - Wails
+ template using Vue+TypeScript+Vite+Element-plus(仿网易云)
+
+## Angular
+
+- [wails-template-angular](https://github.com/mateothegreat/wails-template-angular) -
+ Angular 15+ action packed & ready to roll to production.
+- [wails-angular-template](https://github.com/TAINCER/wails-angular-template) -
+ Angular with TypeScript, Sass, Hot-Reload, Code-Splitting and i18n
+
+## React
+
+- [wails-react-template](https://github.com/AlienRecall/wails-react-template) -
+ A template using reactjs
+- [wails-react-template](https://github.com/flin7/wails-react-template) - A
+ minimal template for React that supports live development
+- [wails-template-nextjs](https://github.com/LGiki/wails-template-nextjs) - A
+ template using Next.js and TypeScript
+- [wails-template-nextjs-app-router](https://github.com/thisisvk-in/wails-template-nextjs-app-router) -
+ A template using Next.js and TypeScript with App router
+- [wails-template-nextjs-app-router-src](https://github.com/edai-git/wails-template-nextjs-app-router) -
+ A template using Next.js and TypeScript with App router src + example
+- [wails-vite-react-ts-tailwind-template](https://github.com/hotafrika/wails-vite-react-ts-tailwind-template) -
+ A template for React + TypeScript + Vite + TailwindCSS
+- [wails-vite-react-ts-tailwind-shadcnui-template](https://github.com/Mahcks/wails-vite-react-tailwind-shadcnui-ts) -
+ A template with Vite, React, TypeScript, TailwindCSS, and shadcn/ui
+
+## Svelte
+
+- [wails-svelte-template](https://github.com/raitonoberu/wails-svelte-template) -
+ A template using Svelte
+- [wails-vite-svelte-template](https://github.com/BillBuilt/wails-vite-svelte-template) -
+ A template using Svelte and Vite
+- [wails-vite-svelte-tailwind-template](https://github.com/BillBuilt/wails-vite-svelte-tailwind-template) -
+ A template using Svelte and Vite with TailwindCSS v3
+- [wails-svelte-tailwind-vite-template](https://github.com/PylotLight/wails-vite-svelte-tailwind-template/tree/master) -
+ An updated template using Svelte v4.2.0 and Vite with TailwindCSS v3.3.3
+- [wails-sveltekit-template](https://github.com/h8gi/wails-sveltekit-template) -
+ A template using SvelteKit
+- [wails-template-shadcn-svelte](https://github.com/xijaja/wails-template-shadcn-svelte) -
+ A template using Sveltekit and Shadcn-Svelte
+
+## Solid
+
+- [wails-template-vite-solid-ts](https://github.com/xijaja/wails-template-solid-ts) -
+ A template using Solid + Ts + Vite
+- [wails-template-vite-solid-js](https://github.com/xijaja/wails-template-solid-js) -
+ A template using Solid + Js + Vite
+
+## Elm
+
+- [wails-elm-template](https://github.com/benjamin-thomas/wails-elm-template) -
+ Develop your GUI app with functional programming and a **snappy** hot-reload
+ setup :tada: :rocket:
+- [wails-template-elm-tailwind](https://github.com/rnice01/wails-template-elm-tailwind) -
+ Combine the powers :muscle: of Elm + Tailwind CSS + Wails! Hot reloading
+ supported.
+
+## HTMX
+
+- [wails-htmx-templ-chi-tailwind](https://github.com/PylotLight/wails-hmtx-templ-template) -
+ Use a unique combination of pure htmx for interactivity plus templ for
+ creating components and forms
+
+## Pure JavaScript (Vanilla)
+
+- [wails-pure-js-template](https://github.com/KiddoV/wails-pure-js-template) - A
+ template with nothing but just basic JavaScript, HTML, and CSS
+
+## Lit (web components)
+
+- [wails-lit-shoelace-esbuild-template](https://github.com/Braincompiler/wails-lit-shoelace-esbuild-template) -
+ Wails template providing frontend with lit, Shoelace component library +
+ pre-configured prettier and typescript.
diff --git a/docs/ref/wails-v3/concepts/architecture.mdx b/docs/ref/wails-v3/concepts/architecture.mdx
new file mode 100644
index 0000000..6b81a15
--- /dev/null
+++ b/docs/ref/wails-v3/concepts/architecture.mdx
@@ -0,0 +1,655 @@
+---
+title: How Wails Works
+description: Understanding the Wails architecture and how it achieves native performance
+sidebar:
+ order: 1
+---
+
+import { Tabs, TabItem } from "@astrojs/starlight/components";
+
+Wails is a framework for building desktop applications using **Go for the backend** and **web technologies for the frontend**. But unlike Electron, Wails doesn't bundle a browser—it uses the **operating system's native WebView**.
+
+```d2
+direction: right
+
+User: "User" {
+ shape: person
+ style.fill: "#3B82F6"
+}
+
+Application: "Your Wails Application" {
+ Frontend: "Frontend\n(HTML/CSS/JS)" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+ }
+
+ Runtime: "Wails Runtime" {
+ Bridge: "Message Bridge" {
+ shape: diamond
+ style.fill: "#10B981"
+ }
+
+ Bindings: "Type-Safe Bindings" {
+ shape: rectangle
+ style.fill: "#10B981"
+ }
+ }
+
+ Backend: "Go Backend" {
+ Services: "Your Services" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+ }
+
+ NativeAPIs: "OS APIs" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+ }
+ }
+}
+
+OS: "Operating System" {
+ WebView: "Native WebView\n(WebKit/WebView2/WebKitGTK)" {
+ shape: rectangle
+ style.fill: "#6B7280"
+ }
+
+ SystemAPIs: "System APIs\n(Windows/macOS/Linux)" {
+ shape: rectangle
+ style.fill: "#6B7280"
+ }
+}
+
+User -> Application.Frontend: "Interacts with UI"
+Application.Frontend <-> Application.Runtime.Bridge: "JSON messages"
+Application.Runtime.Bridge <-> Application.Backend.Services: "Direct function calls"
+Application.Runtime.Bindings -> Application.Frontend: "TypeScript definitions"
+Application.Frontend -> OS.WebView: "Renders in"
+Application.Backend.NativeAPIs -> OS.SystemAPIs: "Native calls"
+```
+
+**Key differences from Electron:**
+
+| Aspect | Wails | Electron |
+|--------|-------|----------|
+| **Browser** | OS-provided WebView | Bundled Chromium (~100MB) |
+| **Backend** | Go (compiled) | Node.js (interpreted) |
+| **Communication** | In-memory bridge | IPC (inter-process) |
+| **Bundle Size** | ~15MB | ~150MB |
+| **Memory** | ~10MB | ~100MB+ |
+| **Startup** | <0.5s | 2-3s |
+
+## Core Components
+
+### 1. Native WebView
+
+Wails uses the operating system's built-in web rendering engine:
+
+
+
+ **WebView2** (Microsoft Edge WebView2)
+ - Based on Chromium (same as Edge browser)
+ - Pre-installed on Windows 10/11
+ - Automatic updates via Windows Update
+ - Full modern web standards support
+
+
+
+ **WebKit** (Safari's rendering engine)
+ - Built into macOS
+ - Same engine as Safari browser
+ - Excellent performance and battery life
+ - Full modern web standards support
+
+
+
+ **WebKitGTK** (GTK port of WebKit)
+ - Installed via package manager
+ - Same engine as GNOME Web (Epiphany)
+ - Good standards support
+ - Lightweight and performant
+
+
+
+**Why this matters:**
+- **No bundled browser** → Smaller app size
+- **OS-native** → Better integration and performance
+- **Auto-updates** → Security patches from OS updates
+- **Familiar rendering** → Same as system browser
+
+### 2. The Wails Bridge
+
+The bridge is the heart of Wails—it enables **direct communication** between Go and JavaScript.
+
+```d2
+direction: down
+
+Frontend: "Frontend (JavaScript)" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+}
+
+Bridge: "Wails Bridge" {
+ Encoder: "JSON Encoder" {
+ shape: rectangle
+ }
+
+ Router: "Method Router" {
+ shape: diamond
+ style.fill: "#10B981"
+ }
+
+ Decoder: "JSON Decoder" {
+ shape: rectangle
+ }
+}
+
+Backend: "Backend (Go)" {
+ Services: "Registered Services" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+ }
+}
+
+Frontend -> Bridge.Encoder: "1. Call Go method\nGreet('Alice')"
+Bridge.Encoder -> Bridge.Router: "2. Encode to JSON\n{method: 'Greet', args: ['Alice']}"
+Bridge.Router -> Backend.Services: "3. Route to service\nGreetService.Greet('Alice')"
+Backend.Services -> Bridge.Decoder: "4. Return result\n'Hello, Alice!'"
+Bridge.Decoder -> Frontend: "5. Decode to JS\nPromise resolves"
+```
+
+**How it works:**
+
+1. **Frontend calls a Go method** (via auto-generated binding)
+2. **Bridge encodes the call** to JSON (method name + arguments)
+3. **Router finds the Go method** in registered services
+4. **Go method executes** and returns a value
+5. **Bridge decodes the result** and sends back to frontend
+6. **Promise resolves** in JavaScript with the result
+
+**Performance characteristics:**
+- **In-memory**: No network overhead, no HTTP
+- **Zero-copy** where possible (for large data)
+- **Async by default**: Non-blocking on both sides
+- **Type-safe**: TypeScript definitions auto-generated
+
+### 3. Service System
+
+Services are the recommended way to expose Go functionality to the frontend.
+
+```go
+// Define a service (just a regular Go struct)
+type GreetService struct {
+ prefix string
+}
+
+// Methods with exported names are automatically available
+func (g *GreetService) Greet(name string) string {
+ return g.prefix + name + "!"
+}
+
+func (g *GreetService) GetTime() time.Time {
+ return time.Now()
+}
+
+// Register the service
+app := application.New(application.Options{
+ Services: []application.Service{
+ application.NewService(&GreetService{prefix: "Hello, "}),
+ },
+})
+```
+
+**Service discovery:**
+- Wails **scans your struct** at startup
+- **Exported methods** become callable from frontend
+- **Type information** is extracted for TypeScript bindings
+- **Error handling** is automatic (Go errors → JS exceptions)
+
+**Generated TypeScript binding:**
+```typescript
+// Auto-generated in frontend/bindings/GreetService.ts
+export function Greet(name: string): Promise
+export function GetTime(): Promise
+```
+
+**Why services?**
+- **Type-safe**: Full TypeScript support
+- **Auto-discovery**: No manual registration of methods
+- **Organised**: Group related functionality
+- **Testable**: Services are just Go structs
+
+[Learn more about services →](/features/bindings/services)
+
+### 4. Event System
+
+Events enable **pub/sub communication** between components.
+
+```d2
+direction: right
+
+GoService: "Go Service" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+}
+
+EventBus: "Event Bus" {
+ shape: cylinder
+ style.fill: "#10B981"
+}
+
+Frontend1: "Window 1" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+}
+
+Frontend2: "Window 2" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+}
+
+GoService -> EventBus: "Emit('data-updated', data)"
+EventBus -> Frontend1: "Notify subscribers"
+EventBus -> Frontend2: "Notify subscribers"
+Frontend1 -> EventBus: "On('data-updated', handler)"
+Frontend2 -> EventBus: "On('data-updated', handler)"
+```
+
+**Use cases:**
+- **Window communication**: One window notifies others
+- **Background tasks**: Go service notifies UI of progress
+- **State synchronisation**: Keep multiple windows in sync
+- **Loose coupling**: Components don't need direct references
+
+**Example:**
+```go
+// Go: Emit an event
+app.Event.Emit("user-logged-in", user)
+```
+
+```javascript
+// JavaScript: Listen for event
+import { Events } from '@wailsio/runtime'
+
+Events.On('user-logged-in', (user) => {
+ console.log('User logged in:', user)
+})
+```
+
+[Learn more about events →](/features/events/system)
+
+## Application Lifecycle
+
+Understanding the lifecycle helps you know when to initialise resources and clean up.
+
+```d2
+direction: down
+
+Start: "Application Start" {
+ shape: oval
+ style.fill: "#10B981"
+}
+
+Init: "Initialisation" {
+ Create: "Create Application" {
+ shape: rectangle
+ }
+
+ Register: "Register Services" {
+ shape: rectangle
+ }
+
+ Setup: "Setup Windows/Menus" {
+ shape: rectangle
+ }
+}
+
+Run: "Event Loop" {
+ Events: "Process Events" {
+ shape: rectangle
+ }
+
+ Messages: "Handle Messages" {
+ shape: rectangle
+ }
+
+ Render: "Update UI" {
+ shape: rectangle
+ }
+}
+
+Shutdown: "Shutdown" {
+ Cleanup: "Cleanup Resources" {
+ shape: rectangle
+ }
+
+ Save: "Save State" {
+ shape: rectangle
+ }
+}
+
+End: "Application End" {
+ shape: oval
+ style.fill: "#EF4444"
+}
+
+Start -> Init.Create
+Init.Create -> Init.Register
+Init.Register -> Init.Setup
+Init.Setup -> Run.Events
+Run.Events -> Run.Messages
+Run.Messages -> Run.Render
+Run.Render -> Run.Events: "Loop"
+Run.Events -> Shutdown.Cleanup: "Quit signal"
+Shutdown.Cleanup -> Shutdown.Save
+Shutdown.Save -> End
+```
+
+**Lifecycle hooks:**
+
+```go
+app := application.New(application.Options{
+ Name: "My App",
+
+ // Called before windows are created
+ OnStartup: func(ctx context.Context) {
+ // Initialise database, load config, etc.
+ },
+
+ // Called when app is about to quit
+ OnShutdown: func() {
+ // Save state, close connections, etc.
+ },
+})
+```
+
+[Learn more about lifecycle →](/concepts/lifecycle)
+
+## Build Process
+
+Understanding how Wails builds your application:
+
+```d2
+direction: down
+
+Source: "Source Code" {
+ Go: "Go Code\n(main.go, services)" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+ }
+
+ Frontend: "Frontend Code\n(HTML/CSS/JS)" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+ }
+}
+
+Build: "Build Process" {
+ AnalyseGo: "Analyse Go Code" {
+ shape: rectangle
+ }
+
+ GenerateBindings: "Generate Bindings" {
+ shape: rectangle
+ }
+
+ BuildFrontend: "Build Frontend" {
+ shape: rectangle
+ }
+
+ CompileGo: "Compile Go" {
+ shape: rectangle
+ }
+
+ Embed: "Embed Assets" {
+ shape: rectangle
+ }
+}
+
+Output: "Output" {
+ Binary: "Native Binary\n(myapp.exe/.app)" {
+ shape: rectangle
+ style.fill: "#10B981"
+ }
+}
+
+Source.Go -> Build.AnalyseGo
+Build.AnalyseGo -> Build.GenerateBindings: "Extract types"
+Build.GenerateBindings -> Source.Frontend: "TypeScript bindings"
+Source.Frontend -> Build.BuildFrontend: "Compile (Vite/webpack)"
+Build.BuildFrontend -> Build.Embed: "Bundled assets"
+Source.Go -> Build.CompileGo
+Build.CompileGo -> Build.Embed
+Build.Embed -> Output.Binary
+```
+
+**Build steps:**
+
+1. **Analyse Go code**
+ - Scan services for exported methods
+ - Extract parameter and return types
+ - Generate method signatures
+
+2. **Generate TypeScript bindings**
+ - Create `.ts` files for each service
+ - Include full type definitions
+ - Add JSDoc comments
+
+3. **Build frontend**
+ - Run your bundler (Vite, webpack, etc.)
+ - Minify and optimise
+ - Output to `frontend/dist/`
+
+4. **Compile Go**
+ - Compile with optimisations (`-ldflags="-s -w"`)
+ - Include build metadata
+ - Platform-specific compilation
+
+5. **Embed assets**
+ - Embed frontend files into Go binary
+ - Compress assets
+ - Create single executable
+
+**Result:** A single native executable with everything embedded.
+
+[Learn more about building →](/guides/build/building)
+
+## Development vs Production
+
+Wails behaves differently in development and production:
+
+
+
+ **Characteristics:**
+ - **Hot reload**: Frontend changes reload instantly
+ - **Source maps**: Debug with original source
+ - **DevTools**: Browser DevTools available
+ - **Logging**: Verbose logging enabled
+ - **External frontend**: Served from dev server (Vite)
+
+ **How it works:**
+ ```d2
+ direction: right
+
+ WailsApp: "Wails App" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+ }
+
+ DevServer: "Vite Dev Server\n(localhost:5173)" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+ }
+
+ WebView: "WebView" {
+ shape: rectangle
+ style.fill: "#6B7280"
+ }
+
+ WailsApp -> DevServer: "Proxy requests"
+ DevServer -> WebView: "Serve with HMR"
+ WebView -> WailsApp: "Call Go methods"
+ ```
+
+ **Benefits:**
+ - Instant feedback on changes
+ - Full debugging capabilities
+ - Faster iteration
+
+
+
+ **Characteristics:**
+ - **Embedded assets**: Frontend built into binary
+ - **Optimised**: Minified, compressed
+ - **No DevTools**: Disabled by default
+ - **Minimal logging**: Errors only
+ - **Single file**: Everything in one executable
+
+ **How it works:**
+ ```d2
+ direction: right
+
+ Binary: "Single Binary\n(myapp.exe)" {
+ GoCode: "Compiled Go" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+ }
+
+ Assets: "Embedded Assets\n(HTML/CSS/JS)" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+ }
+ }
+
+ WebView: "WebView" {
+ shape: rectangle
+ style.fill: "#6B7280"
+ }
+
+ Binary.Assets -> WebView: "Serve from memory"
+ WebView -> Binary.GoCode: "Call Go methods"
+ ```
+
+ **Benefits:**
+ - Single file distribution
+ - Smaller size (minified)
+ - Better performance
+ - No external dependencies
+
+
+
+## Memory Model
+
+Understanding memory usage helps you build efficient applications.
+
+{/* VISUAL PLACEHOLDER: Memory Diagram
+Description: Memory layout diagram showing:
+1. Go Heap (services, application state)
+2. WebView Memory (DOM, JavaScript heap)
+3. Shared Memory (bridge communication)
+4. Arrows showing data flow between regions
+5. Annotations for zero-copy optimisations
+Style: Technical diagram with memory regions as boxes, clear labels, size indicators
+*/}
+
+**Memory regions:**
+
+1. **Go Heap**
+ - Your services and application state
+ - Managed by Go garbage collector
+ - Typically 5-10MB for simple apps
+
+2. **WebView Memory**
+ - DOM, JavaScript heap, CSS
+ - Managed by WebView's engine
+ - Typically 10-20MB for simple apps
+
+3. **Bridge Memory**
+ - Message buffers for communication
+ - Minimal overhead (\<1MB)
+ - Zero-copy for large data where possible
+
+**Optimisation tips:**
+- **Avoid large data transfers**: Pass IDs, fetch details on demand
+- **Use events for updates**: Don't poll from frontend
+- **Stream large files**: Don't load entirely into memory
+- **Clean up listeners**: Remove event listeners when done
+
+[Learn more about performance →](/guides/advanced/performance)
+
+## Security Model
+
+Wails provides a secure-by-default architecture:
+
+```d2
+direction: down
+
+Frontend: "Frontend (Untrusted)" {
+ shape: rectangle
+ style.fill: "#EF4444"
+}
+
+Bridge: "Wails Bridge (Validation)" {
+ shape: diamond
+ style.fill: "#F59E0B"
+}
+
+Backend: "Backend (Trusted)" {
+ shape: rectangle
+ style.fill: "#10B981"
+}
+
+Frontend -> Bridge: "Call method"
+Bridge -> Bridge: "Validate:\n- Method exists?\n- Types correct?\n- Access allowed?"
+Bridge -> Backend: "Execute if valid"
+Backend -> Bridge: "Return result"
+Bridge -> Frontend: "Send response"
+```
+
+**Security features:**
+
+1. **Method whitelisting**
+ - Only exported methods are callable
+ - Private methods are inaccessible
+ - Explicit service registration required
+
+2. **Type validation**
+ - Arguments checked against Go types
+ - Invalid types rejected
+ - Prevents injection attacks
+
+3. **No eval()**
+ - Frontend can't execute arbitrary Go code
+ - Only predefined methods callable
+ - No dynamic code execution
+
+4. **Context isolation**
+ - Each window has its own context
+ - Services can check caller context
+ - Permissions per window possible
+
+**Best practices:**
+- **Validate user input** in Go (don't trust frontend)
+- **Use context** for authentication/authorisation
+- **Sanitise file paths** before file operations
+- **Rate limit** expensive operations
+
+[Learn more about security →](/guides/advanced/security)
+
+## Next Steps
+
+**Application Lifecycle** - Understand startup, shutdown, and lifecycle hooks
+[Learn More →](/concepts/lifecycle)
+
+**Go-Frontend Bridge** - Deep dive into how the bridge works
+[Learn More →](/concepts/bridge)
+
+**Build System** - Understand how Wails builds your application
+[Learn More →](/concepts/build-system)
+
+**Start Building** - Apply what you've learned in a tutorial
+[Tutorials →](/tutorials/03-notes-vanilla)
+
+---
+
+**Questions about architecture?** Ask in [Discord](https://discord.gg/JDdSxwjhGf) or check the [API reference](/reference/overview).
diff --git a/docs/ref/wails-v3/concepts/bridge.mdx b/docs/ref/wails-v3/concepts/bridge.mdx
new file mode 100644
index 0000000..13a8ac4
--- /dev/null
+++ b/docs/ref/wails-v3/concepts/bridge.mdx
@@ -0,0 +1,700 @@
+---
+title: Go-Frontend Bridge
+description: Deep dive into how Wails enables direct communication between Go and JavaScript
+sidebar:
+ order: 3
+---
+
+import { Tabs, TabItem } from "@astrojs/starlight/components";
+
+## Direct Go-JavaScript Communication
+
+Wails provides a **direct, in-memory bridge** between Go and JavaScript, enabling seamless communication without HTTP overhead, process boundaries, or serialisation bottlenecks.
+
+## The Big Picture
+
+```d2
+direction: right
+
+Frontend: "Frontend (JavaScript)" {
+ UI: "React/Vue/Vanilla" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+ }
+
+ Bindings: "Auto-Generated Bindings" {
+ shape: rectangle
+ style.fill: "#A78BFA"
+ }
+}
+
+Bridge: "Wails Bridge" {
+ Encoder: "JSON Encoder" {
+ shape: rectangle
+ style.fill: "#10B981"
+ }
+
+ Router: "Method Router" {
+ shape: diamond
+ style.fill: "#10B981"
+ }
+
+ Decoder: "JSON Decoder" {
+ shape: rectangle
+ style.fill: "#10B981"
+ }
+
+ TypeGen: "Type Generator" {
+ shape: rectangle
+ style.fill: "#10B981"
+ }
+}
+
+Backend: "Backend (Go)" {
+ Services: "Your Services" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+ }
+
+ Registry: "Service Registry" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+ }
+}
+
+Frontend.UI -> Frontend.Bindings: "import { Method }"
+Frontend.Bindings -> Bridge.Encoder: "Call Method('arg')"
+Bridge.Encoder -> Bridge.Router: "Encode to JSON"
+Bridge.Router -> Backend.Registry: "Find service"
+Backend.Registry -> Backend.Services: "Invoke method"
+Backend.Services -> Bridge.Decoder: "Return result"
+Bridge.Decoder -> Frontend.Bindings: "Decode to JS"
+Frontend.Bindings -> Frontend.UI: "Promise resolves"
+Bridge.TypeGen -> Frontend.Bindings: "Generate types"
+```
+
+**Key insight:** No HTTP, no IPC, no process boundaries. Just **direct function calls** with **type safety**.
+
+## How It Works: Step by Step
+
+### 1. Service Registration (Startup)
+
+When your application starts, Wails scans your services:
+
+```go
+type GreetService struct {
+ prefix string
+}
+
+func (g *GreetService) Greet(name string) string {
+ return g.prefix + name + "!"
+}
+
+func (g *GreetService) Add(a, b int) int {
+ return a + b
+}
+
+// Register service
+app := application.New(application.Options{
+ Services: []application.Service{
+ application.NewService(&GreetService{prefix: "Hello, "}),
+ },
+})
+```
+
+**What Wails does:**
+1. **Scans the struct** for exported methods
+2. **Extracts type information** (parameters, return types)
+3. **Builds a registry** mapping method names to functions
+4. **Generates TypeScript bindings** with full type definitions
+
+### 2. Binding Generation (Build Time)
+
+Wails generates TypeScript bindings automatically:
+
+```typescript
+// Auto-generated: frontend/bindings/GreetService.ts
+export function Greet(name: string): Promise
+export function Add(a: number, b: number): Promise
+```
+
+**Type mapping:**
+
+| Go Type | TypeScript Type |
+|---------|-----------------|
+| `string` | `string` |
+| `int`, `int32`, `int64` | `number` |
+| `float32`, `float64` | `number` |
+| `bool` | `boolean` |
+| `[]T` | `T[]` |
+| `map[string]T` | `Record` |
+| `struct` | `interface` |
+| `time.Time` | `Date` |
+| `error` | Exception (thrown) |
+
+### 3. Frontend Call (Runtime)
+
+Developer calls the Go method from JavaScript:
+
+```javascript
+import { Greet, Add } from './bindings/GreetService'
+
+// Call Go from JavaScript
+const greeting = await Greet("World")
+console.log(greeting) // "Hello, World!"
+
+const sum = await Add(5, 3)
+console.log(sum) // 8
+```
+
+**What happens:**
+1. **Binding function called** - `Greet("World")`
+2. **Message created** - `{ service: "GreetService", method: "Greet", args: ["World"] }`
+3. **Sent to bridge** - Via WebView's JavaScript bridge
+4. **Promise returned** - Awaits response
+
+### 4. Bridge Processing (Runtime)
+
+The bridge receives the message and processes it:
+
+```d2
+direction: down
+
+Receive: "Receive Message" {
+ shape: rectangle
+ style.fill: "#10B981"
+}
+
+Parse: "Parse JSON" {
+ shape: rectangle
+}
+
+Validate: "Validate" {
+ Check: "Service exists?" {
+ shape: diamond
+ }
+
+ CheckMethod: "Method exists?" {
+ shape: diamond
+ }
+
+ CheckTypes: "Types correct?" {
+ shape: diamond
+ }
+}
+
+Invoke: "Invoke Go Method" {
+ shape: rectangle
+ style.fill: "#00ADD8"
+}
+
+Encode: "Encode Result" {
+ shape: rectangle
+}
+
+Send: "Send Response" {
+ shape: rectangle
+ style.fill: "#10B981"
+}
+
+Error: "Send Error" {
+ shape: rectangle
+ style.fill: "#EF4444"
+}
+
+Receive -> Parse
+Parse -> Validate.Check
+Validate.Check -> Validate.CheckMethod: "Yes"
+Validate.Check -> Error: "No"
+Validate.CheckMethod -> Validate.CheckTypes: "Yes"
+Validate.CheckMethod -> Error: "No"
+Validate.CheckTypes -> Invoke: "Yes"
+Validate.CheckTypes -> Error: "No"
+Invoke -> Encode: "Success"
+Invoke -> Error: "Error"
+Encode -> Send
+```
+
+**Security:** Only registered services and exported methods are callable.
+
+### 5. Go Execution (Runtime)
+
+The Go method executes:
+
+```go
+func (g *GreetService) Greet(name string) string {
+ // This runs in Go
+ return g.prefix + name + "!"
+}
+```
+
+**Execution context:**
+- Runs in a **goroutine** (non-blocking)
+- Has access to **all Go features** (file system, network, databases)
+- Can call **other Go code** freely
+- Returns result or error
+
+### 6. Response (Runtime)
+
+Result is sent back to JavaScript:
+
+```javascript
+// Promise resolves with result
+const greeting = await Greet("World")
+// greeting = "Hello, World!"
+```
+
+**Error handling:**
+
+```go
+func (g *GreetService) Divide(a, b float64) (float64, error) {
+ if b == 0 {
+ return 0, errors.New("division by zero")
+ }
+ return a / b, nil
+}
+```
+
+```javascript
+try {
+ const result = await Divide(10, 0)
+} catch (error) {
+ console.error("Go error:", error) // "division by zero"
+}
+```
+
+## Performance Characteristics
+
+### Speed
+
+**Typical call overhead:** <1ms
+
+```
+Frontend Call → Bridge → Go Execution → Bridge → Frontend Response
+ ↓ ↓ ↓ ↓ ↓
+ <0.1ms <0.1ms [varies] <0.1ms <0.1ms
+```
+
+**Compared to alternatives:**
+- **HTTP/REST:** 5-50ms (network stack, serialisation)
+- **IPC:** 1-10ms (process boundaries, marshalling)
+- **Wails Bridge:** <1ms (in-memory, direct call)
+
+### Memory
+
+**Per-call overhead:** ~1KB (message buffer)
+
+**Zero-copy optimisation:** Large data (>1MB) uses shared memory where possible.
+
+### Concurrency
+
+**Calls are concurrent:**
+- Each call runs in its own goroutine
+- Multiple calls can execute simultaneously
+- No blocking between calls
+
+```javascript
+// These run concurrently
+const [result1, result2, result3] = await Promise.all([
+ SlowOperation1(),
+ SlowOperation2(),
+ SlowOperation3(),
+])
+```
+
+## Type System
+
+### Supported Types
+
+#### Primitives
+
+```go
+// Go
+func Example(
+ s string,
+ i int,
+ f float64,
+ b bool,
+) (string, int, float64, bool) {
+ return s, i, f, b
+}
+```
+
+```typescript
+// TypeScript (auto-generated)
+function Example(
+ s: string,
+ i: number,
+ f: number,
+ b: boolean,
+): Promise<[string, number, number, boolean]>
+```
+
+#### Slices and Arrays
+
+```go
+// Go
+func Sum(numbers []int) int {
+ total := 0
+ for _, n := range numbers {
+ total += n
+ }
+ return total
+}
+```
+
+```typescript
+// TypeScript
+function Sum(numbers: number[]): Promise
+
+// Usage
+const total = await Sum([1, 2, 3, 4, 5]) // 15
+```
+
+#### Maps
+
+```go
+// Go
+func GetConfig() map[string]interface{} {
+ return map[string]interface{}{
+ "theme": "dark",
+ "fontSize": 14,
+ "enabled": true,
+ }
+}
+```
+
+```typescript
+// TypeScript
+function GetConfig(): Promise>
+
+// Usage
+const config = await GetConfig()
+console.log(config.theme) // "dark"
+```
+
+#### Structs
+
+```go
+// Go
+type User struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+ Email string `json:"email"`
+}
+
+func GetUser(id int) (*User, error) {
+ return &User{
+ ID: id,
+ Name: "Alice",
+ Email: "alice@example.com",
+ }, nil
+}
+```
+
+```typescript
+// TypeScript (auto-generated)
+interface User {
+ id: number
+ name: string
+ email: string
+}
+
+function GetUser(id: number): Promise
+
+// Usage
+const user = await GetUser(1)
+console.log(user.name) // "Alice"
+```
+
+**JSON tags:** Use `json:` tags to control field names in TypeScript.
+
+#### Time
+
+```go
+// Go
+func GetTimestamp() time.Time {
+ return time.Now()
+}
+```
+
+```typescript
+// TypeScript
+function GetTimestamp(): Promise
+
+// Usage
+const timestamp = await GetTimestamp()
+console.log(timestamp.toISOString())
+```
+
+#### Errors
+
+```go
+// Go
+func Validate(input string) error {
+ if input == "" {
+ return errors.New("input cannot be empty")
+ }
+ return nil
+}
+```
+
+```typescript
+// TypeScript
+function Validate(input: string): Promise
+
+// Usage
+try {
+ await Validate("")
+} catch (error) {
+ console.error(error) // "input cannot be empty"
+}
+```
+
+### Unsupported Types
+
+These types **cannot** be passed across the bridge:
+
+- **Channels** (`chan T`)
+- **Functions** (`func()`)
+- **Interfaces** (except `interface{}` / `any`)
+- **Pointers** (except to structs)
+- **Unexported fields** (lowercase)
+
+**Workaround:** Use IDs or handles:
+
+```go
+// ❌ Can't pass file handle
+func OpenFile(path string) (*os.File, error) {
+ return os.Open(path)
+}
+
+// ✅ Return file ID instead
+var files = make(map[string]*os.File)
+
+func OpenFile(path string) (string, error) {
+ file, err := os.Open(path)
+ if err != nil {
+ return "", err
+ }
+ id := generateID()
+ files[id] = file
+ return id, nil
+}
+
+func ReadFile(id string) ([]byte, error) {
+ file := files[id]
+ return io.ReadAll(file)
+}
+
+func CloseFile(id string) error {
+ file := files[id]
+ delete(files, id)
+ return file.Close()
+}
+```
+
+## Advanced Patterns
+
+### Context Passing
+
+Services can access the call context:
+
+```go
+type UserService struct{}
+
+func (s *UserService) GetCurrentUser(ctx context.Context) (*User, error) {
+ // Access window that made the call
+ window := application.ContextWindow(ctx)
+
+ // Access application
+ app := application.ContextApplication(ctx)
+
+ // Your logic
+ return getCurrentUser(), nil
+}
+```
+
+**Context provides:**
+- Window that made the call
+- Application instance
+- Request metadata
+
+### Streaming Data
+
+For large data, use events instead of return values:
+
+```go
+func ProcessLargeFile(path string) error {
+ file, err := os.Open(path)
+ if err != nil {
+ return err
+ }
+ defer file.Close()
+
+ scanner := bufio.NewScanner(file)
+ lineNum := 0
+
+ for scanner.Scan() {
+ lineNum++
+ // Emit progress events
+ app.Event.Emit("file-progress", map[string]interface{}{
+ "line": lineNum,
+ "text": scanner.Text(),
+ })
+ }
+
+ return scanner.Err()
+}
+```
+
+```javascript
+import { Events } from '@wailsio/runtime'
+import { ProcessLargeFile } from './bindings/FileService'
+
+// Listen for progress
+Events.On('file-progress', (data) => {
+ console.log(`Line ${data.line}: ${data.text}`)
+})
+
+// Start processing
+await ProcessLargeFile('/path/to/large/file.txt')
+```
+
+### Cancellation
+
+Use context for cancellable operations:
+
+```go
+func LongRunningTask(ctx context.Context) error {
+ for i := 0; i < 1000; i++ {
+ // Check if cancelled
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ default:
+ // Continue work
+ time.Sleep(100 * time.Millisecond)
+ }
+ }
+ return nil
+}
+```
+
+**Note:** Context cancellation on frontend disconnect is automatic.
+
+### Batch Operations
+
+Reduce bridge overhead by batching:
+
+```go
+// ❌ Inefficient: N bridge calls
+for _, item := range items {
+ await ProcessItem(item)
+}
+
+// ✅ Efficient: 1 bridge call
+await ProcessItems(items)
+```
+
+```go
+func ProcessItems(items []Item) ([]Result, error) {
+ results := make([]Result, len(items))
+ for i, item := range items {
+ results[i] = processItem(item)
+ }
+ return results, nil
+}
+```
+
+## Debugging the Bridge
+
+### Enable Debug Logging
+
+```go
+app := application.New(application.Options{
+ Name: "My App",
+ Logger: application.NewDefaultLogger(),
+ LogLevel: logger.DEBUG,
+})
+```
+
+**Output shows:**
+- Method calls
+- Parameters
+- Return values
+- Errors
+- Timing information
+
+### Inspect Generated Bindings
+
+Check `frontend/bindings/` to see generated TypeScript:
+
+```typescript
+// frontend/bindings/MyService.ts
+export function MyMethod(arg: string): Promise {
+ return window.wails.Call('MyService.MyMethod', arg)
+}
+```
+
+### Test Services Directly
+
+Test Go services without the frontend:
+
+```go
+func TestGreetService(t *testing.T) {
+ service := &GreetService{prefix: "Hello, "}
+ result := service.Greet("Test")
+ if result != "Hello, Test!" {
+ t.Errorf("Expected 'Hello, Test!', got '%s'", result)
+ }
+}
+```
+
+## Performance Tips
+
+### ✅ Do
+
+- **Batch operations** - Reduce bridge calls
+- **Use events for streaming** - Don't return large arrays
+- **Keep methods fast** - <100ms ideal
+- **Use goroutines** - For long operations
+- **Cache on Go side** - Avoid repeated calculations
+
+### ❌ Don't
+
+- **Don't make excessive calls** - Batch when possible
+- **Don't return huge data** - Use pagination or streaming
+- **Don't block** - Use goroutines for long operations
+- **Don't pass complex types** - Keep it simple
+- **Don't ignore errors** - Always handle them
+
+## Security
+
+The bridge is secure by default:
+
+1. **Whitelist only** - Only registered services callable
+2. **Type validation** - Arguments checked against Go types
+3. **No eval()** - Frontend can't execute arbitrary Go code
+4. **No reflection abuse** - Only exported methods accessible
+
+**Best practices:**
+- **Validate input** in Go (don't trust frontend)
+- **Use context** for authentication/authorisation
+- **Rate limit** expensive operations
+- **Sanitise** file paths and user input
+
+## Next Steps
+
+**Build System** - Learn how Wails builds and bundles your application
+[Learn More →](/concepts/build-system)
+
+**Services** - Deep dive into the service system
+[Learn More →](/features/bindings/services)
+
+**Events** - Use events for pub/sub communication
+[Learn More →](/features/events/system)
+
+---
+
+**Questions about the bridge?** Ask in [Discord](https://discord.gg/JDdSxwjhGf) or check the [binding examples](https://github.com/wailsapp/wails/tree/v3-alpha/v3/examples/binding).
diff --git a/docs/ref/wails-v3/concepts/build-system.mdx b/docs/ref/wails-v3/concepts/build-system.mdx
new file mode 100644
index 0000000..f9de52b
--- /dev/null
+++ b/docs/ref/wails-v3/concepts/build-system.mdx
@@ -0,0 +1,700 @@
+---
+title: Build System
+description: Understanding how Wails builds and packages your application
+sidebar:
+ order: 4
+---
+
+import { Tabs, TabItem } from "@astrojs/starlight/components";
+
+## Unified Build System
+
+Wails provides a **unified build system** that compiles Go code, bundles frontend assets, embeds everything into a single executable, and handles platform-specific builds—all with one command.
+
+```bash
+wails3 build
+```
+
+**Output:** Native executable with everything embedded.
+
+## Build Process Overview
+
+{/*
+TODO: Fix D2 diagram generation or embed as image.
+The previous D2 code block was causing MDX parsing errors in the build pipeline.
+*/}
+
+**[Build Process Diagram Placeholder]**
+
+
+## Build Phases
+
+### 1. Analysis Phase
+
+Wails scans your Go code to understand your services:
+
+```go
+type GreetService struct {
+ prefix string
+}
+
+func (g *GreetService) Greet(name string) string {
+ return g.prefix + name + "!"
+}
+```
+
+**What Wails extracts:**
+- Service name: `GreetService`
+- Method name: `Greet`
+- Parameter types: `string`
+- Return types: `string`
+
+**Used for:** Generating TypeScript bindings
+
+### 2. Generation Phase
+
+#### TypeScript Bindings
+
+Wails generates type-safe bindings:
+
+```typescript
+// Auto-generated: frontend/bindings/GreetService.ts
+export function Greet(name: string): Promise {
+ return window.wails.Call('GreetService.Greet', name)
+}
+```
+
+**Benefits:**
+- Full type safety
+- IDE autocomplete
+- Compile-time errors
+- JSDoc comments
+
+#### Frontend Build
+
+Your frontend bundler runs (Vite, webpack, etc.):
+
+```bash
+# Vite example
+vite build --outDir dist
+```
+
+**What happens:**
+- JavaScript/TypeScript compiled
+- CSS processed and minified
+- Assets optimised
+- Source maps generated (dev only)
+- Output to `frontend/dist/`
+
+### 3. Compilation Phase
+
+#### Go Compilation
+
+Go code is compiled with optimisations:
+
+```bash
+go build -ldflags="-s -w" -o myapp.exe
+```
+
+**Flags:**
+- `-s`: Strip symbol table
+- `-w`: Strip DWARF debugging info
+- Result: Smaller binary (~30% reduction)
+
+**Platform-specific:**
+- Windows: `.exe` with icon embedded
+- macOS: `.app` bundle structure
+- Linux: ELF binary
+
+#### Asset Embedding
+
+Frontend assets are embedded into the Go binary:
+
+```go
+//go:embed frontend/dist
+var assets embed.FS
+```
+
+**Result:** Single executable with everything inside.
+
+### 4. Output
+
+**Single native binary:**
+- Windows: `myapp.exe` (~15MB)
+- macOS: `myapp.app` (~15MB)
+- Linux: `myapp` (~15MB)
+
+**No dependencies** (except system WebView).
+
+## Development vs Production
+
+
+
+ **Optimised for speed:**
+
+ ```bash
+ wails3 dev
+ ```
+
+ **What happens:**
+ 1. Starts frontend dev server (Vite on port 5173)
+ 2. Compiles Go without optimisations
+ 3. Launches app pointing to dev server
+ 4. Enables hot reload
+ 5. Includes source maps
+
+ **Characteristics:**
+ - **Fast rebuilds** (<1s for frontend changes)
+ - **No asset embedding** (served from dev server)
+ - **Debug symbols** included
+ - **Source maps** enabled
+ - **Verbose logging**
+
+ **File size:** Larger (~50MB with debug symbols)
+
+
+
+ **Optimised for size and performance:**
+
+ ```bash
+ wails3 build
+ ```
+
+ **What happens:**
+ 1. Builds frontend for production (minified)
+ 2. Compiles Go with optimisations
+ 3. Strips debug symbols
+ 4. Embeds assets
+ 5. Creates single binary
+
+ **Characteristics:**
+ - **Optimised code** (minified, tree-shaken)
+ - **Assets embedded** (no external files)
+ - **Debug symbols stripped**
+ - **No source maps**
+ - **Minimal logging**
+
+ **File size:** Smaller (~15MB)
+
+
+
+## Build Commands
+
+### Basic Build
+
+```bash
+wails3 build
+```
+
+**Output:** `build/bin/myapp[.exe]`
+
+### Build for Specific Platform
+
+```bash
+# Build for Windows (from any OS)
+wails3 build -platform windows/amd64
+
+# Build for macOS
+wails3 build -platform darwin/amd64
+wails3 build -platform darwin/arm64
+
+# Build for Linux
+wails3 build -platform linux/amd64
+```
+
+**Cross-compilation:** Build for any platform from any platform.
+
+### Build with Options
+
+```bash
+# Custom output directory
+wails3 build -o ./dist/myapp
+
+# Skip frontend build (use existing)
+wails3 build -skipbindings
+
+# Clean build (remove cache)
+wails3 build -clean
+
+# Verbose output
+wails3 build -v
+```
+
+### Build Modes
+
+```bash
+# Debug build (includes symbols)
+wails3 build -debug
+
+# Production build (default, optimised)
+wails3 build
+
+# Development build (fast, unoptimised)
+wails3 build -devbuild
+```
+
+## Build Configuration
+
+### Taskfile.yml
+
+Wails uses [Taskfile](https://taskfile.dev/) for build configuration:
+
+```yaml
+# Taskfile.yml
+version: '3'
+
+tasks:
+ build:
+ desc: Build the application
+ cmds:
+ - wails3 build
+
+ build:windows:
+ desc: Build for Windows
+ cmds:
+ - wails3 build -platform windows/amd64
+
+ build:macos:
+ desc: Build for macOS (Universal)
+ cmds:
+ - wails3 build -platform darwin/amd64
+ - wails3 build -platform darwin/arm64
+ - lipo -create -output build/bin/myapp.app build/bin/myapp-amd64.app build/bin/myapp-arm64.app
+
+ build:linux:
+ desc: Build for Linux
+ cmds:
+ - wails3 build -platform linux/amd64
+```
+
+**Run tasks:**
+
+```bash
+task build:windows
+task build:macos
+task build:linux
+```
+
+### Build Options File
+
+Create `build/build.json` for persistent configuration:
+
+```json
+{
+ "name": "My Application",
+ "version": "1.0.0",
+ "author": "Your Name",
+ "description": "Application description",
+ "icon": "build/appicon.png",
+ "outputFilename": "myapp",
+ "platforms": ["windows/amd64", "darwin/amd64", "linux/amd64"],
+ "frontend": {
+ "dir": "./frontend",
+ "install": "npm install",
+ "build": "npm run build",
+ "dev": "npm run dev"
+ },
+ "go": {
+ "ldflags": "-s -w -X main.version={{.Version}}"
+ }
+}
+```
+
+## Asset Embedding
+
+### How It Works
+
+Wails uses Go's `embed` package:
+
+```go
+package main
+
+import (
+ "embed"
+ "github.com/wailsapp/wails/v3/pkg/application"
+)
+
+//go:embed frontend/dist
+var assets embed.FS
+
+func main() {
+ app := application.New(application.Options{
+ Name: "My App",
+ Assets: application.AssetOptions{
+ Handler: application.AssetFileServerFS(assets),
+ },
+ })
+
+ app.Window.New()
+ app.Run()
+}
+```
+
+**At build time:**
+1. Frontend built to `frontend/dist/`
+2. `//go:embed` directive includes files
+3. Files compiled into binary
+4. Binary contains everything
+
+**At runtime:**
+1. App starts
+2. Assets served from memory
+3. No disk I/O for assets
+4. Fast loading
+
+### Custom Assets
+
+Embed additional files:
+
+```go
+//go:embed frontend/dist
+var frontendAssets embed.FS
+
+//go:embed data/*.json
+var dataAssets embed.FS
+
+//go:embed templates/*.html
+var templateAssets embed.FS
+```
+
+## Build Optimisations
+
+### Frontend Optimisations
+
+**Vite (default):**
+
+```javascript
+// vite.config.js
+export default {
+ build: {
+ minify: 'terser',
+ terserOptions: {
+ compress: {
+ drop_console: true, // Remove console.log
+ drop_debugger: true,
+ },
+ },
+ rollupOptions: {
+ output: {
+ manualChunks: {
+ vendor: ['react', 'react-dom'], // Separate vendor bundle
+ },
+ },
+ },
+ },
+}
+```
+
+**Results:**
+- JavaScript minified (~70% reduction)
+- CSS minified (~60% reduction)
+- Images optimised
+- Tree-shaking applied
+
+### Go Optimisations
+
+**Compiler flags:**
+
+```bash
+-ldflags="-s -w"
+```
+
+- `-s`: Strip symbol table (~10% reduction)
+- `-w`: Strip DWARF debug info (~20% reduction)
+
+**Additional optimisations:**
+
+```bash
+-ldflags="-s -w -X main.version=1.0.0"
+```
+
+- `-X`: Set variable values at build time
+- Useful for version numbers, build dates
+
+### Binary Compression
+
+**UPX (optional):**
+
+```bash
+# After building
+upx --best build/bin/myapp.exe
+```
+
+**Results:**
+- ~50% size reduction
+- Slightly slower startup (~100ms)
+- Not recommended for macOS (code signing issues)
+
+## Platform-Specific Builds
+
+### Windows
+
+**Output:** `myapp.exe`
+
+**Includes:**
+- Application icon
+- Version information
+- Manifest (UAC settings)
+
+**Icon:**
+
+```bash
+# Specify icon
+wails3 build -icon build/appicon.png
+```
+
+Wails converts PNG to `.ico` automatically.
+
+**Manifest:**
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### macOS
+
+**Output:** `myapp.app` (application bundle)
+
+**Structure:**
+
+```
+myapp.app/
+├── Contents/
+│ ├── Info.plist # App metadata
+│ ├── MacOS/
+│ │ └── myapp # Binary
+│ ├── Resources/
+│ │ └── icon.icns # Icon
+│ └── _CodeSignature/ # Code signature (if signed)
+```
+
+**Info.plist:**
+
+```xml
+
+
+
+
+ CFBundleName
+ My App
+ CFBundleIdentifier
+ com.example.myapp
+ CFBundleVersion
+ 1.0.0
+
+
+```
+
+**Universal Binary:**
+
+```bash
+# Build for both architectures
+wails3 build -platform darwin/amd64
+wails3 build -platform darwin/arm64
+
+# Combine into universal binary
+lipo -create -output myapp-universal \
+ build/bin/myapp-amd64 \
+ build/bin/myapp-arm64
+```
+
+### Linux
+
+**Output:** `myapp` (ELF binary)
+
+**Dependencies:**
+- GTK3
+- WebKitGTK
+
+**Desktop file:**
+
+```ini
+# myapp.desktop
+[Desktop Entry]
+Name=My App
+Exec=/usr/bin/myapp
+Icon=myapp
+Type=Application
+Categories=Utility;
+```
+
+**Installation:**
+
+```bash
+# Copy binary
+sudo cp myapp /usr/bin/
+
+# Copy desktop file
+sudo cp myapp.desktop /usr/share/applications/
+
+# Copy icon
+sudo cp icon.png /usr/share/icons/hicolor/256x256/apps/myapp.png
+```
+
+## Build Performance
+
+### Typical Build Times
+
+| Phase | Time | Notes |
+|-------|------|-------|
+| Analysis | <1s | Go code scanning |
+| Binding Generation | <1s | TypeScript generation |
+| Frontend Build | 5-30s | Depends on project size |
+| Go Compilation | 2-10s | Depends on code size |
+| Asset Embedding | <1s | Embedding frontend |
+| **Total** | **10-45s** | First build |
+| **Incremental** | **5-15s** | Subsequent builds |
+
+### Speeding Up Builds
+
+**1. Use build cache:**
+
+```bash
+# Go build cache is automatic
+# Frontend cache (Vite)
+npm run build # Uses cache by default
+```
+
+**2. Skip unchanged steps:**
+
+```bash
+# Skip frontend if unchanged
+wails3 build -skipbindings
+```
+
+**3. Parallel builds:**
+
+```bash
+# Build multiple platforms in parallel
+wails3 build -platform windows/amd64 &
+wails3 build -platform darwin/amd64 &
+wails3 build -platform linux/amd64 &
+wait
+```
+
+**4. Use faster tools:**
+
+```bash
+# Use esbuild instead of webpack
+# (Vite uses esbuild by default)
+```
+
+## Troubleshooting
+
+### Build Fails
+
+**Symptom:** `wails3 build` exits with error
+
+**Common causes:**
+
+1. **Go compilation error**
+ ```bash
+ # Check Go code compiles
+ go build
+ ```
+
+2. **Frontend build error**
+ ```bash
+ # Check frontend builds
+ cd frontend
+ npm run build
+ ```
+
+3. **Missing dependencies**
+ ```bash
+ # Install dependencies
+ npm install
+ go mod download
+ ```
+
+### Binary Too Large
+
+**Symptom:** Binary is >50MB
+
+**Solutions:**
+
+1. **Strip debug symbols** (should be automatic)
+ ```bash
+ wails3 build # Already includes -ldflags="-s -w"
+ ```
+
+2. **Check embedded assets**
+ ```bash
+ # Remove unnecessary files from frontend/dist/
+ # Check for large images, videos, etc.
+ ```
+
+3. **Use UPX compression**
+ ```bash
+ upx --best build/bin/myapp.exe
+ ```
+
+### Slow Builds
+
+**Symptom:** Builds take >1 minute
+
+**Solutions:**
+
+1. **Use build cache**
+ - Go cache is automatic
+ - Frontend cache (Vite) is automatic
+
+2. **Skip unchanged steps**
+ ```bash
+ wails3 build -skipbindings
+ ```
+
+3. **Optimise frontend build**
+ ```javascript
+ // vite.config.js
+ export default {
+ build: {
+ minify: 'esbuild', // Faster than terser
+ },
+ }
+ ```
+
+## Best Practices
+
+### ✅ Do
+
+- **Use `wails3 dev` during development** - Fast iteration
+- **Use `wails3 build` for releases** - Optimised output
+- **Version your builds** - Use `-ldflags` to embed version
+- **Test builds on target platforms** - Cross-compilation isn't perfect
+- **Keep frontend builds fast** - Optimise bundler config
+- **Use build cache** - Speeds up subsequent builds
+
+### ❌ Don't
+
+- **Don't commit `build/` directory** - Add to `.gitignore`
+- **Don't skip testing builds** - Always test before release
+- **Don't embed unnecessary assets** - Keep binaries small
+- **Don't use debug builds for production** - Use optimised builds
+- **Don't forget code signing** - Required for distribution
+
+## Next Steps
+
+**Building Applications** - Detailed guide to building and packaging
+[Learn More →](/guides/building)
+
+**Cross-Platform Builds** - Build for all platforms from one machine
+[Learn More →](/guides/cross-platform)
+
+**Creating Installers** - Create installers for end users
+[Learn More →](/guides/installers)
+
+---
+
+**Questions about building?** Ask in [Discord](https://discord.gg/JDdSxwjhGf) or check the [build examples](https://github.com/wailsapp/wails/tree/v3-alpha/v3/examples/build).
diff --git a/docs/ref/wails-v3/concepts/lifecycle.mdx b/docs/ref/wails-v3/concepts/lifecycle.mdx
new file mode 100644
index 0000000..c7f6c08
--- /dev/null
+++ b/docs/ref/wails-v3/concepts/lifecycle.mdx
@@ -0,0 +1,807 @@
+---
+title: Application Lifecycle
+description: Understanding the Wails application lifecycle from startup to shutdown
+sidebar:
+ order: 2
+---
+
+import { Tabs, TabItem } from "@astrojs/starlight/components";
+
+## Understanding Application Lifecycle
+
+Desktop applications have a lifecycle from startup to shutdown. Wails v3 provides **services**, **events**, and **hooks** to manage this lifecycle effectively.
+
+## The Lifecycle Stages
+
+```d2
+direction: down
+
+Start: "Application Start" {
+ shape: oval
+ style.fill: "#10B981"
+}
+
+Init: "Initialisation" {
+ Parse: "Parse Options" {
+ shape: rectangle
+ }
+ Register: "Register Services" {
+ shape: rectangle
+ }
+ Setup: "Setup Runtime" {
+ shape: rectangle
+ }
+}
+
+AppRun: "app.Run()" {
+ shape: rectangle
+ style.fill: "#3B82F6"
+}
+
+ServiceStartup: "Service Startup" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+}
+
+EventLoop: "Event Loop" {
+ Process: "Process Events" {
+ shape: rectangle
+ }
+ Handle: "Handle Messages" {
+ shape: rectangle
+ }
+ Update: "Update UI" {
+ shape: rectangle
+ }
+}
+
+QuitSignal: "Quit Signal" {
+ shape: diamond
+ style.fill: "#F59E0B"
+}
+
+ShouldQuit: "ShouldQuit Check" {
+ shape: rectangle
+ style.fill: "#3B82F6"
+}
+
+OnShutdown: "OnShutdown Callbacks" {
+ shape: rectangle
+ style.fill: "#3B82F6"
+}
+
+ServiceShutdown: "Service Shutdown" {
+ shape: rectangle
+ style.fill: "#8B5CF6"
+}
+
+Cleanup: "Cleanup" {
+ Close: "Close Windows" {
+ shape: rectangle
+ }
+ Release: "Release Resources" {
+ shape: rectangle
+ }
+}
+
+End: "Application End" {
+ shape: oval
+ style.fill: "#EF4444"
+}
+
+Start -> Init.Parse
+Init.Parse -> Init.Register
+Init.Register -> Init.Setup
+Init.Setup -> AppRun
+AppRun -> ServiceStartup
+ServiceStartup -> EventLoop.Process
+EventLoop.Process -> EventLoop.Handle
+EventLoop.Handle -> EventLoop.Update
+EventLoop.Update -> EventLoop.Process: "Loop"
+EventLoop.Process -> QuitSignal: "User quits"
+QuitSignal -> ShouldQuit: "Check allowed?"
+ShouldQuit -> EventLoop.Process: "Denied"
+ShouldQuit -> OnShutdown: "Allowed"
+OnShutdown -> ServiceShutdown
+ServiceShutdown -> Cleanup.Close
+Cleanup.Close -> Cleanup.Release
+Cleanup.Release -> End
+```
+
+### 1. Application Creation
+
+Create your application with `application.New()`:
+
+```go
+app := application.New(application.Options{
+ Name: "My App",
+ Description: "An application built with Wails",
+ Services: []application.Service{
+ application.NewService(&MyService{}),
+ },
+ Assets: application.AssetOptions{
+ Handler: application.BundledAssetFileServer(assets),
+ },
+})
+```
+
+**What happens:**
+1. Options are parsed and validated
+2. Services are registered (but not started yet)
+3. Asset server is configured
+4. Runtime is set up
+
+### 2. Running the Application
+
+Call `app.Run()` to start the application:
+
+```go
+err := app.Run() // Blocks until quit
+if err != nil {
+ log.Fatal(err)
+}
+```
+
+**What happens:**
+1. Services are started in registration order
+2. Event listeners are activated
+3. Windows can be created
+4. Event loop begins
+
+### 3. Event Loop
+
+The application enters the event loop where it spends most of its time:
+
+- OS events processed (mouse, keyboard, window events)
+- Go-to-JS messages handled
+- JS-to-Go calls executed
+- UI updates rendered
+
+### 4. Shutdown
+
+When the application quits:
+
+1. `ShouldQuit` callback is checked (if set)
+2. `OnShutdown` callbacks are executed
+3. Services are shut down in reverse order
+4. Windows are closed
+5. Resources are released
+
+## Services Lifecycle
+
+Services are the primary way to manage lifecycle in Wails v3. They provide startup and shutdown hooks through interfaces. For complete documentation on services, see the [Services guide](/features/bindings/services).
+
+### Creating a Service
+
+```go
+type MyService struct {
+ db *sql.DB
+}
+
+// ServiceStartup is called when the application starts
+func (s *MyService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
+ var err error
+ s.db, err = sql.Open("sqlite3", "app.db")
+ if err != nil {
+ return err // Startup aborts if error returned
+ }
+
+ // Run migrations
+ if err := s.runMigrations(); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// ServiceShutdown is called when the application shuts down
+func (s *MyService) ServiceShutdown() error {
+ if s.db != nil {
+ return s.db.Close()
+ }
+ return nil
+}
+```
+
+### Registering Services
+
+```go
+app := application.New(application.Options{
+ Services: []application.Service{
+ application.NewService(&MyService{}),
+ application.NewService(&AnotherService{}),
+ },
+})
+```
+
+**Key points:**
+- Services start in registration order
+- Services shut down in **reverse** registration order
+- If a service's `ServiceStartup` returns an error, the application aborts
+- The `ctx` passed to `ServiceStartup` is cancelled when shutdown begins
+
+### Using the Application Context
+
+The context passed to `ServiceStartup` is valid for the application's lifetime:
+
+```go
+func (s *MyService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
+ // Start a background task that respects shutdown
+ go func() {
+ ticker := time.NewTicker(5 * time.Minute)
+ defer ticker.Stop()
+
+ for {
+ select {
+ case <-ticker.C:
+ s.performBackgroundSync()
+ case <-ctx.Done():
+ // Application is shutting down
+ return
+ }
+ }
+ }()
+
+ return nil
+}
+```
+
+You can also access the context from the application instance:
+
+```go
+app := application.Get()
+ctx := app.Context()
+```
+
+## Application-Level Hooks
+
+These are convenience callbacks in `application.Options` that let you hook into the application lifecycle without creating a full service. They're useful for simple cleanup tasks, quit confirmation, or when you need to run code at specific points in the shutdown sequence.
+
+For more complex lifecycle management with startup logic, dependency injection, or stateful resources, use [Services](#services-lifecycle) instead.
+
+### ShouldQuit
+
+The `ShouldQuit` callback is called whenever a quit is requested—whether by the user closing the last window, pressing Cmd+Q (macOS) / Alt+F4 (Windows), or calling `app.Quit()` programmatically.
+
+**Return value:**
+- Return `true` to allow the quit to proceed (application will shut down)
+- Return `false` to cancel the quit (application continues running)
+
+This is your opportunity to intercept quit requests and optionally prevent them, for example to prompt the user about unsaved changes:
+
+```go
+app := application.New(application.Options{
+ ShouldQuit: func() bool {
+ if !hasUnsavedChanges() {
+ return true // No unsaved changes, allow quit
+ }
+
+ // Prompt the user
+ result, _ := application.QuestionDialog().
+ SetTitle("Unsaved Changes").
+ SetMessage("You have unsaved changes. Quit anyway?").
+ AddButton("Quit", "quit").
+ AddButton("Cancel", "cancel").
+ Show()
+
+ // Only quit if user clicked "Quit"
+ return result == "quit"
+ },
+})
+```
+
+If `ShouldQuit` is not set, the application will quit immediately when requested.
+
+**When ShouldQuit is called:**
+- User closes the last window (unless `DisableQuitOnLastWindowClosed` is set)
+- User presses Cmd+Q on macOS
+- User presses Alt+F4 on Windows (when focused on last window)
+- Code calls `app.Quit()`
+
+**When ShouldQuit is NOT called:**
+- The process is killed (SIGKILL, Task Manager force-quit)
+- `os.Exit()` is called directly
+
+### OnShutdown
+
+The `OnShutdown` callback is called when the application is confirmed to be quitting (after `ShouldQuit` returns `true`, if set). Use this for cleanup tasks like saving state, closing database connections, or releasing resources.
+
+```go
+app := application.New(application.Options{
+ OnShutdown: func() {
+ // Save application state
+ saveState()
+
+ // Close connections
+ cleanup()
+ },
+})
+```
+
+You can also register additional shutdown callbacks programmatically at any time during the application's lifecycle:
+
+```go
+app.OnShutdown(func() {
+ log.Println("Application shutting down...")
+})
+```
+
+Multiple callbacks are executed in the order they were registered. The shutdown process blocks until all callbacks complete.
+
+**Important:** Keep shutdown callbacks fast (under 1 second). The operating system may force-terminate applications that take too long to quit, which could interrupt your cleanup and cause data loss.
+
+### PostShutdown
+
+The `PostShutdown` callback is called after all shutdown tasks have completed, just before the process terminates. At this point, the application instance is no longer usable—windows are closed, services are shut down, and resources are released.
+
+This is primarily useful for:
+- Final logging that must happen after all other cleanup
+- Testing and debugging shutdown behaviour
+- Platforms where `app.Run()` doesn't return (the callback ensures your code runs)
+
+```go
+app := application.New(application.Options{
+ PostShutdown: func() {
+ // Final logging
+ log.Println("Application terminated cleanly")
+
+ // Flush any buffered logs
+ logger.Sync()
+ },
+})
+```
+
+**Note:** Do not attempt to use application features (windows, dialogs, etc.) in `PostShutdown`—they are no longer available.
+
+## Event-Based Lifecycle
+
+Wails provides an event system that notifies you when things happen in your application—windows opening, the application starting, theme changes, and more. You can listen to these events to react to lifecycle changes without blocking or intercepting them.
+
+For window events, you can also use `RegisterHook` instead of `OnWindowEvent` to intercept and cancel actions—for example, preventing a window from closing. See [Window Hooks](#window-hooks-cancellable-events) below.
+
+For full documentation on the event system, see the [Events guide](/features/events/system).
+
+### Application Events
+
+Listen to application lifecycle events:
+
+```go
+app.Event.OnApplicationEvent(events.Common.ApplicationStarted, func(event *application.ApplicationEvent) {
+ app.Logger.Info("Application has started!")
+})
+```
+
+Platform-specific events are also available:
+
+```go
+// macOS
+app.Event.OnApplicationEvent(events.Mac.ApplicationDidFinishLaunching, func(event *application.ApplicationEvent) {
+ // Handle macOS launch
+})
+
+app.Event.OnApplicationEvent(events.Mac.ApplicationWillTerminate, func(event *application.ApplicationEvent) {
+ // Handle macOS termination
+})
+
+// Windows
+app.Event.OnApplicationEvent(events.Windows.ApplicationStarted, func(event *application.ApplicationEvent) {
+ // Handle Windows start
+})
+```
+
+### Window Events
+
+Listen to window lifecycle events:
+
+```go
+window := app.Window.New()
+
+window.OnWindowEvent(events.Common.WindowFocus, func(e *application.WindowEvent) {
+ app.Logger.Info("Window gained focus")
+})
+
+window.OnWindowEvent(events.Common.WindowClosing, func(e *application.WindowEvent) {
+ app.Logger.Info("Window is closing")
+})
+```
+
+### Window Hooks (Cancellable Events)
+
+Use `RegisterHook` instead of `OnWindowEvent` when you need to **cancel** an event:
+
+```go
+window := app.Window.New()
+
+var countdown = 3
+
+window.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) {
+ countdown--
+ if countdown > 0 {
+ app.Logger.Info("Not closing yet!", "remaining", countdown)
+ e.Cancel() // Prevent the window from closing
+ return
+ }
+ app.Logger.Info("Window closing now")
+})
+```
+
+**Difference between OnWindowEvent and RegisterHook:**
+- `OnWindowEvent`: Notifies you when an event happens (cannot cancel)
+- `RegisterHook`: Lets you intercept and potentially cancel the event
+
+## Window Lifecycle
+
+Windows have their own lifecycle, from creation through to destruction. Each window loads its frontend content independently and can be shown, hidden, or closed at any time. When a user attempts to close a window, you can intercept this with a `RegisterHook` to prompt for confirmation or hide the window instead of destroying it.
+
+For complete window documentation, see the [Windows guide](/features/windows/basics).
+
+```d2
+direction: down
+
+Create: "Create Window" {
+ shape: oval
+ style.fill: "#10B981"
+}
+
+Load: "Load Frontend" {
+ shape: rectangle
+}
+
+Show: "Show Window" {
+ shape: rectangle
+}
+
+Active: "Window Active" {
+ Events: "Handle Events" {
+ shape: rectangle
+ }
+}
+
+CloseRequest: "Close Request" {
+ shape: diamond
+ style.fill: "#F59E0B"
+}
+
+Hook: "WindowClosing Hook" {
+ shape: rectangle
+ style.fill: "#3B82F6"
+}
+
+Destroy: "Destroy Window" {
+ shape: rectangle
+}
+
+End: "Window Closed" {
+ shape: oval
+ style.fill: "#EF4444"
+}
+
+Create -> Load
+Load -> Show
+Show -> Active.Events
+Active.Events -> Active.Events: "Loop"
+Active.Events -> CloseRequest: "User closes"
+CloseRequest -> Hook
+Hook -> Active.Events: "Cancelled"
+Hook -> Destroy: "Allowed"
+Destroy -> End
+```
+
+### Creating Windows
+
+```go
+window := app.Window.NewWithOptions(application.WebviewWindowOptions{
+ Title: "My Window",
+ Width: 800,
+ Height: 600,
+})
+```
+
+### Preventing Window Close
+
+```go
+window.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) {
+ if hasUnsavedChanges() {
+ // Show dialog
+ result, _ := application.QuestionDialog().
+ SetTitle("Unsaved Changes").
+ SetMessage("Save before closing?").
+ AddButton("Save", "save").
+ AddButton("Discard", "discard").
+ AddButton("Cancel", "cancel").
+ Show()
+
+ switch result {
+ case "save":
+ saveChanges()
+ // Allow close
+ case "cancel":
+ e.Cancel() // Prevent close
+ }
+ // "discard" falls through and allows close
+ }
+})
+```
+
+### Hide Instead of Close
+
+A common pattern for system tray apps:
+
+```go
+window.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) {
+ window.Hide() // Hide instead of destroy
+ e.Cancel() // Prevent actual close
+})
+```
+
+## Multi-Window Lifecycle
+
+With multiple windows:
+
+```go
+mainWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
+ Title: "Main Window",
+})
+
+settingsWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
+ Title: "Settings",
+ Width: 400,
+ Height: 600,
+ Hidden: true, // Start hidden
+})
+```
+
+**Default behaviour varies by platform:**
+
+| Platform | Default when last window closes |
+|----------|--------------------------------|
+| macOS | App stays running (menu bar remains) |
+| Windows | App quits |
+| Linux | App quits |
+
+macOS follows native platform conventions where applications typically remain active in the menu bar even with no windows. Windows and Linux quit by default.
+
+**Make all platforms quit when last window closes:**
+
+```go
+app := application.New(application.Options{
+ Mac: application.MacOptions{
+ ApplicationShouldTerminateAfterLastWindowClosed: true,
+ },
+})
+```
+
+**Make all platforms stay running when last window closes:**
+
+This is useful for system tray applications or apps that should remain running in the background.
+
+```go
+app := application.New(application.Options{
+ Windows: application.WindowsOptions{
+ DisableQuitOnLastWindowClosed: true,
+ },
+ Linux: application.LinuxOptions{
+ DisableQuitOnLastWindowClosed: true,
+ },
+})
+```
+
+## Common Patterns
+
+### Pattern 1: Database Service
+
+```go
+type DatabaseService struct {
+ db *sql.DB
+}
+
+func (s *DatabaseService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
+ var err error
+ s.db, err = sql.Open("sqlite3", "app.db")
+ if err != nil {
+ return fmt.Errorf("failed to open database: %w", err)
+ }
+
+ if err := s.db.PingContext(ctx); err != nil {
+ return fmt.Errorf("failed to connect to database: %w", err)
+ }
+
+ return nil
+}
+
+func (s *DatabaseService) ServiceShutdown() error {
+ if s.db != nil {
+ return s.db.Close()
+ }
+ return nil
+}
+
+// Exported methods are available to the frontend
+func (s *DatabaseService) GetUsers() ([]User, error) {
+ // Query implementation
+}
+```
+
+### Pattern 2: Configuration Service
+
+```go
+type ConfigService struct {
+ config *Config
+ path string
+}
+
+func (s *ConfigService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
+ s.path = "config.json"
+
+ data, err := os.ReadFile(s.path)
+ if err != nil {
+ if os.IsNotExist(err) {
+ s.config = &Config{} // Default config
+ return nil
+ }
+ return err
+ }
+
+ return json.Unmarshal(data, &s.config)
+}
+
+func (s *ConfigService) ServiceShutdown() error {
+ data, err := json.MarshalIndent(s.config, "", " ")
+ if err != nil {
+ return err
+ }
+ return os.WriteFile(s.path, data, 0644)
+}
+```
+
+### Pattern 3: Background Worker
+
+```go
+type WorkerService struct {
+ cancel context.CancelFunc
+}
+
+func (s *WorkerService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
+ workerCtx, cancel := context.WithCancel(ctx)
+ s.cancel = cancel
+
+ go s.runWorker(workerCtx)
+
+ return nil
+}
+
+func (s *WorkerService) ServiceShutdown() error {
+ if s.cancel != nil {
+ s.cancel()
+ }
+ return nil
+}
+
+func (s *WorkerService) runWorker(ctx context.Context) {
+ ticker := time.NewTicker(time.Minute)
+ defer ticker.Stop()
+
+ for {
+ select {
+ case <-ticker.C:
+ s.doWork()
+ case <-ctx.Done():
+ return
+ }
+ }
+}
+```
+
+## Lifecycle Reference
+
+| Hook/Interface | When Called | Can Cancel? | Use For |
+|----------------|-------------|-------------|---------|
+| `ServiceStartup` | During `app.Run()`, before event loop | No (return error to abort) | Initialisation |
+| `ServiceShutdown` | During shutdown, after `OnShutdown` | No | Cleanup |
+| `OnShutdown` | When quit confirmed | No | Application cleanup |
+| `ShouldQuit` | When quit requested | Yes (return false) | Confirm quit |
+| `RegisterHook(WindowClosing)` | When window close requested | Yes (`e.Cancel()`) | Prevent window close |
+| `OnWindowEvent` | When event occurs | No | React to events |
+| `OnApplicationEvent` | When event occurs | No | React to events |
+
+## Platform Differences
+
+### macOS
+
+- **Application menu** persists even with no windows
+- **Cmd+Q** triggers quit (goes through `ShouldQuit`)
+- **Dock icon** remains unless hidden
+- Use `ApplicationShouldTerminateAfterLastWindowClosed` to control quit behaviour
+
+### Windows
+
+- **No application menu** without a window
+- **Alt+F4** closes window (can be prevented with `RegisterHook`)
+- **System tray** can keep app running
+
+### Linux
+
+- **Behaviour varies** by desktop environment
+- **Generally similar to Windows**
+
+## Debugging Lifecycle Issues
+
+### Problem: Application Won't Quit
+
+**Causes:**
+1. `ShouldQuit` returning `false`
+2. `OnShutdown` taking too long
+3. Background goroutines not stopping
+
+**Solution:**
+
+```go
+// 1. Check ShouldQuit logic
+ShouldQuit: func() bool {
+ log.Println("ShouldQuit called")
+ return true
+}
+
+// 2. Keep OnShutdown fast
+OnShutdown: func() {
+ log.Println("OnShutdown started")
+ // Fast cleanup only
+ log.Println("OnShutdown finished")
+}
+
+// 3. Use context for background tasks
+func (s *MyService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
+ go func() {
+ <-ctx.Done()
+ log.Println("Context cancelled, stopping background work")
+ }()
+ return nil
+}
+```
+
+### Problem: Service Startup Fails
+
+**Solution:** Return descriptive errors:
+
+```go
+func (s *MyService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
+ if err := s.init(); err != nil {
+ return fmt.Errorf("failed to initialise: %w", err)
+ }
+ return nil
+}
+```
+
+The error will be logged and the application will not start.
+
+## Best Practices
+
+### Do
+
+- **Use services for lifecycle management** - They provide proper startup/shutdown hooks
+- **Keep shutdown fast** - Target under 1 second for all cleanup
+- **Use context for cancellation** - Stop background tasks properly
+- **Handle errors in startup** - Return errors to abort cleanly
+- **Log lifecycle events** - Helps with debugging
+
+### Don't
+
+- **Don't block in service startup** - Keep initialisation fast (under 2 seconds)
+- **Don't show dialogs in shutdown** - App is quitting, UI may not work
+- **Don't ignore the context** - Always check `ctx.Done()` in goroutines
+- **Don't leak resources** - Always implement `ServiceShutdown`
+
+## Next Steps
+
+**Services** - Learn more about the service system
+[Learn More →](/features/services)
+
+**Events System** - Use events for communication
+[Learn More →](/features/events/system)
+
+**Window Management** - Create and manage windows
+[Learn More →](/features/windows/basics)
+
+---
+
+**Questions about lifecycle?** Ask in [Discord](https://discord.gg/JDdSxwjhGf) or check the [examples](https://github.com/wailsapp/wails/tree/v3-alpha/v3/examples).
diff --git a/docs/ref/wails-v3/concepts/manager-api.mdx b/docs/ref/wails-v3/concepts/manager-api.mdx
new file mode 100644
index 0000000..26f6de9
--- /dev/null
+++ b/docs/ref/wails-v3/concepts/manager-api.mdx
@@ -0,0 +1,266 @@
+---
+title: Manager API
+description: Organized API structure with focused manager interfaces
+sidebar:
+ order: 2
+---
+
+import { Tabs, TabItem } from "@astrojs/starlight/components";
+
+The Wails v3 Manager API provides an organized and discoverable way to access application functionality through focused manager structs. This new API structure groups related methods together while maintaining full backward compatibility with the traditional App API.
+
+## Overview
+
+The Manager API organizes application functionality into eleven focused areas:
+
+- **`app.Window`** - Window creation, management, and callbacks
+- **`app.ContextMenu`** - Context menu registration and management
+- **`app.KeyBinding`** - Global key binding management
+- **`app.Browser`** - Browser integration (opening URLs and files)
+- **`app.Env`** - Environment information and system state
+- **`app.Dialog`** - File and message dialog operations
+- **`app.Event`** - Custom event handling and application events
+- **`app.Menu`** - Application menu management
+- **`app.Screen`** - Screen management and coordinate transformations
+- **`app.Clipboard`** - Clipboard text operations
+- **`app.SystemTray`** - System tray icon creation and management
+
+## Benefits
+
+- **Better discoverability** - IDE autocomplete shows organized API surface
+- **Improved code organization** - Related methods grouped together
+- **Enhanced maintainability** - Separation of concerns across managers
+- **Future extensibility** - Easier to add new features to specific areas
+
+## Usage
+
+The Manager API provides organized access to all application functionality:
+
+```go
+// Events and custom event handling
+app.Event.Emit("custom", data)
+app.Event.On("custom", func(e *CustomEvent) { ... })
+
+// Window management
+window, _ := app.Window.GetByName("main")
+app.Window.OnCreate(func(window Window) { ... })
+
+// Browser integration
+app.Browser.OpenURL("https://wails.io")
+
+// Menu management
+menu := app.Menu.New()
+app.Menu.Set(menu)
+
+// System tray
+systray := app.SystemTray.New()
+```
+
+## Manager Reference
+
+### Window Manager
+
+Manages window creation, retrieval, and lifecycle callbacks.
+
+```go
+// Create windows
+window := app.Window.New()
+window := app.Window.NewWithOptions(options)
+current := app.Window.Current()
+
+// Find windows
+window, exists := app.Window.GetByName("main")
+windows := app.Window.GetAll()
+
+// Window callbacks
+app.Window.OnCreate(func(window Window) {
+ // Handle window creation
+})
+```
+
+### Event Manager
+
+Handles custom events and application event listening.
+
+```go
+// Custom events
+app.Event.Emit("userAction", data)
+cancelFunc := app.Event.On("userAction", func(e *CustomEvent) {
+ // Handle event
+})
+app.Event.Off("userAction")
+app.Event.Reset() // Remove all listeners
+
+// Application events
+app.Event.OnApplicationEvent(events.Common.ThemeChanged, func(e *ApplicationEvent) {
+ // Handle system theme change
+})
+```
+
+### Browser Manager
+
+Provides browser integration for opening URLs and files.
+
+```go
+// Open URLs and files in default browser
+err := app.Browser.OpenURL("https://wails.io")
+err := app.Browser.OpenFile("/path/to/document.pdf")
+```
+
+### Environment Manager
+
+Access to system environment information.
+
+```go
+// Get environment info
+env := app.Env.Info()
+fmt.Printf("OS: %s, Arch: %s\n", env.OS, env.Arch)
+
+// Check system theme
+if app.Env.IsDarkMode() {
+ // Dark mode is active
+}
+
+// Open file manager
+err := app.Env.OpenFileManager("/path/to/folder", false)
+```
+
+### Dialog Manager
+
+Organized access to file and message dialogs.
+
+```go
+// File dialogs
+result, err := app.Dialog.OpenFile().
+ AddFilter("Text Files", "*.txt").
+ PromptForSingleSelection()
+
+result, err = app.Dialog.SaveFile().
+ SetDefaultFilename("document.txt").
+ PromptForSingleSelection()
+
+// Message dialogs
+app.Dialog.Info().
+ SetTitle("Information").
+ SetMessage("Operation completed successfully").
+ Show()
+
+app.Dialog.Error().
+ SetTitle("Error").
+ SetMessage("An error occurred").
+ Show()
+```
+
+### Menu Manager
+
+Application menu creation and management.
+
+```go
+// Create and set application menu
+menu := app.Menu.New()
+fileMenu := menu.AddSubmenu("File")
+fileMenu.Add("New").OnClick(func(ctx *Context) {
+ // Handle menu click
+})
+
+app.Menu.Set(menu)
+
+// Show about dialog
+app.Menu.ShowAbout()
+```
+
+### Key Binding Manager
+
+Dynamic management of global key bindings.
+
+```go
+// Add key bindings
+app.KeyBinding.Add("ctrl+n", func(window *WebviewWindow) {
+ // Handle Ctrl+N
+})
+
+app.KeyBinding.Add("ctrl+q", func(window *WebviewWindow) {
+ app.Quit()
+})
+
+// Remove key bindings
+app.KeyBinding.Remove("ctrl+n")
+
+// Get all bindings
+bindings := app.KeyBinding.GetAll()
+```
+
+### Context Menu Manager
+
+Advanced context menu management (for library authors).
+
+```go
+// Create and register context menu
+menu := app.ContextMenu.New()
+app.ContextMenu.Add("myMenu", menu)
+
+// Retrieve context menu
+menu, exists := app.ContextMenu.Get("myMenu")
+
+// Remove context menu
+app.ContextMenu.Remove("myMenu")
+```
+
+### Screen Manager
+
+Screen management and coordinate transformations for multi-monitor setups.
+
+```go
+// Get screen information
+screens := app.Screen.GetAll()
+primary := app.Screen.GetPrimary()
+
+// Coordinate transformations
+physicalPoint := app.Screen.DipToPhysicalPoint(logicalPoint)
+logicalPoint := app.Screen.PhysicalToDipPoint(physicalPoint)
+
+// Screen detection
+screen := app.Screen.ScreenNearestDipPoint(point)
+screen = app.Screen.ScreenNearestDipRect(rect)
+```
+
+### Clipboard Manager
+
+Clipboard operations for reading and writing text.
+
+```go
+// Set text to clipboard
+success := app.Clipboard.SetText("Hello World")
+if !success {
+ // Handle error
+}
+
+// Get text from clipboard
+text, ok := app.Clipboard.Text()
+if !ok {
+ // Handle error
+} else {
+ // Use the text
+}
+```
+
+### SystemTray Manager
+
+System tray icon creation and management.
+
+```go
+// Create system tray
+systray := app.SystemTray.New()
+systray.SetLabel("My App")
+systray.SetIcon(iconBytes)
+
+// Add menu to system tray
+menu := app.Menu.New()
+menu.Add("Open").OnClick(func(ctx *Context) {
+ // Handle click
+})
+systray.SetMenu(menu)
+
+// Destroy system tray when done
+systray.Destroy()
+```
\ No newline at end of file
diff --git a/docs/ref/wails-v3/contributing.mdx b/docs/ref/wails-v3/contributing.mdx
new file mode 100644
index 0000000..841c302
--- /dev/null
+++ b/docs/ref/wails-v3/contributing.mdx
@@ -0,0 +1,275 @@
+---
+title: Contributing
+description: Contribute to Wails
+sidebar:
+ order: 100
+---
+
+import { Card, CardGrid } from "@astrojs/starlight/components";
+
+## Welcome Contributors!
+
+We welcome contributions to Wails! Whether you're fixing bugs, adding features, or improving documentation, your help is appreciated.
+
+## Ways to Contribute
+
+### 1. Report Issues
+
+Found a bug? [Open an issue](https://github.com/wailsapp/wails/issues/new) with:
+- Clear description
+- Steps to reproduce
+- Expected vs actual behaviour
+- System information
+- Code samples
+
+### 2. Improve Documentation
+
+Documentation improvements are always welcome:
+- Fix typos and errors
+- Add examples
+- Clarify explanations
+- Translate content
+
+### 3. Submit Code
+
+Contribute code through pull requests:
+- Bug fixes
+- New features
+- Performance improvements
+- Tests
+
+## Getting Started
+
+### Fork and Clone
+
+```bash
+# Fork the repository on GitHub
+# Then clone your fork
+git clone https://github.com/YOUR_USERNAME/wails.git
+cd wails
+
+# Add upstream remote
+git remote add upstream https://github.com/wailsapp/wails.git
+```
+
+### Build from Source
+
+```bash
+# Install dependencies
+go mod download
+
+# Build Wails CLI
+cd v3/cmd/wails3
+go build
+
+# Test your build
+./wails3 version
+```
+
+### Run Tests
+
+```bash
+# Run all tests
+go test ./...
+
+# Run specific package tests
+go test ./v3/pkg/application
+
+# Run with coverage
+go test -cover ./...
+```
+
+## Making Changes
+
+### Create a Branch
+
+```bash
+# Update main
+git checkout main
+git pull upstream main
+
+# Create feature branch
+git checkout -b feature/my-feature
+```
+
+### Make Your Changes
+
+1. **Write code** following Go conventions
+2. **Add tests** for new functionality
+3. **Update documentation** if needed
+4. **Run tests** to ensure nothing breaks
+5. **Commit changes** with clear messages
+
+### Commit Guidelines
+
+```bash
+# Good commit messages
+git commit -m "fix: resolve window focus issue on macOS"
+git commit -m "feat: add support for custom window chrome"
+git commit -m "docs: improve bindings documentation"
+
+# Use conventional commits:
+# - feat: New feature
+# - fix: Bug fix
+# - docs: Documentation
+# - test: Tests
+# - refactor: Code refactoring
+# - chore: Maintenance
+```
+
+### Submit Pull Request
+
+```bash
+# Push to your fork
+git push origin feature/my-feature
+
+# Open pull request on GitHub
+# Provide clear description
+# Reference related issues
+```
+
+## Pull Request Guidelines
+
+### Good PR Description
+
+```markdown
+## Description
+Brief description of changes
+
+## Changes
+- Added feature X
+- Fixed bug Y
+- Updated documentation
+
+## Testing
+- Tested on macOS 14
+- Tested on Windows 11
+- All tests passing
+
+## Related Issues
+Fixes #123
+```
+
+### PR Checklist
+
+- [ ] Code follows Go conventions
+- [ ] Tests added/updated
+- [ ] Documentation updated
+- [ ] All tests passing
+- [ ] No breaking changes (or documented)
+- [ ] Commit messages clear
+
+## Code Guidelines
+
+### Go Code Style
+
+```go
+// ✅ Good: Clear, documented, tested
+// ProcessData processes the input data and returns the result.
+// It returns an error if the data is invalid.
+func ProcessData(data string) (string, error) {
+ if data == "" {
+ return "", errors.New("data cannot be empty")
+ }
+
+ result := process(data)
+ return result, nil
+}
+
+// ❌ Bad: No docs, no error handling
+func ProcessData(data string) string {
+ return process(data)
+}
+```
+
+### Testing
+
+```go
+func TestProcessData(t *testing.T) {
+ tests := []struct {
+ name string
+ input string
+ want string
+ wantErr bool
+ }{
+ {"valid input", "test", "processed", false},
+ {"empty input", "", "", true},
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got, err := ProcessData(tt.input)
+ if (err != nil) != tt.wantErr {
+ t.Errorf("ProcessData() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+ if got != tt.want {
+ t.Errorf("ProcessData() = %v, want %v", got, tt.want)
+ }
+ })
+ }
+}
+```
+
+## Documentation
+
+### Writing Docs
+
+Documentation uses Starlight (Astro):
+
+```bash
+cd docs
+npm install
+npm run dev
+```
+
+### Documentation Style
+
+- Use International English spelling
+- Start with the problem
+- Provide working examples
+- Include troubleshooting
+- Cross-reference related content
+
+## Community
+
+### Get Help
+
+- **Discord:** [Join our community](https://discord.gg/JDdSxwjhGf)
+- **GitHub Discussions:** Ask questions
+- **GitHub Issues:** Report bugs
+
+### Code of Conduct
+
+Be respectful, inclusive, and professional. We're all here to build great software together.
+
+## Recognition
+
+Contributors are recognised in:
+- Release notes
+- Contributors list
+- GitHub insights
+
+Thank you for contributing to Wails! 🎉
+
+## Next Steps
+
+
+
+ Visit the Wails repository.
+
+ [View on GitHub →](https://github.com/wailsapp/wails)
+
+
+
+ Join the community.
+
+ [Join Discord →](https://discord.gg/JDdSxwjhGf)
+
+
+
+ Read the docs.
+
+ [Browse Docs →](/quick-start/why-wails)
+
+
diff --git a/docs/ref/wails-v3/contributing/architecture.mdx b/docs/ref/wails-v3/contributing/architecture.mdx
new file mode 100644
index 0000000..ed4dab2
--- /dev/null
+++ b/docs/ref/wails-v3/contributing/architecture.mdx
@@ -0,0 +1,99 @@
+---
+title: Wails v3 Architecture
+description: Deep-dive diagrams and explanations of every moving part inside Wails v3
+sidebar:
+ order: 1
+---
+
+
+Wails v3 is a **full-stack desktop framework** consisting of a Go runtime,
+a JavaScript bridge, a task-driven tool-chain and a collection of templates that
+let you ship native applications powered by modern web tech.
+
+This page presents the *big picture* in four diagrams:
+
+1. **Overall Architecture** – how every subsystem connects
+2. **Runtime Flow** – what happens when JS calls Go and vice-versa
+3. **Development vs Production** – two modes of the asset server
+4. **Platform Implementations** – where OS-specific code lives
+
+---
+
+## 1 · Overall Architecture
+
+**Wails v3 – High-Level Stack**
+
+{/*
+TODO: Fix D2 diagram generation (triple quotes for multi-line strings) or embed as image.
+The previous D2 code block was causing MDX parsing errors in the build pipeline.
+*/}
+
+**[High-Level Stack Diagram Placeholder]**
+
+---
+
+## 2 · Runtime Call Flow
+
+**Runtime – JavaScript ⇄ Go Calling Path**
+
+{/*
+TODO: Fix D2 diagram generation (triple quotes for multi-line strings) or embed as image.
+The previous D2 code block was causing MDX parsing errors in the build pipeline.
+*/}
+
+**[Runtime Call Flow Diagram Placeholder]**
+
+Key points:
+
+* **No HTTP / IPC** – the bridge uses the native WebView’s in-memory channel
+* **Method IDs** – deterministic FNV-hash enables O(1) lookup in Go
+* **Promises** – errors propagate as rejections with stack & code
+
+---
+
+## 3 · Development vs Production Asset Flow
+
+**Dev ↔ Prod Asset Server**
+
+{/*
+TODO: Fix D2 diagram generation (triple quotes for multi-line strings) or embed as image.
+The previous D2 code block was causing MDX parsing errors in the build pipeline.
+*/}
+
+**[Asset Flow Diagram Placeholder]**
+
+* In **dev** the server proxies unknown paths to the framework’s live-reload
+ server and serves static assets from disk.
+* In **prod** the same API is backed by `go:embed`, producing a zero-dependency
+ binary.
+
+---
+
+## 4 · Platform-Specific Runtime Split
+
+**Per-OS Runtime Files**
+
+{/*
+TODO: Fix D2 diagram generation (triple quotes for multi-line strings) or embed as image.
+The previous D2 code block was causing MDX parsing errors in the build pipeline.
+*/}
+
+**[Platform Split Diagram Placeholder]**
+
+Every feature follows this pattern:
+
+1. **Common interface** in `pkg/application`
+2. **Message processor** entry in `pkg/application/messageprocessor_*.go`
+3. **Implementation** per OS under `internal/runtime/*.go` guarded by build tags
+
+Missing functionality on an OS should return `ErrCapability` and register
+availability via `internal/capabilities`.
+
+---
+
+## Summary
+
+These diagrams outline **where the code lives**, **how data moves**, and
+**which layers own which responsibilities**.
+Keep them handy while exploring the detailed pages that follow – they are your
+map to the Wails v3 source tree.
diff --git a/docs/ref/wails-v3/contributing/architecture/bindings.mdx b/docs/ref/wails-v3/contributing/architecture/bindings.mdx
new file mode 100644
index 0000000..9cfcfa2
--- /dev/null
+++ b/docs/ref/wails-v3/contributing/architecture/bindings.mdx
@@ -0,0 +1,156 @@
+---
+title: Binding System
+description: How the binding system collects, processes, and generates JavaScript/TypeScript code
+sidebar:
+ order: 1
+---
+
+import { FileTree } from "@astrojs/starlight/components";
+
+This guide explains how the Wails binding system works internally, providing insights for developers who want to understand the mechanics behind the automatic code generation.
+
+## Architecture Overview
+
+The Wails binding system consists of three main components:
+
+1. **Collection**: Analyzes Go code to extract information about services, models, and other declarations
+2. **Configuration**: Manages settings and options for the binding generation process
+3. **Rendering**: Generates JavaScript/TypeScript code based on the collected information
+
+
+- internal/generator/
+ - collect/ # Package analysis and information extraction
+ - config/ # Configuration structures and interfaces
+ - render/ # Code generation for JS/TS
+
+
+## Collection Process
+
+The collection process is responsible for analyzing Go packages and extracting information about services, models, and other declarations. This is handled by the `collect` package.
+
+### Key Components
+
+- **Collector**: Manages package information and caches collected data
+- **Package**: Represents a Go package being analyzed and stores collected services, models, and directives
+- **Service**: Collects information about service types and their methods
+- **Model**: Collects detailed information about model types, including fields, values, and type parameters
+- **Directive**: Parses and interprets `//wails:` directives in Go source code
+
+### Collection Flow
+
+1. The collector scans the Go packages specified in the project
+2. It identifies service types (structs with methods that will be exposed to the frontend)
+3. For each service, it collects information about its methods
+4. It identifies model types (structs used as parameters or return values in service methods)
+5. For each model, it collects information about its fields and type parameters
+6. It processes any `//wails:` directives found in the code
+
+## Rendering Process
+
+The rendering process is responsible for generating JavaScript/TypeScript code based on the collected information. This is handled by the `render` package.
+
+### Key Components
+
+- **Renderer**: Orchestrates the rendering of service, model, and index files
+- **Module**: Represents a single generated JavaScript/TypeScript module
+- **Templates**: Text templates used for code generation
+
+### Rendering Flow
+
+1. For each service, the renderer generates a JavaScript/TypeScript file with functions that mirror the service methods
+2. For each model, the renderer generates a JavaScript/TypeScript class that mirrors the model struct
+3. The renderer generates index files that re-export all services and models
+4. The renderer applies any custom code injections specified by `//wails:inject` directives
+
+## Type Mapping
+
+One of the most important aspects of the binding system is how Go types are mapped to JavaScript/TypeScript types. Here's a summary of the mapping:
+
+| Go Type | JavaScript Type | TypeScript Type |
+|---------|----------------|----------------|
+| `bool` | `boolean` | `boolean` |
+| `int`, `int8`, `int16`, `int32`, `int64`, `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `float32`, `float64` | `number` | `number` |
+| `string` | `string` | `string` |
+| `[]byte` | `Uint8Array` | `Uint8Array` |
+| `[]T` | `Array` | `T[]` |
+| `map[K]V` | `Object` | `Record` |
+| `struct` | `Object` | Custom class |
+| `interface{}` | `any` | `any` |
+| `*T` | `T \| null` | `T \| null` |
+| `func` | Not supported | Not supported |
+| `chan` | Not supported | Not supported |
+
+## Directives System
+
+The binding system supports several directives that can be used to customize the generated code. These directives are added as comments in your Go code.
+
+### Available Directives
+
+- `//wails:inject`: Injects custom JavaScript/TypeScript code into the generated bindings
+- `//wails:include`: Includes additional files with the generated bindings
+- `//wails:internal`: Marks a type or method as internal, preventing it from being exported to the frontend
+- `//wails:ignore`: Completely ignores a method during binding generation
+- `//wails:id`: Specifies a custom ID for a method, overriding the default hash-based ID
+
+### Directive Processing
+
+1. During the collection phase, the collector identifies and parses directives in the Go code
+2. The directives are stored with the corresponding declarations (services, methods, models, etc.)
+3. During the rendering phase, the renderer applies the directives to customize the generated code
+
+## Advanced Features
+
+### Conditional Code Generation
+
+The binding system supports conditional code generation using a two-character condition prefix for `include` and `inject` directives:
+
+```
+
+
+
+