--- title: Codebase Layout description: How the Wails v3 repository is organised and how the pieces fit together sidebar: order: 2 --- Wails v3 lives in a **monorepo** that contains the framework runtime, CLI, examples, documentation, and build tool-chain. This page walks through the *directory structure* that matters to anyone digging into the internals. ## Top-Level View ``` wails/ ├── v3/ # ⬅️ Everything specific to Wails v3 lives here ├── v2/ # Legacy v2 implementation (can be ignored for v3 work) ├── docs/ # Astro-powered v3 docs site (this page!) ├── website/ # Docusaurus v2 site and marketing pages (main site) ├── scripts/ # Misc helper scripts (e.g. sponsor image generator) ├── mkdocs-website/ # Deprecated v3 docs prototype └── *.md # Project-wide meta files (CHANGELOG, LICENSE, …) ``` From here on, we zoom into the **`v3/`** tree. ## `v3/` Root ``` v3/ ├── cmd/ # Compilable commands (currently only wails3 CLI) ├── examples/ # Hands-on sample apps testing every feature ├── internal/ # Framework implementation (not public API) ├── pkg/ # Public Go packages ‑ the API surface ├── tasks/ # Taskfile-based release utilities ├── templates/ # RFC-style proposals (WEP) + common assets ├── go.mod └── go.sum ``` ### Mental Model 1. **`pkg/`** exposes *what application developers import* 2. **`internal/`** contains *how the magic is implemented* 3. **`cmd/wails3`** drives *project lifecycle & builds* 4. **`examples/`** double as *living tests* and *reference code* Everything else supports those three pillars. --- ## `cmd/` – Commands | Path | Notes | |------|-------| | `v3/cmd/wails3` | The **CLI entrypoint**. A tiny `main.go` delegates all logic to packages in `internal/commands`. | | `internal/commands/*` | Sub-commands (init, dev, build, doctor, …). Each lives in its own file for easy discoverability. | | `internal/commands/task_wrapper.go` | Bridges between CLI flags and the Taskfile build pipeline. | The CLI owns: * **Project scaffolding** (`init`, template generation) * **Dev server orchestration** (`dev`, live-reload) * **Production builds & packaging** (`build`, `package`, platform wrappers) * **Diagnostics** (`doctor`) --- ## `internal/` – The Engine Room ``` internal/ ├── assetserver/ # Serving & embedding web assets ├── buildinfo/ # Reproducible build metadata ├── commands/ # CLI mechanics (see above) ├── runtime/ # Desktop runtime (per-platform) ├── generator/ # Static analysis & binding generator ├── templates/ # Project templates (frontend stacks) ├── packager/ # Linux AppImage/deb/rpm, Windows MSI, macOS DMG ├── capabilities/ # Host OS capability probing ├── dbus/ # Linux system tray integration ├── service/ # IPC micro-services framework └── ... # [other helper sub-packages] ``` ### Key Sub-Packages | Package | Responsibility | Where It Connects | |---------|----------------|-------------------| | `runtime` | Window/event loop, clipboard, dialogs, system tray. One file per OS with build-tags (`*_darwin.go`, `*_linux.go`, …). | Called by `pkg/application` and message processor. | | `assetserver` | Dual-mode file server:
• Dev: serves from disk & proxies Vite
• Prod: embeds assets via `go:embed` | Initialized by `pkg/application` during startup. | | `generator` | Parses Go source to build **binding metadata** which later produces TypeScript stub files and Go marshal/unmarshal code. | Triggered by `wails3 init` / `wails3 generate`. | | `packager` | Wraps platform-specific packaging CLIs (eg. `electron-builder` equivalents) into Go for cross-platform automation. | Invoked by `wails3 package`. | Supporting utilities (eg. `s/`, `hash/`, `flags/`) keep internal concerns decoupled. --- ## `pkg/` – Public API ``` pkg/ ├── application/ # Core API: windows, menus, dialogs, events, … ├── runtime/ # JS-side helpers (bridge, events, screen, ...) ├── options/ # Strongly-typed configuration structs ├── menu/ # Declarative menu DSL └── ... # Platform helpers (mac/, windows/, assetserver/, …) ``` `pkg/application` bootstraps a Wails program: ```go func main() { app := application.New(application.Options{ Name: "MyApp", Assets: application.NewAssetsFS(assetsFS), }) window := app.Window.New(&application.WebviewWindowOptions{ Title: "Hello", Width: 1024, Height: 768, }) app.Run() } ``` Under the hood it: 1. Spins up `internal.runtime.*` 2. Sets up an `assetserver` 3. Registers bindings generated by `internal.generator` 4. Enters the OS main thread --- ## `examples/` – Living Specs Each sub-folder is a **self-contained application** exercising one feature. Patterns you’ll see mirrored in real code: * Binding services (`examples/binding/`) * Multi-window (`examples/window/`) * System tray (`examples/systray-*`) * Packaging (`examples/file-association/`) When in doubt, start here and drill into implementation. --- ## `templates/` – Scaffolding Blueprints `internal/templates` ships **base templates** (Go layout) and **frontend skins** (React, Svelte, Vue, …). At `wails3 init -t react`, the CLI: 1. Copies `_common` Go files 2. Merges desired frontend pack 3. Runs `npm install` + `task deps` Editing templates **does not** affect existing apps, only future `init`s. --- ## `tasks/` – Release Automation Taskfiles wrap complex cross-compilation, version bumping, and changelog generation. They are consumed programmatically by `internal/commands/task.go` so the same logic powers **CLI** and **CI**. --- ## How the Pieces Interact ```d2 direction: down CLI: "wails3 CLI" Generator: "internal/generator" AssetDev: "assetserver (dev)" Packager: "internal/packager" AppRuntime: { label: "App runtime" ApplicationPkg: "pkg.application" InternalRuntime: "internal.runtime" OSAPIs: "OS APIs" } CLI -> Generator: "build / generate" CLI -> AssetDev: "dev" CLI -> Packager: "package" Generator -> ApplicationPkg: "bindings" ApplicationPkg -> InternalRuntime InternalRuntime -> OSAPIs ApplicationPkg -> AssetDev ``` *CLI → generator → runtime* forms the core path from **source** to **running desktop app**. --- ## Orientation Tips | Need to understand… | Look at… | |---------------------|----------| | Platform shims | `internal/runtime/*_DARWIN.go`, `*_windows.go`, … | | Bridge protocol | `pkg/application/messageprocessor_*.go` | | Asset workflow | `internal/assetserver`, `v3/templates/base/assets` | | Packaging flow | `internal/commands/appimage.go`, `internal/packager` | | Template engine | `internal/templates/templates.go` | | Static analysis | `internal/generator/*` | --- You now have a **mental map** of the repository. Use it with `ripgrep`, your IDE’s “Go to File/Symbol”, and the example apps to navigate deeper into any feature. Happy hacking!