6.3 KiB
Contributing to Frigate
Thank you for your interest in contributing to Frigate. This document covers the expectations and guidelines for contributions. Please read it before submitting a pull request.
Before you start
Bugfixes
If you've found a bug and want to fix it, go for it. Link to the relevant issue in your PR if one exists, or describe the bug in the PR description.
New features
A pull request is more than just code — it's a request for the maintainers to review, integrate, and support the change long-term. We're selective about what we take on, and prioritize changes that align with the project's direction and can be responsibly maintained in the long term.
Large or highly-requested features raise the bar even higher. Popularity signals demand, but it doesn't pre-approve any particular implementation. The bigger the change, the higher the long-term cost, and the more important it is that we're aligned on scope and approach before any code is written. A large PR that lands without prior discussion is unlikely to be merged as-is, no matter how well it's implemented.
Before writing code for a new feature:
- Check for existing discussion. Search feature requests and discussions to see if it's been proposed or discussed. Feature requests tagged with "planned" are on our radar — we plan to get to them, but we don't maintain a public roadmap or timeline. Check in with us first if you have interest in contributing to one.
- Start a discussion or feature request first. This helps ensure your idea aligns with Frigate's direction before you invest time building it. Community interest in a feature request helps us gauge demand, though a great idea is a great idea even without a crowd behind it.
Pull request guidelines
Before submitting
- Search for existing PRs to avoid duplicating effort.
- Test your changes locally. Your PR cannot be merged unless tests pass.
- Format your code. Run
ruff format frigatefor Python andnpm run prettier:writefrom theweb/directory for frontend changes. - Run the linter. Run
ruff check frigatefor Python andnpm run lintfromweb/for frontend. - One concern per PR. Don't combine unrelated changes. A bugfix and a new feature should be separate PRs.
What we look for in review
- Does it work? Tested locally, tests pass, no regressions.
- Is it maintainable? Clear code, appropriate complexity, good separation of concerns.
- Does it fit? Consistent with Frigate's architecture and design philosophy.
- Is it scoped well? Solves the stated problem without unnecessary additions.
After submitting
- Be responsive to review feedback. We may ask for changes.
- Expect honest, direct feedback. We try to be respectful but we also try to be efficient.
- If your PR goes stale, rebase it on the latest
devbranch.
Coding standards
Python (backend)
- Python — use modern language features (type hints, pattern matching, f-strings, dataclasses)
- Formatting: Ruff (configured in
pyproject.toml) - Linting: Ruff
- Testing:
python3 -u -m unittest - Logging: Use module-level
logger = logging.getLogger(__name__)with lazy formatting - Async: All external I/O must be async. No blocking calls in async functions.
- Error handling: Use specific exception types. Keep try blocks minimal.
- Language: American English for all code, comments, and documentation
TypeScript/React (frontend)
- Linting: ESLint (
npm run lintfromweb/) - Formatting: Prettier (
npm run prettier:writefromweb/) - Type safety: TypeScript strict mode. Avoid
any. - i18n: All user-facing strings must use
react-i18next. Never hardcode display text in components. Add English strings to the appropriate files inweb/public/locales/en/. - Components: Use Radix UI/shadcn primitives and TailwindCSS with the
cn()utility.
Development commands
# Python
python3 -u -m unittest # Run all tests
python3 -u -m unittest frigate.test.test_ffmpeg_presets # Run specific test
ruff format frigate # Format
ruff check frigate # Lint
# Frontend (from web/ directory)
npm run build # Build
npm run lint # Lint
npm run lint:fix # Lint + fix
npm run prettier:write # Format
Project structure
frigate/ # Python backend
api/ # FastAPI route handlers
config/ # Configuration parsing and validation
detectors/ # Object detection backends
events/ # Event management and storage
test/ # Backend tests
util/ # Shared utilities
web/ # React/TypeScript frontend
src/
api/ # API client functions
components/ # Reusable components
hooks/ # Custom React hooks
pages/ # Route components
types/ # TypeScript type definitions
views/ # Complex view components
docker/ # Docker build files
docs/ # Documentation site
migrations/ # Database migrations
Translations
Frigate uses Weblate for managing language translations. If you'd like to help translate Frigate into your language:
- Visit the Frigate project on Weblate.
- Create an account or log in.
- Browse the available languages and select the one you'd like to contribute to, or request a new language.
- Translate strings directly in the Weblate interface — no code changes or pull requests needed.
Translation contributions through Weblate are automatically synced to the repository. Please do not submit pull requests for translation changes — use Weblate instead so that translations are properly tracked and coordinated.