What the web renderer draws
Every block below is drawn live from its example data, followed by the props it takes. Both come from the renderer's own block shapes, so this page changes with the code.
Hero with the brand
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | textrequired | The page's headline; without it the hero draws nothing. |
lede | text | A sentence under the heading. |
accent | text | The part of the heading drawn in the accent; a part the heading does not hold is not drawn so. |
align | text: start, center | `center` centres the text and the actions; `start` is the default. |
question | text | A line above the actions. |
primary | object | The main call to action. Without `label`, or without `href` and the sheet, none is drawn. |
primary.label | textrequired | The button's text. |
primary.href | text | Where it leads: a path of the site, which takes the page's language, an address, or `mailto:`. |
primary.action | text: sheet | `sheet` opens the site's contact sheet instead of `href`. |
primary.note | text | A line beside the button, such as the mail address it writes to. |
secondary | object | A second, quieter call to action. Without `label`, or without `href` and the sheet, none is drawn. |
secondary.label | textrequired | The button's text. |
secondary.href | text | Where it leads: a path of the site, which takes the page's language, an address, or `mailto:`. |
secondary.action | text: sheet | `sheet` opens the site's contact sheet instead of `href`. |
secondary.note | text | A line beside the button, such as the mail address it writes to. |
visual | text | The plugin that draws the figure beside the text, by its id, or `none`. |
caption | text | A line under the figure. |
atmosphere | text: none, data-rain | What falls behind the hero; left out, the site's `hero_atmosphere`. |
rain | list, max 5 | The rain's columns, drawn only under the block's own `atmosphere`. |
rain[].tokens | texts | The words of one column, top to bottom. |
Step rail
From a sentence to running software.
- 1
Describe
what the business needs
You - 2
Set up
once
Once - 3
Run
every day
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
steps | list, max 4required | Two to four steps, numbered in this order. |
steps[].icon | text | A lucide icon name, such as `sparkles`, or an image of the site's assets, `assets/<file>`. |
steps[].title | textrequired | The step's name. |
steps[].text | text | A line under the name. |
steps[].tag | text | A short label, such as who does the step. |
steps[].tag_tone | text: accent, plain | `accent` marks the tag; `plain` is the default. |
Flow step
3
It goes live by itself.
AutomaticThe way to live
- Test
- Stage
- Live
One updatereaches every customer
| Prop | Kind | What it holds |
|---|---|---|
number | numberrequired | The step's place in the flow. |
heading | textrequired | The step's heading. |
body | text | A sentence under the heading. |
tag | text | A short label, such as who does the step. |
tag_tone | text: accent, plain | `accent` marks the tag; `plain` is the default. |
figure | variant: form, status, path | What the step shows, drawn by its `kind`; without it the step draws its head only. |
figure(form).title | textrequired | The record's kind, such as `Order`. |
figure(form).ref | text | The record's number. |
figure(form).fields | list, max 6 | Its fields, two by two. |
figure(form).fields[].label | textrequired | The field's name. |
figure(form).fields[].value | textrequired | What it holds. |
figure(form).states | texts, max 6 | Its states in order. |
figure(form).current | text | The state marked as current. |
figure(status).layout | text: stack, row | `row` lays the rows out side by side from a medium screen up; `stack` is the default. |
figure(status).rows | list, max 6required | What is set up, one row each. |
figure(status).rows[].label | textrequired | What the row is, such as `App`. |
figure(status).rows[].value | textrequired | Its value. |
figure(status).rows[].note | text | A line beside the value. |
figure(status).rows[].stages | texts, max 6 | The stages the row went through. |
figure(path).heading | text | A line above the path. |
figure(path).stages | texts, max 6required | The stages in order. |
figure(path).current | text | The stage the runner reaches; the first when left out. |
figure(path).update | object | A note under the path. |
figure(path).update.heading | textrequired | The note's heading. |
figure(path).update.text | text | A line under it. |
figure(path).update.count | number | How many small marks stand for whom it reaches. |
figure(path).update.icon | text | A lucide icon name, or an image of the site's assets, `assets/<file>`. |
Screen feature
Everything your app needs, included.
includedWith every app.
Your app

