---
title: Application API
description: Complete reference for the Application API
sidebar:
  order: 1
---

import { Card, CardGrid } from "@astrojs/starlight/components";

## Overview

The `Application` is the core of your Wails app. It manages windows, services, events, and provides access to all platform features.

## Creating an Application

```go
import "github.com/wailsapp/wails/v3/pkg/application"

app := application.New(application.Options{
    Name:        "My App",
    Description: "My awesome application",
    Services: []application.Service{
        application.NewService(&MyService{}),
    },
})
```

## Core Methods

### Run()

Starts the application event loop.

```go
func (a *App) Run() error
```

**Example:**

```go
err := app.Run()
if err != nil {
    log.Fatal(err)
}
```

**Returns:** Error if startup fails

### Quit()

Gracefully shuts down the application.

```go
func (a *App) Quit()
```

**Example:**

```go
// In a menu handler
menu.Add("Quit").OnClick(func(ctx *application.Context) {
    app.Quit()
})
```

### Config()

Returns the application configuration.

```go
func (a *App) Config() Options
```

**Example:**

```go
config := app.Config()
fmt.Println("App name:", config.Name)
```

## Window Management

### app.Window.New()

Creates a new webview window with default options.

```go
func (wm *WindowManager) New() *WebviewWindow
```

**Example:**

```go
window := app.Window.New()
window.Show()
```

### app.Window.NewWithOptions()

Creates a new webview window with custom options.

```go
func (wm *WindowManager) NewWithOptions(options WebviewWindowOptions) *WebviewWindow
```

**Example:**

```go
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
    Title:  "My Window",
    Width:  800,
    Height: 600,
    BackgroundColour: application.NewRGB(255, 255, 255),
})
```

### app.Window.GetByName()

Gets a window by its name.

```go
func (wm *WindowManager) GetByName(name string) Window
```

**Example:**

```go
window := app.Window.GetByName("main")
if window != nil {
    window.Show()
}
```

### app.Window.GetAll()

Returns all application windows.

```go
func (wm *WindowManager) GetAll() []Window
```

**Example:**

```go
windows := app.Window.GetAll()
for _, window := range windows {
    fmt.Println("Window:", window.Name())
}
```

## Managers

The Application provides access to various managers through properties:

```go
app.Window      // Window management
app.Menu        // Menu management
app.Dialog      // dialog management
app.Event       // Event management
app.Clipboard   // Clipboard operations
app.Screen      // Screen information
app.SystemTray  // System tray
app.Browser     // Browser operations
app.Env         // Environment variables
```

### Example Usage

```go
// Create window
window := app.Window.New()

// Show dialog
app.Dialog.Info().SetMessage("Hello!").Show()

// Copy to clipboard
app.Clipboard.SetText("Copied text")

// Get screens
screens := app.Screen.GetAll()
```

## Service Management

### RegisterService()

Registers a service with the application.

```go
func (a *App) RegisterService(service Service) error
```

**Example:**

```go
type MyService struct {
    app *application.Application
}

func NewMyService(app *application.Application) *MyService {
    return &MyService{app: app}
}

// Register after app creation
app.RegisterService(application.NewService(NewMyService(app)))
```

## Event Management

### app.Event.Emit()

Emits a custom event.

```go
func (em *EventManager) Emit(name string, data ...interface{})
```

**Example:**

```go
// Emit event with data
app.Event.Emit("user-logged-in", map[string]interface{}{
    "username": "john",
    "timestamp": time.Now(),
})
```

### app.Event.On()

Listens for custom events.

```go
func (em *EventManager) On(name string, callback func(*CustomEvent))
```

**Example:**

```go
app.Event.On("user-logged-in", func(e *application.CustomEvent) {
    data := e.Data.(map[string]interface{})
    username := data["username"].(string)
    fmt.Println("User logged in:", username)
})
```

### app.Event.OnApplicationEvent()

Listens for application lifecycle events.

```go
func (em *EventManager) OnApplicationEvent(eventType ApplicationEventType, callback func(*ApplicationEvent)) func()
```

**Example:**

```go
// Listen for shutdown
app.Event.OnApplicationEvent(application.EventApplicationShutdown, func(e *application.ApplicationEvent) {
    fmt.Println("Application shutting down")
    // Cleanup
})
```

## Dialog Methods

Dialogs are accessed through the `app.Dialog` manager. See [Dialogs API](/reference/dialogs/) for complete reference.

### Message Dialogs

```go
// Information dialog
app.Dialog.Info().
    SetTitle("Success").
    SetMessage("Operation completed!").
    Show()

// Error dialog
app.Dialog.Error().
    SetTitle("Error").
    SetMessage("Something went wrong.").
    Show()

// Warning dialog
app.Dialog.Warning().
    SetTitle("Warning").
    SetMessage("This action cannot be undone.").
    Show()
```

### Question Dialogs

Question dialogs use button callbacks to handle user responses:

