404
ProA 404 page: the code scrambles into place from random digits, rings spread slowly behind it, and the headline, copy and one link home arrive in three beats..
Components / Sections
108 components · 32 at 0 B
Animated page sections for Astro, built from the free primitives: heroes, features, pricing, testimonials, FAQ, blog and footers. Pro.
A 404 page: the code scrambles into place from random digits, rings spread slowly behind it, and the headline, copy and one link home arrive in three beats..
The people a buyer deals with: each drawn by PortraitArt on a colour block, with the name, the role, the areas and languages, a figure or two, a line in their own words, and a call and an email as links.
Sample run
An imaginary agent on an imaginary repository. The lanes fill in order; under reduced motion, or without JavaScript, they are filled from the start.
Task Fix the failing checkout test in apps/web
Done
read_log(job 4182)done0.4 sgrep("toBe(19.99)" apps/web)done0.2 srun_tests(apps/web)done38 sexport function total(items: Item[]) { const sum = items.reduce(add, 0); return sum * 1.2; const gross = sum * 1.2; return Math.round(gross * 100) / 100;}Maya Kim
Ready to merge. The suite passes and the change is two lines.
Approved
Checkout totals round to cents
An AI agent's run, replayed in the page: the task at the top, then four lanes that fill in order (the plan ticks off, tool calls spin and finish with their time, a diff writes in line by line, a person is asked to approve and the approve reads Approved), then the result with its numbers.
Every request takes your key as a bearer token. Sample API, made up for this demo.
Base URLhttps://api.sitename.example/v1
Send an email, then follow it until it lands.
POST/emails
Queues one email. It is sent within seconds; follow it with GET /emails/{id} or a webhook.
Body
fromstringFormat: email.required
An address on a domain you have verified.
tostringFormat: email.required
subjectstringAt most 998 characters.required
textstringoptional
The plain-text body.
tagsarray of objectsoptional
Labels you can filter the logs by.
namestringoptional
valuestringoptional
Responses
202422Request
curl -X POST "https://api.sitename.example/v1/emails" \
-H "Authorization: Bearer $SITENAME_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "hello@sitename.example",
"to": "ada@example.com",
"subject": "Your receipt",
"text": "string",
"tags": [
{
"name": "kind",
"value": "receipt"
}
]
}'const res = await fetch('https://api.sitename.example/v1/emails', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SITENAME_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
from: 'hello@sitename.example',
to: 'ada@example.com',
subject: 'Your receipt',
text: 'string',
tags: [
{
name: 'kind',
value: 'receipt',
},
],
}),
});
const data = await res.json();import os
import requests
res = requests.post(
"https://api.sitename.example/v1/emails",
headers={"Authorization": f"Bearer {os.environ['SITENAME_KEY']}"},
json={
"from": "hello@sitename.example",
"to": "ada@example.com",
"subject": "Your receipt",
"text": "string",
"tags": [
{
"name": "kind",
"value": "receipt",
},
],
},
)
print(res.json()){
"id": "em_7Hq2kD9x",
"status": "queued",
"created_at": "2026-10-09T08:14:22Z"
}{
"error": "domain_not_verified",
"message": "Verify sitename.example before sending from it."
}GET/emails/{id}
Path parameters
idstringrequired
The id the send returned.
Responses
200Request
curl "https://api.sitename.example/v1/emails/em_7Hq2kD9x" \
-H "Authorization: Bearer $SITENAME_KEY"const res = await fetch('https://api.sitename.example/v1/emails/em_7Hq2kD9x', {
headers: {
Authorization: `Bearer ${process.env.SITENAME_KEY}`,
},
});
const data = await res.json();import os
import requests
res = requests.get(
"https://api.sitename.example/v1/emails/em_7Hq2kD9x",
headers={"Authorization": f"Bearer {os.environ['SITENAME_KEY']}"},
)
print(res.json()){
"id": "em_7Hq2kD9x",
"status": "queued",
"created_at": "2026-01-01T00:00:00Z"
}The domains you send from, and whether their records check out.
GET/domains
Query parameters
limitinteger1 to 100.optional
How many to return.
Default20
Responses
200Request
curl "https://api.sitename.example/v1/domains" \
-H "Authorization: Bearer $SITENAME_KEY"const res = await fetch('https://api.sitename.example/v1/domains', {
headers: {
Authorization: `Bearer ${process.env.SITENAME_KEY}`,
},
});
const data = await res.json();import os
import requests
res = requests.get(
"https://api.sitename.example/v1/domains",
headers={"Authorization": f"Bearer {os.environ['SITENAME_KEY']}"},
)
print(res.json()){
"data": [
{
"name": "sitename.example",
"status": "verified"
}
],
"has_more": false
}An API reference in one section: a sidebar of groups and their operations; for each operation its method and path, what it does, its path, query and header parameters, the fields of its body (nested fields under a disclosure, as deep as they go) and its responses; and beside it, sticky on a wide screen, the request in every language with a copy button and the response examples by status.
A hero for a mobile app: the headline, the rating line (stars, the average, how many rated and where) and the store buttons beside a phone on a disc of the app's colour.
The neighbourhoods an agency sells in, as ExpandingPanels: each area a panel with its street drawn by HomeArt, its starting price over its name and a line about it, widening as it is pointed at or focused; under the row the same areas with a few figures each, so the figures are read in order.
What is on offer, as colour blocks: each card paints one of the palette's blocks and carries a drawing in its corner (Motif), an index, a name, a line, chips for what it includes and a foot with a price and a round arrow.
The closing call on a colour block: a short line, a large heading that ends on a phrase in the emphasis face, a sentence and two pill actions, on one of the palette's blocks with a drawing (Motif) rising out of its lower corner.
This post is sample text. It describes the page it sits on, so every sentence can be checked against what the page does.
Two things on this page follow the reader: the line beside the text and the list of headings in the side column.
The line fills as the article scrolls past. It runs on the article's own view timeline, so the browser draws it and no script counts pixels.
The list marks the heading you are reading. Its links are plain anchors, and a jump stops below the sticky bar.
A post imports what it uses: a marker, code tabs, a gallery and a link card.
npx astro add moonarcpnpm astro add moonarcThe list beside this text is Reading TocReading TocA table of contents that marks the heading you are reading., and the line is its sibling.
The line is full and still, the list is a list of links, the pictures link to their full size, and the card is a plain link.
The page of one blog post: a header with the date, the reading time, the title, the author, the tags and the cover, then the body in a measured column that a beam fills as it is read, beside a contents list that follows the reader.
Endpoint, a template for a product with an HTTP API: a console on the home page that sends a request and streams the response back with its status, its time and its region, an API reference written at build from your OpenAPI document, a quickstart and four guides, usage pricing with a slider, a status page, the regions on a map, a changelog with a feed, search and a contact page for sales.
Shows blog posts as cards, with the first post featured across two columns.
Writing as a list: the day, the title at display size and the reading time on one line per post, the whole line a link, and the post's cover floating by the pointer while the line is hovered.
The dates and the guests of a stay, handed to the place's own booking engine: a form that sends them to the engine's address as the parameters it reads (check-in, check-out, adults, children, and any fixed ones, such as the property's id), so a guest lands on the engine's page with the search filled in.
A closing call to action: a deep brand panel with an aurora and film grain behind it, a headline that catches a shine, a magnetic primary action, a secondary one, and a typed command.
Case studies as a deck: on a wide screen each card holds at the top of the screen while the next slides up over it, and the one underneath shrinks and darkens a little on a scroll-driven timeline; on a phone they follow one another.
The top of a case study: the project's title at display size, its facts in a grid (client, year, role, credits), the cover that opens from a rounded inset to the full width as the page scrolls (ScrollExpand), then a before-and-after (ImageCompare) or a gallery that opens full size (Lightbox).
Sample conversation
An imaginary agent on an imaginary repository. Open a call to read what it returned.
You
Fix the failing checkout test in apps/web
Sample agent
One assertion fails: the total keeps a fraction of a cent. I will find where it is computed.
read_log(job 4182)0.4 sFAIL apps/web/cart.test.ts
total > rounds to cents
expected 23.99, received 23.988grep("* 1.2" apps/web/src)0.2 sapps/web/src/cart/total.ts:3 return sum * 1.2;run_tests(apps/web)38 sTests 48 passed (48)
Time 37.9 sSample agent
Push the change to fix/checkout-rounding and open a pull request?
Approved
Sample agent
Done. The total now rounds to cents after tax, and all 48 tests in apps/web pass. The pull request is open for review.
You
Update the lockfile and fix what breaks
Sample agent
Three packages have new minor releases. I will update them one at a time and run the suite after each.
outdated()1.1 sdate-lib 3.2.0 → 3.4.1
http-kit 8.0.2 → 8.1.0
ui-icons 1.9.0 → 1.12.0install(date-lib@3.4.1)6.2 slockfile updated, 1 package changedrun_tests(--changed)52 sTests 211 passed (211)Sample agent
Commit the three updates to deps/2026-09 and open a pull request?
Approved
Sample agent
Updated three packages. One test needed a new date format, which I changed; the other 211 passed as they were.
You
Explain why main is red
Sample agent
The last merge changed a shared type. I will compare the two runs.
list_runs(main, 2)0.3 s#4190 failed 3 min ago
#4189 passed 41 min agodiff_runs(4189, 4190)0.8 snew failure: api/orders.test.ts
Order.total is string, expected numberSample agent
Open an issue for the author of the merge with this explanation?
Approved
Sample agent
Main is red because a merge 40 minutes ago made Order.total a string. One test in api/orders expects a number. Reverting that line or parsing it fixes the build.
A conversation with an AI agent, replayed in the page: the reader's message, the agent's reply with its tool calls folded into <details> (the call and its result in the monospace face), a request for approval that is approved, and the final answer, typed, with a button that copies it; a prompt box at the foot as a demo form.
Compares your product with others in an "us versus them" table.
Contact · sample page
Sample channels on the left. The form on the right is real and sends nothing here: fill it in and watch the button.
Demo: nothing is sent.
A contact section in two columns: the ways to reach you (email, phone, office) on one side, a form that really sends on the other.
A documentation layout: a sticky sidebar with the current page marked, a reading-progress hairline bound to the scroll, the header and content revealed in two beats, and previous/next links.
How the work runs, in a few steps across the page: each step a round number in a colour block, a title and a line.
A split hero: a tall headline revealed line by line on the left, a live panel sliding in from the right, on a slowly drifting grid.
Short answers. The long ones are in the docs.
For 83 of 125, yes, measured from a build.
Yes, verified on Astro 5, 6 and 7.
No.
A heading and lead beside a native accordion: one question open at a time, heights animated by the browser, keyboard and screen reader handled by <details>.
Lays out features as a bento grid: one slab split by 1 px hairlines, with the page ground showing through the gaps.
Shows features in alternating rows of copy and a visual.
Sample features
Two weeks of sample orders, one bar a day.

The share of sample stock each warehouse holds.

Order number, customer, items, status and total.

A product's features as tabs: a named radio group over one panel per feature, each with its title, body and image, the image optionally in a browser window.
Add the MCP server once and the agent searches components by intent and byte budget, reads their craft notes and gets the command that installs them.
# in your project
claude mcp add moonarc -- npx -y @moonarc/mcp// .cursor/mcp.json
{
"mcpServers": {
"moonarc": { "command": "npx", "args": ["-y", "@moonarc/mcp"] }
}
}// .vscode/mcp.json
{
"servers": {
"moonarc": { "type": "stdio", "command": "npx", "args": ["-y", "@moonarc/mcp"] }
}
}# ~/.codex/config.toml
[mcp_servers.moonarc]
command = "npx"
args = ["-y", "@moonarc/mcp"]A feature section with code beside the copy: a headline, copy and a short list on one side, and CodeTabs on the other, one tab per client or language, each panel with its own copy button.
What a practice charges, as tables a reader can trust: one a group, each row a service, its price and a note, and where insurance applies a column that says in words whether it is covered, partly or not, with a mark that repeats it in shape.
A hero with a field of glyphs behind a panel in the brand colour (ink on a page without a theme) whose meta line, headline and actions wipe in one after another.
Point at a room in the list to find it on the plan.
Rooms · Ground floor
Total67.5 m²
Rooms · First floor
Total67.5 m²
A home's floors drawn from its rooms: each room a rectangle on a grid of metres with its walls round it and its name and area over it, and beside the plan the same rooms as a list with the total.
A site footer: brand and blurb, link columns revealed with a stagger, a legal row, and a dot field fading up from the bottom edge.
A footer for a studio or a person: a line and the email address to write to, columns of links, and the name set across the whole width at the bottom.
The foot of a maker's site, made like the label sewn into what they make: a panel in a colour block with a stitched edge, the name large (a second part in the emphasis face), the link columns, a row of care symbols drawn as line icons with their words (how to wash it, that it goes in the oven, that it is mended for free) and a few small lines in the mono face.
A footer that signs off like a letter: on a strong colour block, a line of thanks, the name set large with its second part in the emphasis face and a stroke drawn under that part, a way back to the signup, the links in columns and a few small lines at the foot.
The first screen of one person's work, as a bento.
The opening of a colour-block site: the headline rises line by line out of its masks, its last word turns through a few in the emphasis face (RotatingText), a round badge with text running around it links further down the page, the lede and two pill actions sit under it, and a strip of tiles in the palette's blocks runs across the bottom (Marquee), each a drawing (Motif) or a picture with a caption.
A first screen in type as large as it will go: the name or the claim in a few lines that rise once, one after another, from masks of their own (SplitText by line).
The first screen of an event, made like its poster: one colour block with the edition and the place in the mono face, the name huge, the dates, a line, two actions, three facts, a countdown to the doors (core CountdownFlip) and the days as chips, and beside them a composition of nine shapes in the block's drawing colours that pop into place one after another as the page opens and turn a quarter when a pointer rests on them, one of them turning round a quarter at a time once they are in, inside five seconds, then resting.
The first screen of a practice (a dentist, a doctor, a vet, a law or an accounting firm): the headline, a line of what it does, the two things a visitor comes to do (book and call) and a line for the register it is on; beside them the place as one card on a colour block, its front drawn by HomeArt, a line from OpenStatus that says whether it is open now in the place's own time zone, the address, the phone and a few rows a patient or a client asks first.
A complete hero as one component with props: an ambient aurora, a headline split and revealed word by word, supporting copy with a rotating word, two actions and a typed command.
Firing 08 is on the shelf
Cups, bowls and vases thrown by hand and fired a few dozen at a time.
Tall vase32 cm · StonewarePrice: $86
Morning cup300 ml · Two glazesPrice: $24
Breakfast bowl16 cm · Speckled clayPrice: $32
The first screen of a maker's site: the heading, a line, two actions and three facts on one side; on the other, the products themselves, each drawn on its plate (ProductArt) with its name, a spec line in the mono face and its price.
A guesthouse by the sea, made up for this demo
Seven rooms in an old captain's house, the beach six minutes down the lane. Sample prices.
The first screen of a place to stay: the headline and a line of what the place is, a few facts, and the place by day and by night in one frame: light falling over the day picture (LightRays), the windows lit in the night one, and a pair of radios under them that picks which shows, with no script.
What a guest agrees to before they come, set out to be read: the arrival and departure times large, the house rules as a list where each answer is a word with a mark that repeats it in shape (a tick, a cross), what the stay includes, and the policies in a sentence or two each: cancelling, a deposit, a late arrival.
The product in the middle, its integrations around it, and data travelling along the lines between them: up to eight on the lines, more on a ring around the product.
A grid of integrations, tools or partners: cards with an icon, a name and a line, each lit by a spotlight that follows the cursor and lifting on hover, revealed with a tight stagger..
Who is on: each person a drawn portrait on a colour block (PortraitArt, seeded from the name), the name and what they do, and on the back of the portrait their session: its title, the day and time, the stage.
Southbank, on the river path
$1,150,000 Guide price (a sample)
The top of a home's own page: its pictures on one side, each a building drawn by HomeArt under a Lens that magnifies it at the pointer, with a row of thumbnails that picks one (radios and :has(), so the arrow keys move along them); on the other side the price, the title, the address, the facts and two actions.
Pick a kind and the least bedrooms: the cards filter with no script. Sample homes and prices.
6 homes6 homes5 homes3 homes2 homes3 homes3 homes3 homes3 homes2 homes3 homes3 homes2 homes0 homes0 homes
No home matches. Try fewer bedrooms or another kind.No home matches. Try fewer bedrooms or another kind.
Homes as cards (the building drawn by HomeArt, the price, the address, the beds, the baths and the area) with filters that work with no script: a group of radios for the kind of home and one for the least bedrooms, and :has() rules written for the list at build hide every card that does not match.
The first screen of an estate agency: the headline, a line, two actions and a few figures on one side, and on the other the homes on the market now, one large and two small, each its building drawn by HomeArt with the price and the street on a card over it, every one a link to its page.
A "trusted by" section: a heading, a strip of greyscale logos drifting past that colour up on hover, and optionally the same logos as a hairline grid revealed with a stagger.
Materials
Three clays and the glazes we mix from them. Pick one to see it up close.
A grey clay with dark iron spots that come through the glaze as it fires.
Goes into Cups, bowls, plates
White, smooth and hard to throw thin. It lets a little light through at the rim.
Goes into Espresso cups
A soft, warm clay that fires at a lower heat and is glazed inside to hold water.
Goes into The low vase
Wood ash, sieved and mixed with feldspar; it runs in the kiln and pools green.
Goes into Vases, jugs
What the work is made of, as a short index: each material a row with its name, where it comes from and a small swatch, and beside the rows a large card for the one picked, with the swatch drawn big (a weave, a speckle, a grain, a crumb or a ripple, in the colours of its block), a note and what it goes into.
A menu bar whose panels open as popovers anchored under their triggers, columns revealing with a stagger, closing on Escape or outside click.
| Deposit | 15 years | 20 years | 25 years | 30 years |
|---|---|---|---|---|
| 10% | $5,857 | $4,852 | $4,270 | $3,899 |
| 20% | $5,206 | $4,313 | $3,796 | $3,465 |
| 30% | $4,555 | $3,774 | $3,321 | $3,032 |
An estimate to plan with. A lender works out the real figure.
Numbers someone can plan around, on a colour block: a panel in one of the palette's blocks with a drawing (Motif) half out of its corner, a short line and a heading, then the figures in a row, each large in the block's emphasis colour with its unit beside it and a line under a hairline.
a sample page under the bar
Open the menu: the site in type as large as the screen.
A bar with the name or the mark and one Menu button, and behind the button the whole site in type as large as the screen allows: the menu covers the page, its items arrive one after another, and each label rolls on hover.
What is around a place to stay, by how a guest gets there: a group a way (on foot, by bike, by car, by boat), each place a row with its name, a line about it and the minutes it takes, and a bar drawn to scale against the farthest place of its group, so the near ones read near at a glance.
An email signup section built on a real form: native validation, an invalid state that only shows after the user has typed, a submit button whose label swaps for a spinner when the form carries data-pending, a status line for your handler, and a dot field behind.
Kind words from readers, listeners or students, pinned up as notes: each a card in one of the palette's tints with a strip of tape across its top, tilted a little by its words (the same tilt on every build), the quote and who wrote it with where they are.
The notices a regulated practice owes its readers, set where they are read: first, on a panel of its own in the page's ink, what to do in an emergency with the number as a link; then the rest as short notes, each a title, a sentence and a link (the register it is on, how to complain, that the site gives general information and not advice, the access to the building).
A "now" page in one section: what one person is making, reading, learning and planning at the moment.
Shop
Guide · 120 pages
How to plan, build and keep a small site going for years.
Guide · 48 pages
One colour to a whole palette, with the contrast checks.
Membership · yearly
A second letter each month and the guides as they come out.
$60 a year
Become a member (opens the shop)What one person sells, on a shelf: a course, a guide, a membership, prints or sessions.
Fixed packages with what they cost: each card names a package and who it suits, gives the price and what it is counted in (or "Price on request", for a business that quotes), lists what is included with a tick in a colour block, can carry a bonus line on that block, and ends in an action that asks about that package.
The people of a practice as cards: each drawn by PortraitArt on a colour block, with the name, the role, the qualifications after the name, and the facts a patient or a client checks (the days they are in, the languages they speak, the register they are on and their number), a line in their own words and a link to their page.
Episodes
Episode 48
Episode 47
Episode 46
Episode 45
The issues, episodes, lessons or videos of one person's work, as a list of rows in the order you give them (newest first).
What a writer needs on one page: the app's icon, the fact sheet (a description list a reader can copy from), the files to download with their format and size, the colours with their values, a few words from the people who make it, and who to write to.
$0/yr
MIT, forever
$129/yr
One person, billed yearly
$349/yr
Up to 10 people, one invoice
Shows pricing plans side by side, with an annual/monthly toggle that rolls every price digit by digit to the other period with zero JavaScript (radios, :has and NumberFlow), the highlighted plan wearing a travelling border beam, cards revealed with a stagger.
A feature-by-plan comparison: the highlighted plan's column lit, rows revealed with a 40 ms stagger as the table scrolls into view, and a header row that sticks when you cap the table's height.
How a thing is made, as steps sewn on one thread: a stitched line runs down the section and each step is a knot on it (a round number in a colour block, stitched round its edge) with a title, a line and how long it takes.
Price: $86
A tall vase for branches and long stems, thrown in two parts and joined at the shoulder.
9 of 24 left in this batch
Wrapped in paper and card, and sent the week after it comes out of the kiln.
The top of a product's page: the product drawn large on its plate (ProductArt), with its colourways under it as small swatches (radio buttons) that recolour the drawing in place; beside it the trail back to the shop, the name, the price, a line, how many of the batch are left, two actions, the specifications in the mono face and a few notes that open (care, delivery).
The next batch, as one colour block: the product drawn large (ProductArt) under a round date stamp, and beside it the heading, a line, how many of the batch are spoken for (a count, and a bar that fills as the panel comes into view), three facts in the mono face and two actions.
The shop
32 cm
Price: $86
300 ml
Price: $24
16 cm
Price: $32
18 cm
Price: $64
90 ml
Price: $18
28 cm
Price: $72
A whole collection on one page, filtered by kind: the products as cards (each drawn on its plate with ProductArt, a hang tag for the price, the name as the card's link and a spec line in the mono face) in two, three or four columns by the box's width, and above them a row of filters with their counts (core FilterGrid: the cards that stay slide into place, and the URL keeps the filter).
scroll inside
Sample product
The dashboard in the frame is a capture of sample data. Scroll inside the box and the window stands upright.


A product hero: a headline revealed word by word, two actions, a play chip that opens the demo video in a dialog, and the product screenshot in a browser window that leans back 20 degrees and stands upright as the page scrolls.
A row of products that runs off the page's edge: each drawn on its plate (ProductArt) with a hang tag for the price, the name as the card's link and a spec line in the mono face.
Sample projects
The work as a numbered index: one line per project with the title at display size and the client, the discipline and the year in mono, the whole line a link.
A hero whose entry point is a prompt box: a small label, a short headline, a lead, a large PromptInput with Enter to send, a status line and example tasks.
A quickstart as numbered steps down a rail that fills as the reader moves through them, each number lighting as its step reaches the middle of the screen.
What people who use the app say, as the stores show it: the average large with its stars and how many rated, a bar for each star count with its share written beside it, and a few reviews, each with its stars, its title, who wrote it, when and where.
Where a service runs: the world in dots with each region pinned and pulsing in turn, a chip at each pin with its code and the latency measured there, and under the map the same regions as a list (name, code, figure), so a reader who cannot see the map, or reads on a narrow screen where the chips would crowd, loses nothing.
Email API
One request sends it. Webhooks tell you when it lands, and every message keeps its own log.
Sample figures, made up for this demo
POST /v1/emails HTTP/1.1
Host: api.sitename.example
Authorization: Bearer sk_live_••••
Content-Type: application/json
{
"from": "hello@sitename.example",
"to": "ada@example.com",
"subject": "Your receipt",
"template": "receipt"
}202 Accepted84 msfra1
{
"id": "em_7Hq2kD9x",
"status": "queued",
"created_at": "2026-10-09T08:14:22Z"
}GET /v1/emails/em_7Hq2kD9x HTTP/1.1
Host: api.sitename.example
Authorization: Bearer sk_live_••••200 OK31 msfra1
{
"id": "em_7Hq2kD9x",
"status": "delivered",
"opened": false,
"events": [
{
"type": "delivered",
"at": "2026-10-09T08:14:25Z"
}
]
}GET /v1/domains HTTP/1.1
Host: api.sitename.example
Authorization: Bearer sk_live_••••200 OK27 msiad1
{
"data": [
{
"name": "sitename.example",
"status": "verified",
"region": "eu-west"
}
],
"has_more": false
}A hero for an HTTP API: the headline beside a console where a request is written line by line, a line runs while it is sent, the status lands with the time it took and the region that answered, and the JSON response streams in under it.
The rooms of a place to stay as cards: each drawn by RoomArt on a colour block, with its name, how many it sleeps, its beds and its size, what it has (a terrace, a bath, a sea view), a sentence about it and its price from a night, the whole card a link to book it or to its page.
Schedule
Doors and badges from 09:30
10:00–10:30
Opening
10:30–11:15
Letters that move
Type designer
12:15–13:30
Lunch
14:00–16:00
Drawing with code
Illustrator
The party is in the garden from 19:00
10:00–10:45
Fast pages
Web engineer
13:30–15:30
Motion with manners
Motion designer
16:00–16:45
Everyone reads
Accessibility lead
A shorter day, done by 16:00
10:30–11:15
Words on screens
Writer
11:30–13:00
Light for products
Photographer
15:15–16:00
Closing
A programme by day: a row of day chips (radio buttons, each a weekday over its date in a colour block) picks the day, and under it the day's sessions in order, with the time in the mono face, the title, who leads it, the stage as a chip in the stage's own colour and the kind of session beside it.
An app's features told down the page while one phone stays in view beside them and its screen changes with each feature.
A service's own page, top to bottom: its name and what it is in a sentence, then the parts a reader looks for before booking (what it is, who it is for, what happens step by step, what to bring, what comes after), each under its own heading; beside them a card that stays in view while the page scrolls (position: sticky, nothing animated) with the facts (how long, from what price, whether insurance covers it), the two actions and a line of small print.
What a practice does, by group: each group's name and a line about it on one side, its services on the other as rows, each with a line of what it is, how long it takes and what it costs from, and a link to its own page.
Sample services
A name, a mark and the rules that hold them together, for a company that is new or has outgrown its look.
Deliverables
Sites designed and built by one team, from the first sketch to the code that ships.
Deliverables
Screens for an app or a tool, drawn with the people who will use them and handed over as working components.
Deliverables
The logo in motion, a product film, the interface itself: motion that says one thing each time.
Deliverables
What a studio or a freelancer does, as numbered rows at display size that open one at a time: each row names a service, and opens to a short text beside the list of deliverables.
Sign-in · sample
Type any email for a code, then any six digits. This demo sends nothing.
Demo: nothing is sent.
A sign-in card in two steps, email then a one-time code, as the front end of your own auth service.
Subscribe
Free, every Friday at nine. One click to leave from any issue.
Demo: nothing is sent.
Read by 12,480 people every Friday
SitenameFriday, 09:00
No. 187: The button at the end
Hello, and happy Friday.
This week is about the last button on a form: what it says, where it sits, and what happens after it is pressed.
The rest lands on Friday
A newsletter signup beside a look at what arrives: the heading, a line, one email field with its button and the count of people already reading, and next to them the next issue as it lands in an inbox (who it is from, the subject, the day it sends, its first lines fading out) on a small stack of the issues before it.
Shows big numbers that count up when scrolled into view, 120 ms apart, with labels and an optional bar under each, in a hairline row.
A status page in one section: the state of everything as the heading with its light (it pulses three times, then stays lit), the uptime of the days shown as a Gauge, each service with its state and a bar for every day (up, degraded, an outage, maintenance, no data) rising in turn as the board arrives, and the incidents with their updates, newest first.
A vertical timeline: the line draws itself down the page in step with the scroll, each step revealing from the line's side as it is reached, markers numbered or dated.
Who it is for, as stickers: a heading and a line beside a cloud of rounded labels in the palette's blocks, each tilted a little its own way, coming in one after another as the cloud enters the screen (Reveal).
Steps on one side and one visual on the other that stays in view and changes with them, under a lead paragraph that brightens word by word as it is read.
A sticky navigation bar that condenses over the first 120 px of scroll: the row tightens and a hairline appears, bound to the document's scroll timeline, with zero JavaScript.
The call to get the app: a panel of the app's colour block with the headline, the store buttons and, on a wide screen, a QR code to the app, and a phone rising out of the panel's lower edge as the panel comes into view, its lower third cut by the panel.
Shows team members in a hairline grid: portraits that tilt toward the cursor with a glare, initials when there is no photo, names and roles revealed with a stagger..
A hero for developer tools: split headline on the left, a terminal window on the right that types the install command and prints its output line by line, on a pulsing dot field.
Shows two rows of testimonial cards drifting in opposite directions, pausing while hovered so any quote can be read.
You're in
We'll write once, the day it opens. Until then, every friend who joins through your link moves you up.
A thanks page for after a signup: a headline, the reader's place in line rolling up, a referral link with a copy button, and one burst of confetti.
Two tilted bands that cross the page, each a marquee of the same few words running the other way: one in the ink tone, one in a colour block, the words alternating between the body face and the emphasis face with a spark between them.
The foot of an event's site, made like its ticket: a colour block with the name large (a second part in the emphasis), the dates and the place, the link columns and a few small lines; a perforated line, and past it the stub, with "Admit one", the dates again and a barcode drawn from the name.
The tickets, as tickets: each tier a card with a perforated line under its head (a notch cut from each side), the name and the price, what it includes, how many are left (a count, and a bar that fills as the card comes into view) and its action.
Pricing
Sample plans and prices, made up for this demo.
Lowest price at this usage
Free
For a side project
$0 / monthPast this plan's limitPast this plan's limitPast this plan's limitPast this plan's limit
$0 includes 3,000 emails
Lowest price at this usage
Pro
For a product
$20 / month$20 / month$65 / month$200 / month$875 / month
$20 includes 50,000 emails, then $0.90 / 1,000 emails
Lowest price at this usage
Scale
For volume
$90 / month$90 / month$90 / month$90 / month$540 / month
$90 includes 250,000 emails, then $0.60 / 1,000 emails
Usage-based pricing: a slider of monthly usage and every plan priced at the usage picked, each price rolling to its new figure, the cheapest plan for that usage lit and badged.
Where it is and how to get round it: a drawn site map in a colour block with the places on it as numbered dots in their own colours (the stages, the food, the entrance), and beside it the same places as a numbered list with a line each; pointing at a place in the list lights its dot on the map.
Where to find a studio, a shop or a counter, as one card in a colour block: a drawn map with a pin, the address with a directions link, the opening hours for the week, the ways to get in touch, and above them a live line that says whether it is open now and until when (or when it opens next), with the time where the place is.
Waitlist · private beta
One email when they do. Type it in and watch it go. The form underneath is real.
Opens
Demo: nothing is sent.
A pre-launch hero with a waitlist form: a flip countdown over a retro grid floor, an email field whose text blurs away on submit, a status line that says what happened, and the people already waiting.
An app beyond its own screen, in a bento: its home-screen widgets in three sizes, its lock screen (a phone's top half, cut by the tile) and its watch face, each drawn from rows (AppScreen without its chrome) on a tile of a colour block, with a title and a line under it.
The whole body of work as a grid of covers with filters by discipline.