Droppy Playground

A free, separate app: the real notch, shelf and island, with only the media player inside, and a way to install droplets. Try one on the real surfaces before buying Droppy, or try the one you are building.

What it is

Droppy Playground is built from the same source as Droppy and draws the same surfaces with the same code: the notch, the expanded shelf, the Dynamic Island, mini HUDs and their cards, the lock screen chips and the menu bar. What it leaves out is everything else Droppy does. There is no file shelf, no clipboard, no Cloud, none of Droppy's own droplets except the media player, and no license.

It is its own app with its own bundle identifier and its own settings, so it installs beside Droppy without touching it. It updates itself the way Droppy does, from Settings, About, and it never updates into Droppy: it reads its own release manifest, and its installer refuses any app that is not the Playground.

Download Droppy Playground

URL callbacks

From Playground 1.0.26 and DroppyKit 1.20.0, read host.environment.dropletCallbackURL and append your callback path. Droppy returns droppy://droplet/<id>; Playground returns droppy-playground://droplet/<id>. Both deliver replies through DropletURLHandling to the running droplet. The standalone harness returns nil because it does not register a system URL scheme. Never use isHarness to infer whether callbacks are available. A hardcoded droppy:// URL always targets Droppy, even when your droplet is running in Playground.

What it stands in for

A droplet's minAppVersion names a Droppy release. The Playground has a version line of its own, so it does not compare that number against itself: it answers the handshake with the Droppy version it was built from. A droplet that asks for a newer Droppy than that is refused here exactly as Droppy would refuse it, and the refusal names both numbers.

Installing a droplet

Open the Playground and its Store page appears. Drop a .droplet bundle onto the drop zone, or click the drop zone or Choose to pick one. That is the bundle droppykit build writes into .build/, or one somebody sent you. A folder works too: drop or choose the droplet's package and the bundle in its .build/ is installed. A folder that holds several droplets installs the most recently built one, and the result line says which.

The Playground uses Droppy's native macOS Settings panel: the same sidebar, toolbar, grouped Form pages, native controls, spacing and window behavior. Its Store contains only the Playground's supported surfaces, but the panel chrome and interaction model are shared with Droppy.

The bundle is copied into the Playground's own droplet folder and put through the same admission checks Droppy runs, apart from Droppy's trust check (see below), so a droplet the Playground refuses is one Droppy would refuse too, for the same reason, which the Store row shows. A droplet the Playground accepts is switched on at once.

~/Library/Application Support/Droppy Playground/Droplets/<droplet-id>/<Name>.droplet

Where your droplet shows up

A shelf widget lives on the shelf's Widgets page. Open the shelf (hover the notch, or press Open beside the Display shape switch) and tap the grid button in the floating navigation bar: every widget the Playground can show is there, the media player and each running droplet's widgets under their own icons. Tap yours to open it on the shelf, solo, and add a second to see it paired. Settings, Shelf, Widget icons is the same list, for rearranging and hiding.

The other surfaces need no page. A live activity sits beside the notch as soon as the droplet publishes a state, a HUD appears when it presents one, a lock screen row on the lock surface, a menu bar extra as a tile in the Command Center under Droppy's menu bar icon.

The sidebar has no row per droplet, on purpose: the Playground shows the surfaces droplets land on and nothing else of Droppy's. A droplet's own settings pane opens from its Store row, where the switch, the version and the Remove button also are.

How it differs from Droppy

droppykit build leaves the bundle unsigned. Both apps run with library validation off, so both can load it, and both clear the quarantine flag from a bundle they install. What differs is the trust check. By default, Droppy runs a droplet without asking only when Droppy signed it, which every droplet the Store delivers is; anything else runs after you approve that exact build, under Local droplets on Droppy's Store page or in the question Droppy asks each time it opens. The Playground skips that question and trusts what you install, which is what it is for: the bundle you just built, or one somebody sent you. Every other admission check is the same in both apps.

Running it in Droppy

Release Droppy loads a local .droplet too. On Droppy's Store page, under the Local droplets section, drop the bundle or use Choose to pick it. By default, Droppy asks at every launch whether to run a build it did not sign; DroppyDev remembers the approval instead, and the Playground never asks. Don't ask again for local droplets turns off Droppy's approval questions for all local builds, including new and changed ones. This lets them run with Droppy's permissions while keeping its bundle validity checks. Turn Ask before running local droplets back on under Settings, Store, Local droplets to restore the questions. The droplet host minimum is Droppy 15.3.0.

Seeing both shapes

The Store page has a Display shape switch. Notch draws every surface the way a MacBook with a camera housing draws it: the wings, the cutout to keep clear of, the 32pt shoulders when the shell opens. Island draws every surface as the floating pill every other display gets. A droplet has to look right in both, and this is the fastest way to see whether it does, on a real screen.

Open the shelf from the button beside the switch, or hover the notch or island at the top of the screen, as in Droppy.

A widget that opts in to the notch wrap (DroppyKit 1.21.0) rises beside the camera when it is alone on the shelf, exactly as in Droppy. That needs a Mac with a notch: on any other display the Notch shape has no cutout to wrap around, so the widget keeps its classic layout there, and the harness is where you see the wrapped stage. The row under the switch says which this Mac is.

The new style, on the Store page

From the Playground that embeds DroppyKit 1.21.0, the Store page also shows what the design guidelines ask of a droplet, drawn by the app itself:

  • Icon styles: every installed droplet's icon in the six styles of System Settings, Appearance (Default, Clear and Tinted, light and dark), drawn by the same renderer Droppy draws your icon with.
  • Widget controls: the flat wash every control in a widget uses, the neutral and accent disc and the accent pill at their sizes, named by the style that draws them. See Design guidelines.

Playground or harness

Use the harness (droppykit run) for the edit-and-run loop: it renders every surface in both shapes at once, in Droppy's own metrics, without installing anything. Use the Playground when you want the droplet on the real surfaces, with the real host arbitrating, and when you want to hand a droplet to somebody who does not have Droppy. See The harness and Host support.

What it cannot tell you

The Playground is Droppy with things taken out, never Droppy with things added, so a surface that does not work here does not work in Droppy either, and one that does, does. What it cannot show is contention: with only the media player inside, your droplet's compact activity is rarely outranked here, while in Droppy a running timer or a recording takes the seat first, and a droplet that joins the persistent set moves to the companion pill beside it. Handle the secondary, surfaceSuppressed and outranked seats anyway; the harness lets you see the last two.

See also