
Git City 3d Github Visualization
Extend or customize Git City—the 3D pixel-art GitHub profile city—using Next.js, React Three Fiber, and Supabase.
Overview
git-city-3d-github-visualization is an agent skill for the Build phase that guides extending Git City’s 3D GitHub profile city built with Next.js, React Three Fiber, and Supabase.
Install
npx skills add https://github.com/aradotso/trending-skills --skill git-city-3d-github-visualizationWhat is this skill?
- GitHub profiles mapped to buildings: height from contributions, width from repos, window brightness from stars
- Stack: Next.js 16 App Router, React Three Fiber, Supabase backend
- Local dev on port 3001 after npm install and .env.local from .env.example
- Triggers cover achievements, building decorations, renderer changes, and new GitHub visualization features
- Documented env vars for Supabase URL or anon key, service role, and GitHub personal access token
- local dev default http://localhost:3001
Adoption & trust: 1.2k installs on skills.sh; 31 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You want to add features to Git City’s 3D GitHub visualization but need structured setup, env vars, and domain context so the agent does not break the renderer or auth.
Who is it for?
Solo devs customizing or productizing the open Git City repo who already use Next.js and are comfortable with 3D client stacks.
Skip if: Builders who only need a one-off GitHub stats badge with no 3D app, or teams not willing to manage Supabase and GitHub tokens.
When should I use this skill?
User asks to work on Git City, add features, modify the 3D building renderer, achievements, decorations, or extend the GitHub visualization.
What do I get? / Deliverables
You run Git City locally with correct Supabase and GitHub configuration and ship targeted changes to buildings, achievements, or visualization behavior in the existing app structure.
- Feature changes in Git City codebase
- Running local dev instance for verification
Recommended Skills
Journey fit
Git City is an application feature surface: 3D rendering, API hooks, and game-like UX are built in the product codebase. Frontend subphase is primary because buildings, decorations, and the Three.js scene are user-facing visualization and interaction work.
How it compares
Project-specific extension skill—not a generic GitHub chart generator or standalone MCP integration.
Common Questions / FAQ
Who is git-city-3d-github-visualization for?
Indie builders and contributors working inside the Git City repository who need agent guidance for 3D buildings, Supabase data, and GitHub API usage.
When should I use git-city-3d-github-visualization?
During Build frontend work when you are adding Git City features—achievements, decorations, renderer tweaks—or setting up the project locally from the documented clone flow.
Is git-city-3d-github-visualization safe to install?
Review the Security Audits panel on this Prism page; the skill requires GitHub and Supabase secrets in .env.local and should never commit tokens to git.
SKILL.md
READMESKILL.md - Git City 3d Github Visualization
# Git City — 3D GitHub Profile Visualization > Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection. Git City transforms GitHub profiles into a 3D pixel art city. Each user becomes a unique building: height from contributions, width from repos, window brightness from stars. Built with Next.js 16 (App Router), React Three Fiber, and Supabase. ## Quick Setup ```bash git clone https://github.com/srizzon/git-city.git cd git-city npm install # Copy env template cp .env.example .env.local # Linux/macOS copy .env.example .env.local # Windows CMD Copy-Item .env.example .env.local # PowerShell npm run dev # → http://localhost:3001 ``` ## Environment Variables Fill in `.env.local` after copying: ```bash # Supabase — Project Settings → API NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key SUPABASE_SERVICE_ROLE_KEY=your-service-role-key # GitHub — Settings → Developer settings → Personal access tokens GITHUB_TOKEN=github_pat_your_token_here # Optional: comma-separated GitHub logins for /admin/ads access ADMIN_GITHUB_LOGINS=your_github_login ``` **Finding Supabase values:** Dashboard → Project Settings → API **Finding GitHub token:** github.com → Settings → Developer settings → Personal access tokens (fine-grained recommended) ## Project Structure ``` git-city/ ├── app/ # Next.js App Router pages │ ├── page.tsx # Main city view │ ├── [username]/ # User profile pages │ ├── compare/ # Side-by-side compare mode │ └── admin/ # Admin panel ├── components/ │ ├── city/ # 3D city scene components │ │ ├── Building.tsx # Individual building mesh │ │ ├── CityScene.tsx # Main R3F canvas/scene │ │ └── LODManager.tsx # Level-of-detail system │ ├── ui/ # 2D overlay UI components │ └── profile/ # Profile page components ├── lib/ │ ├── github.ts # GitHub API helpers │ ├── supabase/ # Supabase client + server utils │ ├── buildings.ts # Building metric calculations │ └── achievements.ts # Achievement logic ├── hooks/ # Custom React hooks ├── types/ # TypeScript type definitions └── public/ # Static assets ``` ## Core Concepts ### Building Metrics Mapping Buildings are generated from GitHub profile data: ```typescript // lib/buildings.ts pattern interface BuildingMetrics { height: number; // Based on total contributions width: number; // Based on public repo count windowBrightness: number; // Based on total stars received windowPattern: number[]; // Based on recent activity pattern } function calculateBuildingMetrics(profile: GitHubProfile): BuildingMetrics { const height = Math.log10(profile.totalContributions + 1) * 10; const width = Math.min(Math.ceil(profile.publicRepos / 10), 8); const windowBrightness = Math.min(profile.totalStars / 1000, 1); return { height, width, windowBrightness, windowPattern: [] }; } ``` ### 3D Building Component (React Three Fiber) ```tsx // components/city/Building.tsx pattern import { useRef } from 'react'; import { useFrame } from '@react-three/fiber'; import * as THREE from 'three'; interface BuildingProps { position: [number, number, number]; metrics: BuildingMetrics; username: string; isSelected?: boolean; onClick?: () => void; } export function Building({ position, metrics, username, isSelec