Developer guide
This guide covers how JBrowse 2 code is packaged and structured, and how to create new plugins and pluggable elements.
Products and plugins
The JBrowse 2 ecosystem has two main types of top-level artifacts that are published on their own: products and plugins.

A "product" is an application of some kind that is published on its own (a web
app, an electron app, a CLI app, etc). jbrowse-web, jbrowse-desktop, and
jbrowse-cli are products.
A "plugin" is a package of functionality that is designed to "plug in" to a product at runtime to add functionality. These can be written and published by anyone, not just the JBrowse core team. Not all of the products use plugins, but most of them do.

Example plugins
Plugin templates:
- jbrowse-plugin-template
- jbrowse-plugin-esbuild-template (lightweight esbuild-based alternative)
Working plugin examples:
- jbrowse-plugin-ucsc-api probably the simplest plugin example, it demonstrates accessing data from UCSC REST API
- jbrowse-plugin-gwas a custom plugin to display manhattan plot GWAS data
- jbrowse-plugin-biothings-api demonstrates accessing data from mygene.info, part of the "biothings API" family
- jbrowse-plugin-msaview - demonstrates creating a custom view type that doesn't use any conventional tracks
- jbrowse-plugin-gdc demonstrates accessing GDC cancer data GraphQL API, plus a custom drawer and track type for coloring variants by impact score
- jbrowse-plugin-systeminformation demonstrates using desktop specific functionality, accessing system node libraries. This desktop specific functionality should use the CJS bundle type (electron doesn't support ESM yet)
These show how plugins are structured and can serve as templates for your own pluggable elements.
The jbrowse-plugin-list is the community plugin registry — browse it to find published plugins or submit your own via pull request.
Developer guides
Getting started
- Writing a no-build plugin - Plugin without a build step, useful for jexl callbacks and simple modifications
- Pluggable elements - Overview of all element types a plugin can register
- Writing a plugin using jbrowse-plugin-template - Step-by-step plugin setup using the official rollup template
Core concepts
- Configuration model basics - Config slot types, defaults, and how configuration schemas work
- Extension points - Callbacks registered by producers and consumed across the app
- Renderer architecture - How canvas-based track rendering runs in a web worker via RPC
Creating pluggable elements
- Creating custom adapters - Read data from custom file formats with feature, regions, or sequence adapters
- Creating custom add-track workflows - Custom UI in the Add track dialog for non-standard track types
- Creating custom display types - Control how a track renders in a given view type
- Creating custom renderers - Write canvas- or SVG-based feature rendering in a web worker
- Creating custom track types - Define new high-level track concepts backed by display types
- Creating custom view types - Add entirely new view panels such as DotplotView or CircularView
- Creating custom widgets - Add new drawer/panel UI components
- Creating custom top-level menu items - Add items to the top-level application menu bar
Advanced topics
- PIF (Pairwise Indexed Format) - Tabix-indexed pairwise alignment format for large-scale synteny data
- RefName aliasing - Map between chromosome naming conventions across tracks and assemblies