Repository: GMOD/jbrowse-jupyter (language: python)

Issue:
Updates notebook demos
* Creates an example notebook with dash call backs 
* Adds pip install command to colab notebook


Discussion / hints:

Fix patch:
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..dd84ea7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,38 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Desktop (please complete the following information):**
+ - OS: [e.g. iOS]
+ - Browser [e.g. chrome, safari]
+ - Version [e.g. 22]
+
+**Smartphone (please complete the following information):**
+ - Device: [e.g. iPhone6]
+ - OS: [e.g. iOS8.1]
+ - Browser [e.g. stock browser, safari]
+ - Version [e.g. 22]
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..bbcbbe7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..d316f9d
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,31 @@
+name: Publish Python 🐍 distributions 📦 TestPyPI
+on:
+  push:
+    branches:
+      - main
+jobs:
+  build-and-publish:
+    runs-on: ubuntu-latest
+    steps:
+     - uses: actions/checkout@v2
+     - name: Set up Python
+       uses: actions/setup-python@v2
+       with:
+         python-version: '3.6'
+     - name: Install dependencies
+       run: |
+         python3 -m pip install --upgrade pip
+         python3 -m pip install setuptools wheel twine
+         pip install -r requirements.txt
+     - name: Test with pytest
+       run: |
+         pytest tests -v
+     - name: Build and publish to TestPyPI
+       run: |
+         # Install the package from setup.py
+         python3 setup.py install
+         python3 setup.py sdist bdist_wheel
+         python3 -m twine upload --skip-existing --repository-url https://test.pypi.org/legacy/ dist/*
+       env:
+          TWINE_USERNAME: __token__
+          TWINE_PASSWORD: ${{ secrets.TWINE_TEST_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..21489c8
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,35 @@
+name: Publish Python 🐍 distributions 📦 PyPI
+# Controls when the action will run.
+on:
+  # Triggers the workflow when a release is created
+  release:
+    types: [created]
+  # Allows you to run this workflow manually from the Actions tab
+  workflow_dispatch:
+    
+jobs:
+  build-and-publish:
+    runs-on: ubuntu-latest
+    steps:
+     - uses: actions/checkout@v2
+     - name: Set up Python
+       uses: actions/setup-python@v2
+       with:
+         python-version: '3.6'
+     - name: Install dependencies
+       run: |
+         python3 -m pip install --upgrade pip
+         python3 -m pip install setuptools wheel twine
+         pip install -r requirements.txt
+     - name: Test with pytest
+       run: |
+         pytest tests -v
+     - name: Build and publish to PyPI
+       run: |
+         # Install the package from setup.py
+         python3 setup.py install
+         python3 setup.py sdist bdist_wheel
+         python3 -m twine upload dist/*
+       env:
+          TWINE_USERNAME: __token__
+          TWINE_PASSWORD: ${{ secrets.TWINE_TOKEN }}
diff --git a/.gitignore b/.gitignore
index aa44ee2..0d2a16c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -128,3 +128,5 @@ dmypy.json
 # Pyre type checker
 .pyre/
 
+
+.vscode
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f6314e0..2c751f9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,21 +1,21 @@
 # Contributing
 We use conda environments for development.
 
-First install conda. Read the [conda docs](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html) for getting started with conda and clone the directory.
+First install conda.
+Read the [conda docs](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html) for getting started with conda.
 
 ## Development
-Now we can
-1. after cloning the repo, cd into jbrowse-jupyter
+1. Clone this directory and cd into jbrowse-jupyter
 ```
 $ cd jbrowse-jupyter
 ```
-2. create a conda environment and install the dependencies
+2. Create a conda environment and install the dependencies
 ```
 $ conda create -n myenv python=3.6
 $ source avtivate myenv
 $ python -m pip install -r requirements.txt
 ```
-This command will create a conda environment with python 3.6. 
+This command will create a conda env with python 3.6. 
 
 3. Now you are ready to run the the example
 ```
@@ -25,12 +25,25 @@ $ python browser.py
 jupyter lab or jupyter notebook following [these docs](https://jupyter.org/install)
 More about configuring your [jupyter notebook env](https://softwarejargon.com/jupyterlab-and-conda-environment-installation-and-setup/).
 
-5. For testing the package in another environment, you can pip install a specific branch with this command
+5. You can now test the package by installing it in dev mode. This command will install the package in dev mode
+```
+$ python -m pip install -e .
+```
+To verify that the package was installed, you can run 
+```
+$ pip list
+```
+This will display the list of packages in your conda env. Look for the `jbrowse-jupyter` package.
+
+You can read more about working in [development mode here](https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/#working-in-development-mode).
+
+6. For testing the package in another environment, you can pip install a specific branch with this command
 ```
 $ pip install git+https://github.com/GMOD/jbrowse-jupyter.git@branch
 ``` 
 
-## Running the tests and lint
+
+## Lint and Tests
 You can find all the tests in the `tests/` directory
 To run the tests, you can run this command from the root of the repo directory
 ```
@@ -46,42 +59,48 @@ from the root of this repo to see any lint errors
 https://gmod.github.io/jbrowse-jupyter/
 We store the docs in `docs/` directory. Our docs are created with Sphinx.
 Check [this](https://www.sphinx-doc.org/en/master/contents.html) out for Sphinx documentation.
+
+First,
 ```
 $ cd docs
 ```
-You should see a requirements.txt, Makefile and a make.bat file, docs/ and source/ directories etc
-1. after creating an environment, install the dependencies
+You should see a requirements.txt,a Makefile, a make.bat file, the source/ directory, the docs/ directory which stores the build etc.
+
+1. Create an environment and install the dependencies.
 ```
 $ conda create -n myenv python=3.6
 $ source activate myenv
 $ python -m pip install -r requirements.txt
 ```
-2. Make modifications in the `source` directory
+2. Now you are ready to make modifications. Make any modifications to the docs in the `source` directory
     - the main entry point for the docs is the source/index.rst
 3. After making any modifications, 
 ```
-$ make html
+$ make clean
 ```
-Run this command from the same place where the Makefile exists.
-you can also run 
+to delete the contents of docs/docs directory
+
+Now you can run 
 ```
-$ make clean
+$ make html
 ```
-to delete the contentst of docs/docs directory
+The command above will create a build of the docs and stores them in a subdurectory called docs. For configuring the docs check out the conf.py in the source/ directory. For configuration of the builds, checkout the docs/Makefile and docs/make.bat files.
+
+***Note:*** there parent docs directory stores all the docs. The docs child directory stores the build of the docs when running make html. The source child directory stores the actualy configuration and contents of the sphinx docs.
 
 5. To view your changes, you can checkout `docs/docs/html/index.html`
-6. When you are ready to publish any changes, make a PR against the gh-pages branch. We host our sphinx docs in github pages, and oushing to the gg-pages will publish the updated docs. Once those are published, you can check out this link to view your live docs https://gmod.github.io/jbrowse-jupyter/
+6. When you are ready to publish any changes, make a PR against the gh-pages branch. We host our sphinx docs in github pages, and pushing to the gh-pages will publish the updated docs. Once those are published, you can check out this link to view your live docs https://gmod.github.io/jbrowse-jupyter/
 
 
 
 ## Releasing/publishing 
 
-### Testing Pypi
-1. create an account with [test PyPi](https://test.pypi.org/) and `pip install twine`
+### Testing release in test Pypi
+1. Create an account with [test PyPi](https://test.pypi.org/) and `pip install twine`
 
-2. generate an API Token for this 'jbrowse-jupyter' package. You will need to be added as a contributor first
+2. Generate an API Token for the 'jbrowse-jupyter' package. You will need to be added as a contributor first
 
-3. Make sure that you have update the version in your setup.py
+3. Make sure that you have updated the version in your setup.py
 
 4. From the root of the directory, run
 ```
@@ -91,46 +110,46 @@ This command will create a source distribution and a wheel in a temporary direct
 
 5. Now you can check your tar works by moving the jbrowse-jupyter-<you-version>.tar.gz to your testing env and manually installing it 
 ```
-pip installing jbrowse-jupyter-<you-version>.tar.gz
+pip installing jbrowse-jupyter-<your-version>.tar.gz
 ```
 
-6 if it worked, you can 
+6 if it worked, you can run
 ```
 $ twine upload --repository-url https://test.pypi.org/legacy/dist/*
 ```
-This will upload to test pypi. The command will prompt you for your username. Simply enter `__token__` and paste the API token that you generated for step 2.
+This will upload the contents of your dist folder to test pypi. The command will prompt you for your username. Simply enter `__token__` and paste the API token that you generated in step 2.
 
-7. Now you can pip install your package in any env and test if it works. When you feel ready to release then you can make a pr to main. 
+7. Now you can pip install your package in any env and test that it works. When you feel ready to release then you can make a pr to main. 
 
 ### Production Pypi
 1. Repeat step 2 but for production [PyPi](https://pypi.org/)
-2. generate an API Token for this 'jbrowse-jupyter' package. You will need to be added as a contributor first
-3. Update the version on setup.py and push to main
+2. Generate an API Token for the 'jbrowse-jupyter' package. You will need to be added as a contributor first.
+3. Update the version on setup.py and when you are ready push to main.
 4. Create a tag from main
 5. Draft a release in github
-6. Run
+6. Checkout the github tag and from the tag, run
 ```
 $ python setup.py sdist bdist_wheel
 ```
-and test that you can correctly pip install your tar
+from the root of the github directory.
+Test that you can correctly pip install your tar
 `jbrowse-jupyter-<you-version>.tar.gz`
-7. if it works and you are ready to release
-8. Run 
+7. If it works and you are ready to release, run 
 ```
 twine upload dist/*
 ```
 This will upload to pypi. The command will prompt you for your username. Simply enter `__token__` and paste the API token that you generated for step 2.
-9. Test that it works by pip installing in a new env and running your jupyter notebook.
+8. Test that it works by pip installing in a new env and running the python app.
 10. Add your tar and wheel files to your github release, and link to the new version on pypi.
-11. Publish your github release.
+11. Publish the github release.
 
 
 ## Maintenance
-This package depends on `Dash JBrowse`. The repo can be found [here](https://github.com/GMOD/dash_jbrowse). The [Dash JBrowse] package currently has a dependency on the JBrowse React Linear Genome View npm package. In order to keep up with the dependencies, the version of the Browse React Linear Genome View npm package was set up to allow newer versions. If there are any breaking changes, we will need to update the dependencies
-1. Checkout the [dash_jbrowse repo](https://github.com/GMOD/dash_jbrowse/blob/main/CONTRIBUTING.md)
-2. npm install the dependencies
+This package depends on `Dash JBrowse`. The repo can be found [here](https://github.com/GMOD/dash_jbrowse). The [Dash JBrowse] package currently has a dependency on the JBrowse React Linear Genome View npm package. In order to keep up with the dependencies, the version of the Browse React Linear Genome View npm package was set up to allow newer versions. If there are any breaking changes, we will need to update the version in Dash JBrowse
+1. Checkout the [dash_jbrowse](https://github.com/GMOD/dash_jbrowse/blob/main/CONTRIBUTING.md) repo
+2. install the dependencies with npm
 3. Update the [JBrowse React Linear Genome View npm package](https://www.npmjs.com/package/@jbrowse/react-linear-genome-view)
-4. Make sure the package.json was updated
+4. Make sure the package.json was updated with the latest version of the React Linear Genome View package
 5. Test everything works appropriately by running
 ```
 $ npm run build
@@ -140,6 +159,6 @@ Verify the app works appropriately
 Run the tests and make a pr to main.
 We can draft a release  following the contributing docs found [here](https://github.com/GMOD/dash_jbrowse/blob/main/CONTRIBUTING.md)
 
-6. Now you can update this package and upgrade the python dash-jbrowse package to the latest version of dash jbrowse.
+6. Now you can update this package and upgrade the python dash-jbrowse package dependency to the latest version of dash jbrowse.
 7. Follow the release steps mentioned above for jupyter jbrowse
 8. Test that everything works as expected, and you are done!
diff --git a/README.md b/README.md
index e3aab6a..adc691c 100644
--- a/README.md
+++ b/README.md
@@ -10,10 +10,15 @@ The package provides a JBrowseConfig API to enable the creation of JBrowse state
 ![demo-gif](https://user-images.githubusercontent.com/45598764/144863573-2bcd982b-1d18-4dc8-aa2f-fd8adf4985a2.gif)
 
 *You can open this browser.ipynb in colab* [here](https://colab.research.google.com/github/GMOD/jbrowse-jupyter/blob/main/browser.ipynb)
+Note: to install the package in colab you can use this command.
+In a new cell above the import statement
+```
+!pip install git+https://github.com/GMOD/jbrowse-jupyter.git@main
+```
 ## Dash JBrowse
 Dash JBrowse is a collection of dash components for JBrowse's embeddable components.
 
-We utilize the Dash JBrowse package along with [jupyter-dash](https://github.com/plotly/jupyter-dash) library to embed [JBrowse React Linear Genome view](https://www.npmjs.com/package/@jbrowse/react-linear-genome-view) in any jupyter notebook.
+We utilize the Dash JBrowse package along with [jupyter-dash](https://github.com/plotly/jupyter-dash) library to embed [JBrowse React Linear Genome view](https://www.npmjs.com/package/@jbrowse/react-linear-genome-view) or the [JBrowse React Circular Genome view](https://www.npmjs.com/package/@jbrowse/react-circular-genome-view) in any jupyter notebook.
 
 You can find more information about our Dash JBrowse library [here](https://github.com/GMOD/dash_jbrowse).
 
@@ -49,8 +54,10 @@ $ pip install jbrowse-jupyter
 ```
 
 *Launching a Linear Genome View in Jupyter Notebook*
-![Launching hg38 LGV in python notebook](./images/notebook.png)
+![Launching hg38 LGV in python notebook](https://github.com/GMOD/jbrowse-jupyter/raw/main/images/notebook.png)
 
+*Launching a Circular Genome View in Jupyter Notebook*
+![Launching hg19 CGV in python notebook](https://github.com/GMOD/jbrowse-jupyter/raw/main/images/notebook2.png)
 *JBrowse Linear Genome view in python Dash application*
 ```python
 import dash
@@ -59,7 +66,7 @@ from jbrowse_jupyter import create, create_component
 
 app = dash.Dash(__name__)
 
-jbrowse_conf = create("view", genome="hg38")
+jbrowse_conf = create("LGV", genome="hg38")
 
 config = jbrowse_conf.get_config()
 
@@ -74,17 +81,19 @@ if __name__ == "__main__":
     app.run_server(port=8081, debug=True)
 
 ```
-![Dash JBrowse LGV in python app](./images/python_app.png)
+![Dash JBrowse LGV in python app](https://github.com/GMOD/jbrowse-jupyter/raw/main/images/python_app.png)
 You can customize the Linear Genome View by modifying the `jbrowse_conf`. The `jbrowse_conf` is an instance of our `JBrowseConfig`, and can be modified to set an assembly, add tracks, set custom color palettes and more.
 
 Find more information about the JBrowseConfig API [here](https://gmod.github.io/jbrowse-jupyter/docs/html/index.html)
 
 ### Other Examples
 
-You can find two examples in the root of this repo, 
-`browser.py` or the `browser.ipynb`
+You can find examples in the root of this repo, 
+* `browser.py` - uses the Dash library to create a python application with the Dash JBrowse LinearGenomeView component
+* `browser.ipynb` - jupyter notebook using the JupyterDash library to embed a Dash JBrowse LinearGenomeView component in a cell
+* `cgv_examples.py` - uses the Dash library to create a python application with the Dash JBrowse CircularGenomeView component
+* `cgv_examples.ipynb` - jupyter notebook using the JupyterDash library to embed a Dash JBrowse CircularGenomeView component in a cell
 
-`browser.py` uses the Dash library to create a python application with the Dash JBrowse LinearGenomeView component and configured with the help of this package. `browser.ipynb` is jupyter notebook using the JupyterDash library to embed a Dash JBrowse LinearGenomeView component in a cell.
 
 #### To run the Python Dash application
 ```
@@ -105,12 +114,24 @@ The `jbrowse-jupyter` package provides several utility functions to create and l
 
 ### Configuring Components
 * `create`(view_type, **kwargs)- creates a JBrowseConfig configuration object given a view_type 
-    - view : creates a default empty JBrowseConfig. e.g `create`('view', genome='hg19')
-    - conf: creates a JBrowseConfig from one of the default genomes, e.g `create`('conf')
-* `create_component`(conf, **kwargs) - creates and returns a Dash JBrowse LinearGenomeView component
-    - component can be used as any Dash component in Dash applications
+    - view_type: Choose from a LGV or CGV e.g `create`('LGV') or `create`('CGV')
+    Additional params:
+        - genome: choose from one of our default genomes {hg19 or hg38} e.g `create`('LGV', genome="hg38")
+        OR 
+        - conf: use a conf object, you can manually edit and pass json object.
+        e.g `create`('LGV', conf={"my-conf": "object"})
+        *Note:* you can manually create a conf following the https://jbrowse.org/jb2/docs/config_guide/
+        - if no genome or conf is passed, you will create an empty JBrowseConfig for that view type.
+    *defaults* if you pass no params,an empty JBrowse config for a LGV (LinearGenomeView) will be created
+* `create_component`(conf, **kwargs) - creates and returns a Dash JBrowse component -> 'CGV' or 'LGV'. This component can be used as any  Dash component in Dash applications.
+  - conf: JBrowseConfig obj 
+  - id: id for Dash components (opyional)
+  - dash_comp: 'CGV' or 'LGV', defaults to 'LGV' when none is passed
+  e.g `create_component`(cgv_with_conf.get_config(), dash_comp="CGV")
 * `launch`(conf, **kwargs) - launches a LinearGenomeView Dash component in a Jupyter cell
-    > **Warning**: Only use `launch` in jupyter notebooks
+  - id: id for Dash components
+  - dash_comp: 'CGV' or 'LGV', defaults to 'LGV' when none is passed
+ > **Warning**: Only use `launch` in jupyter notebooks
 
 ### JBrowseConfig
 Quick overview of the JBrowseConfig API
@@ -126,6 +147,7 @@ JBrowseConfig().
     - requires DataFrame to have columns ['refName', 'start', 'end', 'name']
     - refName and name columns must be strings, start and end must be int
     - if the score column is present, it will create a Quantitative track else it will create a Feature track.
+    - not available for CGV
     - params:
         * df – pandas DataFrame with the track data.
         * name (str) – (optional) name for the track
@@ -141,11 +163,12 @@ JBrowseConfig().
         * data (str) – track file or url (currently only supporting url)
         * name (str) – (optional) name for the track
         * index (str) – (optional) index file for the track
-        * track_type (str) – (optional) track type
+        * track_type (str) – (optional) track type. If none is passed, the api will infer one based on the file type
         * overwrite (boolean) – (optional) overwrites existing track if it exists in list of tracks (default False)
 * `set_location`(location)
     - initial location for when the browser first loads, syntax 'refName:start-end' 
     - e.g 'chrom1:500-1000'
+    - not available for CGV
 * `set_default_session`(tracks_ids, display_assembly=True)
     - sets the default session given a list of track ids
     - params:
@@ -155,6 +178,7 @@ JBrowseConfig().
     - sets the theme in the configuration given up to 4 hexadecimal colors
 * `add_text_search_adapter`(ix_path, ixx_path, meta_path, adapter_id=None)
     - adds a trix text search adapter
+    - not available for CGV
 * `get_config`() - returns the configuration object
 <!-- These configurations can be used to create [Dash JBrowse's Linear Genome View](https://github.com/GMOD/dash_jbrowse) components which can be used in any python application and or jupyter notebook. -->
 
@@ -162,6 +186,7 @@ JBrowseConfig().
  <!-- For full details please reference the documentation. -->
 [DOCUMENTATION](https://gmod.github.io/jbrowse-jupyter/docs/html/index.html) with more details and tutorials.
 
+![Circular Genome View Gif](https://user-images.githubusercontent.com/45598764/152484043-aeff48b5-a1f2-44f2-b7d9-131c2afd4e1a.gif)
 ## Resources
 * [JBrowse](https://jbrowse.org/jb2/) - the next generation genome browser
 * [JBrowse React Linear Genome View](https://www.npmjs.com/package/@jbrowse/react-linear-genome-view) - interactive genome browser
@@ -180,16 +205,39 @@ publish, please cite the most recent JBrowse paper, which will be linked from
 We **really** love talking to our users. Please reach out with any thoughts you have on what we are building!
 
 -   Report a bug or request a feature at
-    https://github.com/GMOD/dash_jbrowse/issues/new
+    https://github.com/GMOD/jbrowse-jupyter/issues
 -   Join our developers chat at https://gitter.im/GMOD/jbrowse2
 -   Send an email to our mailing list at `gmod-ajax@lists.sourceforge.net`
 
-<!-- ## FAQ
-* What is an assembly and how do I configure one?
-    - An assembly is
-* What is a track and how do I add one to the configuration?
-    - A track is
+## FAQ
+* What file types are supported?
+    - We currently support:
+        * bam
+        * big wig
+        * big bed
+        * cram
+        * fasta indexed
+        * fasta gzipped
+        * gff3 tabix
+        * two bit
+        * vcf
+        * vcf gzipped
+
+* What track types are supported?
+    - We currently support:
+        * [AlignmentsTrack](https://jbrowse.org/jb2/docs/user_guide/#alignments-tracks)
+        * [QuantitativeTrack](https://jbrowse.org/jb2/docs/user_guide/#bigwig-tracks)
+        * [VariantTrack](https://jbrowse.org/jb2/docs/user_guide/#variant-tracks)
+        * [ReferenceSequenceTrack](https://jbrowse.org/jb2/docs/user_guide/#sequence-track)
+        * Feature Tracks
+
+    For the circular genome view (CGV), we only support variant tracks. Check out [track types](https://jbrowse.org/jb2/docs/user_guide/#sequence-track) docs for more information.
+* What views do you currently support?
+    - We currently support JBrowse's Linear Genome View and Circular Genome View. We hope to support more in the future.
 * How do I configure text searching?
     - In order to configure text searching in your Linear Genome View, you must first create a text index. Follow the steps found [here](https://jbrowse.org/jb2/docs/quickstart_cli/#indexing-feature-names-for-searching). Then you must create and add a text search adapter to your config. 
-* How do I set a default session?
-* How do I set a custom color theme palette to fit with my application? -->
+* How do I configure tracks to show up on first render?
+    - You can set a specific track/tracks to show up when the component first renders, and you can do this via the default session. You can set the default session via the JBrowseConfig API. `set_default_session`
+* How do I set a custom color theme palette to fit with my application?
+    - You can customize the color palette of the component through the use of `set_theme` function from the JBrowseConfig API. Below is an image of an LGV with a custom color palette. 
+![Custom Palette](https://github.com/GMOD/jbrowse-jupyter/raw/main/images/custom_palette.png)
diff --git a/browser.ipynb b/browser.ipynb
index 4993267..e58dd9b 100644
--- a/browser.ipynb
+++ b/browser.ipynb
@@ -2,7 +2,106 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "output_type": "stream",
+     "name": "stdout",
+     "text": [
+      "Collecting git+https://github.com/GMOD/jbrowse-jupyter.git@main\n",
+      "  Cloning https://github.com/GMOD/jbrowse-jupyter.git (to revision main) to /private/var/folders/96/hq94_1qd3c9_q87bwqhg05s80000gn/T/pip-req-build-emfgm9s3\n",
+      "  Running command git clone --filter=blob:none -q https://github.com/GMOD/jbrowse-jupyter.git /private/var/folders/96/hq94_1qd3c9_q87bwqhg05s80000gn/T/pip-req-build-emfgm9s3\n",
+      "  Resolved https://github.com/GMOD/jbrowse-jupyter.git to commit 5a7a753cf3ada2d028992c67ed305e0ea575555b\n",
+      "  Preparing metadata (setup.py) ... \u001b[?25ldone\n",
+      "\u001b[?25hCollecting dash==2.0.0\n",
+      "  Using cached dash-2.0.0-py3-none-any.whl (7.3 MB)\n",
+      "Collecting dash-jbrowse>=1.0.1\n",
+      "  Using cached dash_jbrowse-1.0.1-py3-none-any.whl (1.1 MB)\n",
+      "Requirement already satisfied: flake8>=4.0.1 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jbrowse-jupyter==1.2.1) (4.0.1)\n",
+      "Requirement already satisfied: jupyter_dash>=0.4.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jbrowse-jupyter==1.2.1) (0.4.0)\n",
+      "Requirement already satisfied: pandas>=1.1.5 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jbrowse-jupyter==1.2.1) (1.4.0)\n",
+      "Requirement already satisfied: pytest>=6.2.5 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jbrowse-jupyter==1.2.1) (6.2.5)\n",
+      "Requirement already satisfied: dash-table==5.0.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from dash==2.0.0->jbrowse-jupyter==1.2.1) (5.0.0)\n",
+      "Requirement already satisfied: flask-compress in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from dash==2.0.0->jbrowse-jupyter==1.2.1) (1.10.1)\n",
+      "Requirement already satisfied: dash-core-components==2.0.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from dash==2.0.0->jbrowse-jupyter==1.2.1) (2.0.0)\n",
+      "Requirement already satisfied: plotly>=5.0.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from dash==2.0.0->jbrowse-jupyter==1.2.1) (5.3.1)\n",
+      "Requirement already satisfied: dash-html-components==2.0.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from dash==2.0.0->jbrowse-jupyter==1.2.1) (2.0.0)\n",
+      "Requirement already satisfied: Flask>=1.0.4 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from dash==2.0.0->jbrowse-jupyter==1.2.1) (1.1.2)\n",
+      "Requirement already satisfied: pycodestyle<2.9.0,>=2.8.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from flake8>=4.0.1->jbrowse-jupyter==1.2.1) (2.8.0)\n",
+      "Requirement already satisfied: mccabe<0.7.0,>=0.6.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from flake8>=4.0.1->jbrowse-jupyter==1.2.1) (0.6.1)\n",
+      "Requirement already satisfied: pyflakes<2.5.0,>=2.4.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from flake8>=4.0.1->jbrowse-jupyter==1.2.1) (2.4.0)\n",
+      "Requirement already satisfied: ipykernel in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (5.3.4)\n",
+      "Requirement already satisfied: ansi2html in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (1.6.0)\n",
+      "Requirement already satisfied: retrying in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (1.3.3)\n",
+      "Requirement already satisfied: requests in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (2.24.0)\n",
+      "Requirement already satisfied: ipython in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (7.19.0)\n",
+      "Requirement already satisfied: python-dateutil>=2.8.1 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pandas>=1.1.5->jbrowse-jupyter==1.2.1) (2.8.1)\n",
+      "Requirement already satisfied: numpy>=1.18.5 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pandas>=1.1.5->jbrowse-jupyter==1.2.1) (1.19.2)\n",
+      "Requirement already satisfied: pytz>=2020.1 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pandas>=1.1.5->jbrowse-jupyter==1.2.1) (2020.1)\n",
+      "Requirement already satisfied: packaging in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pytest>=6.2.5->jbrowse-jupyter==1.2.1) (20.4)\n",
+      "Requirement already satisfied: iniconfig in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pytest>=6.2.5->jbrowse-jupyter==1.2.1) (1.1.1)\n",
+      "Requirement already satisfied: attrs>=19.2.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pytest>=6.2.5->jbrowse-jupyter==1.2.1) (20.3.0)\n",
+      "Requirement already satisfied: py>=1.8.2 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pytest>=6.2.5->jbrowse-jupyter==1.2.1) (1.9.0)\n",
+      "Requirement already satisfied: toml in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pytest>=6.2.5->jbrowse-jupyter==1.2.1) (0.10.1)\n",
+      "Requirement already satisfied: pluggy<2.0,>=0.12 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pytest>=6.2.5->jbrowse-jupyter==1.2.1) (0.13.1)\n",
+      "Requirement already satisfied: click>=5.1 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from Flask>=1.0.4->dash==2.0.0->jbrowse-jupyter==1.2.1) (7.1.2)\n",
+      "Requirement already satisfied: itsdangerous>=0.24 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from Flask>=1.0.4->dash==2.0.0->jbrowse-jupyter==1.2.1) (1.1.0)\n",
+      "Requirement already satisfied: Jinja2>=2.10.1 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from Flask>=1.0.4->dash==2.0.0->jbrowse-jupyter==1.2.1) (2.11.2)\n",
+      "Requirement already satisfied: Werkzeug>=0.15 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from Flask>=1.0.4->dash==2.0.0->jbrowse-jupyter==1.2.1) (2.0.2)\n",
+      "Requirement already satisfied: tenacity>=6.2.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from plotly>=5.0.0->dash==2.0.0->jbrowse-jupyter==1.2.1) (8.0.1)\n",
+      "Requirement already satisfied: six in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from plotly>=5.0.0->dash==2.0.0->jbrowse-jupyter==1.2.1) (1.16.0)\n",
+      "Requirement already satisfied: brotli in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from flask-compress->dash==2.0.0->jbrowse-jupyter==1.2.1) (1.0.9)\n",
+      "Requirement already satisfied: appnope in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipykernel->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (0.1.0)\n",
+      "Requirement already satisfied: tornado>=4.2 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipykernel->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (6.0.4)\n",
+      "Requirement already satisfied: jupyter-client in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipykernel->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (6.1.7)\n",
+      "Requirement already satisfied: traitlets>=4.1.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipykernel->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (5.1.1)\n",
+      "Requirement already satisfied: pygments in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (2.7.2)\n",
+      "Requirement already satisfied: decorator in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (4.4.2)\n",
+      "Requirement already satisfied: setuptools>=18.5 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (59.2.0)\n",
+      "Requirement already satisfied: backcall in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (0.2.0)\n",
+      "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (3.0.8)\n",
+      "Requirement already satisfied: jedi>=0.10 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (0.17.1)\n",
+      "Requirement already satisfied: pexpect>4.3 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (4.8.0)\n",
+      "Requirement already satisfied: pickleshare in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (0.7.5)\n",
+      "Requirement already satisfied: pyparsing>=2.0.2 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from packaging->pytest>=6.2.5->jbrowse-jupyter==1.2.1) (2.4.7)\n",
+      "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from requests->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (1.25.11)\n",
+      "Requirement already satisfied: idna<3,>=2.5 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from requests->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (2.10)\n",
+      "Requirement already satisfied: certifi>=2017.4.17 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from requests->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (2020.6.20)\n",
+      "Requirement already satisfied: chardet<4,>=3.0.2 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from requests->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (3.0.4)\n",
+      "Requirement already satisfied: parso<0.8.0,>=0.7.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jedi>=0.10->ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (0.7.0)\n",
+      "Requirement already satisfied: MarkupSafe>=0.23 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from Jinja2>=2.10.1->Flask>=1.0.4->dash==2.0.0->jbrowse-jupyter==1.2.1) (2.0.1)\n",
+      "Requirement already satisfied: ptyprocess>=0.5 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from pexpect>4.3->ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (0.6.0)\n",
+      "Requirement already satisfied: wcwidth in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (0.2.5)\n",
+      "Requirement already satisfied: pyzmq>=13 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jupyter-client->ipykernel->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (19.0.2)\n",
+      "Requirement already satisfied: jupyter-core>=4.6.0 in /Users/teresamartinez/opt/anaconda3/lib/python3.8/site-packages (from jupyter-client->ipykernel->jupyter_dash>=0.4.0->jbrowse-jupyter==1.2.1) (4.6.3)\n",
+      "Building wheels for collected packages: jbrowse-jupyter\n",
+      "  Building wheel for jbrowse-jupyter (setup.py) ... \u001b[?25ldone\n",
+      "\u001b[?25h  Created wheel for jbrowse-jupyter: filename=jbrowse_jupyter-1.2.1-py3-none-any.whl size=23012 sha256=dc06962e969611682d804c0be04df525f0ddaf4de081e7ff81ca334a6ad8ef75\n",
+      "  Stored in directory: /private/var/folders/96/hq94_1qd3c9_q87bwqhg05s80000gn/T/pip-ephem-wheel-cache-_0jqacx4/wheels/a5/b8/b6/451f32abe96728b448365b4289261b6a436d79dd1ace71c4f1\n",
+      "Successfully built jbrowse-jupyter\n",
+      "Installing collected packages: dash, dash-jbrowse, jbrowse-jupyter\n",
+      "  Attempting uninstall: dash\n",
+      "    Found existing installation: dash 2.1.0\n",
+      "    Uninstalling dash-2.1.0:\n",
+      "      Successfully uninstalled dash-2.1.0\n",
+      "  Attempting uninstall: dash-jbrowse\n",
+      "    Found existing installation: dash-jbrowse 1.0.0\n",
+      "    Uninstalling dash-jbrowse-1.0.0:\n",
+      "      Successfully uninstalled dash-jbrowse-1.0.0\n",
+      "Successfully installed dash-2.0.0 dash-jbrowse-1.0.1 jbrowse-jupyter-1.2.1\n",
+      "\u001b[33mWARNING: You are using pip version 21.3.1; however, version 22.0.3 is available.\n",
+      "You should consider upgrading via the '/Users/teresamartinez/opt/anaconda3/bin/python -m pip install --upgrade pip' command.\u001b[0m\n"
+     ]
+    }
+   ],
+   "source": [
+    "!pip install git+https://github.com/GMOD/jbrowse-jupyter.git@main"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -12,16 +111,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
-    "hg38 = create('view', genome='hg38')"
+    "hg38 = create('LGV', genome='hg38')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
@@ -45,13 +144,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
      "output_type": "display_data",
      "data": {
-      "text/plain": "<IPython.lib.display.IFrame at 0x7f89817c0940>",
+      "text/plain": "<IPython.lib.display.IFrame at 0x7fac089d0438>",
       "text/html": "\n        <iframe\n            width=\"100%\"\n            height=\"300\"\n            src=\"http://127.0.0.1:3003/\"\n            frameborder=\"0\"\n            allowfullscreen\n        ></iframe>\n        "
      },
      "metadata": {}
@@ -61,12 +160,12 @@
     "hg38.set_location(\"10:100..350\")\n",
     "hg38.set_default_session(['df_track_id'], False)\n",
     "new_conf = hg38.get_config()\n",
-    "launch(new_conf, component_id=\"new-test\", port=3003)"
+    "launch(new_conf, port=3003)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -86,13 +185,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [
     {
      "output_type": "display_data",
      "data": {
-      "text/plain": "<IPython.lib.display.IFrame at 0x7f89e1d79d30>",
+      "text/plain": "<IPython.lib.display.IFrame at 0x7fabc80d3668>",
       "text/html": "\n        <iframe\n            width=\"100%\"\n            height=\"800\"\n            src=\"http://127.0.0.1:8000/\"\n            frameborder=\"0\"\n            allowfullscreen\n        ></iframe>\n        "
      },
      "metadata": {}
@@ -104,7 +203,7 @@
     "hg38.set_default_session(['gff-demo', 'bigbed'],False)\n",
     "hg38.set_location(\"1:110654228..110936130\")\n",
     "new_conf2 = hg38.get_config()\n",
-    "launch(new_conf2, component_id=\"new-test2\", height=800, dash_comp=\"LGV\", port=8000)"
+    "launch(new_conf2, id=\"test-2\",height=800, dash_comp=\"LGV\", port=8000)"
    ]
   },
   {
diff --git a/browser.py b/browser.py
index c92f173..1121934 100644
--- a/browser.py
+++ b/browser.py
@@ -1,11 +1,11 @@
-import dash
-import dash_html_components as html
+from dash import html, Dash
 from jbrowse_jupyter import create, create_component
 
-app = dash.Dash(__name__)
+app = Dash(__name__)
 
 # create config and pass additional params
-jbrowse_conf = create("config")
+# creates an empty LGV by default when no params are passed
+jbrowse_conf = create()
 aliases = ["hg38"]
 ref_name_aliases = {
     "adapter": {
@@ -43,7 +43,7 @@
 jbrowse_conf.set_default_session(["test-track"])
 # create a dash component
 
-component = create_component(config, dash_comp="LGV")
+component = create_component(config)
 
 # launch the component
 app.layout = html.Div(
diff --git a/cgv_examples.ipynb b/cgv_examples.ipynb
new file mode 100644
index 0000000..8abc650
--- /dev/null
+++ b/cgv_examples.ipynb
@@ -0,0 +1,89 @@
+{
+ "metadata": {
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.12-final"
+  },
+  "orig_nbformat": 2,
+  "kernelspec": {
+   "name": "python3",
+   "display_name": "Python 3.8.12 64-bit ('jbrowse-jupyter': conda)",
+   "metadata": {
+    "interpreter": {
+     "hash": "dc9fc419d624b95bc9cc0bd84733299ab39c72ed5f2a2912fba5b902d66850aa"
+    }
+   }
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from jbrowse_jupyter import launch, create"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# creates an empty CircularGenome View JBrowseConfig\n",
+    "browser = create(\"CGV\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "browser.set_assembly(\"https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz\",aliases=[\"GRCh37\"])\n",
+    "browser.add_track(\"https://s3.amazonaws.com/jbrowse.org/genomes/hg19/pacbio/hs37d5.HG002-SequelII-CCS.bnd-only.sv.vcf.gz\", track_id=\"variantTest\",overwrite=True)\n",
+    "browser.set_default_session([\"variantTest\"], False)\n",
+    "cgv_conf = browser.get_config()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "output_type": "display_data",
+     "data": {
+      "text/plain": "<IPython.lib.display.IFrame at 0x7fa55856a040>",
+      "text/html": "\n        <iframe\n            width=\"100%\"\n            height=\"400\"\n            src=\"http://127.0.0.1:8002/\"\n            frameborder=\"0\"\n            allowfullscreen\n            \n        ></iframe>\n        "
+     },
+     "metadata": {}
+    }
+   ],
+   "source": [
+    "launch(cgv_conf,dash_comp=\"CGV\",height=400, port=8002)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "browser2 = create(\"CGV\", genome=\"hg38\")\n",
+    "launch(browser2.get_config(), dash_comp=\"CGV\")"
+   ]
+  }
+ ]
+}
\ No newline at end of file
diff --git a/cgv_examples.py b/cgv_examples.py
new file mode 100644
index 0000000..8de31b6
--- /dev/null
+++ b/cgv_examples.py
@@ -0,0 +1,119 @@
+from dash import html, Dash
+from jbrowse_jupyter import create, create_component
+
+app = Dash(__name__)
+base = "https://jbrowse.org/genomes/hg19/fasta/"
+base2 = "https://s3.amazonaws.com/jbrowse.org/genomes/hg19/"
+file_name = 'hs37d5.HG002-SequelII-CCS.bnd-only.sv.vcf.gz'
+
+my_assembly = {
+    "name": "hg19",
+    "aliases": ["GRCh37"],
+    "sequence": {
+        "type": "ReferenceSequenceTrack",
+        "trackId": "Pd8Wh30ei9R",
+        "adapter": {
+            "type": "BgzipFastaAdapter",
+            "fastaLocation": {
+                "uri": f'{base}hg19.fa.gz',
+                "locationType": 'UriLocation',
+            },
+            "faiLocation": {
+                "uri": f'{base}hg19.fa.gz.fai',
+                "locationType": 'UriLocation',
+            },
+            "gziLocation": {
+                "uri": f'{base}fasta/hg19.fa.gz.gzi',
+                "locationType": 'UriLocation',
+            },
+        },
+    },
+    "refNameAliases": {
+        "adapter": {
+            "type": "RefNameAliasAdapter",
+            "location": {
+                "uri": f'{base2}hg19_aliases.txt',
+                "locationType": 'UriLocation',
+            },
+        },
+    },
+}
+my_tracks = [
+    {
+        "type": "VariantTrack",
+        "trackId": "pacbio_sv_vcf",
+        "name": "HG002 Pacbio SV (VCF)",
+        "assemblyNames": ["hg19"],
+        "category": ["GIAB"],
+        "adapter": {
+            "type": "VcfTabixAdapter",
+            "vcfGzLocation": {
+                "uri": f'{base2}pacbio/{file_name}',
+                "locationType": 'UriLocation',
+            },
+            "index": {
+                "location": {
+                    "uri": f'{base2}pacbio/{file_name}.tbi',
+                    "locationType": 'UriLocation',
+                },
+            },
+        },
+    },
+]
+my_default_session = {
+    "name": "My session",
+    "view": {
+        "id": "circularView",
+        "type": "CircularView",
+        "bpPerPx": 5000000,
+        "tracks": [{
+            "id": 'uPdLKHik1',
+            "type": 'VariantTrack',
+            "configuration": 'pacbio_sv_vcf',
+            "displays": [
+                {
+                    "id": 'v9QVAR3oaB',
+                    "type": 'ChordVariantDisplay',
+                    "configuration": 'pacbio_sv_vcf-ChordVariantDisplay',
+                },
+            ],
+        }],
+    },
+}
+
+# ===== Aproach 1 ======
+
+# Creating my own conf obj to use when creating a JBrowseConfig
+config = {
+    "assembly": my_assembly,
+    "defaultSession": my_default_session,
+    "tracks": my_tracks
+}
+cgv_with_conf = create(view_type="CGV", conf=config)
+component = create_component(cgv_with_conf.get_config(), dash_comp="CGV")
+# ===== Aproach 2 ======
+
+# Using one of the provided default genomes
+cvg_default = create("CGV", genome="hg19").get_config()
+component2 = create_component(cvg_default, id="test2", dash_comp="CGV")
+
+
+# ===== Aproach 3 ======
+
+# Using the JBrowseConfig API to build a CGV conf from scratch
+cgv_with_api = create(view_type="CGV")
+cgv_with_api.set_assembly(f'{base}hg19.fa.gz', aliases=["GRCh37"])
+cgv_with_api.add_track(f'{base2}pacbio/{file_name}', track_id="variantTest")
+cgv_with_api.set_default_session(["variantTest"], False)
+# cgv_with_api.set_theme("#311b92", "#0097a7", "#f57c00", "#d50000")
+cgv3 = cgv_with_api.get_config()
+component3 = create_component(cgv3, id="test3", dash_comp="CGV")
+
+# 3 different ways to configure, 3 identical components
+app.layout = html.Div(
+    [component, component2, component3],
+    id='test'
+)
+
+if __name__ == "__main__":
+    app.run_server(port=3003, debug=True)
diff --git a/docs/docs/doctrees/contact.doctree b/docs/docs/doctrees/contact.doctree
index 4a0c612..1d3bd01 100644
Binary files a/docs/docs/doctrees/contact.doctree and b/docs/docs/doctrees/contact.doctree differ
diff --git a/docs/docs/doctrees/environment.pickle b/docs/docs/doctrees/environment.pickle
index cb16238..a32cecd 100644
Binary files a/docs/docs/doctrees/environment.pickle and b/docs/docs/doctrees/environment.pickle differ
diff --git a/docs/docs/doctrees/index.doctree b/docs/docs/doctrees/index.doctree
index 2fa78c6..308ebf8 100644
Binary files a/docs/docs/doctrees/index.doctree and b/docs/docs/doctrees/index.doctree differ
diff --git a/docs/docs/doctrees/installation.doctree b/docs/docs/doctrees/installation.doctree
index 10f63c1..4c0e4ea 100644
Binary files a/docs/docs/doctrees/installation.doctree and b/docs/docs/doctrees/installation.doctree differ
diff --git a/docs/docs/doctrees/jbrowse_jupyter.doctree b/docs/docs/doctrees/jbrowse_jupyter.doctree
index ba2867d..6420372 100644
Binary files a/docs/docs/doctrees/jbrowse_jupyter.doctree and b/docs/docs/doctrees/jbrowse_jupyter.doctree differ
diff --git a/docs/docs/doctrees/modules.doctree b/docs/docs/doctrees/modules.doctree
index cf2e01f..14590d2 100644
Binary files a/docs/docs/doctrees/modules.doctree and b/docs/docs/doctrees/modules.doctree differ
diff --git a/docs/docs/doctrees/quickstart.doctree b/docs/docs/doctrees/quickstart.doctree
index e1c0f32..67d5ab1 100644
Binary files a/docs/docs/doctrees/quickstart.doctree and b/docs/docs/doctrees/quickstart.doctree differ
diff --git a/docs/docs/doctrees/tutorial.doctree b/docs/docs/doctrees/tutorial.doctree
index 60500b5..cdaf3e0 100644
Binary files a/docs/docs/doctrees/tutorial.doctree and b/docs/docs/doctrees/tutorial.doctree differ
diff --git a/docs/docs/doctrees/util.doctree b/docs/docs/doctrees/util.doctree
index 6e1764a..ceacfef 100644
Binary files a/docs/docs/doctrees/util.doctree and b/docs/docs/doctrees/util.doctree differ
diff --git a/docs/docs/html/_images/quickstart.png b/docs/docs/html/_images/quickstart.png
index d2ab4e6..c7428db 100644
Binary files a/docs/docs/html/_images/quickstart.png and b/docs/docs/html/_images/quickstart.png differ
diff --git a/docs/docs/html/_images/quickstart2.png b/docs/docs/html/_images/quickstart2.png
new file mode 100644
index 0000000..93d3d43
Binary files /dev/null and b/docs/docs/html/_images/quickstart2.png differ
diff --git a/docs/docs/html/_sources/installation.md.txt b/docs/docs/html/_sources/installation.md.txt
index a26355b..d92b793 100644
--- a/docs/docs/html/_sources/installation.md.txt
+++ b/docs/docs/html/_sources/installation.md.txt
@@ -12,14 +12,17 @@ Clone the GMOD/jbrowse-jupyter [repository](https://github.com/GMOD/jbrowse-jupy
 to create a conda envirnment and install the dependecies.
 ```
 $ cd jbrowse-jupyter
-$ conda create -n myenv python=3.8
+$ conda create -n myenv python=3.6
 $ conda activate myenv
 $ pip install -r requirements.txt
 ```
-You can find two examples in the root of the directory. 
-`browser.py` or the `browser.ipynb`
+You can find examples in the root of the directory. 
+* LGV - `browser.py` or the `browser.ipynb`
+* CGV - `cgv_examples.py` or `cgv_examples.ipynb`
 
 `browser.py` uses the Dash library to create a python application with the Dash JBrowse LinearGenomeView component and configured with the help of this package. `browser.ipynb` is jupyter notebook using the JupyterDash library to embed a Dash JBrowse LinearGenomeView component in a cell.
+`cgv_examples.py` a Dash application using the Dash JBrowse CircularGenomeView component
+`cgv_examples.ipynb` is jupyter notebook using the JupyterDash library to embed a Dash JBrowse CircularGenomeView component in a cell.
 
 To run the Python Dash application
 ```
@@ -43,4 +46,7 @@ For more information about Dash and Dash applications check out these articles.
 * [Dash Applications](https://dash.plotly.com/layout) how to get started to custumize Dash applications.
 * [Dash HTML components](https://dash.plotly.com/dash-html-components) Dash html components to build the Dash aplication layout.
 * [DashJupyter](https://github.com/plotly/jupyter-dash) library to enable embedding Dash components in jupyter notebooks.
-* [DashJbrowse](https://github.com/GMOD/dash_jbrowse) suite of Dash components for JBrowse views. (JBrowse Linear Genome View)
+* [DashJbrowse](https://github.com/GMOD/dash_jbrowse) suite of Dash components for JBrowse views. (JBrowse Linear Genome View and JBrowse Circular Genome View)
+* [JBrowse Docs](https://jbrowse.org/jb2/)
+* [JBrowse Config Guide](https://jbrowse.org/jb2/docs/config_guide/)
+* [JBrowse Views](https://jbrowse.org/jb2/download/#embedded-components)
diff --git a/docs/docs/html/_sources/quickstart.md.txt b/docs/docs/html/_sources/quickstart.md.txt
index 3676bb5..4477d23 100644
--- a/docs/docs/html/_sources/quickstart.md.txt
+++ b/docs/docs/html/_sources/quickstart.md.txt
@@ -19,9 +19,13 @@ Using the package, we can create a Dash JBrowse LinearGenomeView  to embed in a
     - for further customization of the config, check functions that the JBrowseConfig provides
 3. Use the `launch` utility function with the hg38 config to create and launch a Dash JBrowse Linear Genome View in a jupyter notebook cell.
 
+
 ![Launching hg38 LGV in python notebook](./images/quickstart.png)
 *Launching a Linear Genome View in Jupyter Notebook*
 
+
+![Launching hg19 CGV in python notebook](./images/quickstart2.png)
+*Launching a Circular Genome View in Jupyter Notebook*
 ### Python Dash Application
 
 1. Import the package's `create` and  `create_component`
@@ -36,7 +40,7 @@ from jbrowse_jupyter import create, create_component
 
 app = dash.Dash(__name__)
 
-jbrowse_conf = create("view", genome="hg38")
+jbrowse_conf = create("LGV", genome="hg38")
 
 config = jbrowse_conf.get_config()
 
diff --git a/docs/docs/html/_sources/tutorial.md.txt b/docs/docs/html/_sources/tutorial.md.txt
index 270e1d2..8ed5f40 100644
--- a/docs/docs/html/_sources/tutorial.md.txt
+++ b/docs/docs/html/_sources/tutorial.md.txt
@@ -2,4 +2,7 @@
 
 More in depth tutorials
 * [Colab Jupyter Notebook Tutorial](https://colab.research.google.com/github/GMOD/jbrowse-jupyter/blob/main/browser.ipynb)
-* [Python Dash Application](https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.py)
+* [Python Dash Application with LGV](https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.py)
+* [Python Dash Application with CGV](https://github.com/GMOD/jbrowse-jupyter/blob/main/cgv_examples.py)
+* [Notebook Examples LGV](https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.ipynb)
+* [Notebook Examples CGV](https://github.com/GMOD/jbrowse-jupyter/blob/main/cgv_examples.py)
diff --git a/docs/docs/html/_static/basic.css b/docs/docs/html/_static/basic.css
index 603f6a8..bf18350 100644
--- a/docs/docs/html/_static/basic.css
+++ b/docs/docs/html/_static/basic.css
@@ -4,7 +4,7 @@
  *
  * Sphinx stylesheet -- basic theme.
  *
- * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -757,6 +757,7 @@ span.pre {
     -ms-hyphens: none;
     -webkit-hyphens: none;
     hyphens: none;
+    white-space: nowrap;
 }
 
 div[class*="highlight-"] {
diff --git a/docs/docs/html/_static/doctools.js b/docs/docs/html/_static/doctools.js
index 8cbf1b1..e509e48 100644
--- a/docs/docs/html/_static/doctools.js
+++ b/docs/docs/html/_static/doctools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for all documentation.
  *
- * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -264,6 +264,9 @@ var Documentation = {
   hideSearchWords : function() {
     $('#searchbox .highlight-link').fadeOut(300);
     $('span.highlighted').removeClass('highlighted');
+    var url = new URL(window.location);
+    url.searchParams.delete('highlight');
+    window.history.replaceState({}, '', url);
   },
 
   /**
diff --git a/docs/docs/html/_static/documentation_options.js b/docs/docs/html/_static/documentation_options.js
index b6b4b41..120e3ee 100644
--- a/docs/docs/html/_static/documentation_options.js
+++ b/docs/docs/html/_static/documentation_options.js
@@ -1,6 +1,6 @@
 var DOCUMENTATION_OPTIONS = {
     URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
-    VERSION: '0.0.3',
+    VERSION: '1.2.1',
     LANGUAGE: 'None',
     COLLAPSE_INDEX: false,
     BUILDER: 'html',
diff --git a/docs/docs/html/_static/language_data.js b/docs/docs/html/_static/language_data.js
index 863704b..ebe2f03 100644
--- a/docs/docs/html/_static/language_data.js
+++ b/docs/docs/html/_static/language_data.js
@@ -5,7 +5,7 @@
  * This script contains the language-specific data used by searchtools.js,
  * namely the list of stopwords, stemmer, scorer and splitter.
  *
- * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
diff --git a/docs/docs/html/_static/pygments.css b/docs/docs/html/_static/pygments.css
index 582d5c3..08bec68 100644
--- a/docs/docs/html/_static/pygments.css
+++ b/docs/docs/html/_static/pygments.css
@@ -5,22 +5,22 @@ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5
 span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight .hll { background-color: #ffffcc }
 .highlight { background: #f8f8f8; }
-.highlight .c { color: #408080; font-style: italic } /* Comment */
+.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
 .highlight .err { border: 1px solid #FF0000 } /* Error */
 .highlight .k { color: #008000; font-weight: bold } /* Keyword */
 .highlight .o { color: #666666 } /* Operator */
-.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
-.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
-.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
-.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
+.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #9C6500 } /* Comment.Preproc */
+.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
 .highlight .gd { color: #A00000 } /* Generic.Deleted */
 .highlight .ge { font-style: italic } /* Generic.Emph */
-.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gr { color: #E40000 } /* Generic.Error */
 .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
-.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gi { color: #008400 } /* Generic.Inserted */
+.highlight .go { color: #717171 } /* Generic.Output */
 .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
 .highlight .gs { font-weight: bold } /* Generic.Strong */
 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
@@ -33,15 +33,15 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
 .highlight .kt { color: #B00040 } /* Keyword.Type */
 .highlight .m { color: #666666 } /* Literal.Number */
 .highlight .s { color: #BA2121 } /* Literal.String */
-.highlight .na { color: #7D9029 } /* Name.Attribute */
+.highlight .na { color: #687822 } /* Name.Attribute */
 .highlight .nb { color: #008000 } /* Name.Builtin */
 .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
 .highlight .no { color: #880000 } /* Name.Constant */
 .highlight .nd { color: #AA22FF } /* Name.Decorator */
-.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
-.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
 .highlight .nf { color: #0000FF } /* Name.Function */
-.highlight .nl { color: #A0A000 } /* Name.Label */
+.highlight .nl { color: #767600 } /* Name.Label */
 .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
 .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
 .highlight .nv { color: #19177C } /* Name.Variable */
@@ -58,11 +58,11 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
 .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
 .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
 .highlight .s2 { color: #BA2121 } /* Literal.String.Double */
-.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
 .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
-.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
 .highlight .sx { color: #008000 } /* Literal.String.Other */
-.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
+.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
 .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
 .highlight .ss { color: #19177C } /* Literal.String.Symbol */
 .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
diff --git a/docs/docs/html/_static/searchtools.js b/docs/docs/html/_static/searchtools.js
index 002e9c4..2d77859 100644
--- a/docs/docs/html/_static/searchtools.js
+++ b/docs/docs/html/_static/searchtools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for the full-text search.
  *
- * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
diff --git a/docs/docs/html/installation.html b/docs/docs/html/installation.html
index 0c071f3..9f30b1b 100644
--- a/docs/docs/html/installation.html
+++ b/docs/docs/html/installation.html
@@ -87,14 +87,19 @@ <h2>Install with conda<a class="headerlink" href="#install-with-conda" title="Pe
 <p>Clone the GMOD/jbrowse-jupyter <a class="reference external" href="https://github.com/GMOD/jbrowse-jupyter">repository</a> and <a class="reference external" href="https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html">install conda</a>. Once you have conda installed, follow the steps found below
 to create a conda envirnment and install the dependecies.</p>
 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ cd jbrowse-jupyter
-$ conda create -n myenv python=3.8
+$ conda create -n myenv python=3.6
 $ conda activate myenv
 $ pip install -r requirements.txt
 </pre></div>
 </div>
-<p>You can find two examples in the root of the directory.
-<code class="docutils literal notranslate"><span class="pre">browser.py</span></code> or the <code class="docutils literal notranslate"><span class="pre">browser.ipynb</span></code></p>
-<p><code class="docutils literal notranslate"><span class="pre">browser.py</span></code> uses the Dash library to create a python application with the Dash JBrowse LinearGenomeView component and configured with the help of this package. <code class="docutils literal notranslate"><span class="pre">browser.ipynb</span></code> is jupyter notebook using the JupyterDash library to embed a Dash JBrowse LinearGenomeView component in a cell.</p>
+<p>You can find examples in the root of the directory.</p>
+<ul class="simple">
+<li><p>LGV - <code class="docutils literal notranslate"><span class="pre">browser.py</span></code> or the <code class="docutils literal notranslate"><span class="pre">browser.ipynb</span></code></p></li>
+<li><p>CGV - <code class="docutils literal notranslate"><span class="pre">cgv_examples.py</span></code> or <code class="docutils literal notranslate"><span class="pre">cgv_examples.ipynb</span></code></p></li>
+</ul>
+<p><code class="docutils literal notranslate"><span class="pre">browser.py</span></code> uses the Dash library to create a python application with the Dash JBrowse LinearGenomeView component and configured with the help of this package. <code class="docutils literal notranslate"><span class="pre">browser.ipynb</span></code> is jupyter notebook using the JupyterDash library to embed a Dash JBrowse LinearGenomeView component in a cell.
+<code class="docutils literal notranslate"><span class="pre">cgv_examples.py</span></code> a Dash application using the Dash JBrowse CircularGenomeView component
+<code class="docutils literal notranslate"><span class="pre">cgv_examples.ipynb</span></code> is jupyter notebook using the JupyterDash library to embed a Dash JBrowse CircularGenomeView component in a cell.</p>
 <p>To run the Python Dash application</p>
 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ python browser.py
 </pre></div>
@@ -115,7 +120,10 @@ <h2>Resources<a class="headerlink" href="#resources" title="Permalink to this he
 <li><p><a class="reference external" href="https://dash.plotly.com/layout">Dash Applications</a> how to get started to custumize Dash applications.</p></li>
 <li><p><a class="reference external" href="https://dash.plotly.com/dash-html-components">Dash HTML components</a> Dash html components to build the Dash aplication layout.</p></li>
 <li><p><a class="reference external" href="https://github.com/plotly/jupyter-dash">DashJupyter</a> library to enable embedding Dash components in jupyter notebooks.</p></li>
-<li><p><a class="reference external" href="https://github.com/GMOD/dash_jbrowse">DashJbrowse</a> suite of Dash components for JBrowse views. (JBrowse Linear Genome View)</p></li>
+<li><p><a class="reference external" href="https://github.com/GMOD/dash_jbrowse">DashJbrowse</a> suite of Dash components for JBrowse views. (JBrowse Linear Genome View and JBrowse Circular Genome View)</p></li>
+<li><p><a class="reference external" href="https://jbrowse.org/jb2/">JBrowse Docs</a></p></li>
+<li><p><a class="reference external" href="https://jbrowse.org/jb2/docs/config_guide/">JBrowse Config Guide</a></p></li>
+<li><p><a class="reference external" href="https://jbrowse.org/jb2/download/#embedded-components">JBrowse Views</a></p></li>
 </ul>
 </section>
 </section>
diff --git a/docs/docs/html/jbrowse_jupyter.html b/docs/docs/html/jbrowse_jupyter.html
index d52f2f7..e853833 100644
--- a/docs/docs/html/jbrowse_jupyter.html
+++ b/docs/docs/html/jbrowse_jupyter.html
@@ -78,11 +78,13 @@
 <span id="jbrowseconfig-api"></span><h1>JBrowseConfig API<a class="headerlink" href="#module-jbrowse_jupyter.jbrowse_config" title="Permalink to this headline"></a></h1>
 <dl class="py class">
 <dt class="sig sig-object py" id="jbrowse_jupyter.jbrowse_config.JBrowseConfig">
-<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">JBrowseConfig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">conf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#jbrowse_jupyter.jbrowse_config.JBrowseConfig" title="Permalink to this definition"></a></dt>
-<dd><p>Creates Browse configuration objects.
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">JBrowseConfig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">view</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'LGV'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">conf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#jbrowse_jupyter.jbrowse_config.JBrowseConfig" title="Permalink to this definition"></a></dt>
+<dd><p>Creates JBrowse configuration objects.
 Currently supporting configuration objects for the
-React JBrowse Linear Genome View
-<a class="reference external" href="https://jbrowse.org/storybook/lgv/main">https://jbrowse.org/storybook/lgv/main</a></p>
+React JBrowse Linear Genome View and React JBrowse
+Circular Genome View
+<a class="reference external" href="https://jbrowse.org/storybook/lgv/main">https://jbrowse.org/storybook/lgv/main</a>
+<a class="reference external" href="https://jbrowse.org/storybook/cgv/main/">https://jbrowse.org/storybook/cgv/main/</a></p>
 <dl class="py method">
 <dt class="sig sig-object py" id="jbrowse_jupyter.jbrowse_config.JBrowseConfig.add_df_track">
 <span class="sig-name descname"><span class="pre">add_df_track</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">track_data</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#jbrowse_jupyter.jbrowse_config.JBrowseConfig.add_df_track" title="Permalink to this definition"></a></dt>
@@ -108,6 +110,7 @@
 <dd class="field-even"><ul class="simple">
 <li><p><strong>Exception</strong> – if assembly has not been configured.</p></li>
 <li><p><strong>TypeError</strong> – if track data is invalid</p></li>
+<li><p><strong>TypeError</strong> – if view is not LGV</p></li>
 <li><p><strong>TypeError</strong> – if track with that trackId already exists
 list of tracks</p></li>
 </ul>
@@ -118,7 +121,8 @@
 <dl class="py method">
 <dt class="sig sig-object py" id="jbrowse_jupyter.jbrowse_config.JBrowseConfig.add_text_search_adapter">
 <span class="sig-name descname"><span class="pre">add_text_search_adapter</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">ix_path</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ixx_path</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">meta_path</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">adapter_id</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#jbrowse_jupyter.jbrowse_config.JBrowseConfig.add_text_search_adapter" title="Permalink to this definition"></a></dt>
-<dd><p>Adds an aggregate trix text search adapter.</p>
+<dd><p>Adds an aggregate trix text search adapter.
+Currently not available for Circular Genome View</p>
 <p>e.g:
 add_text_search_adapter(“url/file.ix”, url/file.ixx”,
 “url/meta.json”)</p>
@@ -137,6 +141,7 @@
 <li><p><strong>TypeError</strong> – if adapter with same adapter id
 is already configured</p></li>
 <li><p><strong>TypeError</strong> – local files are not supported</p></li>
+<li><p><strong>TypeError</strong> – if view is CGV</p></li>
 </ul>
 </dd>
 </dl>
@@ -182,8 +187,8 @@
 <dd><p>Returns the configuration object of the JBrowseConfig
 instance. This object can then be passed to launch or
 create_component to launch or create a Dash JBrowse
-component (currently only supporting LinearGenomeView)</p>
-<p>e.g: create(“view”, genome=”hg19”).get_config()</p>
+component</p>
+<p>e.g: create(“LGV”, genome=”hg19”).get_config()</p>
 <dl class="field-list simple">
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>returns configuration object</p>
@@ -260,6 +265,9 @@
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><p><strong>location</strong> (<em>str</em>) – location, syntax ‘refName:start-end’</p>
 </dd>
+<dt class="field-even">Raises</dt>
+<dd class="field-even"><p><strong>TypeError</strong> – if view is CGV, location not supported in CGV</p>
+</dd>
 </dl>
 </dd></dl>
 
diff --git a/docs/docs/html/quickstart.html b/docs/docs/html/quickstart.html
index 01d8c49..5da2e0f 100644
--- a/docs/docs/html/quickstart.html
+++ b/docs/docs/html/quickstart.html
@@ -96,6 +96,8 @@ <h2>Jupyter Notebook<a class="headerlink" href="#jupyter-notebook" title="Permal
 </ol>
 <p><img alt="Launching hg38 LGV in python notebook" src="_images/quickstart.png" />
 <em>Launching a Linear Genome View in Jupyter Notebook</em></p>
+<p><img alt="Launching hg19 CGV in python notebook" src="_images/quickstart2.png" />
+<em>Launching a Circular Genome View in Jupyter Notebook</em></p>
 </section>
 <section id="python-dash-application">
 <h2>Python Dash Application<a class="headerlink" href="#python-dash-application" title="Permalink to this headline"></a></h2>
@@ -114,7 +116,7 @@ <h2>Python Dash Application<a class="headerlink" href="#python-dash-application"
 
 <span class="n">app</span> <span class="o">=</span> <span class="n">dash</span><span class="o">.</span><span class="n">Dash</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
 
-<span class="n">jbrowse_conf</span> <span class="o">=</span> <span class="n">create</span><span class="p">(</span><span class="s2">&quot;view&quot;</span><span class="p">,</span> <span class="n">genome</span><span class="o">=</span><span class="s2">&quot;hg38&quot;</span><span class="p">)</span>
+<span class="n">jbrowse_conf</span> <span class="o">=</span> <span class="n">create</span><span class="p">(</span><span class="s2">&quot;LGV&quot;</span><span class="p">,</span> <span class="n">genome</span><span class="o">=</span><span class="s2">&quot;hg38&quot;</span><span class="p">)</span>
 
 <span class="n">config</span> <span class="o">=</span> <span class="n">jbrowse_conf</span><span class="o">.</span><span class="n">get_config</span><span class="p">()</span>
 
diff --git a/docs/docs/html/searchindex.js b/docs/docs/html/searchindex.js
index aaa7b12..817602f 100644
--- a/docs/docs/html/searchindex.js
+++ b/docs/docs/html/searchindex.js
@@ -1,1 +1,1 @@
-Search.setIndex({docnames:["contact","index","installation","jbrowse_jupyter","modules","quickstart","tutorial","util"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["contact.md","index.rst","installation.md","jbrowse_jupyter.rst","modules.rst","quickstart.md","tutorial.md","util.rst"],objects:{"jbrowse_jupyter.jbrowse_config":[[3,1,1,"","JBrowseConfig"]],"jbrowse_jupyter.jbrowse_config.JBrowseConfig":[[3,2,1,"","add_df_track"],[3,2,1,"","add_text_search_adapter"],[3,2,1,"","add_track"],[3,2,1,"","get_config"],[3,2,1,"","set_assembly"],[3,2,1,"","set_default_session"],[3,2,1,"","set_location"],[3,2,1,"","set_theme"]],"jbrowse_jupyter.util":[[7,3,1,"","create_component"],[7,3,1,"","launch"]],jbrowse_jupyter:[[3,0,0,"-","jbrowse_config"],[7,0,0,"-","util"]]},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"0097a7":3,"1":3,"2":5,"3":2,"311b92":3,"4":3,"8":2,"8081":5,"90":3,"boolean":3,"class":3,"default":[3,5,7],"function":5,"import":5,"int":[3,7],"new":0,"return":[3,7],"true":[3,5],For:[2,3,5],If:3,It:5,The:5,To:2,__main__:5,__name__:5,about:[2,5],accept:3,activ:2,adapt:3,adapter_id:3,add:3,add_df_track:3,add_text_search_adapt:3,add_track:3,aggreg:3,ajax:0,alias:3,alreadi:3,also:[3,5],an:[0,3,7],ani:0,api:[1,4,5],aplic:2,app:[5,7],applic:[1,2,6],ar:[0,3],articl:2,assembl:[3,5],assembly_data:3,assum:3,bai:3,bam:3,been:3,below:[2,5],bgzip:3,brows:3,browser:[2,3],bug:0,build:[0,2],can:[2,3,5],cd:2,cell:[2,5],chat:0,check:[2,3,5],checkout:5,choos:7,chr1:3,clone:2,colab:6,color:3,column:3,com:0,compon:[1,2,3,4,5],conda:1,conf:[3,7],config:[3,5],config_guid:3,configur:[2,3,5,7],contact:1,creat:[1,2,3,4,5],create_compon:[3,5,7],current:[3,5],custom:[3,5],custum:2,d50000:3,dash:[1,2,3,6,7],dash_html_compon:5,dashjbrows:2,dashjupyt:2,data:[3,5],datafram:3,debug:5,dependeci:2,depth:6,develop:0,df:3,directori:[2,3,5],displai:3,display_assembl:3,div:5,doc:3,e:3,els:3,email:0,emb:[2,5],embed:2,enabl:2,end:3,envirn:2,environ:2,exampl:[2,5],except:3,exist:3,f57c00:3,facilit:5,fai:3,fals:3,fasta:3,featur:[0,3],file:3,filenam:3,find:2,first:[3,5],flag:3,follow:2,found:[2,3],from:[3,5,7],further:5,g:3,gener:3,genom:[2,3,5,7],get:2,get_config:[3,5,7],github:0,gitter:0,given:[3,7],gmod:[0,2],gz:3,gzi:3,ha:3,have:[0,2,3],height:7,help:[2,7],here:5,hexadecim:3,hg19:[3,5,7],hg38:[5,7],how:2,html:[2,5],http:[0,3],id:[3,5,7],im:0,index:[1,3],inform:[2,5],initi:3,instal:[1,5],instanc:[3,7],interfac:5,invalid:3,ipynb:2,issu:0,ix:3,ix_path:3,ixx:3,ixx_path:3,jb2:3,jbrows:[0,2,3,5,7],jbrowse2:0,jbrowse_conf:5,jbrowse_jupyt:5,jbrowseconfig:[1,4,5,7],jbrowseconfigur:7,join:0,json:3,jupyt:[0,2,6],jupyterdash:[2,7],jupyterlab:2,kwarg:[3,5,7],launch:[3,5,7],layout:[2,5],lgv:3,librari:2,linear:[2,3,5,7],lineargenomeview:[2,3,5,7],list:[0,3],load:3,local:3,locat:3,love:0,mail:0,main:3,make:2,meta:3,meta_path:3,method:5,more:[2,5,6],myenv:2,n:2,name:3,net:0,none:3,notebook:[1,2,6],obj:[3,7],object:[3,5,7],onc:2,one:5,onli:3,option:[3,7],org:3,other:5,our:[0,3,5],out:[0,2,3],overwrit:3,packag:[2,5],page:1,palett:3,panda:3,paramet:[3,7],pass:[3,7],path:3,pip:[2,5],pleas:0,port:[5,7],present:3,primari:3,provid:[3,5],py:2,pypi:1,python:[1,2,6],quantit:3,quaternari:3,quickstart:1,r:2,rais:[3,7],reach:0,react:[3,5],realli:0,recogn:3,refer:[1,3],refnam:3,refname_alias:3,repo:5,report:0,repositori:2,request:0,requir:[2,3],resourc:1,root:2,run:[2,7],run_serv:5,s:5,same:3,score:3,search:[1,3],secondari:3,send:0,sequenc:3,server:7,session:3,set:3,set_assembl:3,set_default_sess:3,set_loc:3,set_them:3,sourceforg:0,specif:2,start:[2,3],state:5,step:2,storybook:3,str:[3,7],subconfigur:3,suit:2,support:3,sure:2,syntax:3,talk:0,tertiari:3,test:5,text:3,them:5,theme:3,thi:[2,3],thought:0,track:3,track_data:3,track_id2:3,track_id:3,track_nam:3,track_typ:3,trackid:3,tracks_id:3,trix:3,tutori:1,two:2,txt:2,type:[3,7],typeerror:[3,7],up:3,url:3,us:[1,2,3,5,7],user:0,util:[5,7],view:[2,3,5,7],view_typ:[5,7],we:[0,5],wether:3,what:0,when:[3,7],where:7,within:2,you:[0,2,5]},titles:["Contact us","Welcome to JBrowse Jupyter\u2019s documentation!","Installation","JBrowseConfig API","Reference","Quickstart","Tutorials","Creating components"],titleterms:{api:3,applic:5,compon:7,conda:2,contact:0,creat:7,dash:5,document:1,indic:1,instal:2,jbrows:1,jbrowseconfig:3,jupyt:[1,5],notebook:5,pypi:2,python:5,quickstart:5,refer:4,resourc:2,s:1,tabl:1,tutori:6,us:0,welcom:1}})
\ No newline at end of file
+Search.setIndex({docnames:["contact","index","installation","jbrowse_jupyter","modules","quickstart","tutorial","util"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["contact.md","index.rst","installation.md","jbrowse_jupyter.rst","modules.rst","quickstart.md","tutorial.md","util.rst"],objects:{"jbrowse_jupyter.jbrowse_config":[[3,1,1,"","JBrowseConfig"]],"jbrowse_jupyter.jbrowse_config.JBrowseConfig":[[3,2,1,"","add_df_track"],[3,2,1,"","add_text_search_adapter"],[3,2,1,"","add_track"],[3,2,1,"","get_config"],[3,2,1,"","set_assembly"],[3,2,1,"","set_default_session"],[3,2,1,"","set_location"],[3,2,1,"","set_theme"]],"jbrowse_jupyter.util":[[7,3,1,"","create_component"],[7,3,1,"","launch"]],jbrowse_jupyter:[[3,0,0,"-","jbrowse_config"],[7,0,0,"-","util"]]},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"0097a7":3,"1":3,"2":5,"3":2,"311b92":3,"4":3,"400":7,"6":2,"8002":7,"8081":5,"90":3,"boolean":3,"class":3,"default":[3,5,7],"function":5,"import":5,"int":[3,7],"new":0,"return":[3,7],"true":[3,5],For:[2,3,5],If:3,It:5,The:5,To:2,__main__:5,__name__:5,about:[2,5],accept:3,activ:2,adapt:3,adapter_id:3,add:3,add_df_track:3,add_text_search_adapt:3,add_track:3,aggreg:3,ajax:0,alias:3,alreadi:3,also:[3,5],an:[0,3,7],ani:0,api:[1,4,5],aplic:2,app:[5,7],applic:[1,2,6],ar:[0,3],articl:2,assembl:[3,5],assembly_data:3,assum:3,avail:3,bai:3,bam:3,been:3,below:[2,5],bgzip:3,browser:[2,3],bug:0,build:[0,2],can:[2,3,5],cd:2,cell:[2,5],cgv:[2,3,6,7],cgv_exampl:2,chat:0,check:[2,3,5],checkout:5,chr1:3,circular:[2,3,5],circulargenomeview:2,clone:2,colab:6,color:3,column:3,com:0,compon:[1,2,3,4,5],conda:1,conf:[3,7],config:[2,3,5,7],config_guid:3,configur:[2,3,5,7],contact:1,creat:[1,2,3,4,5],create_compon:[3,5,7],current:[3,5,7],custom:[3,5],custum:2,d50000:3,dash:[1,2,3,6,7],dash_comp:7,dash_html_compon:5,dashjbrows:2,dashjupyt:2,data:[3,5],datafram:3,debug:5,dependeci:2,depth:6,develop:0,df:3,directori:[2,3,5],displai:3,display_assembl:3,div:5,doc:[2,3],e:[3,7],els:3,email:0,emb:[2,5],embed:2,empti:7,enabl:2,end:3,envirn:2,environ:2,exampl:[2,5,6],except:3,exist:3,f57c00:3,facilit:5,fai:3,fals:3,fasta:3,featur:[0,3],file:3,filenam:3,find:2,first:[3,5],flag:3,follow:2,found:[2,3],from:[3,5,7],further:5,g:[3,7],gener:3,genom:[2,3,5,7],get:2,get_config:[3,5,7],github:0,gitter:0,given:[3,7],gmod:[0,2],guid:2,gz:3,gzi:3,ha:3,have:[0,2,3],height:7,help:[2,7],here:5,hexadecim:3,hg19:[3,5,7],hg38:[5,7],how:2,html:[2,5],http:[0,3],id:[3,5,7],im:0,index:[1,3],inform:[2,5],initi:3,instal:[1,5],instanc:[3,7],interfac:5,invalid:3,ipynb:2,issu:0,ix:3,ix_path:3,ixx:3,ixx_path:3,jb2:3,jbrows:[0,2,3,5,7],jbrowse2:0,jbrowse_conf:5,jbrowse_jupyt:5,jbrowseconfig:[1,4,5,7],jbrowseconfigur:7,join:0,json:3,jupyt:[0,2,6],jupyterdash:[2,7],jupyterlab:2,kwarg:[3,5,7],launch:[3,5,7],layout:[2,5],lgv:[2,3,5,6,7],librari:2,linear:[2,3,5],lineargenomeview:[2,5,7],list:[0,3],load:3,local:3,locat:3,love:0,mail:0,main:3,make:2,meta:3,meta_path:3,method:5,more:[2,5,6],my:7,myenv:2,n:2,name:3,net:0,none:3,notebook:[1,2,6],obj:[3,7],object:[3,5,7],onc:2,one:5,onli:3,option:[3,7],org:3,other:5,our:[0,3,5],out:[0,2,3],overwrit:3,packag:[2,5],page:1,palett:3,panda:3,paramet:[3,7],pass:[3,7],path:3,pip:[2,5],pleas:0,port:[5,7],present:3,primari:3,provid:[3,5],py:2,pypi:1,python:[1,2,6],quantit:3,quaternari:3,quickstart:1,r:2,rais:[3,7],reach:0,react:[3,5],realli:0,recogn:3,refer:[1,3],refnam:3,refname_alias:3,repo:5,report:0,repositori:2,request:0,requir:[2,3],resourc:1,root:2,run:[2,7],run_serv:5,s:5,same:3,score:3,search:[1,3],secondari:3,send:0,sequenc:3,server:7,session:3,set:3,set_assembl:3,set_default_sess:3,set_loc:3,set_them:3,sourceforg:0,specif:2,specifi:7,start:[2,3],state:5,step:2,storybook:3,str:[3,7],subconfigur:3,suit:2,support:[3,7],sure:2,syntax:3,talk:0,tertiari:3,test:[5,7],text:3,them:5,theme:3,thi:[2,3],thought:0,track:3,track_data:3,track_id2:3,track_id:3,track_nam:3,track_typ:3,trackid:3,tracks_id:3,trix:3,tutori:1,txt:2,type:[3,7],typeerror:[3,7],up:3,url:3,us:[1,2,3,5,7],user:0,util:[5,7],view:[2,3,5,7],view_typ:[5,7],we:[0,5],wether:3,what:0,when:[3,7],where:7,within:2,you:[0,2,5]},titles:["Contact us","Welcome to JBrowse Jupyter\u2019s documentation!","Installation","JBrowseConfig API","Reference","Quickstart","Tutorials","Creating components"],titleterms:{api:3,applic:5,compon:7,conda:2,contact:0,creat:7,dash:5,document:1,indic:1,instal:2,jbrows:1,jbrowseconfig:3,jupyt:[1,5],notebook:5,pypi:2,python:5,quickstart:5,refer:4,resourc:2,s:1,tabl:1,tutori:6,us:0,welcom:1}})
\ No newline at end of file
diff --git a/docs/docs/html/tutorial.html b/docs/docs/html/tutorial.html
index fe8e59b..f3b4dc2 100644
--- a/docs/docs/html/tutorial.html
+++ b/docs/docs/html/tutorial.html
@@ -74,7 +74,10 @@ <h1>Tutorials<a class="headerlink" href="#tutorials" title="Permalink to this he
 <p>More in depth tutorials</p>
 <ul class="simple">
 <li><p><a class="reference external" href="https://colab.research.google.com/github/GMOD/jbrowse-jupyter/blob/main/browser.ipynb">Colab Jupyter Notebook Tutorial</a></p></li>
-<li><p><a class="reference external" href="https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.py">Python Dash Application</a></p></li>
+<li><p><a class="reference external" href="https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.py">Python Dash Application with LGV</a></p></li>
+<li><p><a class="reference external" href="https://github.com/GMOD/jbrowse-jupyter/blob/main/cgv_examples.py">Python Dash Application with CGV</a></p></li>
+<li><p><a class="reference external" href="https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.ipynb">Notebook Examples LGV</a></p></li>
+<li><p><a class="reference external" href="https://github.com/GMOD/jbrowse-jupyter/blob/main/cgv_examples.py">Notebook Examples CGV</a></p></li>
 </ul>
 </section>
 
diff --git a/docs/docs/html/util.html b/docs/docs/html/util.html
index e2d9be4..c80d1f8 100644
--- a/docs/docs/html/util.html
+++ b/docs/docs/html/util.html
@@ -78,14 +78,26 @@
 <h1>Creating components<a class="headerlink" href="#creating-components" title="Permalink to this headline"></a></h1>
 <dl class="py function">
 <dt class="sig sig-object py">
-<span class="sig-name descname"><span class="pre">create</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">view_type</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span></dt>
+<span class="sig-name descname"><span class="pre">create</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">view_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'LGV'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Creates a JBrowseConfig given a view type.</p>
+<p>e.g
+create() -</p>
+<blockquote>
+<div><p>creates empty LGV JBrowseConfig</p>
+</div></blockquote>
+<dl class="simple">
+<dt>create(“CGV”) -</dt><dd><p>creates empty CGV JBrowseConfig</p>
+</dd>
+<dt>create(“LGV”, genome=”hg19”) -</dt><dd><p>creates LGV JBrowseConfig with hg19 default config</p>
+</dd>
+<dt>create(“CGV”, conf={“my”: “conf”}) -</dt><dd><p>creates CGV JBrowseConfig given a conf obj</p>
+</dd>
+</dl>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>view_type</strong> (<em>str</em>) – the type of view (‘view’ or ‘conf’)</p></li>
-<li><p><strong>genome</strong> (<em>str</em>) – genome (‘hg19’ or ‘hg38’)
-for view type <cite>view</cite></p></li>
+<li><p><strong>view_type</strong> (<em>str</em>) – the type of view (‘LGV’ or ‘CGV’), defaults to LGV</p></li>
+<li><p><strong>genome</strong> (<em>str</em>) – genome (‘hg19’ or ‘hg38’)</p></li>
 </ul>
 </dd>
 <dt class="field-even">Returns</dt>
@@ -97,8 +109,7 @@ <h1>Creating components<a class="headerlink" href="#creating-components" title="
 <dt class="field-even">Raises</dt>
 <dd class="field-even"><ul class="simple">
 <li><p><strong>TypeError</strong> – if genome passed is not hg19 or hg38</p></li>
-<li><p><strong>TypeError</strong> – if genome is not passed when choosing view_type <cite>view</cite></p></li>
-<li><p><strong>TypeError</strong> – if view type is not <cite>view</cite> or <cite>conf</cite></p></li>
+<li><p><strong>TypeError</strong> – if view type is not <cite>LGV</cite> or <cite>CGV</cite></p></li>
 </ul>
 </dd>
 </dl>
@@ -109,18 +120,23 @@ <h1>Creating components<a class="headerlink" href="#creating-components" title="
 <span class="sig-name descname"><span class="pre">create_component</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">conf</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#jbrowse_jupyter.util.create_component" title="Permalink to this definition"></a></dt>
 <dd><p>Creates a Dash JBrowse LinearGenomeView component
 given a configuration object and optionally an id.</p>
-<p>create_component(hg38.get_config()) where hg38 is an
-instance of JBrowseConfig</p>
+<p>e.g:</p>
+<p>conf = hg38.get_config()
+create_component(conf,id=”hg38-test”, dash_comp=”CGV”)
+where hg38 is an instance of JBrowseConfig</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
 <li><p><strong>conf</strong> (<em>obj</em>) – configuration object from JBrowseConfig
 instance</p></li>
 <li><p><strong>id</strong> (<em>str</em>) – id to use in Dash component</p></li>
+<li><p><strong>dash_comp</strong> (<em>str</em>) – (optional) dash component type to
+create. Currently supporting LGV and CGV.
+defaults to <cite>LGV</cite> when no dash_comp= is specified</p></li>
 </ul>
 </dd>
 <dt class="field-even">Returns</dt>
-<dd class="field-even"><p>Dash JBrowse Linear Genome View component</p>
+<dd class="field-even"><p>Dash JBrowse View given dash_comp type</p>
 </dd>
 <dt class="field-odd">Return type</dt>
 <dd class="field-odd"><p>Dash JBrowse component</p>
@@ -133,6 +149,8 @@ <h1>Creating components<a class="headerlink" href="#creating-components" title="
 <span class="sig-name descname"><span class="pre">launch</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">conf</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#jbrowse_jupyter.util.launch" title="Permalink to this definition"></a></dt>
 <dd><p>Launches a LinearGenomeView Dash JBrowse component in a
 server with the help of JupyterDash.</p>
+<p>e.g
+launch(conf, dash_comp=”CGV”,height=400, port=8002)</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
@@ -140,8 +158,11 @@ <h1>Creating components<a class="headerlink" href="#creating-components" title="
 the Dash JBrowse component</p></li>
 <li><p><strong>id</strong> (<em>str</em>) – (optional) id to use for the Dash JBrowse
 component defaults to <cite>jbrowse-component</cite></p></li>
+<li><p><strong>dash_comp</strong> (<em>str</em>) – (optional) dash component type to
+launch. Currently supporting LGV and CGV.
+defaults to <cite>LGV</cite> when no dash_comp= is specified</p></li>
 <li><p><strong>port</strong> (<em>int</em>) – (optional) port to utilize when running
-the JupyterDash app dash</p></li>
+the JupyterDash app</p></li>
 <li><p><strong>height</strong> (<em>int</em>) – (optional) the height to utilize for
 the JupyterDash app</p></li>
 </ul>
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 2082093..82c7d7e 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -26,7 +26,7 @@
 author = 'Teresa De Jesus Martinez, JBrowse Team'
 
 # The full version, including alpha/beta/rc tags
-release = '0.0.3'
+release = '1.2.1'
 
 
 # -- General configuration ---------------------------------------------------
diff --git a/docs/source/images/quickstart.png b/docs/source/images/quickstart.png
index d2ab4e6..c7428db 100644
Binary files a/docs/source/images/quickstart.png and b/docs/source/images/quickstart.png differ
diff --git a/docs/source/images/quickstart2.png b/docs/source/images/quickstart2.png
new file mode 100644
index 0000000..93d3d43
Binary files /dev/null and b/docs/source/images/quickstart2.png differ
diff --git a/docs/source/installation.md b/docs/source/installation.md
index a26355b..d92b793 100644
--- a/docs/source/installation.md
+++ b/docs/source/installation.md
@@ -12,14 +12,17 @@ Clone the GMOD/jbrowse-jupyter [repository](https://github.com/GMOD/jbrowse-jupy
 to create a conda envirnment and install the dependecies.
 ```
 $ cd jbrowse-jupyter
-$ conda create -n myenv python=3.8
+$ conda create -n myenv python=3.6
 $ conda activate myenv
 $ pip install -r requirements.txt
 ```
-You can find two examples in the root of the directory. 
-`browser.py` or the `browser.ipynb`
+You can find examples in the root of the directory. 
+* LGV - `browser.py` or the `browser.ipynb`
+* CGV - `cgv_examples.py` or `cgv_examples.ipynb`
 
 `browser.py` uses the Dash library to create a python application with the Dash JBrowse LinearGenomeView component and configured with the help of this package. `browser.ipynb` is jupyter notebook using the JupyterDash library to embed a Dash JBrowse LinearGenomeView component in a cell.
+`cgv_examples.py` a Dash application using the Dash JBrowse CircularGenomeView component
+`cgv_examples.ipynb` is jupyter notebook using the JupyterDash library to embed a Dash JBrowse CircularGenomeView component in a cell.
 
 To run the Python Dash application
 ```
@@ -43,4 +46,7 @@ For more information about Dash and Dash applications check out these articles.
 * [Dash Applications](https://dash.plotly.com/layout) how to get started to custumize Dash applications.
 * [Dash HTML components](https://dash.plotly.com/dash-html-components) Dash html components to build the Dash aplication layout.
 * [DashJupyter](https://github.com/plotly/jupyter-dash) library to enable embedding Dash components in jupyter notebooks.
-* [DashJbrowse](https://github.com/GMOD/dash_jbrowse) suite of Dash components for JBrowse views. (JBrowse Linear Genome View)
+* [DashJbrowse](https://github.com/GMOD/dash_jbrowse) suite of Dash components for JBrowse views. (JBrowse Linear Genome View and JBrowse Circular Genome View)
+* [JBrowse Docs](https://jbrowse.org/jb2/)
+* [JBrowse Config Guide](https://jbrowse.org/jb2/docs/config_guide/)
+* [JBrowse Views](https://jbrowse.org/jb2/download/#embedded-components)
diff --git a/docs/source/quickstart.md b/docs/source/quickstart.md
index 3676bb5..4477d23 100644
--- a/docs/source/quickstart.md
+++ b/docs/source/quickstart.md
@@ -19,9 +19,13 @@ Using the package, we can create a Dash JBrowse LinearGenomeView  to embed in a
     - for further customization of the config, check functions that the JBrowseConfig provides
 3. Use the `launch` utility function with the hg38 config to create and launch a Dash JBrowse Linear Genome View in a jupyter notebook cell.
 
+
 ![Launching hg38 LGV in python notebook](./images/quickstart.png)
 *Launching a Linear Genome View in Jupyter Notebook*
 
+
+![Launching hg19 CGV in python notebook](./images/quickstart2.png)
+*Launching a Circular Genome View in Jupyter Notebook*
 ### Python Dash Application
 
 1. Import the package's `create` and  `create_component`
@@ -36,7 +40,7 @@ from jbrowse_jupyter import create, create_component
 
 app = dash.Dash(__name__)
 
-jbrowse_conf = create("view", genome="hg38")
+jbrowse_conf = create("LGV", genome="hg38")
 
 config = jbrowse_conf.get_config()
 
diff --git a/docs/source/tutorial.md b/docs/source/tutorial.md
index 270e1d2..8ed5f40 100644
--- a/docs/source/tutorial.md
+++ b/docs/source/tutorial.md
@@ -2,4 +2,7 @@
 
 More in depth tutorials
 * [Colab Jupyter Notebook Tutorial](https://colab.research.google.com/github/GMOD/jbrowse-jupyter/blob/main/browser.ipynb)
-* [Python Dash Application](https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.py)
+* [Python Dash Application with LGV](https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.py)
+* [Python Dash Application with CGV](https://github.com/GMOD/jbrowse-jupyter/blob/main/cgv_examples.py)
+* [Notebook Examples LGV](https://github.com/GMOD/jbrowse-jupyter/blob/main/browser.ipynb)
+* [Notebook Examples CGV](https://github.com/GMOD/jbrowse-jupyter/blob/main/cgv_examples.py)
diff --git a/example.ipynb b/example.ipynb
new file mode 100644
index 0000000..d63ba52
--- /dev/null
+++ b/example.ipynb
@@ -0,0 +1,127 @@
+{
+ "metadata": {
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.12-final"
+  },
+  "orig_nbformat": 2,
+  "kernelspec": {
+   "name": "python3",
+   "display_name": "Python 3.8.12 64-bit ('jbrowse-jupyter': conda)",
+   "metadata": {
+    "interpreter": {
+     "hash": "dc9fc419d624b95bc9cc0bd84733299ab39c72ed5f2a2912fba5b902d66850aa"
+    }
+   }
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from dash import html, Dash\n",
+    "from dash.dependencies import Input, Output\n",
+    "from dash import dcc\n",
+    "from jupyter_dash import JupyterDash\n",
+    "from jbrowse_jupyter import create, create_component"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    " app = JupyterDash(__name__)\n",
+    " server = app.server"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "locations = [\n",
+    "    {\"value\": \"17:41,196,332..41,277,401\", \"label\": \"BRCA1\"\n",
+    "    },\n",
+    "    {\"value\": \"13:32,889,615..32,974,375\", \"label\": \"BRCA2\"},\n",
+    "]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Return the component with a specific location.\n",
+    "@app.callback(\n",
+    "    Output(\"default-container\", \"children\"), Input(\"location-to-view\", \"value\")\n",
+    ")\n",
+    "def return_jbrowse(location):\n",
+    "    print(location)\n",
+    "    conf = create(\"view\", genome=\"hg19\")\n",
+    "    conf.set_location(location)\n",
+    "    return create_component(conf.get_config())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "\n",
+    "app.layout = html.Div(\n",
+    "    [\n",
+    "        html.P(\"Select a location to view.\"),\n",
+    "        dcc.Dropdown(\n",
+    "            id=\"location-to-view\", options=locations, value=\"1:1..90\"\n",
+    "        ),\n",
+    "        html.Hr(),\n",
+    "        dcc.Loading(id=\"default-container\"),\n",
+    "    ]\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "output_type": "display_data",
+     "data": {
+      "text/plain": "<IPython.lib.display.IFrame at 0x7f9d58f6db50>",
+      "text/html": "\n        <iframe\n            width=\"100%\"\n            height=\"650\"\n            src=\"http://127.0.0.1:3039/\"\n            frameborder=\"0\"\n            allowfullscreen\n            \n        ></iframe>\n        "
+     },
+     "metadata": {}
+    }
+   ],
+   "source": [
+    "app.run_server(mode=\"inline\", use_reloader=False, debug=True, port=3039)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ]
+}
\ No newline at end of file
diff --git a/images/custom_palette.png b/images/custom_palette.png
new file mode 100644
index 0000000..ffa301c
Binary files /dev/null and b/images/custom_palette.png differ
diff --git a/images/notebook.png b/images/notebook.png
index d2ab4e6..c7428db 100644
Binary files a/images/notebook.png and b/images/notebook.png differ
diff --git a/images/notebook2.png b/images/notebook2.png
new file mode 100644
index 0000000..93d3d43
Binary files /dev/null and b/images/notebook2.png differ
diff --git a/jbrowse_jupyter/data/hg19_cgv.json b/jbrowse_jupyter/data/hg19_cgv.json
new file mode 100644
index 0000000..bd72335
--- /dev/null
+++ b/jbrowse_jupyter/data/hg19_cgv.json
@@ -0,0 +1,77 @@
+{
+    "configuration": {},
+    "assembly": {
+        "name": "hg19",
+        "aliases": ["GRCh37"],
+        "sequence": {
+            "type": "ReferenceSequenceTrack",
+            "trackId": "Pd8Wh30ei9R",
+            "adapter": {
+                "type": "BgzipFastaAdapter",
+                "fastaLocation": {
+                    "uri": "https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz",
+                    "locationType": "UriLocation"
+                },
+                "faiLocation": {
+                    "uri": "https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz.fai",
+                    "locationType": "UriLocation"
+                },
+                "gziLocation": {
+                    "uri": "https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz.gzi",
+                    "locationType": "UriLocation"
+                }
+            }
+        },
+        "refNameAliases": {
+            "adapter": {
+                "type": "RefNameAliasAdapter",
+                "location": {
+                    "uri": "https://s3.amazonaws.com/jbrowse.org/genomes/hg19/hg19_aliases.txt",
+                    "locationType": "UriLocation"
+                }
+            }
+        }
+    },
+    "tracks": [
+        {
+            "type": "VariantTrack",
+            "trackId": "pacbio_sv_vcf",
+            "name": "HG002 Pacbio SV (VCF)",
+            "assemblyNames": ["hg19"],
+            "category": ["GIAB"],
+            "adapter": {
+                "type": "VcfTabixAdapter",
+                "vcfGzLocation": {
+                    "uri": "https://s3.amazonaws.com/jbrowse.org/genomes/hg19/pacbio/hs37d5.HG002-SequelII-CCS.bnd-only.sv.vcf.gz",
+                    "locationType": "UriLocation"
+                },
+                "index": {
+                    "location": {
+                        "uri": "https://s3.amazonaws.com/jbrowse.org/genomes/hg19/pacbio/hs37d5.HG002-SequelII-CCS.bnd-only.sv.vcf.gz.tbi",
+                        "locationType": "UriLocation"
+                    }
+                }
+            }
+        }
+    ],
+    "defaultSession": {
+        "name": "My session",
+        "view": {
+            "id": "circularView",
+            "type": "CircularView",
+            "bpPerPx": 5000000, 
+            "tracks": [{
+                "id": "uPdLKHik1",
+                "type": "VariantTrack",
+                "configuration": "pacbio_sv_vcf",
+                "displays": [
+                    {
+                        "id": "v9QVAR3oaB",
+                        "type": "ChordVariantDisplay",
+                        "configuration": "pacbio_sv_vcf-ChordVariantDisplay"
+                    }
+                ]
+            }]
+        }
+    }
+}
diff --git a/jbrowse_jupyter/data/hg38_cgv.json b/jbrowse_jupyter/data/hg38_cgv.json
new file mode 100644
index 0000000..2371274
--- /dev/null
+++ b/jbrowse_jupyter/data/hg38_cgv.json
@@ -0,0 +1,47 @@
+{
+    "configuration": {},
+    "assembly": {
+        "name": "hg38",
+        "sequence": {
+            "type": "ReferenceSequenceTrack",
+            "trackId": "GRCh38-ReferenceSequenceTrack",
+            "adapter": {
+                "type": "BgzipFastaAdapter",
+                "fastaLocation": {
+                    "uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz",
+                    "locationType": "UriLocation"
+                },
+                "faiLocation": {
+                    "uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.fai",
+                    "locationType": "UriLocation"
+                },
+                "gziLocation": {
+                    "uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.gzi",
+                    "locationType": "UriLocation"
+                }
+            }
+        },
+        "aliases": [
+            "GRCh38"
+        ],
+        "refNameAliases": {
+            "adapter": {
+                "type": "RefNameAliasAdapter",
+                "location": {
+                    "uri": "https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/hg38_aliases.txt",
+                    "locationType": "UriLocation"
+                }
+            }
+        }
+    },
+    "tracks": [],
+    "defaultSession": {
+        "name": "My session",
+        "view": {
+            "id": "circularView",
+            "type": "CircularView",
+            "bpPerPx": 5000000,
+            "tracks": []
+        }
+    }
+}
diff --git a/jbrowse_jupyter/jbrowse_config.py b/jbrowse_jupyter/jbrowse_config.py
index 4ede6fe..97e6614 100644
--- a/jbrowse_jupyter/jbrowse_config.py
+++ b/jbrowse_jupyter/jbrowse_config.py
@@ -8,69 +8,93 @@
 )
 
 
-def create(view_type, **kwargs):
+def create(view_type="LGV", **kwargs):
     """
     Creates a JBrowseConfig given a view type.
 
-    :param str view_type: the type of view ('view' or 'conf')
+    e.g
+    create() -
+        creates empty LGV JBrowseConfig
+    create("CGV") -
+        creates empty CGV JBrowseConfig
+    create("LGV", genome="hg19") -
+        creates LGV JBrowseConfig with hg19 default config
+    create("CGV", conf={"my": "conf"}) -
+        creates CGV JBrowseConfig given a conf obj
+
+    :param str view_type: the type of view ('LGV' or 'CGV'), defaults to LGV
     :param str genome: genome ('hg19' or 'hg38')
-        for view type `view`
     :return: JBrowseConfig
     :rtype: JBrowseConfig instance
     :raises TypeError: if genome passed is not hg19 or hg38
-    :raises TypeError: if genome is not passed when choosing view_type `view`
-    :raises TypeError: if view type is not `view` or `conf`
+    :raises TypeError: if view type is not `LGV` or `CGV`
     """
     available_genomes = {"hg19", "hg38"}
-    conf = {}
-    if view_type == "view":
-        if "genome" in kwargs:
-            genome = kwargs["genome"]
-            if genome in available_genomes:
-                conf = get_default(genome)
-            else:
-                raise TypeError(
-                    f'{genome} is not a valid default genome to view')
-        else:
-            raise TypeError("genome is required arg for view_type=view")
-    elif view_type == "JB2config":
-        raise TypeError("currently not supporting JB2 configs files")
-    elif view_type == "config":
-        if "conf" in kwargs:
-            conf = kwargs["conf"]
-        else:
-            # default empty JBrowse config
-            return JBrowseConfig()
-    else:
-        err = f'{view_type} is an invalid view type.' \
-            "Please choose view or config"
-        raise TypeError(err)
-    return JBrowseConfig(conf=conf)
+    conf = kwargs.get('conf', {})
+    genome = kwargs.get('genome', "empty")
+    view = view_type
+    # view type (LGV or CGV)
+    # make it backwards compatible
+    if view_type == "view" or view_type == "conf":
+        view = "LGV"
+    if view != "LGV" and view != "CGV":
+        raise TypeError(f'Currently not supporting view_type: {view}.')
+    # configuration
+    # 1) genomes available
+    # 2) with own conf obj OR
+    # 3) empty default config to customize)
+    no_configuration = (genome != "empty" and not conf)
+    # Check passed genome is available
+    message1 = "is not a valid default genome to view"
+    message2 = "Choose from hg19 or hg38 or pass your own conf"
+    if genome not in available_genomes and no_configuration:
+        raise TypeError(
+                    f'"{genome}" {message1}.{message2}.')
+    #  genome
+    if genome in available_genomes:
+        conf = get_default(genome, view)
+    # start from empty JBrowseConfig
+    elif not conf:
+        return JBrowseConfig(view=view)
+    # get customized JBrowseConfig
+    return JBrowseConfig(view=view, conf=conf)
 
 
 class JBrowseConfig:
     """
-    Creates Browse configuration objects.
+    Creates JBrowse configuration objects.
     Currently supporting configuration objects for the
-    React JBrowse Linear Genome View
+    React JBrowse Linear Genome View and React JBrowse
+    Circular Genome View
     https://jbrowse.org/storybook/lgv/main
+    https://jbrowse.org/storybook/cgv/main/
+
     """
-    def __init__(self, conf=None):
+    def __init__(self, view="LGV", conf=None):
         """
         Initializes class.
 
+        :param str view: LGV or CGV
+            defaults to LGV
         :param obj conf: optional conf obj
         """
+        view_default = {
+            "id": 'linearGenomeView',
+            "type": 'LinearGenomeView',
+            "tracks": []
+        }
+        if view != "LGV" and view == "CGV":
+            view_default = {
+                "id": 'circularView',
+                "type": 'CircularView',
+                "tracks": []
+            }
         default = {
             "assembly": {},
             "tracks": [],
             "defaultSession": {
                 "name": "default-session",
-                "view": {
-                    "id": 'linearGenomeView',
-                    "type": 'LinearGenomeView',
-                    "tracks": []
-                }
+                "view": view_default
             },
             "aggregateTextSearchAdapters": [],
             "location": "",
@@ -87,15 +111,16 @@ def __init__(self, conf=None):
             ids = {x["trackId"]: x for x in conf["tracks"]}
             self.tracks_ids_map = ids
         self.tracks_ids_map = {}
+        self.view = view
 
     def get_config(self):
         """
         Returns the configuration object of the JBrowseConfig
         instance. This object can then be passed to launch or
         create_component to launch or create a Dash JBrowse
-        component (currently only supporting LinearGenomeView)
+        component
 
-        e.g: create("view", genome="hg19").get_config()
+        e.g: create("LGV", genome="hg19").get_config()
 
         :return: returns configuration object
         :rtype: obj
@@ -199,7 +224,7 @@ def get_track_display(self, track):
         # Returns the track display subconfiguration.
         track_type = track["type"]
         track_id = track["trackId"]
-        display_type = guess_display_type(track_type)
+        display_type = guess_display_type(track_type, self.view)
         return {
             "type": track_type,
             "configuration": track_id,
@@ -242,11 +267,14 @@ def add_df_track(self, track_data, name, **kwargs):
         :param str overwrite: flag wether or not to overwrite existing track.
         :raises Exception: if assembly has not been configured.
         :raises TypeError: if track data is invalid
+        :raises TypeError: if view is not LGV
         :raises TypeError: if track with that trackId already exists
             list of tracks
         """
         if not self.get_assembly():
             raise Exception("Please set the assembly before adding a track.")
+        if self.view != "LGV":
+            raise TypeError("Can not add a data frame track to a CGV conf.")
         check_track_data(track_data)
 
         overwrite = kwargs.get('overwrite', False)
@@ -379,8 +407,12 @@ def set_location(self, location):
         set_location("chr1:1..90")
 
         :param str location: location, syntax 'refName:start-end'
+        :raises TypeError: if view is CGV, location not supported in CGV
         """
-        self.config["location"] = location
+        if (self.view == 'CGV'):
+            raise TypeError("Location is not available to set on a CGV")
+        else:
+            self.config["location"] = location
 
     # ======= default session ========
     def set_default_session(self, tracks_ids, display_assembly=True):
@@ -408,14 +440,24 @@ def set_default_session(self, tracks_ids, display_assembly=True):
         # guess the display type
         for t in tracks_to_display:
             tracks_configs.append(self.get_track_display(t))
-        self.config["defaultSession"] = {
-            "name": "my session",
-            "view": {
-                "id": "LinearGenomeView",
-                "type": "LinearGenomeView",
-                "tracks": tracks_configs
+        if (self.view == "CGV"):
+            self.config["defaultSession"] = {
+                "name": "my session",
+                "view": {
+                    "id": "circularView",
+                    "type": "CircularView",
+                    "tracks": tracks_configs
+                }
+            }
+        else:
+            self.config["defaultSession"] = {
+                "name": "my session",
+                "view": {
+                    "id": "LinearGenomeView",
+                    "type": "LinearGenomeView",
+                    "tracks": tracks_configs
+                }
             }
-        }
 
     def get_default_session(self):
         # Returns the defaultSession subconfiguration
@@ -430,6 +472,7 @@ def add_text_search_adapter(self, ix_path,
                                 ixx_path, meta_path, adapter_id=None):
         """
         Adds an aggregate trix text search adapter.
+        Currently not available for Circular Genome View
 
         e.g:
         add_text_search_adapter("url/file.ix", url/file.ixx",
@@ -443,12 +486,15 @@ def add_text_search_adapter(self, ix_path,
         :raises TypeError: if adapter with same adapter id
                 is already configured
         :raises TypeError: local files are not supported
+        :raises TypeError: if view is CGV
         """
         err = "Please set the assembly before adding a text search adapter."
         if not self.get_assembly():
             raise Exception(err)
         if (not (is_url(ix_path) and is_url(ixx_path) and is_url(meta_path))):
             raise TypeError("Local files are not currently supported.")
+        if self.view == "CGV":
+            raise TypeError("Text Searching not currently available in CGV")
         assembly_name = self.get_assembly_name()
         default_id = f'{assembly_name}-{guess_file_name(ix_path)}-index'
         text_id = default_id if adapter_id is None else adapter_id
diff --git a/jbrowse_jupyter/tracks.py b/jbrowse_jupyter/tracks.py
index f92a8a6..cde2bd7 100644
--- a/jbrowse_jupyter/tracks.py
+++ b/jbrowse_jupyter/tracks.py
@@ -31,7 +31,7 @@ def supported_track_type(track_type):
     }
 
 
-def guess_display_type(track_type):
+def guess_display_type(track_type, view="LGV"):
     """
     Returns the possible display type to use for a given track type.
 
@@ -46,9 +46,16 @@ def guess_display_type(track_type):
         "QuantitativeTrack": "LinearBasicDisplay",
         "FeatureTrack": "LinearBasicDisplay",
     }
+    if view == "CGV":
+        displays = {
+            "VariantTrack": "ChordVariantDisplay",
+            "ReferenceSequenceTrack": "LinearReferenceSequenceDisplay",
+        }
     if track_type in displays:
         return displays[track_type]
     else:
+        if view == "CGV":
+            return "ChordVariantDisplay"
         return "LinearBasicDisplay"
 
 
diff --git a/jbrowse_jupyter/util.py b/jbrowse_jupyter/util.py
index 257951f..4fe94e3 100644
--- a/jbrowse_jupyter/util.py
+++ b/jbrowse_jupyter/util.py
@@ -1,9 +1,9 @@
 import re
 import os
 import json
-import dash_html_components as html
 import pkg_resources
-from dash_jbrowse import LinearGenomeView
+import dash_jbrowse as jb
+from dash import html
 from urllib.parse import urlparse
 from jupyter_dash import JupyterDash
 
@@ -52,10 +52,17 @@ def get_name(assembly_file):
     return assembly_file[name_start:name_end]
 
 
-def get_default(name):
+def get_name_regex(assembly_file):
+    """ Returns the name of the assembly based on the assembly data file"""
+    return re.search(r'(\w+)\.(?:fa|fasta|fa\.gz)$', assembly_file).group(1)
+
+
+def get_default(name, view_type="LGV"):
     """Returns the configuration oject given a genome name."""
     base = pkg_resources.resource_filename("jbrowse_jupyter", "data")
     file_name = f'{base}/{name}.json'
+    if view_type == "CGV":
+        file_name = f'{base}/{name}_cgv.json'
     conf = {}
     with open(file_name) as json_data:
         conf = json.load(json_data)
@@ -67,23 +74,36 @@ def create_component(conf, **kwargs):
     Creates a Dash JBrowse LinearGenomeView component
     given a configuration object and optionally an id.
 
-    create_component(hg38.get_config()) where hg38 is an
-    instance of JBrowseConfig
+    e.g:
+
+    conf = hg38.get_config()
+    create_component(conf,id="hg38-test", dash_comp="CGV")
+    where hg38 is an instance of JBrowseConfig
 
     :param obj conf: configuration object from JBrowseConfig
         instance
     :param str id: id to use in Dash component
-    :return: Dash JBrowse Linear Genome View component
+    :param str dash_comp: (optional) dash component type to
+        create. Currently supporting LGV and CGV.
+        defaults to `LGV` when no dash_comp= is specified
+    :return: Dash JBrowse View given dash_comp type
     :rtype: Dash JBrowse component
     """
-    supported = set({"LGV"})
+    supported = set({"LGV", "CGV"})
     comp_id = "jbrowse-component"
     dash_comp = kwargs.get("dash_comp", "LGV")
-    if "component_id" in kwargs:
+    the_view_type = conf["defaultSession"]["view"]["type"]
+    msg = "config was passed but attempting to create"
+    err = "Please specify the correct dash_comp."
+    if (the_view_type == "LinearGenomeView" and dash_comp == "CGV"):
+        raise TypeError(f'LGV {msg} a CGV.{err}')
+    if (the_view_type == "CircularView" and dash_comp == "LGV"):
+        raise TypeError(f'CGV {msg} a LGV.{err}')
+    if "id" in kwargs:
         comp_id = kwargs["id"]
     if dash_comp in supported:
         if dash_comp == "LGV":
-            return LinearGenomeView(
+            return jb.LinearGenomeView(
                 id=comp_id,
                 assembly=conf["assembly"],
                 tracks=conf["tracks"],
@@ -93,6 +113,14 @@ def create_component(conf, **kwargs):
                 aggregateTextSearchAdapters=conf["aggregateTextSearchAdapters"]
             )
         # here is where we can add another view
+        if dash_comp == "CGV":
+            return jb.CircularGenomeView(
+                id=comp_id,
+                assembly=conf["assembly"],
+                tracks=conf["tracks"],
+                defaultSession=conf["defaultSession"],
+                configuration=conf["configuration"],
+            )
     else:
         raise TypeError(f'The {dash_comp} component is not supported.')
 
@@ -102,19 +130,34 @@ def launch(conf, **kwargs):
     Launches a LinearGenomeView Dash JBrowse component in a
     server with the help of JupyterDash.
 
+    e.g
+    launch(conf, dash_comp="CGV",height=400, port=8002)
+
     :param obj conf: JBrowseConfiguration object to pass to
         the Dash JBrowse component
     :param str id: (optional) id to use for the Dash JBrowse
         component defaults to `jbrowse-component`
+    :param str dash_comp: (optional) dash component type to
+        launch. Currently supporting LGV and CGV.
+        defaults to `LGV` when no dash_comp= is specified
     :param int port: (optional) port to utilize when running
-        the JupyterDash app dash
+        the JupyterDash app
     :param int height: (optional) the height to utilize for
         the JupyterDash app
     """
     app = JupyterDash(__name__)
     # could add other JBrowse view types e.g Circular, Dotplot
-    supported = set({"LGV"})
+    supported = set({"LGV", "CGV"})
     dash_comp = kwargs.get("dash_comp", "LGV")
+
+    # error for mismatching config and launch type
+    the_view_type = conf["defaultSession"]["view"]["type"]
+    msg = "config was passed but attempting to launch"
+    err = "Please specify the correct dash_comp."
+    if (the_view_type == "LinearGenomeView" and dash_comp == "CGV"):
+        raise TypeError(f'LGV {msg} a CGV.{err}')
+    if (the_view_type == "CircularView" and dash_comp == "LGV"):
+        raise TypeError(f'CGV {msg} a LGV.{err}')
     comp_id = "jbrowse-component"
     comp_port = 3000
     comp_height = 300
@@ -128,14 +171,27 @@ def launch(conf, **kwargs):
     if dash_comp in supported:
         if dash_comp == "LGV":
             # create jupyter dash app layout
-            app.layout = html.Div([LinearGenomeView(
+            adapters = conf["aggregateTextSearchAdapters"]
+            app.layout = html.Div([
+                jb.LinearGenomeView(
                     id=comp_id,
                     assembly=conf["assembly"],
                     tracks=conf["tracks"],
                     defaultSession=conf["defaultSession"],
+                    aggregateTextSearchAdapters=adapters,
                     location=conf["location"],
                     configuration=conf["configuration"]
                 )])
+        if dash_comp == "CGV":
+            # create jupyter dash app layout
+            app.layout = html.Div([
+                jb.CircularGenomeView(
+                    id=comp_id,
+                    assembly=conf["assembly"],
+                    tracks=conf["tracks"],
+                    defaultSession=conf["defaultSession"],
+                    configuration=conf["configuration"]
+                )])
     else:
         raise TypeError(f'The {dash_comp} component is not supported.')
     app.run_server(port=comp_port,
diff --git a/requirements.txt b/requirements.txt
index f8c75b1..f2611c6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
-dash>=2.0
-dash-jbrowse>=0.0.2
+dash==2.0.0
+dash-jbrowse>=1.0.1
 flake8>=4.0.1
 jupyter_dash>=0.4.0
 pandas>=1.1.5
diff --git a/setup.py b/setup.py
index 77d1544..8d6b094 100644
--- a/setup.py
+++ b/setup.py
@@ -7,10 +7,9 @@
 with open("README.md", "r", encoding="utf-8") as fh:
     long_description = fh.read()
 
-# TODO: figure out install requires vs requirements.txt and look up classifiers
 setuptools.setup(
     name="jbrowse-jupyter",
-    version="0.0.4",
+    version="1.2.1",
     author="Teresa De Jesus Martinez",
     author_email="tere486martinez@gmail.com",
     maintainer="Teresa De Jesus Martinez; JBrowse Team",


Test patch:
diff --git a/tests/test_jbrowse_config.py b/tests/test_jbrowse_config.py
index c878021..913e176 100644
--- a/tests/test_jbrowse_config.py
+++ b/tests/test_jbrowse_config.py
@@ -13,6 +13,12 @@ def test_set_location():
     conf.set_location("1:1..90")
     assert conf.get_config()["location"] == "1:1..90"
 
+    conf.set_location("SL4.0ch00:1..9,643,250")
+    assert conf.get_config()["location"] == "SL4.0ch00:1..9,643,250"
+
+    conf.set_location("ctgA:1105..1221")
+    assert conf.get_config()["location"] == "ctgA:1105..1221"
+
 
 def test_set_theme():
     conf = JBrowseConfig()
@@ -27,7 +33,7 @@ def test_set_theme():
     assert secondary["secondary"]["main"] == "#0097a7"
 
 
-def test_set_assembly_name():
+def test_set_assembly():
     myError = "Can not get assembly name. Please configure the assembly first."
     conf = JBrowseConfig()
     # raises exception trying to get name before setting an assembly
@@ -82,16 +88,36 @@ def test_set_assembly_name():
     )
     assert len(conf.get_tracks()) == 1
 
+    alias_uri = "https://s3.amazonaws.com/jbrowse.org/genomes" \
+        "/hg19/hg19_aliases.txt"
+    ref_name = {
+        "adapter": {
+            "type": "RefNameAliasAdapter",
+            "location": {
+                "uri": alias_uri
+            }
+        }
+    }
+    aliases = [
+        "GRCh37"
+    ]
+
+    a_data = "https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz"
+    conf.set_assembly(a_data, aliases=aliases,
+                      refname_aliases=ref_name, overwrite=True)
+    assert conf.get_assembly_name() == 'hg19'
+
 
 def test_create_view():
     "tests creating a view from one of the provided genomes"
-    genome_error = "volvox is not a valid default genome to view"
+    genome_error = '"volvox" is not a valid default genome to view.' \
+        'Choose from hg19 or hg38 or pass your own conf.'
     with pytest.raises(TypeError) as excinfo:
-        create("view", genome="volvox")
+        create("LGV", genome="volvox")
     assert genome_error in str(excinfo)
     # creates JBrowseConfig from default hg19 or hg38
-    hg19 = create("view", genome="hg19")
-    hg38 = create("view", genome="hg38")
+    hg19 = create("LGV", genome="hg19")
+    hg38 = create("LGV", genome="hg38")
     assert hg19.get_assembly_name() == "hg19"
     assert len(hg19.get_tracks()) > 0
     assert hg19.get_default_session()
@@ -100,9 +126,21 @@ def test_create_view():
     assert hg38.get_default_session()
 
 
+def test_create_view_invalid_genome():
+    "test creating a view from a config"
+    invalid_genome = "invalidGenome"
+    msg = "Choose from hg19 or hg38 or pass your own conf"
+    error = "is not a valid default genome to view."
+    err = f'"{invalid_genome}" {error}{msg}'
+    with pytest.raises(TypeError) as excinfo:
+        create("view", genome="invalidGenome")
+        create("invalidView")
+    assert err in str(excinfo)
+
+
 def test_create_view_invalid():
     "test creating a view from a config"
-    error = "invalidView is an invalid view type.Please choose view or config"
+    error = "Currently not supporting view_type: invalidView."
     with pytest.raises(TypeError) as excinfo:
         create("invalidView")
     assert error in str(excinfo)
@@ -147,7 +185,7 @@ def test_create_view_from_conf():
             },
         },
     }
-    hg19_from_config = create("config", conf=config1)
+    hg19_from_config = create("conf", conf=config1)
     assert hg19_from_config.get_config()
     # can add track
     assert len(hg19_from_config.get_tracks()) == 0
@@ -182,12 +220,42 @@ def test_create_view_from_conf():
     assert len(adapter_after) == 2
 
 
-def test_empty_config():
+def test_empty_config_lgv():
     # === empty config ===
-    empty_conf = create("config")
+    empty_conf = create("LGV")
     assert empty_conf.get_config()
     assembly_error = "Can not get assembly name. " \
         "Please configure the assembly first."
     with pytest.raises(Exception) as excinfo:
         empty_conf.get_assembly_name()
     assert assembly_error in str(excinfo)
+
+
+def test_empty_cgv():
+    # === empty config ===
+    empty_conf = create("CGV")
+    assert empty_conf.get_config()
+    assembly_error = "Can not get assembly name. " \
+        "Please configure the assembly first."
+    with pytest.raises(Exception) as excinfo:
+        empty_conf.get_assembly_name()
+    assert assembly_error in str(excinfo)
+
+
+def test_create_view_cgv():
+    "tests creating a view from one of the provided genomes"
+    genome_error = '"volvox" is not a valid default genome to view.' \
+        'Choose from hg19 or hg38 or pass your own conf.'
+    with pytest.raises(TypeError) as excinfo:
+        create("CGV", genome="volvox")
+    assert genome_error in str(excinfo)
+    # creates JBrowseConfig from default hg19 or hg38
+    hg19 = create("CGV", genome="hg19")
+    hg38 = create("CGV", genome="hg38")
+    assert hg19.get_assembly_name() == "hg19"
+    assert len(hg19.get_tracks()) > 0
+    assert hg19.get_default_session()
+    assert hg38.get_assembly_name() == "hg38"
+    # hg38 for cgv does not have tracks
+    assert len(hg38.get_tracks()) == 0
+    assert hg38.get_default_session()
diff --git a/tests/test_tracks.py b/tests/test_tracks.py
index 47d68c2..ca5ad58 100644
--- a/tests/test_tracks.py
+++ b/tests/test_tracks.py
@@ -30,7 +30,7 @@ def test_make_location():
 
 
 def test_add_track_fail():
-    conf = create("config")
+    conf = create("LGV")
     assembly_error = "Please set the assembly before adding a track."
     with pytest.raises(Exception) as excinfo:
         conf.add_track(gff3, name="this will fail")
@@ -38,7 +38,7 @@ def test_add_track_fail():
 
 
 def test_alignments():
-    conf = create("view", genome="hg19")
+    conf = create("LGV", genome="hg19")
     # BAM or CRAM alignment data
     conf.add_track(cram, name="alignments cram track example")
     conf.add_track(bam, name="alignments bam track example")
@@ -49,7 +49,7 @@ def test_alignments():
 
 
 def test_feature():
-    conf = create("view", genome="hg38")
+    conf = create("LGV", genome="hg38")
     track_error = "Adapter type is not recognized"
     # gff is not supported
     with pytest.raises(TypeError) as excinfo:
@@ -62,7 +62,7 @@ def test_feature():
 
 
 def test_add_track_type_fail():
-    conf = create("view", genome="hg19")
+    conf = create("LGV", genome="hg19")
     track_type_error = 'Track type: "InvalidTrackType" is not supported.'
     with pytest.raises(Exception) as excinfo:
         conf.add_track(gff3Tabix, track_type="InvalidTrackType")
@@ -70,7 +70,7 @@ def test_add_track_type_fail():
 
 
 def test_add_track_overwrite():
-    conf = create("view", genome="hg38")
+    conf = create("LGV", genome="hg38")
     overwrite_err = "track with trackId: " \
         '"GRCh38-test" already exists inconfig.' \
         ' Set overwrite to True to overwrite it.'
@@ -85,9 +85,9 @@ def test_add_track_overwrite():
 
 
 def test_add_track_with_index():
-    conf = create("view", genome="hg38")
+    conf = create("LGV", genome="hg38")
     conf.add_track(gff3Tabix, name="test")
-    conf2 = create("view", genome="hg38")
+    conf2 = create("LGV", genome="hg38")
     conf2.add_track(gff3Tabix, name="test", index=gff3_tabix_index)
     index_one = conf.get_track("test")
     idx = index_one[0]['adapter']['index']['location']['uri']
@@ -98,7 +98,7 @@ def test_add_track_with_index():
 
 def test_variant():
     # VCF data
-    conf = create("view", genome="hg19")
+    conf = create("LGV", genome="hg19")
     conf.add_track(vcf, name="vcf track")
     conf.add_track(vcfGz, name="vcfgz track")
     vcf_track = conf.get_track("vcfgz track")
@@ -107,7 +107,7 @@ def test_variant():
 
 def test_wiggle():
     # bigWig data (quantitative/wiggle)
-    conf = create("view", genome="hg19")
+    conf = create("LGV", genome="hg19")
     conf.add_track(bigWig, name="wiggle track")
     bigwig_track = conf.get_track("wiggle track")
     assert bigwig_track[0]["type"] == "QuantitativeTrack"
@@ -115,7 +115,7 @@ def test_wiggle():
 
 # ==== dataframe track ======
 def test_data_frame_track():
-    hg38 = create('view', genome='hg38')
+    hg38 = create('LGV', genome='hg38')
     assert len(hg38.get_tracks()) == 1
     data_frame = {
         "refName": ["1", "1"],