<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/olsa-a-28-page-astro-marketing-template-that-runs-on-eight-dependencies-11nk3oxcp" -->

---
title: Olsa: a 28-page Astro marketing template that runs on...
description: Olsa is a commercial Astro marketing template ($49) shipping 28 pages, 44 UI primitives, and three Zod-validated content collections on just eight runtime...
canonical: https://daily.dev/posts/olsa-a-28-page-astro-marketing-template-that-runs-on-eight-dependencies-11nk3oxcp
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Olsa: a 28-page Astro marketing template that runs on eight dependencies | daily.dev
og:description: Olsa is a commercial Astro marketing template ($49) shipping 28 pages, 44 UI primitives, and three Zod-validated content collections on just eight runtime...
og:url: https://daily.dev/posts/olsa-a-28-page-astro-marketing-template-that-runs-on-eight-dependencies-11nk3oxcp
og:image: https://api.daily.dev/og/posts/11NK3OXCp.png
og:image:alt: Olsa: a 28-page Astro marketing template that runs on eight dependencies
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Olsa: a 28-page Astro marketing template that runs on eight dependencies

**[DomiDex](https://daily.dev/sources/svbqkzvdrcgg09azsvofx)** · [@domidex](https://daily.dev/domidex) · 9 min read · 0 upvotes · 0 comments

## Summary

Olsa is a commercial Astro marketing template ($49) shipping 28 pages, 44 UI primitives, and three Zod-validated content collections on just eight runtime dependencies. It includes a full product marketing page set — pricing with comparison matrix, an integrations directory with per-entry detail routes, blog with cross-collection author references, and auth page markup. SEO, animations, and icons are all implemented in-house with no third-party packages, keeping the dependency footprint minimal. Styling uses Tailwind CSS 4 with CSS-first theme tokens and a pre-paint dark mode toggle. The template is AI-coding-assistant ready with AGENTS.md, CLAUDE.md, and subsystem documentation included. It deliberately omits a CMS, i18n, search, and authentication backend, targeting SaaS and developer-tool marketing sites.

## Content

*Full disclosure: I build themes at AstroCraft and Olsa is one of ours. It is a commercial

template, $49 for the full source, so read this as a build write-up rather than a free download.

Republished from [the theme page on AstroCraft](https://astrocraftthemes.com/astro-themes/olsa/?utm_source=devto&utm_medium=syndication&utm_campaign=olsa).*

*Live demo: [https://olsa-demo.pages.dev/](https://olsa-demo.pages.dev/). Install docs: [https://doc.astrocraftthemes.com/themes/olsa/installation/](https://doc.astrocraftthemes.com/themes/olsa/installation/).*

Olsa is a production-ready marketing-site template for the Astro web framework, built for founders and agencies shipping a software product rather than a brochure. It ships 28 pages, 44 UI primitives, three Zod-validated content collections, and an SEO layer written in-house rather than pulled from a package. The whole thing runs on eight runtime dependencies, which is the difference between a site you own and a site you maintain around other people's release notes.

## By the numbers

- **28 pages**, counted from a production build, not a route table
- **40 section components** across 11 page groups, plus a dev-only catalog of every primitive
- **44 UI primitives** and **8 content-aware cards**, all `tailwind-variants` configs
- **571 icons** in a typed registry, inlined at build time
- **87 **`animate-*`** utilities** plus scroll-driven extensions, ported with no animation library
- **3 Zod-validated content collections**: blog, authors, integrations
- **8 runtime dependencies**, building to 100% static HTML
- Light and dark mode set pre-paint, fully responsive, AI-ready docs included

## A full page set

- Home, About, Features, Pricing
- Integrations directory plus a detail route per integration (nine shipped as demo content)
- Blog index, post pages, and an RSS feed
- Contact, sign-in, sign-up
- Privacy, terms, and a 404

Content-driven routes come from collections, so the integrations directory and the blog both grow by adding a file, not by wiring a page.

## Built to launch a product site you can grow into

Most marketing templates are a landing page with a blog stapled on. The moment you need a pricing comparison table, a per-integration detail page, or an author byline that resolves to a real profile, you are writing the theme yourself.

Olsa ships those surfaces already built. Pricing has plans and a comparison matrix. Integrations is a real directory: nine entries, each with a category, a rating, requirements, a logo glyph, and its own detail route, sorted and featured from frontmatter. The blog resolves authors through a cross-collection reference, so a post that names a missing author fails the build instead of rendering a blank byline. Auth pages are real markup you can point at whatever backend you choose later.

That is the arbitrage. Assembling this set by hand is a fortnight of decisions about component boundaries and content shapes. Here it is a clone and an afternoon of copy edits.

## Eight dependencies, and none of the ones you expect

The whole runtime manifest:

```
"dependencies": {
  "@astrojs/mdx": "^7.0.0",
  "@astrojs/sitemap": "^3.7.3",
  "@fontsource-variable/host-grotesk": "^5.3.0",
  "@tailwindcss/vite": "^4.3.2",
  "astro": "^7.0.3",
  "tailwind-merge": "^3.6.0",
  "tailwind-variants": "^3.2.2",
  "tailwindcss": "^4.3.2"
}
```

No SEO package. `BaseHead` emits every meta, OpenGraph, and Twitter tag natively, structured data comes from typed JSON-LD builders that hold a stable `@id` graph across the site, and `robots.txt`, `llms.txt`, the sitemap, and the RSS feed are all dynamic endpoints resolving against one configured domain.

No animation library either. The motion catalog is a dependency-free port of tailwind-animations, roughly 87 `animate-*` utilities plus an owned scroll-driven extension, with a global `prefers-reduced-motion` guard the upstream does not ship.

No icon package. 571 icons live in a typed registry inlined at build time, so `<Icon name="…" />` autocompletes and a wrong name fails type-checking rather than rendering nothing.

Every one of those layers is a file in your repo. When you need it to behave differently, you edit it.

## A rebrand is one file

Styling runs on three layers. Palette aliases in `@theme` name your brand on top of Tailwind's scale. Semantic runtime variables in `:root` and `.dark` flip with the theme. An `@theme inline` bridge wires those variables to utilities. Markup only ever writes `bg-primary` or `text-foreground`, never `bg-violet-700`, which is what makes dark mode free instead of a second pass over every component.

```
/* src/styles/tailwind-theme.css: repoint the ramp, the whole site follows */
@theme {
  --color-primary-600: var(--color-purple-600);
  --color-primary-700: var(--color-purple-700);
}
```

Dark mode itself is class-based and set pre-paint by an inline script that reads `localStorage` defensively, so there is no flash of the wrong theme on first load. Every primitive is a `tailwind-variants` config that merges consumer overrides properly through `tailwind-merge`, and the component barrels export named-only, so import style cannot drift across 44 files.

## Zero JavaScript by default

Interactivity reaches for the platform first: `<details>` for disclosure, `<dialog>` for modals, the Popover API, scroll-driven animations, and `@starting-style` for enter transitions. A bundled script ships only where nothing native covers the behavior. View transitions are wired and toggleable, as is the decorative motion layer.

```
// src/config/siteSettings.json.ts
export const siteSettings = {
  useViewTransitions: true,
  // prefers-reduced-motion is honored regardless of this flag
  useAnimations: true,
};
```

## The content system

Three collections, each Zod-validated, so bad frontmatter fails the build rather than the page.

- **blog**, Markdown or MDX, with hero image, categories, draft flag, and an author reference validated at build time
- **authors**, name, role, avatar, bio, and links, referenced by every post
- **integrations**, tagline, category, rating, requirements, logo glyph, and a featured flag that drives the directory

MDX is exercised, not merely installed: one demo post imports a real UI primitive inline, so the integration has a reason to be there.

## Navigation & config

Six typed config files carry everything a handoff touches: site metadata, navigation, pricing, FAQs, legal copy, and feature toggles. The navbar renders plain links and mega menus from one array, and the mobile sheet flattens those menus automatically, so adding a section is a config edit rather than a component edit.

Marketing prose deliberately does not live in config. It sits next to the markup it shapes, in thirteen section files the deploy checklist names one by one.

## SEO & technical basics

- Native meta, OpenGraph, and Twitter tags from `BaseHead`, no plugin to configure
- JSON-LD builders for Organization, WebSite, Article, and BreadcrumbList, sharing a stable `@id` graph
- Dynamic `robots.txt` and `llms.txt` endpoints for AI crawlers
- Sitemap that filters noindex routes, so it can never contradict the markup
- RSS for the blog, canonical URLs, and one canonical trailing-slash URL shape
- Static HTML output with `sharp` image optimization and a self-hosted variable font

## The stack

- Astro 7.0.3, Tailwind CSS 4.3.2 with CSS-first `@theme` tokens, TypeScript 6 in strict mode
- `tailwind-variants` and `tailwind-merge` for typed, conflict-free component styling
- Self-hosted Host Grotesk Variable, `sharp` image pipeline, Node 22.12 or newer
- ESLint with the Astro, a11y, and import-sort plugins, plus Prettier with the Tailwind class sorter

## Why developers will like it

Verification is four commands: `pnpm lint`, `pnpm check`, `pnpm build`, and `pnpm test`, which discovers every self-check under `src/` by filename and runs it (seven at ship, all passing). Adding a check is naming a file, with nothing to wire. Path aliases replace deep relative imports. The contact schema and spam gates, the RSS and JSON-LD serializers, the number formatter, the password meter, and the hotkey and listbox helpers each have a check sitting next to them, so the parts most likely to break silently are the parts that shout.

## What it deliberately leaves out

No CMS. No search. No i18n layer. No authentication backend, the auth pages are markup with nothing behind them.

The contact form is the one hybrid, and it is honest about it. The schema, spam gates, escaping, and the Resend delivery path are all written, type-checked, and self-checked, but the action ships unmounted, because mounting it means choosing a host adapter and the template stays deployment-neutral at 100% static HTML. Until you connect it, the form renders visibly disabled with a note saying so, rather than looking live and dropping messages into nothing. Connecting it is four steps, documented with the security notes and a verification table.

```
// src/actions/contact.ts: the walkthrough, in the file itself
// 1. add a host adapter   2. add src/actions/index.ts
// 3. uncomment `prerender = false` on /contact/
// 4. flip CONTACT_WIRED in Sections/Contact/_form.ts
```

Demo content is a fictional workflow-automation SaaS, and every placeholder is named in an eleven-step deploy checklist covering favicon, metadata, social URLs, imagery, and the thirteen copy files. A `THIRD-PARTY.md` covers every asset the licence does not grant, including three that need your own confirmation before you go to production. You are told what to replace, not left to find it.

## AI-assisted coding ready

Olsa ships the context an AI pair-programmer needs: an `AGENTS.md`, a `CLAUDE.md`, five coding-rule files covering Astro, Tailwind, TypeScript, motion, and SEO, and a bundled wiki documenting each subsystem, including the ones that were removed and why. Point Claude Code or Cursor at the repo and it extends the site in the house style instead of inventing a second one.

## Use this theme for

- A SaaS or developer-tool marketing site with pricing, integrations, and a blog
- A funded startup's public site that has to look finished on launch day
- An agency building a product site for a client who will own the repo afterward
- Any team that would rather patch four files than track four more dependencies

## Not ideal for

- A site that needs a CMS for non-technical editors, since content is Markdown in the repo
- A multilingual site, because the i18n layer was removed on purpose
- A personal portfolio or a blog-only site, where a lighter theme fits better
- A store, since there is no cart, catalog, or checkout here

## Final take

Olsa suits the developer who wants a finished, opinionated marketing site to grow a real product into, and who would rather own the SEO, motion, and component layers outright than inherit four more dependencies to keep current.

---

<!-- COVER IMAGE, do not paste this section into dev.to.

No `cover_image:` is set in the frontmatter on purpose. Upload

`output/themes/olsa/olsa-astro-theme-image.png` (1600x900) with the editor's image button instead.

The demo's `/og.jpg` is an unreplaced placeholder card reading "Astro Boiler" and "placeholder,

replace public/og.jpg with your own image", so it must not be used as a cover. See `index.md`. -->

## Similar posts on daily.dev

- [Astro 7.0](https://daily.dev/posts/astro-7-0-2arekjquc) · Astro · 202 upvotes · 14 comments
- [Astro 6.2](https://daily.dev/posts/astro-6-2-39f0obq7u) · Astro · 180 upvotes · 8 comments
- [What's new in Astro - May 2026](https://daily.dev/posts/what-s-new-in-astro---may-2026-bo5ujlvt4) · Astro · 28 upvotes · 3 comments

---

Tags: [#webdev](https://daily.dev/tags/webdev), [#typescript](https://daily.dev/tags/typescript), [#tailwind-css](https://daily.dev/tags/tailwind-css), [#astro](https://daily.dev/tags/astro)

[View this post on daily.dev](https://daily.dev/posts/olsa-a-28-page-astro-marketing-template-that-runs-on-eight-dependencies-11nk3oxcp)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"DiscussionForumPosting","mainEntityOfPage":"https://daily.dev/posts/olsa-a-28-page-astro-marketing-template-that-runs-on-eight-dependencies-11nk3oxcp","headline":"Olsa: a 28-page Astro marketing template that runs on eight dependencies","text":"Olsa is a commercial Astro marketing template ($49) shipping 28 pages, 44 UI primitives, and three Zod-validated content collections on just eight runtime dependencies. It includes a full product marketing page set — pricing with comparison matrix, an integrations directory with per-entry detail routes, blog with cross-collection author references, and auth page markup. SEO, animations, and icons are all implemented in-house with no third-party packages, keeping the dependency footprint minimal. Styling uses Tailwind CSS 4 with CSS-first theme tokens and a pre-paint dark mode toggle. The template is AI-coding-assistant ready with AGENTS.md, CLAUDE.md, and subsystem documentation included. It deliberately omits a CMS, i18n, search, and authentication backend, targeting SaaS and developer-tool marketing sites.","url":"https://daily.dev/posts/olsa-a-28-page-astro-marketing-template-that-runs-on-eight-dependencies-11nk3oxcp","datePublished":"2026-08-10T03:30:14.595Z","dateModified":"2026-08-10T03:30:46.839Z","author":{"@type":"Person","name":"DomiDex","url":"https://daily.dev/domidex","image":"https://lh3.googleusercontent.com/a/ACg8ocK1y5sGzfc9DZExzMNLIO6PrprB9uQavihG10LJw8w2TK1X3Sk=s96-c","description":"open-source builder shipping Tour Kit, a headless React onboarding library","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"EndorseAction"},"userInteractionCount":160}},"image":"https://media.daily.dev/image/upload/s--35LRK7PR--/f_auto/v1786332615/posts/11NK3OXCp?_a=BAMAMicg0","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"isPartOf":{"@type":"WebPage","url":"https://daily.dev/sources/svbqkzvdrcgg09azsvofx","name":"DomiDex"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"DomiDex","item":"https://daily.dev/sources/svbqkzvdrcgg09azsvofx"},{"@type":"ListItem","position":3,"name":"Olsa: a 28-page Astro marketing template that runs on eight dependencies"}]}
```

