Watch the workflow
Create a site from a starter
Watch the workflow in Primo. Download video · Download captionsRead the walkthrough
Read the walkthrough
- Choose Create Site from the dashboard.
- Give the new site a name.
- Browse starters in the Marketplace.
- Choose Hawthorn Veterinary and review its design.
- Review optional blocks, then create your site.
- Your new site is ready in the dashboard.
Overview
By the end of this guide, you’ll have:- A site with two page types you create: General Page and Blog Post
- Five reusable blocks (Hero, Text, Image, Card Grid, Footer)
- A working navigation system
- Content ready for editors to manage
Download the complete example
Download the first site workspace to compare the finished blocks, fields, page types, and content with this guide. Extract the ZIP into its own folder. After installingprimo-cli, run from the extracted folder:
primo dev --author cms. The included README explains the field connections and differences from the browser tutorial. Use a copy if you want to keep the original example.
Prerequisites
- Primo installed and running (Installation guide)
- Basic familiarity with HTML, CSS, and JavaScript
- Understanding of core concepts
Step 1: Create Your Site
Initialize the site
Configure basic settings
- Site name: An internal name for the dashboard
- Domain: Connect a hostname through the dashboard
- Site fields: Add global branding and navigation content as needed
Step 2: Build Your Component Library
Create five example blocks in the server’s Library: Hero, Text, Image, Card Grid, and Footer. These are names for the Svelte blocks you build below, not built-in block presets. Text and Image are also field type names; the blocks here use those fields to create page sections. A Hero is an introductory section with a headline and button. A Card Grid repeats a card design for several items. You can choose other names and designs for your own sites.Block 1: Hero
The Hero block will be the first thing visitors see on your homepage.Create the Hero block
Write the component
Add fields
headline(Text) - Main headlinesubheadline(Text) - Supporting textcta_text(Text) - Button textcta_link(URL) - Button destination URLbackground_image(Image, optional) - Background image URL
Block 2: Text
A simple text block for content sections.Create the Text block
Write the component
Add fields
content(Rich Text) - The main contentalignment(Select) - Options: “left”, “center”, “right”
Block 3: Image
A block for displaying images with optional captions.Create the Image block
Write the component
Add fields
image(Image) - The image to display (includes URL and alt text)alt_text(Text, optional) - Override alt text if neededcaption(Text, optional) - Image captionfull_width(Switch/Toggle) - Whether to use full width
Block 4: Card Grid
A flexible grid for displaying cards (useful for features, team members, etc.).Create the Card Grid block
Write the component
Add fields
cards(Repeater) - Array of card objects with:title(Text)description(Text, optional)image(Image, optional)link(URL, optional)
columns(Number) - Number of columns (the example code falls back to 3 when empty)
Block 5: Footer
Primo supplies the page-level<footer> wrapper, so this block uses a <div>. You can copy the block into each page type. Each type keeps its own section content; use Site Field references when values should be shared across types.
Create the Footer block
Write the component
Add fields
copyright_text(Text) - Copyright noticelinks(Repeater) - Footer links with:label(Text)url(URL)
Step 3: Define Page Types
Create General Page for the homepage and About page, and Blog Post for articles. The names identify your templates; they do not assign URLs or special behavior.Page Type 1: General Page
Create General Page
Configure available blocks
- Hero
- Text
- Image
- Card Grid
Add page fields
meta_title(Text) - SEO titlemeta_description(Text) - SEO description
Page Type 2: Blog Post
Create Blog Post page type
Configure available blocks
- Text
- Image
Add page fields
title(Text) - Post titleauthor(Text) - Author namepublish_date(Date) - Publication datefeatured_image(Image) - Featured imageexcerpt(Text) - Short descriptionmeta_title(Text) - SEO titlemeta_description(Text) - SEO description
new Date(publish_date).toLocaleDateString("en-US", { timeZone: "UTC" }). This field does not schedule publication.Step 4: Create Pages
Now let’s create actual pages using these page types.Create the Homepage
Open the homepage
/; creating a normal page named Home does not make it the homepage.Add blocks
- Hero - Add a headline and call-to-action link
- Text - Add an introduction section
- Card Grid - Add 3 feature cards
- Text - Add a closing section
Fill in content
- Hero: Welcome message and primary button link
- Text: Introduction to your site
- Card Grid: Three feature highlights
- Text: Call to action or closing message
Set page metadata
- Meta title: “Home - My Site”
- Meta description: “Welcome to my site built with Primo”
Create a Blog Post
Create blog post
Fill page fields
- Title: “Getting Started with Primo”
- Author: Your name
- Publish date: Select a date from the date picker
- Excerpt: A short description
Add content blocks
- Text block with your blog post content
- Image block for illustrations
Create the About Page
Create about page
about using the General Page type. It can use the same type as the homepage while having different sections and content.Build the page
- Hero - “About Us” headline
- Text - Your story
- Card Grid - Team members or values
- Image - Team photo or office image
Step 5: Add Footer to Page Types
Add the Footer block to each page type so it appears on every page:Add Footer to General Page
Add Footer to other page types
Set the shared footer content
- Copyright text
- Footer links (Privacy Policy, Terms, Contact, etc.)
Step 6: Connect navigation and page metadata
Use the footer’slinks repeater to add links to /, /about, and your blog post’s actual path. To create /blog/getting-started, create a Blog parent page and a child with slug getting-started. Page type names do not add URL prefixes.
Give the Hero block’s CTA the URL /about. Open each link in the page preview to verify its destination.
The SEO fields you created do not generate tags automatically. In each page type’s Head HTML, add:
title, author, and featured_image fields also need Page Field references in a display block to appear on the page. Until you build that header block, include the visible post title and author in the Text section.
Step 7: Publish your site
Use a deployed CMS with a connected hostname. If you built locally, deploy your workspace before following these steps.Save and review
Publish
What You’ve Built
You now have:- ✅ A site structure with two page types
- ✅ Five reusable blocks in your component library
- ✅ Multiple published pages with real content
- ✅ Navigation and footer configured
- ✅ A site ready for content editors