Skip to main content

This Runtime Kit Cookbook entry builds the same shape explained in Placeable surfaces: package material becomes named data reads and targets, descriptors declare what each surface may touch, and a dumb shell places the surfaces.

The snippets on this page come from examples/product-cookbook/placeable-surface-product-loop/ and are checked by cookbook-examples.json.

When to use this

Use this recipe when the product is bigger than one component.The point is not “make a dashboard.” The point is to keep arrangement generic while package-specific UI rules live in package data, targets, descriptors, and surface bodies.

What you will build

What should happen

Step 1: package records and targets

The package owns product facts and callable targets.
Runtime Kit admits this package set and prepares the public read/request surface for the app.The package contract is:

Step 2: surface descriptors

A descriptor says where the surface can appear and which Runtime Kit names the surface body may use.
Notice what is missing: no dashboard branch, no help branch, no support branch in the shell. The product-specific names are data on the descriptor.Descriptor contract:

Step 3: dumb shell

The shell receives surface descriptors and a render registry. It builds navigation from descriptor labels and chooses the active surface by id.
That shell can place any future surface that follows the descriptor. It does not change when you add analytics, onboarding, billing, settings, or a new customer-facing product area.Shell verification:

Step 4: surface body

The surface body is where product work happens. It reads Runtime Kit data and calls Runtime Kit targets.
This surface can be moved from main to panel, opened beside another surface, or reused in a different shell. The product work stays with the surface body. The arrangement stays with the shell.Surface body contract:

Step 5: second surface, same request primitive

The app has another capability. The shell still did not change.

Verify the full loop

Before you call the feature done, write this checklist beside it:
Check the product loop against this list before it ships. Use the same checklist for teammate code, your own code, or AI-written code.

Common failures

Safe variations

You can extend this recipe without changing the primitive:
  1. Add launch.analytics in the rail region with its own data name.
  2. Move launch.help from panel to main by changing region.
  3. Add settings.billing with a new component key and target.
  4. Add a second shell that renders the same descriptors differently for mobile.
  5. Add a support surface that reads account/device status once that public names exists.
The shell stays generic in every variation. The product grows by adding descriptors, package material, and surface bodies.

Review checklist

The finished product loop should be able to answer:
Reject the work if the shell names product concepts in branches, if a surface reads/calls names missing from its descriptor, or if app code imports package implementation files.

Next

Read Placeable surfaces when you need the concept behind this recipe.Read Package file for exact package thing fields.Read Runtime Kit API for the public read/request functions.
Last modified on May 10, 2026