Development server
embeddables dev compiles your TSX (and styles, config, computed fields, actions) and runs a local proxy that:
- Serves the compiled Embeddable to the Engine at the Preview URL.
- Watches files under
embeddables/<id>/and recompiles on change (hot reload). - By default uses the production Engine (
https://engine.embeddables.com); use--localto point to a local engine (e.g.http://localhost:8787).
http://localhost:3000?id=<embeddable-id>&version=latest
Open it in a browser to see your Embeddable. The dev server needs internet when using the default (remote) engine.
Workbench (debugging)
The Workbench is a debugging panel for easily changing pages, inspecting user data, computed fields, and actions.- On localhost previews (from
embeddables dev), the Workbench is on by default. - To hide it, add
?workbench=falseto the URL. - On non-localhost preview links (e.g. shared or deployed URLs), add
?workbench=trueto show the Workbench. - It is injected by the dev proxy so you can debug without deploying.
Authoring with TypeScript
Page and global-component files are React (TSX). Import primitives from@embeddables/cli/components for autocomplete and correct props:
- IDs and keys: Each component needs a unique
idandkey. Keys must not start with a digit (use a prefix likeoption_orrange_if needed). - Button actions: Use
"next-page"and"prev-page"(with-page), not"next"or"prev". - Types and stubs live in
.types/(created byinit) so your editor can resolve@embeddables/cli/componentsand@embeddables/cli/typeswithout installing the CLI as a project dependency.
For technical developers
- Comparing changes: Use
embeddables diffto compare your local working files against the last saved cloud version (embeddables diffwith no extra arguments defaults to--from latest --to local). For a deeper look, pass--depth propsto see individual prop changes, or--page <key>/--component <key>to filter to specific pages or components. You can also compare two cloud versions directly (e.g.embeddables diff --from 46 --to 47). For a raw JSON diff, openembeddable.jsonand the latestembeddable-<branch>@<version>.jsonin.generated/(e.g.embeddable-main@47.json) side by side in VS Code or Cursor: Shift+click both files, then right-click → Compare Selected. - Branches: Use
embeddables branchto switch branches; branch/version are stored inconfig.json. CLI-only branches can exist that aren’t editable in the Builder; the Builder remains the merge point for production. - Save conflicts:
embeddables saveuses the version inconfig.json(or.generated/) for optimistic concurrency. If the server has a newer version, you’ll be prompted; resolve by pulling the latest or force-saving when appropriate. - Custom engine: Use
embeddables dev --localor--engine <url>for local or custom Engine origins. - Build only: Run
embeddables build -i <id>to compile to.generated/embeddable.jsonwithout saving; then optionallyembeddables save --skip-build.
Best practices
- Save frequently (e.g. every 10 minutes or after significant edits) to avoid large conflicts.
- Use the Builder to diff and review after saving from the CLI; helps catch translation or styling differences.
- Test in both local preview (
embeddables dev) and (when applicable) live/staging to catch environment-specific issues. - Use Workbench (on by default for localhost previews from
embeddables dev; use?workbench=trueon non-localhost links) to inspect user data, computed fields, and actions while debugging. - Use
--fixon pull or build if you need to recover from missing required props (removes invalid components with a warning).

