Submitting
Get your droplet into Droppy's Store.
The chain is short: you publish an open-source repository, submit its URL and a commit, and a reviewed build is signed and published. Nothing you upload is executed before someone has read it.
Why open source
A droplet is native code in Droppy's process, with Droppy's permissions. There is no sandbox between the two — which is what lets a droplet draw real SwiftUI on the notch instead of shipping a JSON description of a layout.
The price of that is review, and review means readable code. A submission without a public repository is refused at intake.
Your licence is yours. The SDK's licence covers the SDK; it claims nothing over what you build with it.
Before you submit
droppykit validateThis is the same check the intake runs. It verifies:
droplet.jsondecodes and satisfiesvalidate(submission:)- the id is lowercase, valid, and matches
idand the Info.plist - every declared surface has a matching conformance
- every capability is one DroppyKit knows
- the Icon Composer document is present, well formed, and self-contained
- the creator avatar is a square PNG of at least 256×256
- the built bundle links the resilient framework, and carries no direct-access imports — see Add the package
A submission that validates locally validates at intake. If it does not, the message names the field.
Submitting
Push your repository, then go to getdroppy.app/submit-droplet and give:
- the repository URL, reachable without credentials
- the commit SHA you want reviewed
- a contact address for questions
The commit is pinned. A repository that moves after submission does not change what shipped, and an update is a new submission naming a new commit.
Review
Review reads the code and runs the droplet. What sends a submission back, most often first:
- Capabilities you do not use. The user sees the list before installing. Ask for what you use and nothing else.
- Design that ignores the surface. Light backgrounds on dark chrome, Title Case labels, borders, invented spacing. See Design guidelines.
- Work that does not stop. A timer or observer that survives
deactivate(). Swift cannot unload code, so it runs until Droppy relaunches. - A live activity that never yields. Holding the compact seat when there is nothing to show.
- An icon that does not read at 28pt.
None of these are rejections. They come back with the reason, and a new commit usually settles it.
Publishing
Once accepted, the reviewed commit is mirrored, built per-architecture against the framework Droppy actually ships, signed with Droppy's Developer ID, and notarized.
The Store already sorts droplets by maker — All droplets / By Droppy / Community — and every row carries its creator's mark, so a published droplet is listed beside your name and your avatar. What is not built yet is the install button behind that row: today an accepted droplet is delivered as a signed bundle and placed in
~/Library/Application Support/Droppy/Droplets/<your-id>/<YourDroplet>.dropletwhich Droppy loads at its next launch, running the same five admission checks described in Host support. One-click install from the Store row, the droppy://extension/<your-id> deep link, and auto-update when the catalogue refreshes are the next piece of host work; nothing about a droplet changes when they land.
Versions
version is major.minor.patch, numeric only. A pre-release tag cannot be published: the fleet's catalogue decode is strict, and one undecodable entry refuses the whole catalogue.
Raise it on every submission. The Store compares versions to decide who needs an update.