RORK LABJP
TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the roundTOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Articles/Dev Tools
Dev Tools/2026-06-03Advanced

Adding a Wallpaper Shuffle to the iOS 18 Control Center in a Rork App

A field guide to bolting an iOS 18 Control Center control (ControlWidget) onto a Rork-built React Native wallpaper app — App Group sharing, AppIntent, and the Expo config plugin that keeps it from breaking on every prebuild.

iOS 185ControlWidgetApp Intents6Expo149wallpaper app23

Premium Article

"Let me change today's wallpaper without unlocking the phone." That request started trickling into the reviews of one of my wallpaper apps (Beautiful Wallpapers) right after iOS 18 shipped. I have been building apps solo since 2014 — around 50 million downloads in total, most of them wallpaper and calm-utility apps. The trouble with this category is that opening the app is a surprisingly heavy step, and on the days nobody opens it, no ads are served either.

iOS 18 finally lets third-party apps place a control in Control Center, so a single button pulled down from the corner can run logic without launching the app. For a wallpaper app, that is one of the few legitimate ways to claw back the "never opened today" days. Here are my notes on retrofitting a ControlWidget onto a React Native (Expo) app generated with Rork, including the parts that tripped me up.

Why a ControlWidget fits a wallpaper app

iOS 18 custom controls are built as part of WidgetKit. They are cousins of home-screen widgets: you create a small extension target conforming to the ControlWidget protocol, and users can then add your control through Settings or by customizing Control Center.

There are two shapes — ControlWidgetButton and ControlWidgetToggle. Wallpaper shuffle wants the button: tapping it fires an AppIntent that picks the next wallpaper and writes the index to UserDefaults. Because AdMob revenue tracks impressions, adding a lighter touch point in front of the heavy "launch the app" path matters. Even a few percent more sessions per month adds up at the thin per-unit economics of a utility app.

One honest caveat: the control cannot actually set the wallpaper. iOS does not let third-party apps change the lock or home screen wallpaper directly. So I split the design cleanly: the control decides "today's next image," and the user finishes the actual set through a Shortcut or the share sheet. The control owns the decision, not the act.

Architecture — the App Group is the spine

The body of a Rork (Expo) app runs in the JavaScript layer, but a ControlWidget runs as a separate native extension process. They cannot share memory directly, so UserDefaults backed by an App Group becomes the spine.

Three pieces:

  1. The main app (Expo / React Native) writes the wallpaper index into the App Group UserDefaults.
  2. The control extension (Swift / WidgetKit) holds the ControlWidget and AppIntent.
  3. The App Group (an identifier like group.design.dolice.wallpaper) is the shared store.

Built in that order, the data flow stays one-directional: JS writes "total count" and "current position," and the AppIntent reads them to advance the index.

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
A working ControlWidget + AppIntent that shuffles the wallpaper from Control Center in one tap (~40 lines of Swift)
A concrete pattern for sharing state between the Rork (Expo) JS layer and the native extension via an App Group
The three reasons a Control Center button shows up but does nothing — and how to avoid each
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.

or
Unlock all articles with Membership →
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.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Dev Tools2026-06-26
Watermark Only the Shared Image in Your Rork Wallpaper App
In a Rork-generated Expo wallpaper or image app, keep saved images untouched and burn a watermark only into the share export, shown two ways — react-native-view-shot and Skia — with the resolution-loss pitfalls to avoid.
Dev Tools2026-06-15
Putting a Working Button in a Rork App's Widget — Implementing App Intents So a Tap Acts Without Opening the App
How to put a button in a Rork-generated Expo app's widget that changes state without launching the app. We wire App Intents and WidgetKit together through an App Group, all the way to reloadTimelines — including the two places I lost real time.
Dev Tools2026-05-26
Two Weeks Tightening Up iPad Support for a Rork-Generated Wallpaper App
Notes from spending two weeks tightening up iPad support for a wallpaper app I scaffolded with Rork. Coming from an iPhone-centric indie practice since 2014, I cover where Rork's defaults stopped, how the AdMob adaptive banner misbehaved on iPad, and what changed in retention afterwards.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →