We're always looking for people to help make Prowlarr even better, there are a number of ways to contribute.
Setup guides, FAQ, the more information we have on the wiki the better.
Prowlarr is written in C# (backend) and JS (frontend). The backend is built on the .NET6 framework, while the frontend utilizes Reactjs.
VS 2022 V17.0 or higher is recommended as it includes the .NET6 SDK
Prowlarr will NOT run on older versions such as
10.x
,8.x
,6.x
, or any version below 12.0!
corepack enable
npm i -g corepack
Be sure to run lint
yarn lint --fix
on your code for any front end changes before committing.
For css changesyarn stylelint-windows --fix
Navigate to the cloned directory
Install the required Node Packages
yarn install
Start webpack to monitor your development environment for any changes that need post processing using:
yarn start
The backend solution is most easily built and ran in Visual Studio or Rider, however if the only priority is working on the frontend UI it can be built easily from command line as well when the correct SDK is installed.
Ensure startup project is set to
Prowlarr.Console
and framework tonet6.0
Build
the solution in Visual Studio, this will ensure all projects are correctly built and dependencies restoredDebug/Run
the project in Visual Studio to start Prowlarrdotnet clean src/Prowlarr.sln -c Debug
dotnet msbuild -restore src/Prowlarr.sln -p:Configuration=Debug -p:Platform=Posix -t:PublishAllRids
/_output
develop
branchNew: (Indexer) {Indexer Name}
, New: (Indexer) {Usenet|Torrent} {Indexer Name}
, New: (Indexer) {Torznab|Newznab} {Indexer Name}
Fixed: (Indexer) {Indexer Name} {changes}
e.g. Fixed: (Indexer) Changed BHD to use API
master
branchdevelop
, never master
, if you make a PR to master
we will comment on it and close itnew-feature
(Good)fix-bug
(Good)patch
(Bad)develop
(Bad)New:
or Fixed:
for changes that would not be considered a maintenance release
Prowlarr utilizes nunit for its unit, integration, and automation test suite.
Tests can be run easily from within VS using the included nunit3testadapter nuget package or from the command line using the included bash script test.sh
.
From VS simply navigate to Test Explorer and run or debug the tests you'd like to examine.
Tests can be run all at once or one at a time in VS.
From command line the test.sh
script accepts 3 parameters
test.sh <PLATFORM> <TYPE> <COVERAGE>
While not always fun, we encourage writing unit tests for any backend code changes. This will ensure the change is functioning as you intended and that future changes dont break the expected behavior.
We currently require 80% coverage on new code when submitting a PR
If you have any questions about any of this, please let us know.
Prowlarr uses a self hosted open access Weblate instance to manage its json translation files. These files are stored in the repo at src/NzbDrone.Core/Localization
Weblate handles synchronization and translation of strings for all languages other than English. Editing of translated strings and translating existing strings for supported languages should be performed there for the Prowlarr project.
The English translation, en.json
, serves as the source for all other translations and is managed on GitHub repo.
Adding translations to Prowlarr requires two steps
The English translation, src/NzbDrone.Core/Localization/en.json
, serves as the source for all other translations and is managed on GitHub repo. When adding a new string to either the UI or backend a key must also be added to en.json
along with the default value in English. This key may then be consumed as follows:
PRs for translation of log messages will not be accepted
Backend strings may be added utilizing the Localization Service GetLocalizedString
method
private readonly ILocalizationService _localizationService;
public IndexerCheck(ILocalizationService localizationService)
{
_localizationService = localizationService;
}
var translated = _localizationService.GetLocalizedString("IndexerHealthCheckNoIndexers")
New strings can be added to the frontend by importing the translate function and using a key specified from en.json
import translate from 'Utilities/String/translate';
<div>
{translate('UnableToAddANewIndexerPleaseTryAgain')}
</div>