- In all your languages
- Light and dark
| Prop | Kind | What it holds |
|---|---|---|
icon | text | A lucide icon name or an image of the site's assets, `assets/<file>`, in the head's tile. |
heading | textrequired | The section's heading. |
lede | text | A sentence under the heading. |
badge | text | A short accent label on a line of its own, such as `included`. |
badge_note | text | A line beside the badge. |
title | text | The card's title. |
text | text | A line under the card's title. |
link_label | text | A text button beside the card's title that opens `link_shot` large. |
link_shot | object | The screenshot `link_label` opens. |
link_shot.light | textrequired | The image in light mode, and in both modes without a `dark` twin. |
link_shot.dark | text | Its twin in dark mode. |
link_shot.alt | textrequired | What the image shows, for a reader who cannot see it. |
link_shot.paper | flag | A printed page: one image, the same in both modes, drawn whole. |
screens | list, max 2required | One or two screenshots: a desktop one, and a phone beside it. |
screens[].light | textrequired | The image in light mode, and in both modes without a `dark` twin. |
screens[].dark | text | Its twin in dark mode. |
screens[].alt | textrequired | What the image shows, for a reader who cannot see it. |
screens[].paper | flag | A printed page: one image, the same in both modes, drawn whole. |
screens[].label | text | A short label on the image, such as `Phone`. |
screens[].frame | text: desktop, phone | `phone` draws it in a phone's frame; `desktop` is the default. |
points | texts, max 6 | Short points under the screens. |
Hub
The core
The engine
Reads what was built and serves it.
One core feeds them all.
- App
- Websites
- Reports
| Prop | Kind | What it holds |
|---|---|---|
label | text | A short line above the heading. |
heading | textrequired | The core's name. |
body | text | A line under the heading. |
core | text | A lucide icon name or an image of the site's assets, `assets/<file>`, drawn between the arrows. |
note | text | A line above the outputs. |
outputs | texts, max 6required | What the core feeds, one to six, in order. |
Shot cards
Reminders and imports, finished even after an interruption.
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
cards | list, max 4required | One to four cards, in a row from wide screens up. |
cards[].title | textrequired | The card's name. |
cards[].text | text | A line under the name. |
cards[].shots | list, max 2 | None, one or two screenshots on top of the card, side by side. |
cards[].shots[].light | textrequired | The image in light mode, and in both modes without a `dark` twin. |
cards[].shots[].dark | text | Its twin in dark mode. |
cards[].shots[].alt | textrequired | What the image shows, for a reader who cannot see it. |
cards[].shots[].paper | flag | A printed page: one image, the same in both modes, drawn whole. |
cards[].icon | text | Without a screenshot: a lucide icon name or an image of the site's assets, `assets/<file>`, on top of the card. |
cards[].icon_text | text | Without a screenshot: a sentence under that icon. |
Disclosures
For engineers
What an app is made of
Order.entity.jsonorder.ts
| Artefact | What it does |
|---|---|
| entity JSON | The records and their fields |
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
items | list, max 8required | The panels, closed until a reader opens one. |
items[].summary | textrequired | The panel's line, which opens it. |
items[].chips | list, max 16 | Short labels, such as file names. |
items[].chips[].label | textrequired | The chip's text. |
items[].chips[].tone | number | 1 to 6: one of six marks from the theme's accent, so chips of one kind match; 1 when left out. |
items[].head | texts, max 2 | The table's column heads, one or two; a missing second one stays empty. |
items[].rows | list, max 16 | The table's rows. |
items[].rows[].label | textrequired | The left cell. |
items[].rows[].value | textrequired | The right cell. |
Closing panel
See it live, with your own process.
We show live demos by appointment.
Book a live demohello@example.com
| Prop | Kind | What it holds |
|---|---|---|
heading | textrequired | The panel's heading; without it the panel draws nothing. |
body | text | A line under the heading. |
primary | object | The main call to action. Without `label`, or without `href` and the sheet, none is drawn. |
primary.label | textrequired | The button's text. |
primary.href | text | Where it leads: a path of the site, which takes the page's language, an address, or `mailto:`. |
primary.action | text: sheet | `sheet` opens the site's contact sheet instead of `href`. |
primary.note | text | A line beside the button, such as the mail address it writes to. |
secondary | object | A second, quieter call to action. Without `label`, or without `href` and the sheet, none is drawn. |
secondary.label | textrequired | The button's text. |
secondary.href | text | Where it leads: a path of the site, which takes the page's language, an address, or `mailto:`. |
secondary.action | text: sheet | `sheet` opens the site's contact sheet instead of `href`. |
secondary.note | text | A line beside the button, such as the mail address it writes to. |
note | text | A small line under the actions. |
frame | text: card, none | `none` draws the panel without its card, border and glow; `card` is the default. |
Pillars
What we stand on
01
Open
Every book is on the shelf.
02
Free
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
items | listrequired | The pillars; one without a title is left out. |
items[].num | text | A short mark above the title, such as `01`. |
items[].title | textrequired | The pillar's title. |
items[].body | text | A sentence under the title. |
Stack
The products
Lending
availableLoans and returns.
Shop
coming| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
items | listrequired | The products; one with neither a title nor a lockup is left out. |
items[].title | text | The product's name, where no lockup draws it. |
items[].lockup | object | The product's name as a family lockup, such as `digita ● erp`. |
items[].lockup.family | text | The family's word. |
items[].lockup.product | text | The product's word. |
items[].status | text: available, early_access, coming | How available the product is today. |
items[].body | text | A sentence under the name. |
items[].href | text | Where the card's link leads; drawn only with `link_label`. |
items[].link_label | text | The link's text. |
Pipeline
How a loan works
1
Reserve
2
Collect
within a week
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
stages | listrequired | The stages in order; one without a title is left out. |
stages[].stage | text | A short mark above the title, such as `Step 1`. |
stages[].title | textrequired | The stage's title. |
stages[].body | text | A sentence under the title. |
stages[].target | text | A line at the card's foot, such as how long the stage takes. |
Compare
Before and after
| Before | After | |
|---|---|---|
| Loans | BeforeOn paper | AfterIn the app |
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
columns | texts, max 2required | The two columns' heads; without both nothing is drawn. |
rows | listrequired | The rows; one without an aspect is left out. |
rows[].aspect | textrequired | What the row compares. |
rows[].a | text | The first column's cell. |
rows[].b | text | The second column's cell. |
Checklist
What you need
- An IDany official one
- An address
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
items | listrequired | The points; one without `what` is left out. |
items[].what | textrequired | The point. |
items[].note | text | A line beside it. |
Segments
Who reads here
A
Students
who study here
Quiet desks
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
items | listrequired | The segments; one without a title is left out. |
items[].mark | text | A short mark above the title. |
items[].title | textrequired | The segment's title. |
items[].who | text | Who it is for. |
items[].gain | text | What they gain, at the card's foot. |
Signals
In short
- Free
- Open six days
- In the town centre
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
items | textsrequired | The short claims, one per line. |
note | text | A small line under them. |
Hero
Borrow a book today
Every book, three weeks at a time.
How to join| Prop | Kind | What it holds |
|---|---|---|
heading | textrequired | The page's headline; without it the hero draws nothing. |
subheading | text | A sentence under the headline. |
cta_label | text | The button's text; drawn only with `cta_href`. |
cta_href | text | Where the button leads. |
Rich text
Visit us
Open Monday to Saturday.
The reading room closes an hour earlier.
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
body | text | The text; an empty line starts a new paragraph. |
primary | object | A call to action under the text. Without `label`, or without `href` and the sheet, none is drawn. |
primary.label | textrequired | The button's text. |
primary.href | text | Where it leads: a path of the site, which takes the page's language, an address, or `mailto:`. |
primary.action | text: sheet | `sheet` opens the site's contact sheet instead of `href`. |
primary.note | text | A line beside the button, such as the mail address it writes to. |
secondary | object | A second, quieter call to action. Without `label`, or without `href` and the sheet, none is drawn. |
secondary.label | textrequired | The button's text. |
secondary.href | text | Where it leads: a path of the site, which takes the page's language, an address, or `mailto:`. |
secondary.action | text: sheet | `sheet` opens the site's contact sheet instead of `href`. |
secondary.note | text | A line beside the button, such as the mail address it writes to. |
note | text | A small line under the actions. |
align | text: start, center | `center` centres the text; `start` is the default. |
size | text: normal, small | `small` sets the lede as a small aside; `normal` is the default. |
Feature grid
What members get
Three weeks
Every loan runs three weeks.
Reservations
| Prop | Kind | What it holds |
|---|---|---|
heading | text | The section's heading. |
items | list | The cards, three in a row on a wide screen. |
items[].title | text | The card's title. |
items[].body | text | A line under the title. |
Stats
- Books
- 12,000
- Members
- 800
| Prop | Kind | What it holds |
|---|---|---|
items | listrequired | The figures, up to four in a row on a wide screen. |
items[].label | text | What the figure counts. |
items[].value | text | The figure. |
Media

