Overview
Adding a new company to Who To Bother involves creating a JSON file with contact information, adding the company logo, and validating the data. This guide walks you through each step.Quick Start
Create the JSON file
Create a new file in
src/data/companies/ with your company’s name (lowercase, hyphenated):Company JSON Structure
Each company is represented by a JSON file following this structure:src/data/companies/yourcompany.json
The
$schema property enables IDE autocomplete and validation hints. Always include it at the top of your JSON file.Field Descriptions
Required Fields
Unique identifier for the company (lowercase, alphanumeric with hyphens only)
- Must match the filename (without
.json) - Used to generate the route:
/yourcompany - Example:
"vercel","tanstack","google-ai-studio"
The display name of the company
- This is what users will see in the UI
- Can include spaces and proper capitalization
- Example:
"Vercel","TanStack","Google AI Studio"
Brief description of what the company does
- Keep it concise (1-2 sentences)
- Helps users understand what the company offers
- Example:
"Frontend cloud platform for deploying web applications"
Key used to lookup the logo in
company-logos.tsx- Must match a key in the
companyLogosobject - Usually the same as the
idfield - Example:
"vercel","tanstack"
Array of category objects grouping related contacts
- At least one category is required
- Each category groups contacts by product, team, or area
- Example categories:
"Frameworks & OSS","Vercel products","v0 & AI"
Category Structure
The name of the category
- Groups related contacts together
- Examples:
"Engineering","Support","Community"
Array of contact objects
- At least one contact is required per category
- Each contact represents a person or team
Contact Structure
The product, role, or area this contact is responsible for
- Examples:
"Next.js","Customer Support","Community Manager"
Array of Twitter/X handles
- Must start with
@ - Can only contain letters, numbers, and underscores
- At least one handle is required
- Example:
["@timneutkens"],["@shadcn", "@rauchg"]
Email address for contact (optional)
- Must be a valid email format
- Only include publicly available emails
- Example:
"[email protected]"
Discord invite URL (optional)
- Must be a valid URL
- Example:
"https://discord.gg/yourserver"
Optional Company Fields
URL to external logo image (optional)
- Alternative to using
logoType - Must be a valid URL
Company website URL (optional)
- Must be a valid URL
- Example:
"https://vercel.com"
Documentation URL (optional)
- Must be a valid URL
- Example:
"https://nextjs.org/docs"
GitHub organization or repository URL (optional)
- Must be a valid URL
- Example:
"https://github.com/vercel"
Discord server invite URL (optional)
- Must be a valid URL
- Example:
"https://discord.gg/vercel"
Real Example
Here’s a real example from the Vercel company file:src/data/companies/vercel.json
Best Practices
Handles and Emails
- Handles: Only include people who are comfortable being contacted
- Email addresses: Only include publicly available emails (from websites, public profiles, etc.)
- Verify accuracy: Double-check that handles are correct and active
Descriptions
- Keep descriptions concise and informative
- Focus on what the company does, not marketing speak
- Examples:
- Good:
"Frontend cloud platform for deploying web applications" - Bad:
"The world's best and most innovative cloud platform that revolutionizes..."
- Good:
Categories
- Use clear, descriptive category names
- Group related contacts together
- Common categories:
- By product:
"Next.js","v0 & AI" - By team:
"Engineering","Support" - By area:
"Community","OSS Projects"
- By product:
Validation
Before submitting your changes, validate your JSON file:All required fields are present
Twitter/X handles follow the correct format (
@username)Email addresses are valid (if provided)
URLs are valid (if provided)
Company ID uses only lowercase letters, numbers, and hyphens
At least one category and contact per company
Common Validation Errors
Invalid handle format
Invalid handle format
Error:
Handle must start with @ and contain only letters, numbers, and underscoresSolution: Make sure all handles start with @ and don’t contain spaces or special characters:Missing required fields
Missing required fields
Error:
Company ID is required or similarSolution: Make sure all required fields are present:idnamedescriptionlogoTypecategories(with at least one category)- Each category must have
nameandcontacts - Each contact must have
productandhandles
Invalid email format
Invalid email format
Error:
Must be a valid email addressSolution: Check that email addresses are properly formatted:Invalid company ID
Invalid company ID
Error:
Company ID must be lowercase with only letters, numbers, and hyphensSolution: Use lowercase letters, numbers, and hyphens only:Testing Locally
After creating your company file, test it locally:http://localhost:3000/yourcompany to see your company page.
The company ID (filename without
.json) becomes the route path automatically.Next Steps
Once you’ve created your company JSON file:- Add your company logo to
company-logos.tsx - Validate your changes with
pnpm validate - Test locally with
pnpm dev - Submit a Pull Request
Add Logos
Learn how to add your company logo
Schema Validation
Deep dive into schema validation