Quick Links

GlassIntroKit icon: a waving hand in glass on a blue grid

GlassIntroKit

A first-launch intro for SwiftUI apps.

Made with Liquid Glass and Metal, added with one modifier. Open source, for iOS and macOS.

GitHub  Get started

Overview

Add .glassIntro(appName:pages:) to your root view. At launch, your app's mark appears on frosted glass; on the first launch, a welcome follows, one page at a time, and ends with the mark filling with color and dissolving over your app.

Pages come from eight kinds of pictures, from a greeting written in glass to a live Metal scene or your own SwiftUI view. It has no dependencies, makes no network requests and stores one Boolean to remember that the welcome was shown.

How an intro plays

Launch. Your mark comes up on frosted glass over the app.

Welcome. Your pages, one at a time: a picture, a title, a message and Continue.

Last page. "Let's Begin" and Get Started, in your words if you like.

Ending. Up to three lines of words in glass, then the mark fills with color.

Your app. The mark dissolves where it is, and the app is yours.

Pages

A picture for every page.

Pages can come in any order and repeat. Pictures made to follow one another continue directly; any other two meet in a drop of glass, so no transition jumps.

Two more. .greeting: the mark gathers into a pen and writes "hello" in glass. .card: your own SwiftUI view, on a card of glass.

Mac

The same intro on macOS.

One package and the same code for iOS and macOS, sized to the window.

The scene page playing on a MacBook Pro
Scene. A live Metal scene through a glass lens, on a MacBook Pro.
The graph page playing on a MacBook Pro
Graph. A graph of your own nodes grows across the window.

New in 0.2

Easier to read. Easier to skip.

Version 0.2 adds Reduce Transparency and a Skip button, from community feedback. New options come with defaults, so existing code compiles unchanged.

Reduce Transparency.

The mark rests on a solid surface instead of frosted glass, each page shows one solid colour, and the buttons are opaque. Every colour keeps at least 7:1 contrast with the white text.

A Skip button.

Shows in the corner while the welcome plays, on iOS and macOS. showsSkipButton: false hides it and skipButton relabels it. VoiceOver's escape gesture skips too.

Skipping, defined.

Playing the welcome through or skipping it records it as seen. Quitting mid-welcome doesn't, so it plays again at the next launch.

Windows on Mac.

Close a window mid-intro, and the next window plays it from the start.

No hang in the background.

The launch no longer waits on an animation that never reports finishing while the app is in the background.

New guides.

SwiftUI and Metal, Testing on Devices and Making the Preview Video. Bug reports now use a form.

Release notes

Get started

In Xcode, choose File › Add Package Dependencies, enter the repository URL, and add GlassIntroKit to your app. Then put one modifier on your root view.

OrbitApp.swift

import GlassIntroKit
import SwiftUI

@main
struct OrbitApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .glassIntro(
                    appName: "Orbit",
                    pages: [
                        .greeting("Welcome to Orbit", message: "Plan trips with the people you travel with."),
                        .symbols("Everything in Reach", message: "Maps, photos, and notes gather around each trip."),
                        .icon("Ready When You Are", message: "Packed and ready to go."),
                    ]
                )
        }
    }
}

Frame-by-frame tests.

Every page is played after every other page; any frame that jumps fails.

Accessible.

Reduce Motion, Reduce Transparency, keyboard and VoiceOver support.

Private.

No network requests; one Boolean in UserDefaults.

Specs

Version
0.2.0 Release notes
Platforms
iOS 26 or later, macOS 26 or later
Swift
Swift 6.3 or later, Swift 6 language mode
Install
Swift Package Manager: https://github.com/Jiaxu-Li/GlassIntroKit.git, from 0.2.0
Dependencies
None
Built-in text
English. Titles and messages are localized from your app's string catalog.
Demo app
Included, for iOS and macOS. Try every option without writing code, and copy the code it writes for you.
License
Apache 2.0

GlassIntroKit is on GitHub.

GitHub Swift Package Index