import { useState, useEffect, useMemo } from 'react'; import { VirtuosoGrid } from 'react-virtuoso'; import { useSkills } from '../context/SkillContext'; import { SkillCard } from '../components/SkillCard'; import { Icon } from '../components/ui/Icon'; import type { SyncMessage, CategoryStats } from '../types'; import { usePageMeta } from '../hooks/usePageMeta'; import { buildHomeMeta, getHomeFaqItems } from '../utils/seo'; import { Link } from 'react-router-dom'; const conceptCards = [ { title: 'Specialized plugins', body: 'Focused installable distributions for domains like web apps, security, documents, data, DevOps, QA, OSS, mobile, automation, and agent/MCP work.', }, { title: 'Skills', body: 'Reusable SKILL.md playbooks that teach an AI assistant how to execute a workflow with better structure and context.', }, { title: 'MCP tools', body: 'External capabilities and system integrations the assistant can call. Tools provide actions; skills tell the assistant how to use them well.', }, { title: 'Bundles', body: 'Curated starting sets of recommended skills for a role, domain, or team that wants a smaller shortlist first.', }, { title: 'Workflows', body: 'Ordered execution playbooks that show how to combine multiple skills step by step for a concrete outcome.', }, ] as const; const integrationGuides = [ { name: 'Claude Code', href: 'https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/claude-code-skills.md', body: 'Install paths, starter prompts, plugin marketplace flow, and first skills to try.', }, { name: 'Cursor', href: 'https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/cursor-skills.md', body: 'A practical guide for chat-first UI, frontend, and full-stack workflows in Cursor.', }, { name: 'Codex CLI', href: 'https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/codex-cli-skills.md', body: 'How to use Antigravity Awesome Skills with Codex CLI for planning, implementation, testing, and review.', }, { name: 'Gemini CLI', href: 'https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/gemini-cli-skills.md', body: 'A broad starting point for engineering, agent systems, integrations, and applied AI workflows.', }, ] as const; const syncFeatureEnabled = ( (import.meta as ImportMeta & { env: Record }).env.VITE_ENABLE_SKILLS_SYNC === 'true' ); export function Home(): React.ReactElement { const { skills, stars, loading, error, refreshSkills } = useSkills(); const [search, setSearch] = useState(''); const [debouncedSearch, setDebouncedSearch] = useState(''); const [categoryFilter, setCategoryFilter] = useState('all'); const [sortBy, setSortBy] = useState('default'); const [syncing, setSyncing] = useState(false); const [syncMsg, setSyncMsg] = useState(null); const [commandCopied, setCommandCopied] = useState(false); const installCommand = 'npx antigravity-awesome-skills'; const repositoryLink = 'https://github.com/sickn33/antigravity-awesome-skills'; const docsLink = 'https://github.com/sickn33/antigravity-awesome-skills/blob/main/docs/users/usage.md'; const installLink = 'https://www.npmjs.com/package/antigravity-awesome-skills'; const faqItems = getHomeFaqItems(); const catalogCountLabel = skills.length > 0 ? skills.length.toLocaleString('en-US') : 'installable'; usePageMeta(buildHomeMeta(skills.length)); const copyInstallCommand = async () => { await navigator.clipboard.writeText(installCommand); setCommandCopied(true); window.setTimeout(() => setCommandCopied(false), 2000); }; useEffect(() => { const timeoutId = window.setTimeout(() => { setDebouncedSearch(search); }, 300); return () => { window.clearTimeout(timeoutId); }; }, [search]); const filteredSkills = useMemo(() => { let result = [...skills]; if (debouncedSearch) { const lowerSearch = debouncedSearch.toLowerCase(); result = result.filter(skill => skill.name.toLowerCase().includes(lowerSearch) || skill.description.toLowerCase().includes(lowerSearch) ); } if (categoryFilter !== 'all') { result = result.filter(skill => skill.category === categoryFilter); } // Apply sorting if (sortBy === 'stars') { result = [...result].sort((a, b) => (stars[b.id] || 0) - (stars[a.id] || 0)); } else if (sortBy === 'newest') { result = [...result].sort((a, b) => (b.date_added || '').localeCompare(a.date_added || '')); } else if (sortBy === 'az') { result = [...result].sort((a, b) => a.name.localeCompare(b.name)); } return result; }, [debouncedSearch, categoryFilter, sortBy, skills, stars]); // Sort categories by count (most skills first), with 'uncategorized' at the end const { categories, categoryStats } = useMemo(() => { const stats: CategoryStats = {}; skills.forEach(skill => { stats[skill.category] = (stats[skill.category] || 0) + 1; }); const cats = ['all', ...Object.keys(stats) .filter(cat => cat !== 'uncategorized') .sort((a, b) => stats[b] - stats[a]), ...(stats['uncategorized'] ? ['uncategorized'] : []) ]; return { categories: cats, categoryStats: stats }; }, [skills]); const handleSync = async () => { setSyncing(true); setSyncMsg(null); try { const res = await fetch('/api/refresh-skills', { method: 'POST' }); const data = await res.json(); if (data.success) { if (data.upToDate) { setSyncMsg({ type: 'info', text: 'Skills are already up to date.' }); } else { setSyncMsg({ type: 'success', text: `Synced ${data.count} skills.` }); await refreshSkills(); } } else { setSyncMsg({ type: 'error', text: String(data.error) }); } } catch { setSyncMsg({ type: 'error', text: 'Network error' }); } finally { setSyncing(false); setTimeout(() => setSyncMsg(null), 5000); } }; return (

Skills Library

Build agent workflows with production-grade skill playbooks

Antigravity Awesome Skills is a curated catalog for the official GitHub repository of installable capabilities for AI assistants. Search fast, shortlist by category, and launch your first tested workflow from one focused workspace.

Open the GitHub repository Install with npm Read getting started docs Compare specialized plugins
Recommended command {installCommand}

Explore Skills

Discover {catalogCountLabel} agentic capabilities for your AI assistant.

{syncMsg && ( {syncMsg.text} )} {syncFeatureEnabled ? ( ) : ( Public catalog mode )}
{!syncFeatureEnabled && (

Catalog sync is a maintainer-only workflow in local builds, so the public Pages site always shows the last published catalog.

)}
setSearch(e.target.value)} />
{loading ? (
{[...Array(8)].map((_, i) => (
))}
) : error && skills.length === 0 ? (

Unable to load skills

{error}

) : filteredSkills.length === 0 ? (

No skills found

Try adjusting your search or category filters.

) : ( { const skill = filteredSkills[index]; return ; }} /> )}

Concepts

Understand the system before scaling your setup

The catalog is easier to navigate when you separate reusable playbooks from external tool integrations. Skills explain execution quality, MCP tools expose systems, bundles reduce decision overhead, and workflows map the operating sequence.

{conceptCards.map((card) => (

{card.title}

{card.body}

))}

Integration Guides

Start from the guide that matches your assistant runtime

{integrationGuides.map((guide) => (

{guide.name}

{guide.body}

))}

Quick FAQ

Answers to the first questions most users ask

{faqItems.map((item) => (

{item.question}

{item.answer}

))}
Read the full FAQ
); } export default Home;