--- import Base from '../layouts/Base.astro'; import ResourceCard from '../components/ResourceCard.astro'; import ResourceSearch from '../components/ResourceSearch.vue'; import { listResources, listAllResources } from '../lib/resources'; import { RESOURCE_TYPES, REGISTRY } from '../lib/registry'; import { getAllStats } from '../lib/stats'; import { buildSyncScript, buildSyncScriptPS, isPowerShell } from '../lib/sync'; const accept = Astro.request.headers.get('accept') || ''; if (!accept.includes('text/html')) { const ps = isPowerShell(Astro.request); const script = ps ? await buildSyncScriptPS(Astro.url.origin, '.claude\\skills') : await buildSyncScript(Astro.url.origin, '.claude/skills'); return new Response(script, { headers: { 'Content-Type': 'text/plain; charset=utf-8' }, }); } // Fetch all resources grouped by type const resourcesByType: Record>> = {}; const typeCounts: Record = {}; for (const type of RESOURCE_TYPES) { const resources = await listResources(type); resourcesByType[type] = resources; typeCounts[type] = resources.length; } const allResources = Object.entries(resourcesByType).flatMap(([type, resources]) => resources.map(r => ({ ...r, type })) ).sort((a, b) => a.name.localeCompare(b.name)); // Compute fork counts const forkCounts = new Map(); for (const r of allResources) { if (r['fork-of']) { const key = `${r.type}:${r['fork-of']}`; forkCounts.set(key, (forkCounts.get(key) || 0) + 1); } } const authors = [...new Set(allResources.map(r => r.author).filter(Boolean))].sort(); const allTags = [...new Set(allResources.flatMap(r => r.tags))].sort(); // Get stats for all types const allStatsMap: Record> = {}; for (const type of RESOURCE_TYPES) { allStatsMap[type] = await getAllStats(type); } function parseTools(val: unknown): string[] { if (Array.isArray(val)) return val.map(String); if (typeof val === 'string') return val.split(',').map(t => t.trim()).filter(Boolean); return []; } --- {allResources.length === 0 ? (

No resources yet

Create your first skill, agent, output style, or rule to get started.

Create your first resource
) : (
Grimoired logo

Grimoired

Grimoired (from grimoire — a book of spells, originally French) is a shared registry for Claude Code resources: skills, agents, output styles, and rules. Resources can be simple prompt files (.md) or full packages with scripts, references, and assets that Claude picks up automatically.

Create, browse, and share reusable prompts that standardize how Claude handles tasks across your team. Install them instantly with a single curl command.

Quick install (skills)

Sync all skills to your project. They'll be saved to .claude/skills/ and Claude Code picks them up on the next conversation.

curl -fsSL {Astro.url.origin} | bash
Install globally
curl -fsSL {Astro.url.origin}/gi | bash

Quick push (skills)

Push your local skills to the server. Run from your project root — it reads .claude/skills/*.md and uploads them.

curl -fsSL {Astro.url.origin}/p | bash
{allResources.map((r) => { const config = REGISTRY[r.type as keyof typeof REGISTRY]; const stats = allStatsMap[r.type]?.[r.slug] || { downloads: 0, pushes: 0, lastPushedAt: null }; const fc = forkCounts.get(`${r.type}:${r.slug}`) || 0; const tools = parseTools(r.fields['allowed-tools'] ?? r.fields.allowedTools); return (
); })}
)}