Thanks for your interest in contributing! This is an open-source project and we welcome pull requests.
git clone https://github.com/kevinkiklee/phototools.io.git
cd phototools.io
npm install
npm run devDev server runs at http://localhost:3200.
- Fork the repo and create a branch from
main - Make your changes
- Run tests:
npm test - Run lint:
npm run lint - Run build to verify:
npm run build - Open a pull request
app/ Routes (homepage, tool pages, learn/glossary)
components/
layout/ Nav (mega-menu), Footer, ThemeProvider, ThemeToggle
shared/ LearnPanel, InfoTooltip, ShareModal, ToolActions, FileDropZone, DraftBanner
tools/ One directory per tool + shared/
lib/
math/ Pure calculation modules with co-located tests
data/ Tool registry, education content, sensors, focal lengths, scenes, glossary
data/education/ Per-tool educational content, challenge definitions
utils/ Export helpers
types.ts Shared TypeScript types
public/ Static assets (images, icons, manifest)
- Math module (if the tool needs calculations): create
lib/math/yourtool.tswith pure functions andlib/math/yourtool.test.tswith tests. - Component: create
components/tools/your-tool/YourTool.tsx(add'use client'at the top if it uses state, effects, or event handlers) andYourTool.module.cssfor styles. - Route: create
app/your-tool/page.tsxwith a co-located_components/directory for tool-specific UI. - Registry: add an entry to the
TOOLSarray inlib/data/tools.ts:Set{ slug: 'your-tool', name: 'Your Tool', description: '...', status: 'draft', category: 'calculator' }
status: 'live'when the tool is ready for production. In development, all tools are visible regardless of status. - Education content: add a
ToolEducationentry inlib/data/education/with beginner/deeper explanations, tips, tooltips, and challenges. IncludeLearnPanelin the tool's layout. - Verify: run
npm test && npm run build.
Add the term to the GLOSSARY array in lib/data/glossary.ts. Terms are sorted alphabetically in the UI. Each entry needs a term, definition, and optionally a category.
- CSS Modules for component styles (
Component.module.css), not global CSS - Design tokens via CSS custom properties for colors, spacing, typography
'use client'directive on interactive components; everything else is a server component by default- Named exports for all components
- No external UI libraries — custom CSS only
- Pure math: calculation logic in
lib/math/with no React dependencies - TDD: write tests for math modules before or alongside implementation
- No emojis in code
Open an issue at https://github.com/kevinkiklee/phototools.io/issues with:
- What you expected to happen
- What actually happened
- Browser and device info
- Screenshot if relevant