Directory Overview
GitHub Wrapped follows Next.js 16 App Router conventions with a clean separation between pages, components, and business logic.App Directory (/app)
The app/ directory contains all routes using Next.js App Router.
API Routes (/app/api)
Serverless API endpoints for backend functionality:
/api/auth/[...all]/route.ts
/api/auth/[...all]/route.ts
Purpose: better-auth catch-all authentication routeHandles all authentication flows:
- GitHub OAuth login/logout
- Session management
- Token refresh
/api/wrapped/route.ts
/api/wrapped/route.ts
Purpose: Generate repository wrapped dataRequest:Response: Complete
WrappedData objectFlow:- Check cache
- Validate repository
- Fetch GitHub data
- Run analytics
- Cache and return
/api/wrapped/user/route.ts
/api/wrapped/user/route.ts
Purpose: Generate user-level wrapped (“My Year in Code”)Request:Response:
UserWrappedData with personal stats/api/validate/route.ts
/api/validate/route.ts
Purpose: Quick repository validationChecks if a repository exists and is public before generating wrapped.
/api/summary/route.ts
/api/summary/route.ts
Purpose: Quick repository summary for previewsReturns basic info without full analytics.
/api/og/route.tsx
/api/og/route.tsx
Purpose: Dynamic Open Graph image generationGenerates custom social sharing images with Vercel OG.
/api/performance/route.ts
/api/performance/route.ts
Purpose: Performance metrics and monitoringInternal endpoint for tracking API performance.
/api/user/repos/route.ts
/api/user/repos/route.ts
Purpose: Get authenticated user’s repositoriesReturns list of user’s repos for quick selection.
Page Routes (/app)
page.tsx
Homepage / Landing PageContains:
- Hero section
- Repository input form
- Year selector
- Feature highlights
/layout.tsx
Root LayoutProvides:
- HTML structure
- Theme provider
- Auth provider
- Global metadata
- Font loading
wrapped/[owner]/[repo]/[year]/page.tsx
Repository Wrapped PageDynamic route for wrapped stories.Example:
/wrapped/facebook/react/2024Fetches data and renders WrappedStorywrapped/user/[username]/[year]/page.tsx
User Wrapped PagePersonal year-in-code wrapped.Example:
/wrapped/user/octocat/2024Renders UserWrappedStoryComponents (/components)
Feature Components
RepositoryInput.tsx
Main input component for repository search.Features:
- URL/slug parsing (
owner/repoor full GitHub URL) - Real-time validation
- Autocomplete suggestions
- Error handling
- Loading states
WrappedStory.tsx
Main container for wrapped presentation.Features:
- Slide navigation (keyboard + buttons)
- Progress indicator
- Share functionality
- Slide transitions
components/WrappedStory.tsx:7885WrappedSlide.tsx
Individual slide components (8-12 slides).Slides:
- Intro slide with repo info
- Commit statistics
- Top contributors
- Language breakdown
- Community growth
- Monthly trends
- Special achievements
- Share slide
components/WrappedSlide.tsx:47979UI Components (/components/ui)
Reusable, styled Radix UI primitives:
Layout Components
hero.tsx- Landing page hero sectiontheme-provider.tsx- Dark/light mode providertheme-toggle.tsx- Theme switcher component
Library Code (/lib)
Business logic and service layer:
github.ts
GitHub API Service
GitHubService class with methods:- Repository operations
- Commit fetching
- Contributor queries
- Rate limit management
analytics.ts
Analytics Engine
AnalyticsEngine class:- Data transformation
- Statistics calculation
- Insight generation
- Trend analysis
cache.ts
Caching LayerFunctions:
getCachedWrapped()setCachedWrapped()getCachedValidation()- Dual Redis/in-memory support
auth.ts
Authentication Configbetter-auth configuration:
- GitHub OAuth setup
- Session management
- Database adapter
authClient.ts
Auth ClientClient-side auth hooks and utilities.
redis.ts
Redis ClientUpstash Redis initialization:
- Connection setup
- Environment checks
- Type-safe client
utils.ts
Utility FunctionsHelper functions:
cn()- className merger- Date formatters
- String utilities
Types (/types)
Centralized TypeScript type definitions:
Configuration Files
next.config.ts
next.config.ts
Next.js configuration:
- TypeScript support
- Image optimization settings
- API route configuration
- Build output settings
tailwind.config.ts (implicit with Tailwind 4)
tailwind.config.ts (implicit with Tailwind 4)
Tailwind CSS configuration:
- Custom colors and themes
- Dark mode settings
- Plugin configuration (animate)
- Custom utilities
tsconfig.json
tsconfig.json
TypeScript compiler options:
- Path aliases (
@/→ root) - Strict type checking
- JSX configuration
- Module resolution
eslint.config.mjs
eslint.config.mjs
ESLint configuration:
- Next.js recommended rules
- TypeScript rules
- Code style enforcement
components.json
components.json
shadcn/ui configuration:
- Component path
- Utility path
- Tailwind config
- TypeScript settings
File Naming Conventions
Components
PascalCase.tsxExamples:
RepositoryInput.tsxWrappedStory.tsxUserProfile.tsx
Utilities & Services
camelCase.tsExamples:
github.tsanalytics.tscache.tsutils.ts
Routes
lowercase with foldersExamples:
app/page.tsxapp/api/wrapped/route.tsapp/wrapped/[owner]/[repo]/[year]/page.tsx
Configuration
Various conventionsExamples:
next.config.tstailwind.config.tstsconfig.json.env.local
Import Aliases
The project uses path aliases for cleaner imports:Key Files Reference
| File | Purpose | Lines |
|---|---|---|
lib/github.ts | GitHub API integration | 537 |
lib/analytics.ts | Analytics processing | 823 |
components/WrappedSlide.tsx | Slide components | ~48k |
components/WrappedStory.tsx | Story container | ~8k |
components/RepositoryInput.tsx | Input form | ~12k |
lib/cache.ts | Caching layer | 178 |
types/index.ts | Type definitions | 131 |
Line counts are approximate and based on the current codebase. They may change as the project evolves.
Static Assets (/public)
Static files served at the root:
- Favicon and app icons
- Open Graph images
- Robots.txt
- Manifest files
/filename.ext (e.g., /favicon.ico)