Thank you for your interest in contributing to Radarr! This is an actively maintained fork of the original Radarr/Radarr project.
- Check GitHub Issues for existing issues and planned work
- For bug reports or feature requests, please open a GitHub issue first
- For large changes, please discuss your approach in an issue before starting work
We use a Gitflow-style workflow:
master- Production-ready code (protected)develop- Integration branch for featuresfeature/*- New featuresfix/*- Bug fixeshotfix/*- Urgent production fixes
- Fork the repository and create your branch from
develop - Make meaningful commits, or squash them
- Ensure all tests pass
- Submit a PR to
develop(nevermaster, unless it is a hotfix)
- No emojis in code, commits, comments, or documentation
- Follow existing code patterns and formatting
- Backend: StyleCop analyzers enforced, 4-space indentation,
varpreferred,_camelCasefor private fields - Frontend: ESLint + Prettier (2-space indentation), StyleLint for CSS
Run linting before submitting frontend changes:
yarn lint --fix
yarn stylelint-linux # macOS/LinuxRadarr is a monorepo containing:
- C#/.NET 8.0 Backend (API, domain logic, data layer)
- React/TypeScript Frontend (SPA with Redux and SignalR)
The codebase uses the legacy NzbDrone namespace from its predecessor project. Project directories use NzbDrone.* but .csproj files are named Radarr.*.
- .NET SDK 8.0 (see
global.jsonfor exact version) - Node.js 20.x (Volta-managed)
- Yarn 1.22.x (included with Node 20+ via
corepack enable) - Git
- Visual Studio 2022+, Rider, or VS Code
Node 20.x is required. The application will not run on older versions (18.x, 16.x) or on 21.x due to dependency issues.
- Fork the repository
- Clone your fork
- Build and run (see below)
yarn install --frozen-lockfile
yarn start # Dev watch mode
yarn build # Production build- Open
src/Radarr.sln - Set startup project to
Radarr.Console, framework tonet8.0 - Build the solution
- Run/Debug
- Open http://localhost:7878
# Clean
dotnet clean src/Radarr.sln -c Debug
# Restore and build
dotnet msbuild -restore src/Radarr.sln -p:Configuration=Debug -p:Platform=Posix -t:PublishAllRids
# Run from output
./_output/RadarrRadarr uses NUnit for its test suite. Test assemblies are output to _tests/.
# Unit tests
./test.sh Linux Unit Test
./test.sh Mac Unit Test
# Integration tests
./test.sh Linux Integration Test
# With coverage
./test.sh Linux Unit Coverage
# Specific test project
dotnet test src/NzbDrone.Core.Test/Radarr.Core.Test.csproj
# Specific test by name
dotnet test src/NzbDrone.Core.Test/Radarr.Core.Test.csproj --filter "FullyQualifiedName~TestClassName"We encourage writing unit tests for any backend code changes. We currently require 80% coverage on new code when submitting a PR.
- If you're adding a feature already listed in Issues, comment on it so work is not duplicated
- Rebase from
develop, do not merge - One feature/bug fix per pull request
- Add tests (unit/integration)
- Commit with unix line endings
- Use 4 spaces instead of tabs (backend), 2 spaces (frontend)
- Commits should use
New:orFixed:prefixes for non-maintenance changes - Feel free to open a draft PR before work is complete so we can provide early feedback
Radarr uses a self-hosted Weblate instance for translations. Translation files are stored at src/NzbDrone.Core/Localization.
The English translation (en.json) is the source for all other translations and is managed in the GitHub repo.
private readonly ILocalizationService _localizationService;
public IndexerCheck(ILocalizationService localizationService)
{
_localizationService = localizationService;
}
var translated = _localizationService.GetLocalizedString("IndexerHealthCheckNoIndexers");import translate from 'Utilities/String/translate';
<div>
{translate('UnableToAddANewIndexerPleaseTryAgain')}
</div>PRs for translation of log messages will not be accepted.