Docs

Block-based workspace pages that embed FastYoke data into your operator UI.

Pages

Pages are how admins compose custom workspace views without writing code. Each page is an ordered list of blocks (headings, paragraphs, lists, action buttons, images) configured through a visual designer, then rendered at a tenant URL. When a page is marked public, the same render is available at /p/:slug — useful for driver-facing dashboards, customer portals, or anything you'd otherwise need to author a full extension for.

Page vs extension

I want...Use
List jobs from a schema, fire transitions on a button clickA page
Custom UI beyond the block catalog (charts, maps, tables)An extension
Something anonymous users can readA public page
Rich interactivity tied to tenant stateAn extension

The boundary is intentional: pages trade customization for configurability. An extension is a React bundle you author + upload; a page is clicks in the designer + immediate preview.

Block types

The designer ships six block types. More can be added via extensions (the SDK's registerBlock() API — see SDK Reference).

TypePurpose
headingH1 / H2 / H3 with text content
paragraphProse paragraph
job_listList jobs for a given FSM schema, optionally filtered
entity_listList entity records for a given entity kind
action_buttonFires a named FSM transition on click
imageImage served from entity_files (one upload per image block)

The entity_list block is the bridge to entity annotations — when the typed entity has annotations, Columns renders as a checkbox picker and Default sort field becomes a dropdown populated from annotated field keys.

The designer workflow

  1. Open Pages in the admin sidebar and click New page.
  2. Give it a name and a URL-safe slug (used in the route).
  3. Drag blocks from the palette into the canvas. Each block opens a config panel — field keys, labels, schema ids.
  4. Toggle Public if you want the page served at /p/:slug with no auth.
  5. Save.

The tenant-admin view of the same page is at /workspace/:slug.

Public pages + embed origins

A public page at /p/:slug is served with a Content-Security-Policy header derived from the tenant's allowed_embed_domains. Two cases:

  • Unset — CSP is frame-ancestors 'self', so the page only renders when embedded on the same origin.
  • Set to a comma- or space-separated domain list — those domains are appended as allowed frame ancestors.

That lets you embed a public FastYoke page inside your own customer portal without relaxing the CSP globally. See Embed Config for the frontend contract (GET /api/v1/public/embed-config?slug=... returns the resolved CSP for use in the embedding shell).

Inheritance (enterprise)

Pages participate in the inheritance engine. Master-tenant pages propagate to subsidiary tenants as read-only mirrors; the designer renders an inherited page's blocks locked and hides the Save button. Edits happen in the master — changes sync on the next inheritance run.

Page per entity (optional)

/admin/pages/entity/:entityName is a convenience URL that opens the designer on a page keyed to an entity kind. This is the entry-point most admins use: design the detail view for a vehicle, a delivery, a work_order. The same page shape backs the public /p/... URL.

  • SDK Reference — registering custom block types via extensions.
  • Entities — how annotations upgrade the entity_list block's configurability.
  • Workflows — FSM schemas the job_list and action_button blocks reference.