Communitygithub.com

anubhavg-icpl/vibe

Erstelle inhaltsfokussierte Websites mit Astro – standardmäßig null JavaScript, Inselarchitektur, Multi-Framework-Komponenten und Markdown/MDX-Unterstützung. Verwende dies, wenn du Hilfe mit Astro benötigst.

Was ist vibe?

Diese Fertigkeit bietet umfassende Unterstützung für das Astro-Webframework, das für inhaltsreiche Websites wie Blogs, Dokumentationen, Portfolios, Marketingseiten und E-Commerce optimiert ist. Astro setzt auf eine Inselarchitektur: Standardmäßig wird kein JavaScript an den Browser gesendet; interaktive Komponenten werden nur bei Bedarf hydriert. Du kannst Komponenten aus React, Vue, Svelte, Solid und anderen Frameworks im selben Projekt kombinieren. Die Fertigkeit führt dich Schritt für Schritt durch die Projekteinrichtung, die Erstellung von `.astro`-Komponenten, dateibasiertes Routing mit dynamischen Pfaden, typsichere Content-Collections und die selektive Hydrierung von Inseln mittels `client:`-Direktiven. Sie behandelt sowohl den statischen (SSG) als auch den hybriden SSR-Modus mit Adaptern wie Vercel. Praktische Beispiele zeigen RSS-Feeds, API-Endpunkte und interaktive React-Inseln. Die Fertigkeit betont Best Practices wie die Minimierung von clientseitigem JS, die Nutzung von Content-Collections für Typsicherheit und die Vermeidung häufiger Fallstricke wie fehlender Hydrierung oder falscher Umgebungsvariablen.

Funktioniert mit✓Claude Code~Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/anubhavg-icpl/vibe/tree/HEAD/skills/ag-astro

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Astro Web Framework

Überblick

Astro ist ein Webframework, das für inhaltsreiche Websites entwickelt wurde – Blogs, Dokumentationen, Portfolios, Marketingseiten und E-Commerce. Die Kerninnovation ist die Inselarchitektur: Standardmäßig sendet Astro null JavaScript an den Browser. Interaktive Komponenten werden selektiv als isolierte „Inseln“ hydriert. Astro unterstützt gleichzeitig React, Vue, Svelte, Solid und andere UI-Frameworks im selben Projekt, sodass du pro Komponente das passende Werkzeug wählen kannst.

Wann du diese Fertigkeit einsetzen solltest

  • Verwende sie beim Erstellen eines Blogs, einer Dokumentationsseite, einer Marketingseite oder eines Portfolios
  • Verwende sie, wenn Leistung und Core Web Vitals höchste Priorität haben
  • Verwende sie, wenn das Projekt inhaltslastig mit Markdown- oder MDX-Dateien ist
  • Verwende sie, wenn du eine statische (SSG) Ausgabe mit optionalem SSR für dynamische Routen wünschst
  • Verwende sie, wenn der Benutzer nach .astro-Dateien, Astro.props, Content-Collections oder client:-Direktiven fragt

So funktioniert es

Schritt 1: Projekteinrichtung

npm create astro@latest my-site
cd my-site
npm install
npm run dev

Füge Integrationen nach Bedarf hinzu:

npx astro add tailwind        # Tailwind CSS
npx astro add react           # React-Komponentenunterstützung
npx astro add mdx             # MDX-Unterstützung
npx astro add sitemap         # Automatische sitemap.xml
npx astro add vercel          # Vercel SSR-Adapter

Projektstruktur:

src/
  pages/          ← Dateibasiertes Routing (.astro, .md, .mdx)
  layouts/        ← Wiederverwendbare Seitenhüllen
  components/     ← UI-Komponenten (.astro, .tsx, .vue, etc.)
  content/        ← Typsichere Content-Collections (Markdown/MDX)
  styles/         ← Globales CSS
public/           ← Statische Assets (werden unverändert kopiert)
astro.config.mjs  ← Framework-Konfiguration

Schritt 2: Astro-Komponentensyntax

.astro-Dateien haben einen Code-Bereich oben (nur Server) und eine Vorlage darunter:

