My Stack Spec
Spec for my stack page - filterable categories showing what I use, what I'm watching, what I retired, and why
Vision
The My Stack page shows what I actually use, what I'm following, and what I've retired—with the stories behind those choices. Instead of just listing "I use React," it explains why I picked React, what I moved away from, and what I'm actively exploring. Filter by AI dev, homelab, superseded tools, whatever—each view tells a different story about how my stack evolved.
It's basically a living document of my technical worldview and how it changes over time.
Problem Statement
Most tool pages are boring as hell:
- Static lists: "Proficient in React, TypeScript, Python" means nothing—where's the context?
- No filtering: Can't drill down to AI stuff vs infrastructure vs creative tools
- Missing migration stories: Nobody explains why they moved from Tailwind to Emotion, or Django to Next.js
- Overwhelming: 60+ tools in one endless scroll = cognitive overload
- No narrative: Just logos and names, no explanation of technical choices
Core Philosophy
This documents my technical worldview. It's not about flexing expertise—it's about showing:
- What I actually use day-to-day and why
- Tech I'm following and what makes it interesting
- Tools I've retired and what I learned from the switch
- Stuff I respect but haven't deployed yet (aspirational homelab vibes)
- How my stack evolved over time
The goal: show technical reasoning. React for components over templates. Tailwind → Emotion when I needed more control. Actively studying distributed AI. That kind of thing.
Current Implementation (Phase 1)
Component Architecture
// ToolCard component (reusable)
<ToolCard
logo="/tool-logos/react.svg"
title="React"
description="Component architecture for ui"
invert={false} // white logos need inversion
/>
// ColoredHeading (custom styled component)
const ColoredHeading = styled.h2`
color: hsl(210, 100%, 60%);
font-family: var(--font-sekuya), sans-serif;
font-size: 2rem;
margin: 3rem 0 1rem 0;
`;
// Section pattern (17 sections currently)
<ColoredHeading>Section Title</ColoredHeading>
<div style={{ margin: '3rem 0' }}>
<Paragraph>Narrative description...</Paragraph>
</div>
<div style={gridContainerStyle}>
<ToolCard ... />
<ToolCard ... />
</div>
<Divider />Current Sections (17 Total)
- Software I'm Following (6 tools): Cursor, Claude Code, GitHub Copilot SDK, Claude Cowork, Codex, Exo
- Software I Plan to Use (2 tools): LangChain, LangSmith
- Homelab & Self-Hosting (10 tools): Ollama, Open WebUI, Proxmox, Grafana, Hetzner, TrueNAS, Home Assistant, Prometheus, Unraid, OpenMediaVault
- Languages (6 tools): TypeScript, JavaScript, Python, HTML, CSS, Shell
- Core Dev Stack (12 tools): React, Next.js, Vite, Emotion, Vercel, Cloudflare, Git, GitHub, GitHub Copilot, VS Code, Chrome DevTools, jaygriff.com
- Chatbots (3 tools): ChatGPT, Claude, Gemini
- Vibecoding (2 tools): Lovable.dev, Bolt.new
- Productivity (6 tools): Notion, Obsidian, Excel, Google Sheets, Office Suite, Locus
- Photo & Image Editing (2 tools): Affinity, Canva
- Video Recording (1 tool): OBS
- Design & Color Tools (2 tools): Figma, Coolors
- OS Automation (2 tools): Hammerspoon, AutoHotKey
- CSS Frameworks (Superseded) (2 tools): Tailwind, DaisyUI
- Web Frameworks (Superseded) (4 tools): Django, Flask, Express, WordPress
- Static Site Generators (Superseded) (2 tools): Hugo, Jekyll
- Hosting & Infrastructure (Superseded) (1 tool): Netlify
- Tools Vanquished by Affinity (4 tools): Photoshop, Photopea, Inkscape, GIMP
Phase 2: Filtering System (Planned)
Filter Categories
Each filter creates a curated view with its own narrative:
- All: Gallery mode—just logos and names, minimal cognitive load, quick scanning
- AI Dev / AI Engineering: Cursor, Claude Code, GitHub Copilot SDK, Exo, LangChain, LangSmith, Chatbots, Vibecoding tools—shows AI-native development workflow
- Homelab / Infrastructure: All 10 homelab tools with narrative: "I respect this deeply even though I don't run one yet"
- Superseded / Retired: CSS Frameworks, Web Frameworks, Static Site Generators, Hosting, Affinity-vanquished—tells migration stories
- Creative & Productivity: Productivity, Photo/Image Editing, Video Recording, Design & Color Tools—shows creative workflow
- What I'm Following: Software I'm Following section—what's on my radar for adoption
- What I'm Studying: Meta-category about learning vibe coding architecture, AI assistant internals, distributed inference systems
- Core Stack / Daily Toolkit: Languages, Core Dev Stack—everyday tools, production-ready
Filter-Specific Narratives
Each filter gets its own introductory paragraph explaining context. Examples:
const filterIntros = {
'ai-dev': `I build with AI-native tools daily. Not just using ChatGPT—I'm
deep into system prompts, context management, tool-calling patterns, and
distributed inference. This is where I see development heading.`,
'homelab': `I respect homelab culture deeply even though I don't run one yet.
Proxmox, TrueNAS, Grafana—I'm studying these because self-hosting,
infrastructure ownership, and local-first AI are where I want to grow.`,
'superseded': `These are tools I've retired, but each migration taught
something valuable. Tailwind → Emotion: realized CSS-in-JS gives more
control. Django → Next.js: discovered React components changed how I think
about UI. WordPress → Custom: understood the power of owning your stack.`,
'studying': `I'm not just using tools—I'm studying how they're built.
Fascinated by Cursor's architecture, Claude Sonnet's context management,
distributed inference patterns in Exo. Want to understand internals, not
just APIs.`
};State Management
// Client component with useState
'use client';
const [activeFilter, setActiveFilter] = useState<FilterCategory>('all');
// Filter button component
interface FilterButtonProps {
label: string;
category: FilterCategory;
active: boolean;
onClick: () => void;
}
// Conditional rendering
{activeFilter === 'all' && <GalleryView tools={allTools} />}
{activeFilter === 'ai-dev' && (
<>
<FilterIntro text={filterIntros['ai-dev']} />
<ToolSection title="AI Development Tools" tools={aiDevTools} />
</>
)}Tag System (Cross-Cutting Concerns)
Some tools belong in multiple categories. Use tags for flexible filtering:
interface ToolData {
logo: string;
title: string;
description: string;
invert?: boolean;
tags: string[]; // e.g., ['ai', 'dev', 'core-stack']
status: 'active' | 'watching' | 'want-to-use' | 'superseded';
}
// Example
const tools: ToolData[] = [
{
logo: '/tool-logos/cursor.svg',
title: 'Cursor',
description: 'Ai-first code editor',
tags: ['ai', 'dev', 'core-stack', 'following'],
status: 'active'
},
{
logo: '/tool-logos/vercel.svg',
title: 'Vercel',
description: 'Serverless deployment platform',
tags: ['infrastructure', 'hosting', 'core-stack'],
status: 'active'
}
];UX Requirements
Gallery Mode (All View)
- Compact grid: Just logos and titles, no descriptions
- Quick scanning: See 60+ tools at a glance
- No cognitive load: Minimal text, maximum visual recognition
- Click to filter: Clicking a tool could auto-filter to its primary category
Filtered Views
- Rich narrative intro: Context-setting paragraph at top
- Full descriptions: Show ToolCards with complete text
- Grouped sections: Related tools together with subheadings
- Migration stories: For "Superseded" view, explain why tools were retired
Filter Button Design
// Filter bar at top of page
<FilterBar>
<FilterButton label="All" category="all" active={activeFilter === 'all'} />
<FilterButton label="AI Dev" category="ai-dev" active={activeFilter === 'ai-dev'} />
<FilterButton label="Homelab" category="homelab" active={activeFilter === 'homelab'} />
<FilterButton label="Superseded" category="superseded" active={activeFilter === 'superseded'} />
<FilterButton label="Creative" category="creative" active={activeFilter === 'creative'} />
<FilterButton label="Core Stack" category="core-stack" active={activeFilter === 'core-stack'} />
</FilterBar>
// Active state styling
const FilterButton = styled.button<{ active: boolean }>`
background: ${props => props.active ? 'hsl(210, 100%, 60%)' : 'transparent'};
color: ${props => props.active ? 'white' : 'hsl(210, 100%, 60%)'};
border: 2px solid hsl(210, 100%, 60%);
padding: 0.5rem 1rem;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s;
&:hover {
background: hsl(210, 100%, 60%);
color: white;
}
`;Filter Examples
AI Dev Filter
Shows: Cursor, Claude Code, GitHub Copilot SDK, Exo, LangChain, LangSmith, Chatbots, Vibecoding tools
Intro could be: "I build with AI-native tools daily. Not just using ChatGPT—deep into system prompts, context management, tool-calling patterns, local inference."
Homelab Filter
Shows: All 10 homelab tools (Ollama, Open WebUI, Proxmox, TrueNAS, Grafana, etc.)
Intro could be: "I love homelab even though I don't run a lot of hardware. Studying Proxmox, TrueNAS, Grafana because self-hosting and local-first AI is where I want to grow."
Superseded Filter
Shows: Retired tools with migration stories
- Tailwind → Emotion: Realized CSS-in-JS gives more control for constraint-based design systems
- Django → Next.js: React components changed how I think about UI composition
- WordPress → Custom: Understood the power of owning your entire stack
- Photoshop → Affinity: Professional design tools without subscription lock-in
Implementation Roadmap
Phase 1: Current State ✓
- 17 sections with consistent structure
- 60+ tools with logos, titles, descriptions
- ColoredHeading + Paragraph + ToolCards pattern
- All descriptions capitalized
- Homelab section created and populated
Phase 2: Data Refactor (Next)
- Extract tools into data structure (tools.ts)
- Add tags array to each tool
- Add status field (active, watching, want-to-use, superseded)
- Map current sections to tool tags
Phase 3: Filter UI (Following Phase 2)
- Create FilterButton component
- Add useState for active filter
- Implement filter bar at top of page
- Write filter-specific intro paragraphs
- Create conditional rendering logic
Phase 4: Gallery Mode (Following Phase 3)
- Design compact ToolCard variant (logo + title only)
- Create GalleryView component
- Implement grid layout with responsive sizing
- Add hover states for quick tool info
Phase 5: Migration Stories (Final Polish)
- Write detailed migration narratives for Superseded view
- Add "What I Learned" sections for retired tools
- Create timeline visualization of stack evolution
- Add "Why I'm Watching" stories for Following view
Success Metrics
- Self-serve navigation: People can drill down to specific interests without scrolling endlessly
- Story resonance: Migration stories and "What I'm Studying" sections land well
- Better than static lists: More interesting than typical "skills" pages
- Personal clarity: Acts as living document of my own technical evolution
Technical Debt & Future Considerations
Known Issues
- Missing logo:
/tool-logos/codex.svgreturns 404 - No search: 60+ tools with no search functionality yet
- Manual data entry: All tools hardcoded in JSX, no CMS or data file
- No timestamps: Can't track when tools were added/removed over time
Future Enhancements
- Tool detail pages: Click a tool to see full usage notes, projects built with it, learning resources
- Timeline view: Visualize stack evolution over time (2020: Python/Django → 2022: React/Next.js → 2024: AI-native)
- Project cross-references: Link tools to specific projects (e.g., "Used React + Emotion to build jaygriff.com")
- Learning notes: Embed thoughts on each tool—why I chose it, what problems it solves, gotchas discovered
Conclusion
This is about showing technical decision-making. Not a static skill list—it tells stories about why I switched tools, what I'm exploring, and how my stack evolved.
Filter by AI dev to see the AI-native workflow. Click Superseded for migration stories. Hit Homelab to see aspirational infrastructure interests. Each view is its own narrative about how I think about tech.