
By Sensinum
Performance that leaders trust The future of how you build is now — Astro × Strapi, agent-ready today, not a roadmap promise for next quarter.

AI-native first — agent context (AGENTS.md), Agent Skills under .ai/, and Cursor rules are part of the product, not a README afterthought. You extend the stack with AI, not against it.
All-in-one starter combining Astro, Strapi CMS, TailwindCSS, and shadcn/ui with support for Strapi Astro Loader and Strapi Astro Blocks Field. Details: AI-native support.
AGENTS.md, Agent Skills under .ai/, and Cursor rules tailored to Astro x Strapi for Loader & Blocks@fontsource
# NPM
npm create astro@latest -- --template VirtusLab-Open-Source/astro-strapi-starter
# Yarn
yarn create astro --template VirtusLab-Open-Source/astro-strapi-starterCreate a .env file in the root directory:
# Strapi Configuration
STRAPI_URL=http://localhost:1337
STRAPI_TOKEN=your_strapi_api_token_herenpm run devOpen http://localhost:4321 in your browser.
/
├── src/
│ ├── components/
│ │ ├── blocks/ # Strapi block components (Astro + Tailwind)
│ │ │ ├── BlockRenderer.astro
│ │ │ ├── TextBlock.astro
│ │ │ ├── QuoteBlock.astro
│ │ │ ├── MediaBlock.astro
│ │ │ ├── CTABlock.astro
│ │ │ └── HeroBlock.astro
│ │ ├── tailwind/ # Pure Tailwind Astro components
│ │ │ ├── Button.astro
│ │ │ ├── Card.astro
│ │ │ ├── CardHeader.astro
│ │ │ ├── CardTitle.astro
│ │ │ ├── CardDescription.astro
│ │ │ ├── CardContent.astro
│ │ │ └── Badge.astro
│ │ ├── ui/ # shadcn/ui React components
│ │ │ ├── button.tsx
│ │ │ ├── card.tsx
│ │ │ ├── badge.tsx
│ │ │ └── separator.tsx
│ │ ├── showcase/ # Side-by-side component demos
│ │ │ ├── TailwindShowcase.astro
│ │ │ └── ShadcnShowcase.tsx
│ │ ├── Toolbar.astro # Sticky header with logo + toggles
│ │ ├── ThemeToggle.astro # Dark / Light mode switch
│ │ └── UIToggle.astro # Tailwind / shadcn switch
│ ├── lib/
│ │ └── utils.ts # cn() utility for class merging
│ ├── pages/
│ │ └── index.astro # Homepage
│ ├── types/
│ │ └── strapi/ # Strapi TS types (`index.ts` re-exports modules)
│ ├── content.config.ts # Strapi Loader configuration
│ ├── styles/
│ │ └── global.css # Theme, fonts, toggle visibility rules
│ └── utils/
│ └── media.ts # Strapi Media utils
├── components.json # shadcn/ui configuration
├── package.json
└── astro.config.mjsThis starter ships first-class agent context for any AI coding tool (Cursor, Claude Code, Copilot, and other SKILL.md–compatible clients):
AGENTS.md (root) points to the full guide: .ai/AGENTS.md.ai/:
.ai/astro-strapi-starter/SKILL.md — end-to-end workflow for this template (the only long-form skill kept here).ai/astro-strapi-loader/SKILL.md and .ai/astro-strapi-blocks/SKILL.md — short stubs with links to the canonical SKILL (and related) files in astro-strapi-loader and astro-strapi-blocks (no duplicate prose in this repo).cursor/rules/ — astro-strapi-loader and astro-strapi-blocks are thin pointers to the loader and blocks upstream rules; astro-strapi-starter and tailwind-shadcn are defined in this repoThe authoritative manuals for the packages live in those upstream .ai trees. Pin a tag or commit in the raw-GitHub URLs to match your package.json version when you need strict reproducibility.
To use a skill in a tool that only loads from .cursor/skills/, copy or symlink .ai/astro-strapi-starter/ there. For loader and blocks, copy from upstream raw URLs (see the stub files) or fetch them in your tool if it supports URL-based skills.
Nearly perfect scores out of the box — no extra optimization needed.
| Desktop | Mobile |
|---|---|
![]() | ![]() |
The starter includes a theme toggle in the header. It:
localStorage<head> to prevent flash of wrong themedark class on <html> — all semantic tokens adapt automaticallyAll components use semantic color tokens (text-foreground, bg-card, border-border, etc.) so dark mode works everywhere out of the box.
This starter ships with two parallel component sets — switch between them live using the toggle in the header.
Components in src/components/tailwind/ are .astro files styled with Tailwind utility classes. Zero JavaScript, server-rendered.
---
import Button from "@/components/tailwind/Button.astro";
import Card from "@/components/tailwind/Card.astro";
import CardHeader from "@/components/tailwind/CardHeader.astro";
import CardTitle from "@/components/tailwind/CardTitle.astro";
import CardContent from "@/components/tailwind/CardContent.astro";
---
<Card>
<CardHeader>
<CardTitle>My Card</CardTitle>
</CardHeader>
<CardContent>
<Button variant="outline">Click me</Button>
</CardContent>
</Card>Components in src/components/ui/ are React components built on Radix UI primitives. Accessible, composable, interactive.
---
import { Button } from "@/components/ui/button";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
---
<Card>
<CardHeader>
<CardTitle>My Card</CardTitle>
</CardHeader>
<CardContent>
<Button client:load variant="outline">Click me</Button>
</CardContent>
</Card>npx shadcn@latest add dialog dropdown-menu tabsIf you prefer pure Tailwind only:
src/components/ui/, src/components/showcase/ShadcnShowcase.tsx, and src/lib/utils.tscomponents.json@astrojs/react from astro.config.mjs (if not using React elsewhere)npm uninstall @astrojs/react radix-ui class-variance-authority clsx tailwind-merge lucide-react tw-animate-css shadcn@sensinum/astro-strapi-loader — Automatic content loading from Strapi@sensinum/astro-strapi-blocks — Modular & flexible block rendering| Command | Action |
|---|---|
npm install | Installs dependencies |
npm run dev | Starts dev server at localhost:4321 |
npm run build | Build your production site to ./dist/ |
npm run preview | Preview your build locally |
npm run astro ... | Run CLI commands like astro add, astro check |
npm run builddistnpm installnpm run devnpx astro checkWe welcome contributions to this project! Here's how you can help:
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)Please make sure to:
Copyright © Sensinum
This project is licensed under the MIT License - see the LICENSE.md file for details.
Share your work with the community and get it listed in the Strapi ecosystem for everyone to discover and use.
Submit
