The download link lets you choose between Prodigy wheels for all supported platforms, as well as the extensive API documentation.  You can install Prodigy by pointing pip to the local path of the respective wheel. Note that Prodigy currently requires Python 3.5+ and spaCy v2.1.x. The following command will install the Prodigy package in your current environment:

pip install prodigy-1.7.1-cp35.cp36.cp37-cp35m.cp36m.cp37m-macosx_10_13_x86_64.whlpip install prodigy-1.7.1-cp35.cp36.cp37-cp35m.cp36m.cp37m-linux_x86_64.whlpip install prodigy-1.7.1-cp35.cp36.cp37-cp35m.cp36m.cp37m-win_amd64.whl

spaCy models

To use Prodigy's built-in recipes for NER or Text Classification, you'll also need to install a spaCy model – for example, the small English model, en_core_web_sm (around 35 MB).

python -m spacy download en_core_web_sm


When you first run Prodigy, it will create a folder .prodigy in your home directory. By default, this will be the location where Prodigy looks for its global configuration file, prodigy.json. You can change this directory via the environment variable PRODIGY_HOME:


When you run Prodigy, it will first check if a global configuration file exists. It will also check the current working directory for a prodigy.json or .prodigy.json. This allows you to overwrite specific settings on a project-by-project basis.


{ "theme": "basic", "custom_theme": {}, "batch_size": 10, "port": 8080, "host": "localhost", "cors": true, "db": "sqlite", "db_settings": {}, "api_keys": {}, "auto_create": true, "auto_exclude_current": true, "instant_submit": false, "show_stats": false, "hide_meta": false, "show_flag": false, "instructions": false, "swipe": false, "split_sents_threshold": false, "diff_style": "words", "html_template": false, "global_css": null, "javascript": null, "writing_dir": "ltr", "hide_true_newline_tokens": false, "ner_manual_require_click": false, "ner_manual_label_style": "list", "choice_style": "single", "choice_auto_accept": false, "darken_image": 0, "show_bounding_box_center": false, "preview_bounding_boxes": false, "shade_bounding_boxes": false }
themeName of UI theme to use."basic"
custom_theme Custom UI theme overrides keyed by name.{}
batch_size Number of tasks to return to and receive back from the web app at once. A low batch size means more frequent updates.10
portPort to use for serving the web application.8080
hostHost to use for serving the web application."localhost"
cors Enable or disable cross-origin resource sharing (CORS) to allow the REST API to receive requests from other domains.true
db Name of database to use. See here for available options."sqlite"
db_settingsAdditional settings for the respective database.{}
api_keysLive API keys, keyed by API loader ID.{}
auto_createAutomatically create dataset if it doesn't exist in database.true
auto_exclude_currentAutomatically exclude examples already present in current dataset.true
instant_submitInstantly submit a task after it's answered in the app, skipping the history.false
show_statsShow additional stats, like decision counts, in the sidebar.false
hide_metaHide the meta information displayed on annotation cards.false
show_flag Show a flag icon in the top right corner that lets you bookmark a task for later. Will add "flagged": true to the task.false
instructions Path to a text file with instructions for the annotator (HTML allowed). Will be displayed as a help modal in the UI.false
swipe Enable swipe gestures on touch devices (left for accept, right for reject).false
split_sents_threshold Minimum character length of a text to be split by the split_sentences preprocessor, mostly used in NER recipes. If false, all multi-sentence texts will be split.false
diff_style Style for visual diffs. "words", "chars" or "sentences"."words"
html_template Optional Mustache template for content in the html annotation interface. All task properties are available as variables.false
global_cssCSS overrides added to the global scope.null
javascriptCustom JavaScript added to the global scope.null
writing_dir Writing direction. Mostly important for manual text annotation interfaces."ltr"
hide_true_newline_tokens Don't add real line breaks to tokens in manual annotation mode and only use symbols.false
ner_manual_require_click In manual NER annotation mode, don't auto-add the selection as an entity and require an additional button click to convert the selection to an entity.false
ner_manual_label_style Style of label set in manual NER model. "list" for list of keyboard-accessible buttons or "dropdown"."list"
choice_styleStyle of choice interface, "single" or "multiple"."single"
choice_auto_accept Automatically accept a single-choice option when selecting it – without having to click the accept button.false
darken_image Darken an image in image detection or segmentation mode for better visibility of the coloured bounding boxes. For example, 0.25 will darken the image by 25%.0
show_bounding_box_centerShow a dot marking the center of a bounding box.false
preview_bounding_boxes Also show image spans with "hidden": true in the background to preview other bounding boxes detected in the same image. This can help with making the annotation decision, because you get to preview potentially better analyses.false
shade_bounding_boxes Display bounding boxes with an opaque background color. Mostly used for annotating larger image segments.false

Using Prodigy with Docker

By default, Prodigy starts the web server on localhost and port 8080. If you're running Prodigy via a Docker container or a similar, containerized environment, you'll have to set the host to Simply edit your prodigy.json and add the following:


{ "host": "" }

See this thread for more details and background. The above approach should also work in other environments if you come across the following error on startup:

OSError: [Errno 99] Cannot assign requested address

Database setup

By default, Prodigy uses SQLite to store annotations in a simple database file in your Prodigy home directory. If you want to use the default database with its default settings, no further configuration is required and you can start using Prodigy straight away. Alternatively, you can choose to use Prodigy with a MySQL or PostgreSQL database, or write your own custom recipe to plug in any other storage solution.

SQLitesqlite name for database file name (defaults to "prodigy.db"), path for custom path (defaults to Prodigy home directory), plus sqlite3 connection parameters. To only store the database in memory, use ":memory:" as the database name.
MySQLmysql MySQLdb or PyMySQL connection parameters.
PostgreSQLpostgresql psycopg2 connection parameters.