From 5e2cd60895b2ef2df6f65d8f3617cc0d6773e155 Mon Sep 17 00:00:00 2001 From: Kevin Riehl Date: Mon, 4 May 2026 15:37:29 -0700 Subject: [PATCH] feat: add MovieLoop and TehRiehlBudget projects with new Games branch Add a Games parent node branching off the top of the Projects node, with MovieLoop (daily movie-chain web game built with React/NestJS) as its first child. Add TehRiehlBudget (self-hosted personal finance app) as a fourth child under Personal Tools, and stagger the Personal Tools children coordinates so they no longer stack on a perfect vertical line. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lib/data.ts | 57 +++++++++++++++++++++++++++++++++++++----- static/icons/games.svg | 7 ++++++ 2 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 static/icons/games.svg diff --git a/src/lib/data.ts b/src/lib/data.ts index d2f8f43..b4e38cb 100644 --- a/src/lib/data.ts +++ b/src/lib/data.ts @@ -256,6 +256,19 @@ export const treeNodes: TreeNode[] = [ icon: '/icons/tools.svg', }, + // Games + { + id: 'proj-games', + label: 'Games', + description: 'Interactive games and playful experiments.', + x: -200, + y: -310, + parentId: 'proj-branch', + category: 'projects', + size: 'medium', + icon: '/icons/games.svg', + }, + // ========== OPEN SOURCE CHILDREN ========== { id: 'proj-tvdbapi', @@ -307,8 +320,8 @@ export const treeNodes: TreeNode[] = [ id: 'proj-renameshow', label: 'Rename Show', description: 'Desktop application for batch renaming TV show files using metadata from TVDB and TMDB. Features undo support, multi-episode detection, and automatic show searching.', - x: -450, - y: -130, + x: -475, + y: -135, parentId: 'proj-tools', category: 'projects', size: 'small', @@ -320,8 +333,8 @@ export const treeNodes: TreeNode[] = [ id: 'proj-portfolio', label: 'Skill Tree Portfolio', description: 'This interactive portfolio you\'re exploring right now! A Path of Exile inspired skill tree built with modern web technologies.', - x: -450, - y: -50, + x: -480, + y: -60, parentId: 'proj-tools', category: 'projects', size: 'small', @@ -334,8 +347,8 @@ export const treeNodes: TreeNode[] = [ id: 'proj-character-builder', label: 'Pathfinder 2E Character Builder', description: 'Web-based character creation tool for Pathfinder 2E tabletop RPG. Features modern component-based architecture with comprehensive testing and code quality tooling.', - x: -450, - y: 10, + x: -490, + y: 15, parentId: 'proj-tools', category: 'projects', size: 'small', @@ -344,6 +357,38 @@ export const treeNodes: TreeNode[] = [ repoUrl: 'https://github.com/TehRiehlDeal/teh-riehl-character-builder', status: 'active' }, + { + id: 'proj-budget', + label: 'TehRiehlBudget', + description: 'Self-hosted personal finance app tracking spending, balances, and net worth across checking, savings, credit, loans, and investments. Features field-level AES-256-GCM encryption, receipt uploads, audit logging, CSV export, and a local Ollama-powered AI advisor.', + x: -440, + y: 75, + parentId: 'proj-tools', + category: 'projects', + size: 'small', + icon: '/icons/react.svg', + techStack: ['React', 'TypeScript', 'NestJS', 'Prisma', 'PostgreSQL', 'TailwindCSS', 'ShadCN', 'Zustand', 'Supabase', 'Ollama'], + projectUrl: 'https://budget.tehriehldeal.com/', + repoUrl: 'https://git.tehriehldeal.com/TehRiehlDeal/TehRiehlBudget', + status: 'active' + }, + + // ========== GAMES CHILDREN ========== + { + id: 'proj-movieloop', + label: 'MovieLoop', + description: 'Daily challenge game where players chain movies through shared actors — a "six degrees of Kevin Bacon" reimagined for the web. Features leaderboards, daily and freeplay modes, undo support, and PWA install with push notifications.', + x: -260, + y: -390, + parentId: 'proj-games', + category: 'projects', + size: 'small', + icon: '/icons/react.svg', + techStack: ['React', 'TypeScript', 'Vite', 'NestJS', 'Prisma', 'PWA', 'Web Push', 'Docker'], + projectUrl: 'https://movieloop.tehriehldeal.com/', + repoUrl: 'https://git.tehriehldeal.com/TehRiehlDeal/movieloop-frontend', + status: 'active' + }, // ========== SKILLS (Bottom Right Quadrant) ========== { diff --git a/static/icons/games.svg b/static/icons/games.svg new file mode 100644 index 0000000..9cf77b2 --- /dev/null +++ b/static/icons/games.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file