<!-- # hard line break macro for HTML -->

<a id="contributing"></a>

# Contributing to FiftyOne

FiftyOne is **open source** and built by contributors like you. Whether you’re
fixing a typo, adding a feature, or building a plugin, **every contribution**
makes FiftyOne better for everyone.

#### NOTE
Check out the [FiftyOne GitHub repository](https://github.com/voxel51/fiftyone)
to get started, or join our [Discord community](https://community.voxel51.com/)
to connect with other contributors.

<a id="contributing-ways"></a>

## Ways to contribute

There are many ways to contribute to FiftyOne, from writing code to improving
documentation. Choose the path that best matches your skills and interests:

<div class="tutorials-callout-container">
    <div class="row">

<div class="col-md-6">
    <div class="text-container">
        <h3>Report bugs & request features</h3>
        <p class="body-paragraph">Found a bug or have an idea for a new feature? Open a GitHub issue to let us know. Quality bug reports and well-thought-out feature requests are incredibly valuable.</p>
        <a href="https://github.com/voxel51/fiftyone/issues/new/choose" class="sd-btn sd-btn-primary book-a-demo" rel="noopener noreferrer" data-cta-dynamic="true">
            <div class="arrow">
                <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="size-3">
                <path stroke="currentColor" stroke-width="1.5"
                        d="M1.458 11.995h20.125M11.52 22.063 21.584 12 11.521 1.937"
                        vector-effect="non-scaling-stroke"></path>
                </svg>  
            </div>
            <div class="text">Open an Issue</div>
        </a>
        
    </div>
</div>

<div class="col-md-6">
    <div class="text-container">
        <h3>Contribute code</h3>
        <p class="body-paragraph">Fix bugs, implement new features, or improve existing functionality. Our codebase is Python-based with a TypeScript frontend, and we welcome contributions of all sizes.</p>
        <a href="https://github.com/voxel51/fiftyone/blob/develop/CONTRIBUTING.md" class="sd-btn sd-btn-primary book-a-demo" rel="noopener noreferrer" data-cta-dynamic="true">
            <div class="arrow">
                <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="size-3">
                <path stroke="currentColor" stroke-width="1.5"
                        d="M1.458 11.995h20.125M11.52 22.063 21.584 12 11.521 1.937"
                        vector-effect="non-scaling-stroke"></path>
                </svg>  
            </div>
            <div class="text">Contributing Guide</div>
        </a>
        
    </div>
</div>

<div class="col-md-6">
    <div class="text-container">
        <h3>Improve documentation</h3>
        <p class="body-paragraph">Help make FiftyOne easier to use by improving our docs. Fix typos, add examples, write tutorials, or translate content. Great docs make great software.</p>
        <a href="https://github.com/voxel51/fiftyone/blob/develop/docs/README.md" class="sd-btn sd-btn-primary book-a-demo" rel="noopener noreferrer" data-cta-dynamic="true">
            <div class="arrow">
                <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="size-3">
                <path stroke="currentColor" stroke-width="1.5"
                        d="M1.458 11.995h20.125M11.52 22.063 21.584 12 11.521 1.937"
                        vector-effect="non-scaling-stroke"></path>
                </svg>  
            </div>
            <div class="text">Docs README</div>
        </a>
        
    </div>
</div>

<div class="col-md-6">
    <div class="text-container">
        <h3>Build plugins</h3>
        <p class="body-paragraph">Extend FiftyOne's capabilities by creating plugins. Share your integrations, custom panels, and workflows with the community.</p>
        <a href="../plugins/contributing_plugins.html" class="sd-btn sd-btn-primary book-a-demo" rel="noopener noreferrer" data-cta-dynamic="true">
            <div class="arrow">
                <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="size-3">
                <path stroke="currentColor" stroke-width="1.5"
                        d="M1.458 11.995h20.125M11.52 22.063 21.584 12 11.521 1.937"
                        vector-effect="non-scaling-stroke"></path>
                </svg>  
            </div>
            <div class="text">Plugin Guide</div>
        </a>
        
    </div>
</div>

<div class="col-md-6">
    <div class="text-container">
        <h3>Contribute to the App</h3>
        <p class="body-paragraph">Help improve the FiftyOne App, our TypeScript frontend. Enhance the user interface, add new visualizations, or improve performance.</p>
        <a href="https://github.com/voxel51/fiftyone/blob/develop/app/CONTRIBUTING.md" class="sd-btn sd-btn-primary book-a-demo" rel="noopener noreferrer" data-cta-dynamic="true">
            <div class="arrow">
                <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="size-3">
                <path stroke="currentColor" stroke-width="1.5"
                        d="M1.458 11.995h20.125M11.52 22.063 21.584 12 11.521 1.937"
                        vector-effect="non-scaling-stroke"></path>
                </svg>  
            </div>
            <div class="text">App Contributing Guide</div>
        </a>
        
    </div>
</div>

<div class="col-md-6">
    <div class="text-container">
        <h3>Help the community</h3>
        <p class="body-paragraph">Answer questions on Discord, help triage issues, review pull requests, or share your FiftyOne workflows and tutorials with others.</p>
        <a href="https://community.voxel51.com/" class="sd-btn sd-btn-primary book-a-demo" rel="noopener noreferrer" data-cta-dynamic="true">
            <div class="arrow">
                <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="size-3">
                <path stroke="currentColor" stroke-width="1.5"
                        d="M1.458 11.995h20.125M11.52 22.063 21.584 12 11.521 1.937"
                        vector-effect="non-scaling-stroke"></path>
                </svg>  
            </div>
            <div class="text">Join Discord</div>
        </a>
        
    </div>
</div>

    </div>
</div>

<a id="contributing-getting-started"></a>

## Getting started

Ready to make your first contribution? Follow these steps to set up your
development environment:

SDK

App

Docs

Plugins

Follow these steps to contribute to the FiftyOne SDK (Python):

**Step 1: Fork and clone**

```shell
# Fork https://github.com/voxel51/fiftyone on GitHub...

# Then clone it locally
git clone https://github.com/YOUR_USERNAME/fiftyone.git
cd fiftyone
```

**Step 2: Install in development mode**

```shell
# Install FiftyOne as an editable package with pre-commit hooks
bash install.sh -d
```

**Step 3: Add FiftyOne to your PYTHONPATH**

```shell
export PYTHONPATH=$PYTHONPATH:$(pwd)
```

**Step 4: Create a branch and make changes**

```shell
# Create a branch from develop
git checkout develop
git checkout -b feature/my-feature-branch

# Make changes...
```

**Step 5: Run unit tests locally**

```shell
# Run tests locally to verify your changes
pytest tests/unittests
```

**Step 6: Submit a pull request**

```shell
git push -u origin feature/my-feature-branch

# Open a PR targeting the develop branch on github.com...
```

Refer to the
[contributing guide](https://github.com/voxel51/fiftyone/blob/develop/CONTRIBUTING.md)
and [style guide](https://github.com/voxel51/fiftyone/blob/develop/STYLE_GUIDE.md)
for complete guidelines.

Follow these steps to contribute to the FiftyOne App (TypeScript):

**Step 1: Fork and clone**

```shell
# Fork https://github.com/voxel51/fiftyone on GitHub...

# Then clone it locally
git clone https://github.com/YOUR_USERNAME/fiftyone.git
cd fiftyone
```

**Step 2: Install in development mode**

```shell
# Install FiftyOne as an editable package with pre-commit hooks
bash install.sh -d
```

**Step 3: Add FiftyOne to your PYTHONPATH**

```shell
export PYTHONPATH=$PYTHONPATH:$(pwd)
```

**Step 4: Create a branch and make changes**

```shell
# Create a branch from develop
git checkout develop
git checkout -b feature/my-feature-branch

# Make changes...
```

**Step 5: Test changes locally**

Start the App server in development mode:

```shell
# Start client server with hot reloading
cd app
yarn dev

# Start backend server manually (so you have access to stack traces)
python fiftyone/server/main.py
```

Then launch the App via Python SDK:

```python
import fiftyone as fo
import fiftyone.zoo as foz

dataset = foz.load_zoo_dataset("quickstart")
session = fo.launch_app(dataset)
```

Run App tests locally:

```shell
yarn test
```

**Step 6: Submit a pull request**

```shell
git push -u origin feature/my-feature-branch

# Open a PR targeting the develop branch on github.com...
```

Refer to the
[App contributing guide](https://github.com/voxel51/fiftyone/blob/develop/app/CONTRIBUTING.md)
for more information.

Follow these steps to contribute to the
[FiftyOne documentation](https://docs.voxel51.com):

**Step 1: Fork and clone**

```shell
# Fork https://github.com/voxel51/fiftyone on GitHub...

# Then clone it locally
git clone https://github.com/YOUR_USERNAME/fiftyone.git
cd fiftyone
```

**Step 2: Install with docs dependencies**

```shell
# Install FiftyOne as an editable package with pre-commit hooks
bash install.sh -d

# Install docs dependencies
pip install -r requirements/docs.txt
```

**Step 3: Add FiftyOne to your PYTHONPATH**

```shell
export PYTHONPATH=$PYTHONPATH:$(pwd)
```

**Step 4: Create a branch and make changes**

```shell
# Create a branch from develop
git checkout develop
git checkout -b docs/my-docs-branch

# Make changes in docs/source folder...
```

**Step 5: Build the docs locally**

```shell
bash docs/generate_docs.bash
```

Notable flags: `-c` (clean build), `-f` (fast build), `-s` (static only).

**Step 6: Submit a pull request**

```shell
git push -u origin docs/my-docs-branch

# Open a PR targeting the develop branch on github.com...
```

Refer to the
[Docs README](https://github.com/voxel51/fiftyone/blob/develop/docs/README.md)
for more information.

Follow these instructions to build and share
[FiftyOne Plugins](../plugins/index.md#plugins-ecosystem):

**Step 1: Initialize a new plugin**

```shell
fiftyone plugins create my-plugin
```

This creates a new directory for your plugin within your plugins directory
(default `~/fiftyone/__plugins__`).

**Step 2: Develop your plugin**

Edit `fiftyone.yml` (manifest) and `__init__.py` (code) in your
plugin’s directory.

**Step 3: Test your plugin**

Launch the FiftyOne App and test your plugin’s operators and panels.

**Step 4: Share with the community**

Publish your plugin to your own GitHub repository and then
[publish it](../plugins/contributing_plugins.md#plugins-ecosystem-submission) to the
[Plugins Ecosystem](../plugins/index.md#plugins-ecosystem).

Refer to the [developing plugins](../plugins/developing_plugins.md#developing-plugins) and
[contributing plugins](../plugins/contributing_plugins.md#contributing-plugins) guides for more
information.

<a id="contributing-good-first-issues"></a>

## Good first issues

Looking for something to work on? These issues are great for newcomers:

- [Good first issues](https://github.com/voxel51/fiftyone/labels/good%20first%20issue) -
  perfect for first-time contributors
- [Help wanted](https://github.com/voxel51/fiftyone/labels/help%20wanted) -
  we’d love your help on these
- [Documentation](https://github.com/voxel51/fiftyone/labels/documentation) -
  help make FiftyOne easier to use

<a id="contributing-contributors"></a>

## Our amazing contributors

FiftyOne would not be possible without the contributions of our amazing
community. **Thank you** to every developer who has submitted a pull request,
reported a bug, or helped improve the project. Your contributions make FiftyOne
better for everyone—and now you can be part of this growing community of
developers!

[![FiftyOne Contributors](https://contrib.rocks/image?repo=voxel51/fiftyone)](https://github.com/voxel51/fiftyone/graphs/contributors)

<a id="contributing-need-help"></a>

## Need help?

Don’t hesitate to ask for help! The FiftyOne community is friendly and
welcoming:

- **Discord**: join our [Discord community](https://community.voxel51.com)
  for real-time chat with maintainers and other contributors
- **GitHub Discussions**: ask questions on
  [GitHub Discussions](https://github.com/voxel51/fiftyone/discussions)
- **Email**: reach out to us at [support@voxel51.com](mailto:support@voxel51.com)
