Thanks for your interest in contributing! This guide will help you get started.
Follow the Quick Start to get both services running locally. You only need Supabase for most development work.
core-api/— Python/FastAPI backend. See core-api/README.md for architecture details.core-web/— React/Vite frontend. See core-web/README.md for frontend details.
cd core-api
# Run tests
make test
# Type checking
make typecheck
# Lint
make lint
# Format
make format
# Run all checks
make checkPattern: Routes go in api/routers/, business logic in api/services/, shared clients in lib/.
cd core-web
# Dev server with hot reload
npm run dev
# Lint
npm run lint
# Type check
npx tsc -b
# Build
npm run buildPattern: Feature components in src/components/, state in src/stores/ (Zustand), API calls through src/api/client.ts.
- Fork the repo and create a branch from
main - Make your changes
- Ensure tests pass (
make checkin core-api,npm run lintin core-web) - Write a clear PR description explaining what changed and why
- Keep PRs focused — one feature or fix per PR
Use clear, descriptive commit messages:
Add project board filtering by label
Fix calendar event timezone offset for UTC+N zones
Update email sync to handle Gmail batch API rate limits
If your change requires schema modifications:
cd core-api
supabase migration new my_migration_nameWrite idempotent SQL — use IF NOT EXISTS, DROP ... IF EXISTS before CREATE. See core-api/supabase/README.md for patterns.
If you add a new environment variable:
- Add it to
core-api/api/config.py(with a sensible default or empty string) - Add it to the appropriate
.env.examplewith a comment - Document which tier it belongs to (required / optional / feature-specific)
- Python: Follow existing patterns. Pydantic models for validation. Async where the service layer is async.
- TypeScript: Follow existing patterns. Zustand for state.
api<T>()client for API calls. - No unnecessary abstractions. Three similar lines > premature helper function.
Open an issue on GitHub with:
- What you expected to happen
- What actually happened
- Steps to reproduce
- Your environment (OS, Node/Python version, browser)
By contributing, you agree that your contributions will be licensed under the Apache License 2.0.