Overview
Who To Bother follows a clear, domain-driven structure organized by feature and functionality. The codebase uses TypeScript throughout with strict type checking enabled.Root Directory
Source Directory (src/)
Complete Structure
Key Directories
/src/app - Routes & Pages
TanStack Start uses file-based routing where each file in app/ becomes a route.
Root layout component wrapping all pages.Contains:
- Global providers (theme, auth)
- Common layout elements (header, footer)
- Error boundaries
Home page (
/) - Landing page with company directoryIndividual company page (
/:company)- URL parameter:
company(company ID) - Displays company details and contacts
- Dynamic OG images
Server-side API endpointsAuthentication (
api/auth/):- Better Auth integration for GitHub OAuth
api/github/):fork.ts- Fork repository for contributionscompanies.ts- Fetch company data from GitHubcreate-pr.ts- Create pull requests
Contribution workflow pages
index.tsx- Contribution optionsadd.tsx- Add new company formedit.tsx- Select company to editedit.$company.tsx- Edit specific company
/src/components - UI Components
Low-level, reusable UI components built with Radix UI primitives.All components:
- Use Tailwind CSS for styling
- Support dark mode
- Include accessibility features
- Export component types for TypeScript
Domain-specific components for the contribution workflow:
- company-form.tsx: TanStack Form implementation for editing company data
- pr-status.tsx: Shows PR creation status and GitHub link
- svg-uploader.tsx: Logo upload and preview component
- company-logos.tsx: Company logo grid display
- contacts-list.tsx: Searchable contact list with categories
- header.tsx: Site navigation and search
- footer.tsx: Footer with links
- theme-provider.tsx: Dark mode context provider
- theme-toggle.tsx: Light/dark mode switcher
/src/data/companies - Company Data
Source of truth for data validation.Exports:
CompanySchema- Valibot validation schemaCompany- Inferred TypeScript typeCategory- Category typeContact- Contact type
Auto-generated JSON Schema for IDE autocomplete.Generated by:
pnpm generate-schemaReferenced in company JSON files:Individual company data files.Naming convention:
{company-id}.jsonExample: vercel.json, appwrite.json, cloudflare.json/src/lib - Utility Libraries
Better Auth configuration and setup.Handles:
- GitHub OAuth provider
- Session management
- User data
GitHub API integration for contribution workflow.Functions:
- Fork repository
- Create/update files
- Create pull requests
- Fetch company data
Fuse.js fuzzy search configuration.Searches across:
- Company names
- Descriptions
- Product names
- Contact handles
SEO utilities for meta tags and Open Graph images.
- Dynamic page titles
- OG image generation
- Meta descriptions
Theme management utilities.
- Dark/light mode toggle
- System preference detection
- Local storage persistence
Shared utility functions.Common utilities:
cn()- Merge Tailwind classes withclsxandtailwind-merge- String manipulation
- Array helpers
/src/scripts - Build Scripts
Generates favicon assets for all platforms.Run:
pnpm generate-faviconsCreates:- favicon.ico
- apple-touch-icon.png
- Various sizes for PWA
Generates sitemap.xml for SEO.Run:
pnpm generate-sitemapIncludes:- Home page
- All company pages
- Static pages (search, stats, sponsors)
Validates all company JSON files against Valibot schema.Run:
pnpm validateChecks:- Schema compliance
- Required fields
- Format validation (URLs, emails, handles)
prebuild script.Converts Valibot schema to JSON Schema.Run:
pnpm generate-schemaOutput: src/data/companies/schema.jsonEnables IDE autocomplete for company JSON files.Configuration Files
TypeScript Configuration
Vite Configuration
Cloudflare Configuration
Import Aliases
The project uses TypeScript path aliases for cleaner imports:tsconfig.json → paths → "@/*": ["./src/*"]
File Naming Conventions
company-logos.tsx, contacts-list.tsx- Static:
search.tsx,stats.tsx - Dynamic:
$company.tsx,edit.$company.tsx
use-theme.ts, auth-client.tsvercel.json, better-auth.json, cloud-flare.jsonBuild Output
Related
- Data Schema - Schema documentation
- Tech Stack - Technologies used
- Contributing Guide - How to contribute