15% off individual templatesCUTER15
Apply it at checkout
Olmo Studio template — Home view

What is inside

Olmo Studio is a flexible foundation for a creative practice with multiple services. It keeps company information, navigation, testimonials and frequently edited content in typed data files, while each portfolio case becomes its own page automatically.

Feature by feature

Services that are their own pages

A service file becomes a route — pricing.mdx is served at /pricing — with nothing to register and no route to write.

Case studies in MDX

Projects with cover, client, tags and date, and images imported next to the copy rather than pulled from a URL.

Reveals you add with an attribute

Scroll animations come from data attributes read by one shared library, with a trigger option for the cases the default cannot see.

Six tokens and the site follows

Light surfaces, dark panels, body, two muted greys and the accent. Changing those six values re-skins everything.

Smooth scrolling that behaves

One Lenis instance exported from a module, animated same-page anchors, and a navbar that switches to its solid state on light pages.

Images that never leave the repo

One entry point, every source local, sharp building the srcset at build time. No CDN, so the build runs offline.

A contact form with typed dropdowns

Its options come from the same data file the service pages read, so adding a service adds it to the form.

Social cards that always resolve

Cards are pinned to JPEG at 1200x630 with a default that every page falls back to, and the canonical URL — not the request URL — is what they carry.

Pages included
/Home
/Studio
/Works
/Work detail
/Services
/Contact
/Legal + 404
What you publish without touching code

Typed content collections. You write a file, and the listing, the detail page, the feed and the sitemap pick it up on the next build.

Projects
src/content/projects/*.mdxCase studies. Marking one as featured surfaces it on the home page.
Services
src/content/services/*.mdxThe filename is the URL. Add the matching option to the contact form's data file and the new service is selectable.
Legal
src/content/legals/*.mdPrivacy, terms and licensing.
Site data
src/config/*.data.tsNavigation, social and contact details, values, process, team, testimonials, partners and the FAQ.
A new project is this file:
---
title: 'Project Name'
description: 'One line for cards and social previews.'
coverImage: '../../assets/projects-img/project-name/cover.webp'
tags: ['Branding', 'Web']
client: 'Client Name'
date: 2026-03-15
featured: true
clientLink: 'https://example.com'
---
Making it yours

The copy

src/config/labels.ts

Every user-facing string, SEO metadata included. Translating the site means translating this one file.

The palette

src/styles/global.css

Six colour values in the theme block. Change them and the whole site follows, presets and all.

The marks

src/icons/

Drop an SVG in and reference it by name. Fill and stroke are rewritten to follow text colour, and artwork with its own palette keeps it.

Stack
Astro 7Tailwind CSS 4TypeScriptGSAPLenisMDXAstro ActionsZodResendUpstash Redis
What you need to run it
RuntimeNode 22.12 or newer
Package managerpnpm 10 or newer
DeployVercel out of the box; any static or Node host with a one-line adapter swap
Accounts you need
Resend— delivers the contact form email
Upstash Redis— rate-limits the contact form

Both have a free tier, and the contact form needs them: the ZIP ships an .env.template with the variables to fill in.

Documentation included

A README written for this template, not copied between them, inside the ZIP. It covers:

Quick start
Tech stack
Project structure
Pages & rendering
Text & data
Content collections
Images
Icons
Animations
Scrolling
Contact form
Styling
SEO
Environment variables
Deployment
Gotchas
Release history
v1.0Feb 01, 2026Initial commercial release with studio, services, project cases and contact form.

Try any demo before you decide

The demos are the real templates, deployed. No signup, no email in the way.