A modern landing page template optimized for AI-driven development. Clone, open Claude Code, describe what you want — get a production-ready landing page.
Built with Astro + React + shadcn/ui (Base UI) + Tailwind CSS v4. Ships as static HTML. Deploys with Docker + nginx + Traefik.
| Desktop | Mobile |
|---|---|
![]() |
![]() |
# Clone the template
git clone https://github.com/agalitsyn/vibecoder-heaven-langing-page.git my-landing
cd my-landing
# Install dependencies
pnpm install
# Open Claude Code and start building
claudeThen tell Claude what you want:
"Create a landing page for a SaaS product called Acme that helps developers deploy faster. Use a dark theme, add a hero with a gradient background, feature grid with 4 items, pricing with 2 tiers, and a newsletter signup form."
Claude has access to shadcn/ui and Astro documentation via MCP servers (pre-configured in .mcp.json), so it can browse available components, install new ones, and follow framework best practices automatically.
| Layer | Tool | Why |
|---|---|---|
| Framework | Astro 5 | Static site generator — zero JS by default, blazing fast |
| UI library | React 19 | Used for interactive components (islands) |
| Components | shadcn/ui | Copy-paste components you own and customize |
| Primitives | Base UI | Headless primitives from the creators of Radix + MUI |
| Styling | Tailwind CSS v4 | CSS-first config, @theme blocks in CSS |
| Icons | Lucide React | Beautiful, consistent icon set |
| Serving | nginx (alpine) | Lightweight static file server |
| Routing | Traefik v3 | Reverse proxy with auto TLS via Let's Encrypt |
src/
├── components/
│ ├── ui/ # shadcn/ui components (Base UI primitives)
│ │ ├── button.tsx
│ │ ├── card.tsx
│ │ ├── badge.tsx
│ │ ├── separator.tsx
│ │ └── sheet.tsx
│ └── landing/ # Landing page sections
│ ├── Navbar.astro # Sticky nav + mobile menu
│ ├── MobileNav.tsx # Interactive mobile menu (React island)
│ ├── Hero.astro # Headline, CTAs, optional image
│ ├── Features.astro # Icon grid with cards
│ ├── Pricing.astro # Tier cards with highlight
│ ├── Testimonials.astro
│ ├── CTA.astro # Call-to-action banner
│ └── Footer.astro # Multi-column footer
├── layouts/
│ └── BaseLayout.astro # HTML head, meta, global styles
├── lib/
│ └── utils.ts # cn() utility for Tailwind classes
├── styles/
│ └── global.css # Tailwind imports + theme variables
└── pages/
└── index.astro # Landing page (compose from sections)
Landing sections are Astro components (.astro files) that accept props for content. They use shadcn/ui React components internally but compile to pure static HTML at build time — zero JavaScript shipped.
The only exception is MobileNav.tsx which uses client:visible to hydrate the Sheet (slide-out menu) on mobile devices.
To build a page, compose sections in src/pages/index.astro:
---
import BaseLayout from '../layouts/BaseLayout.astro';
import Navbar from '../components/landing/Navbar.astro';
import Hero from '../components/landing/Hero.astro';
import Features from '../components/landing/Features.astro';
import Footer from '../components/landing/Footer.astro';
---
<BaseLayout title="My Product">
<Navbar logo="Acme" />
<Hero
headline="Ship faster with Acme"
subtext="The deployment platform for modern teams."
primaryCTA={{ label: "Start Free", href: "/signup" }}
/>
<Features features={[
{ icon: "🚀", title: "Fast Deploys", description: "Push to deploy in seconds." },
{ icon: "🔒", title: "Secure", description: "SOC 2 compliant out of the box." },
]} />
<Footer />
</BaseLayout>Each section is optional and composable. Pass different props to customize content:
| Section | Props |
|---|---|
Navbar |
logo, links[], cta |
Hero |
headline, subtext, primaryCTA, secondaryCTA, image |
Features |
headline, subtext, features[] (icon, title, description) |
Pricing |
headline, subtext, tiers[] (name, price, features, cta, highlighted) |
Testimonials |
headline, subtext, testimonials[] (quote, author, role, avatar) |
CTA |
headline, subtext, primaryCTA, secondaryCTA |
Footer |
logo, columns[] (title, links), copyright |
Install any component from the shadcn/ui registry:
pnpm dlx shadcn@latest add dialog
pnpm dlx shadcn@latest add accordion tabs input textareaAll components use Base UI primitives automatically (configured via "style": "base-vega" in components.json).
All theme variables are in src/styles/global.css. Modify colors, radius, fonts:
:root {
--radius: 0.625rem;
--primary: oklch(0.205 0 0);
--primary-foreground: oklch(0.985 0 0);
/* ... */
}tweakcn.com is an interactive theme editor for shadcn/ui. It lets you:
- Visually customize colors, typography, border radius, shadows
- Preview changes on real shadcn/ui components in real-time
- Export generated CSS variables
Workflow:
- Open tweakcn.com
- Adjust colors, fonts, radius, shadows to your liking
- Copy the generated CSS variables
- Paste into
src/styles/global.css, replacing the:rootand.darkblocks
This is the fastest way to create a unique visual identity without manually tweaking oklch values.
shadcn/ui with Base UI supports multiple visual styles. Edit components.json:
{
"style": "base-vega"
}Available Base UI styles: base-vega, base-nova, base-maia, base-lyra, base-mira. After changing the style, reinstall components:
pnpm dlx shadcn@latest add --all --overwriteThis project includes pre-configured MCP (Model Context Protocol) servers in .mcp.json that give AI assistants direct access to framework documentation and component registries.
{
"shadcn": {
"command": "npx",
"args": ["shadcn@latest", "mcp"]
}
}The official shadcn MCP server gives your AI assistant the ability to:
- Browse components — list all available components, blocks, and templates from the shadcn/ui registry
- Search — find components by name or functionality
- Install — add components using natural language (e.g., "add a login form")
When you ask Claude to add a new section or component, it uses this MCP to find the right shadcn/ui component and install it correctly.
{
"astro-docs": {
"type": "http",
"url": "https://mcp.docs.astro.build/mcp"
}
}The official Astro Docs MCP server provides real-time access to the latest Astro documentation. This ensures Claude follows current best practices for:
- Page routing and layouts
- Component islands and
client:*directives - Static site generation config
- Integrations (React, Tailwind, MDX)
Edit .mcp.json to add additional servers. Some useful ones:
{
"mcpServers": {
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp"]
}
}
}Context7 provides up-to-date documentation for any library (React, Tailwind, etc.).
# Start dev server
pnpm dev
# Build static site
pnpm build
# Preview production build
pnpm previewdocker build -t my-landing .
docker run --rm -p 8080:80 my-landingOpen http://localhost:8080.
The included docker-compose.yml sets up Traefik as a reverse proxy with automatic HTTPS:
- Edit
docker-compose.yml— replaceyou@example.comwith your email andexample.comwith your domain - Deploy:
docker-compose up -dTraefik automatically obtains and renews Let's Encrypt TLS certificates.
To deploy multiple landings on the same server, add services to docker-compose.yml:
services:
# ... traefik config ...
landing-product-a:
image: ghcr.io/you/landing-product-a:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.product-a.rule=Host(`product-a.example.com`)"
- "traefik.http.routers.product-a.entrypoints=websecure"
- "traefik.http.routers.product-a.tls.certresolver=letsencrypt"
landing-product-b:
image: ghcr.io/you/landing-product-b:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.product-b.rule=Host(`product-b.example.com`)"
- "traefik.http.routers.product-b.entrypoints=websecure"
- "traefik.http.routers.product-b.tls.certresolver=letsencrypt"Each landing gets its own domain, its own Docker image, and automatic TLS. Traefik discovers services via Docker labels.
- Clone this template into a new repo
- Open Claude Code:
claude - Describe your landing page in natural language
- Claude will customize sections, theme, and content
pnpm buildto generate static filesdocker buildand deploy
MIT

