A beautiful, searchable, and categorized gallery for your Zo saved skills. Built as a reusable Zo Site template.
- π Smart Search: Filter skills by title, description, or content
- π·οΈ Tag Filtering: Filter by tags with OR logic (any selected tag matches)
- π Categories: Automatically categorize skills into logical groups
- π¨ Modern UI: Beautiful dark-mode friendly design with shadcn/ui components
- π± Responsive: Works great on desktop and mobile
- βοΈ Edit Skills: Quick access to edit prompt metadata inline
- π― Quick View: Pop-up modal to preview prompt content without leaving page
- βοΈ Batch Management: Global category and tag management across all skills with bulk operations
- π Conflict Resolution: Smart handling when renaming/moving items with existing names
- π Live Preview: Preview changes before applying batch operations
cd /home/workspace/Projects
git clone <your-repo-url> prompt-gallery
cd prompt-gallery
bun installCopy these files to your existing Zo Site:
src/pages/demos/skills-gallery.tsx
src/components/ui/dialog.tsx
src/components/ui/popover.tsx
src/components/ui/command.tsx
src/components/ui/markdown-content.tsx
src/components/ui/alert.tsx
src/components/ui/scroll-area.tsx
src/components/ui/tabs.tsx
scripts/categorize-skills.ts
server.ts (update your existing with skills endpoints)
- Install Dependencies:
bun add marked gray-matter
bunx --bun shadcn@latest add dialog popover command tabs scroll-area alert- Update
zosite.json:
{
"env": {
"VITE_ZO_SITE_DEMO_VARIANT": "skills"
}
}- Run Categorization Script:
bun scripts/categorize-skills.tsThis will auto-categorize your existing skills in /home/workspace/Skills into logical groups.
- Start Site: Use the Zo UI to start your site, then visit the preview URL.
The site includes API endpoints:
GET /api/skills: Scans/home/workspace/Skillsdirectory and returns all.SKILL.mdfiles with metadata (title, description, tags, category, emojis)POST /api/skills/batch/preview: Preview bulk operations (rename/delete categories or tags) before applyingPOST /api/skills/batch/apply: Apply bulk operations to all matching prompt files with conflict resolution
- Fetches all skills from
/api/skillson load - Provides search, tag filtering, and category filtering
- Shows a beautiful grid of prompt cards
- Click any card to open a modal with full content
- Edit mode allows updating category and description directly
- Gear icon (βοΈ) in header opens management modal for batch operations
- Manage categories: rename, delete, or merge existing categories
- Manage tags: rename or delete existing tags
- Preview all changes before applying them
- Conflict resolution when target names already exist
The gallery organizes skills into these default categories:
- Productivity & Planning - Task management, automation, organization
- Writing & Content - Blog posts, essay writing, creative writing
- Data & Integrations - CSV processing, API integrations, data work
- Development - Coding, debugging, code review
- Media & Graphics - Image generation, video creation, design
- Communication - Email, SMS, messaging
- Research & Learning - Topic research, summarization
- System & Admin - Site setup, configuration, maintenance
Edit scripts/categorize-skills.ts to add or modify category mappings:
const categories: Record<string, string> = {
"your-keyword": "Your Category Name"
};Then run the script again:
bun scripts/categorize-skills.tsThe site uses Tailwind CSS 4. You can customize colors in:
src/styles.css- Global styles- Component classes - Modify Tailwind utility classes directly
Skills should follow this frontmatter format:
---
title: Your Prompt Title
description: A brief description
tags: ["tag1", "tag2"]
category: Your Category
tool: true (or false)
---
Your prompt content here...- Check that skills are in
/home/workspace/Skills - Ensure files end with
.SKILL.md - Check browser console for errors
- Verify API is working:
curl http://localhost:YOUR_PORT/api/skills
The gallery uses OR logic by default. If you want AND logic (must match ALL tags), edit the filter function in src/pages/demos/skills-gallery.tsx:
// Change from:
const matchesTags = selectedTags.length === 0 || selectedTags.some((t) => prompt.tags.includes(t));
// To:
const matchesTags = selectedTags.length === 0 || selectedTags.every((t) => prompt.tags.includes(t));This is a community template! Feel free to:
- Report bugs
- Suggest new features
- Submit pull requests
- Share your own customizations
This template is open source and free to use for your personal Zo computer.
Built with:
- Zo - The AI Computer
- Bun - JavaScript runtime
- Hono - Web framework
- React - UI library
- shadcn/ui - Component library
- Tailwind CSS - Styling
Made with β€οΈ for the Zo Community