```go
dialog := app.Dialog.Question().
    SetTitle("Confirm").
    SetMessage("Continue?")

yes := dialog.AddButton("Yes")
yes.OnClick(func() {
    // Handle yes
})

no := dialog.AddButton("No")
no.OnClick(func() {
    // Handle no
})

dialog.SetDefaultButton(yes)
dialog.SetCancelButton(no)
dialog.Show()
```

### File Dialogs

```go
// Open file dialog
path, err := app.Dialog.OpenFile().
    SetTitle("Select File").
    AddFilter("Images", "*.png;*.jpg").
    PromptForSingleSelection()

// Save file dialog
path, err := app.Dialog.SaveFile().
    SetTitle("Save File").
    SetFilename("document.pdf").
    AddFilter("PDF", "*.pdf").
    PromptForSingleSelection()

// Folder selection (use OpenFile with directory options)
path, err := app.Dialog.OpenFile().
    SetTitle("Select Folder").
    CanChooseDirectories(true).
    CanChooseFiles(false).
    PromptForSingleSelection()
```

## Logger

The application provides a structured logger:

```go
app.Logger.Info("Message", "key", "value")
app.Logger.Error("Error occurred", "error", err)
app.Logger.Debug("Debug info")
app.Logger.Warn("Warning message")
```

**Example:**

```go
func (s *MyService) ProcessData(data string) error {
    s.app.Logger.Info("Processing data", "length", len(data))
    
    if err := process(data); err != nil {
        s.app.Logger.Error("Processing failed", "error", err)
        return err
    }
    
    s.app.Logger.Info("Processing complete")
    return nil
}
```

## Raw Message Handling

For applications that need direct, low-level control over frontend-to-backend communication, Wails provides the `RawMessageHandler` option. This bypasses the standard binding system.

:::note
Raw messages should only be used as a last resort. The standard binding system is highly optimized and sufficient for almost all applications. Only use raw messages if you have profiled your application and confirmed that bindings are a bottleneck.
:::

### RawMessageHandler

The `RawMessageHandler` callback receives raw messages sent from the frontend using `System.invoke()`.

```go
func (a *App) RawMessageHandler(window Window, message string)
```

**Example:**

```go
app := application.New(application.Options{
    Name: "My App",
    RawMessageHandler: func(window application.Window, message string) {
        // Handle the raw message
        fmt.Printf("Received from %s: %s\n", window.Name(), message)

        // You can respond using events
        window.EmitEvent("response", processMessage(message))
    },
})
```


For more details, see the [Raw Messages Guide](/guides/raw-messages).

## Platform-Specific Options

### Windows Options

Configure Windows-specific behavior at the application level:

```go
app := application.New(application.Options{
    Name: "My App",
    Windows: application.WindowsOptions{
        // WebView2 browser flags (apply to ALL windows)
        EnabledFeatures:       []string{"msWebView2EnableDraggableRegions"},
        DisabledFeatures:      []string{"msExperimentalFeature"},
        AdditionalBrowserArgs: []string{"--remote-debugging-port=9222"},

        // Other Windows options
        WndClass:                      "MyAppClass",
        WebviewUserDataPath:           "",  // Default: %APPDATA%\[BinaryName.exe]
        WebviewBrowserPath:            "",  // Default: system WebView2
        DisableQuitOnLastWindowClosed: false,
    },
})
```

**Browser Flags:**
- `EnabledFeatures` - WebView2 feature flags to enable
- `DisabledFeatures` - WebView2 feature flags to disable
- `AdditionalBrowserArgs` - Chromium command-line arguments

See [Window Options - Application-Level Windows Options](/features/windows/options#application-level-windows-options) for detailed documentation.

### Mac Options

```go
app := application.New(application.Options{
    Name: "My App",
    Mac: application.MacOptions{
        ActivationPolicy: application.ActivationPolicyRegular,
        ApplicationShouldTerminateAfterLastWindowClosed: true,
    },
})
```

### Linux Options

```go
app := application.New(application.Options{
    Name: "My App",
    Linux: application.LinuxOptions{
        ProgramName:                   "my-app",
        DisableQuitOnLastWindowClosed: false,
    },
})
```

## Complete Application Example

```go
package main

import (
    "github.com/wailsapp/wails/v3/pkg/application"
)

func main() {
    app := application.New(application.Options{
        Name:        "My Application",
        Description: "A demo application",
        Mac: application.MacOptions{
            ApplicationShouldTerminateAfterLastWindowClosed: true,
        },
    })

    // Create main window
    window := app.Window.NewWithOptions(application.WebviewWindowOptions{
        Title:            "My App",
        Width:            1024,
        Height:           768,
        MinWidth:         800,
        MinHeight:        600,
        BackgroundColour: application.NewRGB(255, 255, 255),
        URL:              "http://wails.localhost/",
    })

    window.Centre()
    window.Show()

    app.Run()
}
```

