Build a calm experience for ZenClub

Every experience in ZenClub is its own small web app. It runs on its own origin inside a sandboxed frame and talks to the city through one small SDK. You keep your engine, your framework and your release rhythm.

How it fits together

  1. The platform opens your entry URL in a sandboxed frame and passes its own origin and an instance id in the URL hash.
  2. Your code calls connect(). After a short handshake, every call travels over a private MessagePort. Your frame never calls ZenClub servers itself.
  3. The platform checks each call against the capabilities approved for your exact version, then saves, records or presents the result for you.

What the SDK gives you

  • The visitor's themeColours, light or dark mode, type and reduced motion arrive as CSS variables and update live.
  • Safe savesVersioned save slots with revisions, conflict detection, safe retries and autosave.
  • Measured timeYou report whether the experience is running. The platform measures time, so you never count it yourself.
  • Moments and badgesLet visitors keep a picture of a quiet moment, and request badges the platform verifies.
  • Header actionsPlace sound, restart, help and your own small actions in the platform header.
  • Language and timeThe visitor's language and time zone come with the context, so your experience can greet them in their own words.

What stays private

Plugins never receive an email address, account id, token or cookie. The context carries only a display name, language, time zone, membership tier, theme, optional sound preference and an approved city-recording choice. The frame cannot open pop-ups, show alert dialogs, submit forms or navigate the page.

Guides

Getting the SDK

@zenclub/sdk is a dependency-free ES module package with TypeScript types. We share it with creators we work with. Write to us about your idea, and we will send the current release and a review slot.