---
// src/components/Card.astro
// Dieser Block läuft NUR auf dem Server – niemals im Browser
interface Props {
  title: string;
  href: string;
  description: string;
}

const { title, href, description } = Astro.props;
---

<article class="card">
  <h2><a href={href}>{title}</a></h2>
  <p>{description}</p>
</article>

<style>
  /* Automatisch auf diese Komponente beschränkt */
  .card { border: 1px solid #eee; padding: 1rem; }
</style>

Schritt 3: Dateibasierte Seiten und Routing

src/pages/index.astro          → /
src/pages/about.astro          → /about
src/pages/blog/[slug].astro    → /blog/:slug (dynamisch)
src/pages/blog/[...path].astro → /blog/* (Auffangpfad)

Dynamische Route mit getStaticPaths:

---
// src/pages/blog/[slug].astro
export async function getStaticPaths() {
  const posts = await getCollection('blog');
  return posts.map(post => ({
    params: { slug: post.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await post.render();
---

<h1>{post.data.title}</h1>
<Content />

Schritt 4: Content-Collections

Content-Collections bieten typsicheren Zugriff auf Markdown- und MDX-Dateien:

// src/content/config.ts
import { z, defineCollection } from 'astro:content';

const blog = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false),
  }),
});

export const collections = { blog };
---
// src/pages/blog/index.astro
import { getCollection } from 'astro:content';

const posts = (await getCollection('blog'))
  .filter(p => !p.data.draft)
  .sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf());
---

<ul>
  {posts.map(post => (
    <li>
      <a href={`/blog/${post.slug}`}>{post.data.title}</a>
      <time>{post.data.date.toLocaleDateString()}</time>
    </li>
  ))}
</ul>

Schritt 5: Inseln – Selektive Hydrierung

Standardmäßig rendern UI-Framework-Komponenten zu statischem HTML ohne JS. Verwende client:-Direktiven zum Hydrieren:

---
import Counter from '../components/Counter.tsx';  // React-Komponente
import VideoPlayer from '../components/VideoPlayer.svelte';
---

<!-- Statisches HTML – kein JavaScript wird an den Browser gesendet -->
<Counter initialCount={0} />

<!-- Sofort beim Seitenladen hydrieren -->
<Counter initialCount={0} client:load />

<!-- Hydrieren, wenn die Komponente in den sichtbaren Bereich scrollt -->
<VideoPlayer src="/demo.mp4" client:visible />

<!-- Nur hydrieren, wenn der Browser im Leerlauf ist -->
<Analytics client:idle />

<!-- Nur bei einer bestimmten Media-Query hydrieren -->
<MobileMenu client:media="(max-width: 768px)" />

Schritt 6: Layouts

---
// src/layouts/BaseLayout.astro
interface Props {
  title: string;
  description?: string;
}
const { title, description = 'My Astro Site' } = Astro.props;
---

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>{title}</title>
    <meta name="description" content={description} />
  </head>
  <body>
    <nav>...</nav>
    <main>
      <slot />  <!-- Seiteninhalt wird hier gerendert -->
    </main>
    <footer>...</footer>
  </body>
</html>
---
// src/pages/about.astro
import BaseLayout from '../layouts/BaseLayout.astro';
---

<BaseLayout title="About Us">
  <h1>About Us</h1>
  <p>Welcome to our company...</p>
</BaseLayout>

Schritt 7: SSR-Modus (On-Demand Rendering)

Aktiviere SSR für dynamische Seiten durch Festlegen eines Adapters:

// astro.config.mjs
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';

export default defineConfig({
  output: 'hybrid',  // 'static' | 'server' | 'hybrid'
  adapter: vercel(),
});

Optiere einzelne Seiten in SSR mit export const prerender = false.

Beispiele

Beispiel 1: Blog mit RSS-Feed

// src/pages/rss.xml.ts
import rss from '@astrojs/rss';
import { getCollection } from 'astro:content';

export async function GET(context) {
  const posts = await getCollection('blog');
  return rss({
    title: 'My Blog',
    description: 'Latest posts',
    site: context.site,
    items: posts.map(post => ({
      title: post.data.title,
      pubDate: post.data.date,
      link: `/blog/${post.slug}/`,
    })),
  });
}

Beispiel 2: API-Endpunkt (SSR)

// src/pages/api/subscribe.ts
import type { APIRoute } from 'astro';

export const POST: APIRoute = async ({ request }) => {
  const { email } = await request.json();

  if (!email) {
    return new Response(JSON.stringify({ error: 'Email required' }), {
      status: 400,
      headers: { 'Content-Type': 'application/json' },
    });
  }

  await addToNewsletter(email);
  return new Response(JSON.stringify({ success: true }), { status: 200 });
};

Beispiel 3: React-Komponente als Insel

// src/components/SearchBox.tsx
import { useState } from 'react';

export default function SearchBox() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);

  async function search(e: React.FormEvent) {
    e.preventDefault();
    const data = await fetch(`/api/search?q=${query}`).then(r => r.json());
    setResults(data);
  }

  return (
    <form onSubmit={search}>
      <input value={query} onChange={e => setQuery(e.target.value)} />
      <button type="submit">Search</button>
      <ul>{results.map(r => <li key={r.id}>{r.title}</li>)}</ul>
    </form>
  );
}
---
import SearchBox from '../components/SearchBox.tsx';
---
<!-- Sofort hydriert – diese Insel ist interaktiv -->
<SearchBox client:load />

Best Practices

  • ✅ Halte die meisten Komponenten als statische .astro-Dateien – hydriere nur, was interaktiv sein muss
  • ✅ Verwende Content-Collections für alle Markdown/MDX-Inhalte – du erhältst Typsicherheit und automatische Validierung
  • ✅ Bevorzuge client:visible gegenüber client:load für Komponenten unterhalb des Bildschirmrands, um anfängliches JS zu reduzieren
  • ✅ Verwende import.meta.env für Umgebungsvariablen – stelle öffentlichen Variablen PUBLIC_ voran
  • ✅ Füge <ViewTransitions /> von astro:transitions für flüssige Seitennavigation ohne vollständige SPA hinzu
  • ❌ Verwende nicht client:load bei jeder Komponente – das hebt Astros Leistungsvorteil auf
  • ❌ Lege keine Geheimnisse in .astro-Frontmatter, das in clientseitigen Vorlagen verwendet wird
  • ❌ Überspringe nicht getStaticPaths für dynamische Routen im statischen Modus – Builds werden fehlschlagen

Sicherheitshinweise

  • Frontmatter-Code in .astro-Dateien läuft nur serverseitig und wird niemals im Browser angezeigt.
  • Verwende import.meta.env.PUBLIC_* nur für unkritische Werte. Private Umgebungsvariablen (ohne PUBLIC_-Präfix) werden niemals an den Client gesendet.
  • Validiere im SSR-Modus alle Astro.request-Eingaben vor Datenbankabfragen oder API-Aufrufen.
  • Säubere alle benutzergenerierten Inhalte vor der Darstellung mit set:html – es umgeht die automatische Escaping-Funktion.

Häufige Fallstricke

  • Problem: JavaScript aus einer React/Vue-Komponente wird im Browser nicht ausgeführt
    Lösung: Füge eine client:-Direktive hinzu (client:load, client:visible, usw.) – ohne sie rendern Komponenten nur statisches HTML.

  • Problem: getStaticPaths-Daten sind nach Inhaltsaktualisierungen während der Entwicklung veraltet
    Lösung: Astros Entwicklerserver überwacht Inhaltsdateien – starte neu, wenn Änderungen an content/config.ts nicht übernommen werden.

  • Problem: Der Typ von Astro.props ist any – keine Autovervollständigung
    Lösung: Definiere ein Props-Interface oder einen Typen im Frontmatter – Astro leitet ihn automatisch ab.

  • Problem: CSS aus einer .astro-Komponente überträgt sich auf andere Komponenten
    Lösung: Styles in .astro <style>-Tags werden automatisch begrenzt. Verwende :global() nur bei gezielter Ausrichtung auf Kindelemente.

Verwandte Fertigkeiten

  • @sveltekit – Wenn du ein Full-Stack-Framework mit reaktiver UI benötigst (im Gegensatz zu Astros Inhaltsfokus)
  • @nextjs-app-router-patterns – Wenn du ein React-zentriertes Full-Stack-Framework benötigst
  • @tailwind-patterns – Gestaltung von Astro-Seiten mit Tailwind CSS
  • @progressive-web-app – Hinzufügen von PWA-Funktionen zu einer Astro-Seite

Einschränkungen

  • Verwende diese Fertigkeit nur, wenn die Aufgabe eindeutig dem oben beschriebenen Umfang entspricht.
  • Betrachte die Ausgabe nicht als Ersatz für umgebungsspezifische Validierung, Tests oder Expertenüberprüfung.
  • Frage nach, wenn erforderliche Eingaben, Berechtigungen, Sicherheitsgrenzen oder Erfolgskriterien fehlen.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

anubhavg-icpl/vibe

|. Use when you need help with 8 bit orbit video template. Hyperframes-based video template for retro pixel deck motion design. Use when users want a high-fidelity, multi-scene HTML-to-video composition with advanced transitions, interactive preview controls, and ready-to-render default style.

anubhavg-icpl/vibe

Reference DESIGN.md for luxury automotive editorial that needs to feel engineered. White slabs, full-bleed performance photography, BMW corporate blue rising into a deeper blue at active states, restrained Helvetica-grade typography. Use when building UI components, applying design tokens, or implementing visual styles for cinematic bmw.

anubhavg-icpl/vibe

Reference DESIGN.md for enterprise-AI brands that need to feel premium, dark, and quietly futuristic. Ink canvas, Unica grotesque type, saturated coral-to-violet brand gradient deployed as backdrop and accent rule, full-pill buttons, gen. Use when building UI components, applying design tokens, or implementing visual styles for cinematic cohere.

anubhavg-icpl/vibe

Reference DESIGN.md for performance brands that need to feel theatrical. High-contrast black-and-white frames cut by Rosso Corsa red, sharp 0-radius components, FerrariSans across the entire page, photography that treats the car as sculp. Use when building UI components, applying design tokens, or implementing visual styles for cinematic ferrari.

anubhavg-icpl/vibe

Reference DESIGN.md for hyper-luxury that needs to feel forged. True-black canvas, oversized LamboType nameplates at 120px+, hexagonal angle motifs, single warm-gold accent for primary actions, photography lit like a vault. Use when building UI components, applying design tokens, or implementing visual styles for cinematic lamborghini.

anubhavg-icpl/vibe

Reference DESIGN.md for AI-lab cinematic: pure black canvas, neon-lime accent on charcoal chrome, geometric DM Sans / Outfit type, pill-shaped CTAs. Use when building UI components, applying design tokens, or implementing visual styles for cinematic minimax.

anubhavg-icpl/vibe

Reference DESIGN.md for GPU-vendor cinematic: chrome-black canvas, signature green action, video-led hero, hard-edged grotesque headlines. Use when building UI components, applying design tokens, or implementing visual styles for cinematic nvidia.

anubhavg-icpl/vibe

Skill for discovering and researching autonomous AI agents, tools, and ecosystems using the AgentFolio directory. Use when you need help with agentfolio.

anubhavg-icpl/vibe

Expert in building portfolios that actually land jobs and clients -. Use when you need help with interactive portfolio. not just showing work, but creating memorable experiences. Covers developer portfolios, designer portfolios, creative portfolios, and portfolios that convert visitors into opportunities.

anubhavg-icpl/vibe

Generates high-converting Next.js/React landing pages with Tailwind CSS. Uses PAS, AIDA, and BAB frameworks for optimized copy/components (Heroes, Features, Pricing). Focuses on Core Web Vitals/SEO. Use when you need help with landing page generator.

anubhavg-icpl/vibe

Generate walkthrough videos from Stitch projects using Remotion with smooth transitions, zooming, and text overlays. Use when you need help with remotion.

anubhavg-icpl/vibe

Writes complete, structured landing pages optimized for SEO ranking, AEO citation, and visitor conversion. Activate when the user wants to write or generate a landing page for a product, service, or offer.

anubhavg-icpl/vibe

Project scaffolding - generate boilerplate for common project types with best-practice defaults. Use for: scaffold, boilerplate, template, new project, init, create project, starter, setup, project structure, directory structure, monorepo, microservice, API template, web app template, CLI tool template, library template.

anubhavg-icpl/vibe

Automate Klipfolio tasks via Rube MCP (Composio). Always search tools first for current schemas. Use when you need help with klipfolio automation.

anubhavg-icpl/vibe

>. Use when you need help with kami landing. Produce a print-grade single-page kami (紙 / 纸) document — warm parchment canvas, ink-blue accent, serif at one weight, no italic, no cool grays. The output reads like a professional white paper or studio one-pager, not an app UI. Multilingual by design (EN · zh-CN · ja). One self-contained HTML file, zero dependencies.

anubhavg-icpl/vibe

>. Use when you need help with open design landing deck. Produce a single-file slide deck in the Atelier Zero visual language (warm-paper background, italic-serif emphasis spans, coral terminating dots, surreal collage plates) — Open Design's brand deck recipe. The deck uses **horizontal magazine-style swipe pagination** (←/→, wheel, swipe), a per-slide chrome strip with brand mark and slide counter, an ESC overview grid, a coral progress bar, and inherits the canonical stylesheet + 16-slot image library from the sister `open-design-landing` skill.

anubhavg-icpl/vibe

>. Use when you need help with open design landing. Produce a world-class single-page editorial landing site in the Atelier Zero visual language (Monocle / Apartamento / Études editorial collage) — the same aesthetic Open Design uses for its own marketing surface. The agent fills a typed `inputs.json` from a brand brief, optionally generates 16 collage assets via gpt-image-2, then runs a pure-function composer that emits a self-contained HTML file; a separate path can mirror the Astro marketing site in `apps/landing-page/`. Drop-in scroll-reveal motion and a Headroom-style sticky nav are wired automatically.

anubhavg-icpl/vibe

>. Use when building UI with epic design language and visual style. Build immersive, cinematic 2.5D interactive websites using scroll storytelling, parallax depth, text animations, and premium scroll effects — no WebGL required. Use this skill for any web design task: landing pages, product sites, hero sections, scroll animations, parallax, sticky sections, section overlaps, floating products between sections, clip-path reveals, text that flies in from sides, words that light up on scroll, curtain drops, iris opens, card stacks, bleed typography, and any site that should feel cinematic or premium. Trigger on phrases like "make it feel alive", "Apple-style animation", "sections that overlap", "product rises between sections", "immersive", "scrollytelling", or any scroll-driven visual effect. Covers 45+ techniques across 8 categories. Always inspects, judges, and plans assets before coding. Use aggressively for ANY web design task.

anubhavg-icpl/vibe

Generates high-converting landing pages as complete Next.js/React (TSX) components with Tailwind CSS. Creates hero sections, feature grids, pricing tables, FAQ accordions, testimonial blocks, and CTA sections using proven copy frameworks (PAS, AIDA, BAB). Outputs SEO meta tags, structured data, and performance-optimised code targeting Core Web Vitals (LCP < 1s, CLS < 0.1). Use when the user asks to create a landing page, marketing page, homepage, single-page site, lead capture page, campaign page, promo page, or conversion-optimised web page — or when they want to A/B test landing page variants or replace a static page with one designed to convert.

anubhavg-icpl/vibe

Generates a premium single-page HTML landing page with 3D CSS animations, GSAP scroll effects, and mouse-parallax depth. Forcing intake (product + elevator pitch, audience register, brand overrides, tone) locks down positioning before any copy or markup is written, so the page reflects the actual product rather than generic boilerplate. Use whenever the user says 'landing for X', 'create a landing page', 'build a landing page', 'make a landing page for X', 'I need a web page for Y', or provides product/service details and wants a polished website. Also triggers on 'promotional page', 'product page', 'one-pager', 'web presence', 'sales page'. Outputs a single self-contained HTML file (Claude Code) or HTML artifact (Claude.ai). Supports configurable brand colors via CSS custom property overrides.

Verwandte Skills