●MAX — Rork Max handles code signing and provisioning so you can submit to the App Store in two clicks, with no local Mac required●SIMULATOR — Try your app in an in-browser streaming simulator, then scan a QR code to install straight to your device without TestFlight●NATIVE — Coverage reaches SwiftUI, ARKit, HealthKit, HomeKit, Core ML, and Metal, going where React Native cannot●SEED — Rork raised a $15M seed led by Left Lane Capital in April 2026, joined by Peak XV and a16z Speedrun●GROWTH — Reported at 743,000 monthly visits with 85% growth, widening access to AI-built mobile apps●NOCODE — Gartner expects 75% of new applications to be built with low-code or no-code tools by the end of 2026●MAX — Rork Max handles code signing and provisioning so you can submit to the App Store in two clicks, with no local Mac required●SIMULATOR — Try your app in an in-browser streaming simulator, then scan a QR code to install straight to your device without TestFlight●NATIVE — Coverage reaches SwiftUI, ARKit, HealthKit, HomeKit, Core ML, and Metal, going where React Native cannot●SEED — Rork raised a $15M seed led by Left Lane Capital in April 2026, joined by Peak XV and a16z Speedrun●GROWTH — Reported at 743,000 monthly visits with 85% growth, widening access to AI-built mobile apps●NOCODE — Gartner expects 75% of new applications to be built with low-code or no-code tools by the end of 2026
Implementing App Clips with Rork Max — delivering the core of your app the moment someone scans a code
Building on the native Swift that Rork Max produces, this note walks through the 15 MB App Clip budget, receiving the launch URL, and handing state off to the full app.
Every time I try to show a friend one of my wallpaper apps, I get stuck at the same point. All I want is for them to see a single wallpaper. But first they open the App Store, search, wait for a download, launch the app, and only then reach the first image. By that moment, the initial spark has cooled a little.
I only want to show one wallpaper. Could the install step move behind that one image instead of in front of it? App Clips exist to swap exactly this order around.
Rork Max produces native Swift, which is what makes App Clips reachable at all — they sit in a territory React Native rarely touches. That said, App Clips involve splitting your app into separate targets, so you cannot simply use generated code as-is. You need to understand the structure and edit it deliberately. This note records where those edits go, from an implementation point of view.
What an App Clip actually solves
An App Clip is a small slice of your full app that launches instantly, with no install, showing just one part of what the app does. It launches from a QR code, a dedicated App Clip Code, an NFC tag, or a Smart App Banner on a web page, and presents a single screen in a few seconds.
The important thing is that it is not a "lite" version. Preview one wallpaper, view a restaurant menu, pay for a parking spot. You carve out the single thing the user wants to do right now and leave everything else to the full app. The subtraction of features is itself the design.
From an indie perspective, this is also an experiment in distribution. Print an App Clip Code on a business card or a poster; the person who scans it experiences the core of the app on the spot. The download can wait until after they have tried it and thought, "I want more."
Splitting targets — the first decision that protects your 15 MB
An App Clip ships inside the full app as its own target. This is where you meet the first constraint. An App Clip binary has a strict size ceiling in its uncompressed state.
OS
Uncompressed App Clip size limit
iOS 16 and later
15 MB
iOS 15 and earlier
10 MB
15 MB fills up fast once you stack a few real image assets. To stay under it, you share code between the full app and the App Clip while sharply limiting what the Clip actually carries.
In practice, I split it like this. Shared logic — models, the network layer, the single screen's view — goes into a Swift Package or a shared target that both reference. Meanwhile, the heavy dependencies only the full app needs (video playback, analytics SDKs, a billing stack) are not linked into the App Clip target at all. The App Clip's package dependencies are an explicit, minimal list, not a copy of the full app's.
Element
In the App Clip
Full app only
The one preview screen's view
Include
—
Shared models / network layer
Include (shared target)
—
Analytics / ad SDKs
—
Full app only
The full image catalog
—
Full app only
Images on the App Clip side are not bundled on-device; the Clip fetches just the one image it needs from a parameter in the launch URL. That single act of restraint was the most effective lever for staying under the ceiling.
✦
Thank you for reading this far.
Continue Reading
What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.
WHAT YOU'LL LEARN
✦How to split targets and prune dependencies so the App Clip stays under 15 MB
✦Receiving the launch URL from a QR code, App Clip Code, or NFC via NSUserActivity and going straight to the right screen
✦Handing the state gathered in the App Clip off to the full app through an App Group and a shared Keychain
Secure payment via Stripe · Cancel anytime
✦
Unlock This Article
Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.
An App Clip launches from a URL. You bind a URL like https://example.com/w?id=1042 to a QR code or App Clip Code, receive it on launch, and go straight to the target screen.
In SwiftUI, you receive NSUserActivityTypeBrowsingWeb in onContinueUserActivity and read its webpageURL.
import SwiftUI@mainstruct WallpaperClipApp: App { @State private var wallpaperID: String? var body: some Scene { WindowGroup { ClipRootView(wallpaperID: wallpaperID) .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in guard let url = activity.webpageURL else { return } wallpaperID = parseWallpaperID(from: url) } } } private func parseWallpaperID(from url: URL) -> String? { let components = URLComponents(url: url, resolvingAgainstBaseURL: false) return components?.queryItems?.first(where: { $0.name == "id" })?.value }}
The key here is not to leave the view empty while wallpaperID resolves. URL parsing runs in the instant after launch, so ClipRootView should show a loading state first and switch to the target image the moment the ID arrives. That few-hundred-millisecond design determines how fast the App Clip feels.
Why insist on URL launches? Because the value of an App Clip is opening with context. The app does not merely start; the specific wallpaper the scanned QR points to is already open. Passing that context is the job of the URL parameter.
Declaring appclips in apple-app-site-association
For URL launches to work, the domain-side declaration and the App Clip's Associated Domains entitlement have to match.
In the App Clip target's Associated Domains, register the domain with the appclips: prefix.
appclips:example.com
On the server, place a JSON file with an appclips key at https://example.com/.well-known/apple-app-site-association.
ABCDE12345 is your Team ID and com.example.Wallpaper.Clip is the App Clip's bundle ID. Serve this file as Content-Type: application/json with no redirects. If these do not line up, scanning the QR just opens Safari instead of the App Clip. I once mistyped a single character in this bundle ID and spent half a day chasing "why does it keep falling back to Safari." Suspect this mapping first.
Choosing the launch source
The same URL feels different depending on the entry point you launch it from.
Launch source
Good for
Notes
App Clip Code
Posters, cards, in-store
The NFC-enabled variant can be read just by holding the phone near it
QR code
Online and print in general
Easy, but requires aiming the camera
NFC tag
Physical fixtures
The tap gesture is intuitive
Smart App Banner
Web traffic
Low added cost if you already run a site
If you are trying this for the first time as an indie developer, I would start with an App Clip Code. Apple's provided design itself signals "hold your phone here and something happens" — it needs less explanation than a QR code.
Handing App Clip state off to the full app
A user who thinks "I want to see more" moves from the App Clip to installing the full app. If you throw away the state they touched in the Clip, they start over after installing. You need a handoff.
The foundation of that handoff is an App Group. Put the full app and the App Clip in the same App Group and pass data through the shared container.
struct ClipHandoff { static let suite = "group.com.example.Wallpaper" static func store(previewedID: String) { let defaults = UserDefaults(suiteName: suite) defaults?.set(previewedID, forKey: "lastPreviewedID") defaults?.set(Date(), forKey: "clipHandoffDate") }}
On first launch the full app reads this value and opens the wallpaper the user had been viewing in the Clip. "That wallpaper I just tried" appearing right after install reduces drop-off.
For more sensitive state, such as authenticated information, use a shared Keychain. Share the Keychain access group between the full app and the App Clip and store with a matching kSecAttrAccessGroup. The App Group holds ordinary data; the shared Keychain holds secrets that are safe to hand over.
Note that the App Group container survives for a while even after the App Clip is removed, but it is not permanent storage. Design the handoff as "read once, on first launch," and always provide a fallback on the full-app side for when the value is absent.
Deciding what the App Clip will not do
The most effective decision in App Clip design is not what to add but what to leave out. App Clips deliberately lack several capabilities.
Can do
Cannot / should avoid
Payment via Apple Pay
Standard In-App Purchase
Sign in with Apple
Long custom ID/password sign-up flows
Ephemeral notifications (up to 8 hours)
Persistent push notification permission
A one-time location check
Background/long-running work
Billing and full membership signup are the full app's job. Attempting them in the App Clip inflates both size and complexity, and you bounce off the 15 MB wall. To move a user from the App Clip to the full app, use SKOverlay to recommend the download without interrupting the flow.
Ephemeral notifications are worth remembering. An App Clip can send notifications for up to eight hours without asking for persistent permission. You can use this for a restrained nudge — "liked the wallpaper you previewed? here it is" — delivered once, a few hours later. Restraint is what keeps it tasteful.
Checking before you ship
For local testing, set the _XCAppClipURL environment variable in your Xcode scheme to feed a real launch URL in and verify behavior. Before you print a QR code, run through the parameter variations and confirm each one goes straight to the correct screen.
When you publish, registering an Advanced App Clip Experience in App Store Connect lets you show a distinct card — title, image, action — per specific URL. Starting with only the default experience and adding per-URL cards after you see the response was more than enough.
Even with Rork Max producing the underlying Swift, the heart of an App Clip is the "work outside the app" — splitting targets, declaring domains, wiring the handoff. Generated code is only a starting point. If you verify the wiring beyond it one step at a time, in the order laid out here, you should reach a path where the core of your app opens within seconds of a scan.
I hope this helps with your own implementation, and thank you for reading.
Share
Thank You for Reading
Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.