Every page, built from blocks
Pick a block, fill in the fields and drag it into place. Publish, and the page is live.
See every blockEverything a marketing site needs
Each block has its own fields, so editors fill in content instead of fighting a layout.
Blocks in any order
Add, remove and drag blocks. Every one holds up next to any other.
Options per block
Layouts, backgrounds and anchors, set in the Options tab.
SEO per page
Titles and descriptions per page, with fallbacks from settings.
Typed end to end
Schemas, queries and components share one set of types.
Live on publish
Publish in the Studio and the page updates on the next request.
Easy to extend
A new block is one folder and one line in each registry.
Links that resolve
Point a button at a page and the URL follows when its slug changes.
Settings in one place
Navigation, footer and defaults live in a single document.
Pages are a stack of blocks, nothing more
There are no templates to outgrow. A page is an ordered list of blocks, and each block knows how to look next to the others.
Editors build a new landing page in the time it takes to write the copy, and nobody waits on a developer to move a section.
Reorder by dragging
Required fields checked
Images with hotspots
Reuse across pages
Editors in control, developers in the loop
Every option is a field with a sensible default, so a page always looks finished.
Layouts
Switch a hero or a feature block to another layout without losing content.
Backgrounds
Set a block on light or dark, and every token inside it follows.
Anchors
Give a block an anchor and link straight to it from anywhere.
Roles
Sanity roles decide who can publish and who can only draft.
Add a block in three files
A schema for the Studio, a query for the data and a component for the page. Register it once and it shows up everywhere.
export const banner = defineType({
name: "banner",
title: "Banner",
type: "object",
fields: [
defineField({ name: "heading", type: "string" }),
defineField({ name: "link", type: "link" }),
],
});The schema decides what editors see in the Studio.
Validation runs before anyone can publish.
Shared fields like link and figure come for free.
Groups keep content and options apart.
export const bannerQuery = /* groq */ `
heading,
link${linkQuery},
${optionsQuery}
`;Each block asks only for the fields it renders.
Links resolve to URLs in the query.
Images arrive with size and hotspot.
Types live next to the query.
<Block options={options}>
<Text tag="h2" variant="displayMD">
{heading}
</Text>
<Button href={link.href}>{link.label}</Button>
</Block>Components are plain Astro, styled with the same tokens.
Block handles spacing, background and anchor.
Text and Button keep the type scale consistent.
No client JavaScript unless a block needs it.
Restyle it once, every block follows
Colours, fonts and radii live in tokens. Change one file and the whole site takes the new look.
Read the docsTokens for colour
Every block reads the same colour tokens.
One type scale
Headings and text come from a single Text component.
Shared fields
Links, images and options are defined once.
Plain Astro
Blocks are Astro components you can read and change.
Light and dark
Any block switches tone and its colours follow.
One theme file
Fonts, radii and shadows are set in one place.
Built for the long run
Most site templates stop at the first launch. Blocks keep working as the site grows.
Page builder
Templates
New pages without code
Editors compose pages from blocks in the Studio.
One design system
Every block reads the same tokens and type scale.
Typed content
Schemas, queries and components share their types.
Live on publish
Changes go out without a rebuild or a deploy.
What teams say a month in
1 of 4
Pricing
Start free and pay only for what you add. No minimums and no annual contract.
Pages
Up to 20 pages
$0
Each extra 10 pages
$5
/ month
Custom domain
$0
Editors
Two editors
$0
Each extra editor
$8
/ month
Custom roles
$15
/ month
Support
Email support
$0
Replies within four hours
$49
/ month
Migration from another CMS
$400
/ project



