A Droplet is an extension that lives inside Droppy. It draws on the same surfaces Droppy's own features do — the notch, the shelf, the lock screen — and it is written in SwiftUI, against this SDK.
Droplets are native code running in Droppy's process, so the Store is review-and-sign: you build against DroppyKit, submit an open-source repository, and a reviewed build is signed and published. Nothing loads unsigned, and no droplet ships without someone having read it.
The surfaces you can build
| Surface | What it is | Protocol |
|---|---|---|
| Shelf widget | A card on the expanded shelf, alone or sharing the row | ShelfWidgetProviding |
| Live activity | A compact row beside the notch, plus its expanded detail | LiveActivityProviding |
| Expanded surface | A takeover on the notch, for something that needs the room | ExpandedSurfaceProviding |
| Settings pane | Your droplet's own page inside Droppy's Settings | SettingsPaneProviding |
| HUD | A transient message on the notch | HUDPresenting |
| Lock screen row | One line on Droppy's lock surface | LockScreenStatusProviding |
| Menu bar extra | An item beside Droppy's own | MenuBarExtraProviding |
You pick the ones you need. A droplet that only draws a shelf widget is a perfectly good droplet.
What a droplet is made of
- A Swift package that builds a dynamic library and links DroppyKit.
- A
droplet.jsonmanifest — seeDropletManifest— naming the droplet, the surfaces it provides, the capabilities it needs, and who made it. - An Icon Composer document, which is required. See
DropletIcon. - A creator avatar, also required, which is the round mark beside your droplet's name in the Store. See
DropletCreatorAvatar.
Trying it without installing anything
DroppyKitHarness opens your droplet in Droppy's Settings panel — the real one, built from the app's own source — with a page per surface, a switch per capability, and a running list of everything your droplet asks the host to do. It never touches the system, so it runs happily alongside Droppy itself.
import DroppyKit
import DroppyKitHarness
@main
struct WorldClockHarness: DropletHarnessApp {
static func makeDroplet() -> any Droplet { WorldClockDroplet() }
}Start here
Building a droplet
- The manifest
- Design guidelines
- Shelf widgets
- Live activities
- Expanded surfaces
- Settings panes
- Host support
Artwork
Testing
Publishing
Entry point
DropletDropletPrincipalDropletIDDropletHost
Manifest
Host services
DropletPreferencesServiceDropletEnvironmentServiceDropletHUDServiceDropletShelfServiceDropletLiveActivityServiceDropletNotchSurfaceServiceDropletShortcutsServiceDropletWorkspaceServiceDropletFeedbackServiceDropletPermissionsServiceDropletInstallStateServiceDropletLogService
Design system
DroppySpacingDroppyRadiusDroppyOpacityAdaptiveColorsDroppyAnimationDroppyLiveActivityMetricsDropletSettingsCardDropletControlRowDropletToggleRowDropletStackedRowDropletSliderRow