The reading room
| Prop | Kind | What it holds |
|---|---|---|
image | text | The image as a file id or `assets/<file>`; it wins over `src`. |
src | text | The image's address. |
alt | text | What the image shows, for a reader who cannot see it. |
caption | text | A line under the image. |
Call to action
| Prop | Kind | What it holds |
|---|---|---|
heading | text | The panel's heading. |
body | text | A line under the heading. |
cta_label | text | The button's text; drawn only with `cta_href`. |
cta_href | text | Where the button leads. |
Embed
| Prop | Kind | What it holds |
|---|---|---|
src | textrequired | The address the frame shows; without it nothing is drawn. |
title | text | The frame's title for a screen reader. |
Code
One file
book.entity.jsonjson
{ "name": "Book" }| Prop | Kind | What it holds |
|---|---|---|
code | textrequired | The code, as it is shown; without it nothing is drawn. |
title | text | A file name or title above the code. |
language | text | The language's name, shown as a badge. |
heading | text | The section's heading. |
intro | text | A sentence above the code. |
caption | text | A line under the code. |
Contact details
Find us
| Prop | Kind | What it holds |
|---|---|---|
heading | text | The section's heading. |
body | text | A sentence under the heading. |
address | textsrequired | The postal address, one line each; without it nothing is drawn. |
email | text | The mail address. |
phone | text | The phone number. |
booking_url | text | Where the booking button leads; drawn only with `booking_label`. |
booking_label | text | The booking button's text. |
form | object | The contact sheet's own texts; each one left out keeps the site's text. |
form.title | text | The sheet's title. |
form.heading | text | The heading above the form. |
form.lede | text | A sentence under it. |
form.name | text | The name field's label. |
form.email | text | The mail field's label. |
form.message | text | The message field's label. |
form.messagePlaceholder | text | The message field's hint. |
form.send | text | The send button's text. |
App list
The apps
| Prop | Kind | What it holds |
|---|---|---|
eyebrow | text | A short line above the heading. |
heading | text | The section's heading. |
lede | text | A sentence under the heading. |
apps | list | The texts of the tenant's apps, each by its name; an app without one shows its name in words. |
apps[].app | textrequired | The app's name, as the tenant runs it. |
apps[].title | text | The card's title. |
apps[].description | text | A sentence under the title. |
link_label | text | The text of the link into an app. |
demo_label | text | The text of the demo link on a demo tenant. |