Reimplement a local, static version of a skills directory (similar to skills.sh) using:
- React
- Vite
- Static JSON + Markdown data
- No backend
- No external dependencies beyond minimal libraries
The system must support:
- Skill discovery (leaderboard)
- Search/filter
- Skill detail rendering (Markdown)
- Copy-to-install command UX
/project-root
/public
/skills/
skill-a.md
skill-b.md
skills.json
/src
/components
/pages
/hooks
/utils
/styles
App.jsx
main.jsx
index.html
vite.config.js
{
"skills": [
{
"id": "python-logging",
"name": "Python Logging",
"description": "Standard logging patterns",
"tags": ["python", "logging"],
"path": "/skills/python-logging.md",
"repo": "org/python-logging",
"installs": 1200,
"trendScore": 80,
"hotScore": 200
}
]
}
# Skill Title
## Summary
Description
## Usage
Steps
## Examples
Code
## Notes
Extra info
/ → leaderboard
/skill/:id → skill detail
- Fetch
/skills.json - Store in state
-
Instant filtering
-
Match against:
- name
- description
- tags
- Trending → trendScore
- Hot → hotScore
- All Time → installs
Copies:
npx skills add <repo>
- Fetch
.md - Render using
react-markdown
Header (title + search)
Filter Tabs
Skill List (vertical rows)
--font-sans: system-ui, -apple-system, Segoe UI, Roboto
--font-mono: monospace
--text-xs: 12px
--text-sm: 13px
--text-md: 14px
--text-base: 16px
--text-lg: 18px
--text-xl: 22px
--space-1: 4px
--space-2: 8px
--space-3: 12px
--space-4: 16px
--space-5: 24px
--space-6: 32px
--bg: #ffffff
--panel: #fafafa
--text: #111111
--muted: #6b7280
--faint: #9ca3af
--border: #e5e7eb
--border-strong: #d1d5db
--hover-bg: #f5f5f5
--active-bg: #eeeeee
- Left: title
- Right: search input
- Trending
- Hot
- All Time
Structure:
[Rank] [Title + Desc + Tags] [Installs + Button]
- Monospace font
- Copy-to-clipboard
- Hover + active states
- Small pill
- Rounded
- Border only
body {
margin: 0;
font-family: var(--font-sans);
}
.header {
display: flex;
justify-content: space-between;
padding: 16px;
border-bottom: 1px solid var(--border);
}
.tab {
padding: 6px 10px;
border-radius: 6px;
}
.tab.active {
border: 1px solid var(--border-strong);
}
.skill-row {
display: flex;
padding: 16px;
border-bottom: 1px solid var(--border);
}
.skill-row:hover {
background: var(--hover-bg);
}
.install-btn {
font-family: var(--font-mono);
border: 1px solid var(--border-strong);
border-radius: 6px;
padding: 6px 10px;
}
.content pre {
border: 1px solid var(--border);
padding: 16px;
border-radius: 8px;
}
{
skills: [],
query: "",
mode: "trending"
}
- Create Vite React app
- Add routing
- Load skills.json
- Render list
- Implement search
- Implement sorting
- Load markdown
- Add styling
- No cards
- No shadows
- Minimal animation (<200ms)
- High density layout
- Text-first UI
- Lazy load markdown
- Cache loaded skills
- Avoid re-render on search (memoize)
Build:
npm run build
Output:
/dist
Deployable as static site.
This system is:
- Fully static
- Developer-focused
- Fast to scan
- Minimal UI
- Data-driven
Primary goal:
Discover → Evaluate → Copy Install