Free course

Build macOS Apps with SwiftUI Course

Build native Mac apps with SwiftUI windows, sidebars, menus, settings, local files, Keychain, menu bar extras, and reliable process integration.

5 modules · 25 lessons · No signup

Prerequisites: SwiftUI and macOS for Developers

~~~

Your progress

of lessons completed.

Course completed.

What you'll learn

Build and test a focused native Mac utility with deliberate state ownership, desktop behavior, durable data, and one useful system integration.

Take this course offline

Subscribe to my newsletter to get every free book and course in PDF and EPUB format.

Get the downloads

Course contents

  1. Start a macOS app

    Create a native target, understand scenes, separate model state, and test real windows.

    1. Create a macOS SwiftUI project
    2. Read the App and scene structure
    3. Separate model, state, and views
    4. Preview and run real windows
    5. Check your understanding: starting a macOS app
  2. Windows and commands

    Build a sidebar, application menus, keyboard shortcuts, utility windows, and settings.

    1. Build a sidebar interface
    2. Add menu commands and shortcuts
    3. Open a purpose-built window
    4. Add a Settings scene
    5. Check your understanding: windows and commands
  3. Files and persistence

    Choose storage locations, save atomically, accept user files, and handle replacement.

    1. Choose the right storage location
    2. Save Codable data atomically
    3. Let the user choose a file
    4. Handle file replacement
    5. Check your understanding: files and persistence
  4. macOS integration

    Add a menu bar extra, notifications, Keychain storage, and explicit command-line tools.

    1. Build a menu bar extra
    2. Request notification permission in context
    3. Store a secret in Keychain
    4. Launch a command-line tool explicitly
    5. Check your understanding: macOS integration
  5. Make the app reliable

    Define process protocols, stop work safely, cross concurrency boundaries, and finish a tested utility.

    1. Treat child output as a protocol
    2. Stop a child process gracefully
    3. Cross concurrency boundaries deliberately
    4. Complete a native macOS utility
    5. Check your understanding: making the app reliable