---
# System prepended metadata

title: Tutorial for developing plugin with napari

---

# Tutorial for developing plugin with napari

Largely inspired from the [tutorial](https://napari.org/stable/plugins/first_plugin.html) on the official [napari] website

## Pre-requisites

1. Python
1. Environment manager ([conda], preferably __*not*__ Anaconda!!)
1. Some knowledge in Python
1. Some knowledge in [napari]

__Everything should be ran in a local environement to avoid breaking everything!__

## Setting-up the environment

### Creating and activating the environment

    conda create -n napari-tuto -c conda-forge
    conda activate napari-tuto

### Installing [napari]

    conda install "napari[all]"

Once installed, you should be able to run the command `napari` from anywhere in a terminal and it should start [napari]

### Installing [cookiecutter]

    conda install cookiecutter

Cookiecutter allows you to create the folders and file layout that will be the basis for your plugin.

### Setting up your first plugin layout

    cookiecutter https://github.com/napari/cookiecutter-napari-plugin

It will ask few questions:
    
    full_name [Napari Developer]: Leo
    email [yourname@example.com]: leo@leo.leo
    github_username_or_organization [githubuser]: leo
    plugin_name [napari-foobar]: napari-first
    Select github_repository_url:
    1 - https://github.com/leo/napari-first
    2 - provide later
    Choose from 1, 2 [1]: 2
    module_name [napari_first]:
    display_name [FooBar Segmentation]: My First Napari Plugin
    short_description [A simple plugin to use FooBar segmentation within napari]: A simple first plugin
    include_reader_plugin [y]: n
    include_writer_plugin [y]: n
    include_sample_data_plugin [y]: n
    include_widget_plugin [y]:
    use_git_tags_for_versioning [n]:
    install_precommit [n]:

Using the previous parameters it will create a folder `napari-first` with the following layout:

    napari-first
    ├── .github
    │   └── workflows
    │       └── test_and_deploy.yml
    ├── .gitignore
    ├── .napari-hub
    │   ├── DESCRIPTION.md
    │   └── config.yml
    ├── .pre-commit-config.yaml
    ├── LICENSE
    ├── MANIFEST.in
    ├── README.md
    ├── pyproject.toml
    ├── setup.cfg
    ├── src
    │   └── napari_first
    │       ├── __init__.py
    │       ├── _tests
    │       │   ├── __init__.py
    │       │   └── test_widget.py
    │       ├── _widget.py
    │       └── napari.yaml
    └── tox.ini

### Installing your plugin

Now, to install the plugin you can run the following command from the `napari-first` folder:

    pip install -e .

Note the `-e` option for the `pip install` command it allows to install the plugin "in place" meaning that if you modify the code it will be directly integrated without having to re-install it.

Here is a small description of the files we will be looking at during this introduction:


| File name | Description |
|---|---|
|`README.md` | a file containing the instruction for your plugin|
|`setup.cfg` | the file that allows the installation of your plugin and its dependencies|
|`napari.yaml` | the file that tells [napari] where to find your plugin code and how to load it|
|`__init__.py` | the file that tells how to load the code|
|`_widget.py` | the file that contains the core of your plugin.|

If we have time we will look at the following files (likely in that order):
| File name | Description |
|---|---|
| `test_and_deploy.yml` | a file containing the information for testing when pushing on GitHub
| `_tests` | a folder containing the test files
|`pyproject.toml` | a file containing some parameters for your coding preferences|

[conda]: https://docs.conda.io/en/latest/
[napari]: https://napari.org/stable/
[cookiecutter]: https://github.com/cookiecutter/cookiecutter