Repository: palmetto/palm-cli (language: python)

Issue:
Adding changelog for v2.1.0
<!-- Thanks for sending a pull request! Please make sure you click the link above to view the contribution guidelines, then fill out the blanks below. -->
## Pull request checklist

Before submitting your PR, please review the following checklist:

- [ ] Consider adding a unit test if your PR resolves an issue.
- [X] All new and existing tests pass locally (`palm test`)
- [X] Lint (`palm lint`) has passed locally and any fixes were made for failures
- [X] Docs have been reviewed and added / updated if needed (for bug fixes / features)

### Breaking changes

- [ ] Check if this pull request introduces a breaking change

## What does this implement/fix? Explain your changes.
We needed a changelog for 2.1.0!

## Does this close any currently open issues?
…

## Any other comments?
…


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/pull_request.yaml b/.github/workflows/pull_request.yaml
index 083cd18..adeda4b 100644
--- a/.github/workflows/pull_request.yaml
+++ b/.github/workflows/pull_request.yaml
@@ -1,10 +1,10 @@
-name: "PULL REQUEST"
+name: "Pull Request"
 
 on:
   pull_request:
     branches:
       - main
-      - feature/v2.0
+      - develop
 
 jobs:
   test:
@@ -20,4 +20,12 @@ jobs:
           python -m pip install --upgrade pip
           pip install -r dev-requirements.txt
       - name: Run tests with pytest
-        run: pytest
\ No newline at end of file
+        run: pytest
+
+  lint:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: psf/black@stable
+        with:
+          options: '--check --diff --skip-string-normalization --exclude="\.tpl\.py"'
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 8c43e3b..19da8a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,7 @@ __pycache__
 .tox
 .env
 .venv
-DS_Store
+.DS_Store
 
 docs/_build
 
diff --git a/.palm/cmd_docs.py b/.palm/cmd_docs.py
index 36ec194..2c12f37 100644
--- a/.palm/cmd_docs.py
+++ b/.palm/cmd_docs.py
@@ -1,5 +1,4 @@
 import click
-import subprocess
 from pathlib import Path
 import webbrowser
 
@@ -12,10 +11,17 @@ def cli(ctx):
     """Generates internal readthedocs for palm and serves them"""
 
     click.echo(f"Launching palm-cli readthedocs at {CODE_DOCS_URI}...")
-    subprocess.run(
-        'docker-compose run --detach --rm --service-ports palm_docs',
-        cwd=Path.cwd(),
-        shell=True,
-        check=True,
+    exit_code, out, err = ctx.obj.run_on_host(
+        'docker-compose run -d --rm --service-ports palm_docs'
     )
+    if exit_code > 0:
+        if "port is already allocated" in err:
+            click.secho(
+                (
+                    "It looks like palm docs (or something else) "
+                    "is already running on port 8989. Aborting."
+                ),
+                fg="yellow",
+            )
+        return
     webbrowser.open_new_tab(CODE_DOCS_URI)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8294ebf..843ab6f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,28 @@
 # Palm CLI Changelog
 
+## 2.1.0
+
+> 12/01/2021
+
+Our first minor release on v2 includes containerization, support for older Python versions, 
+and added logo and brand assets!
+
+Features:
+- **Containerize**: NEW command added for containerization of Python projects with `palm containerize`
+- **Shell**: NEW command to shell into the project container and execute arbitrary commands
+- **Plugin generator**: NEW command to generate the boilerplate code for writing a new plugin
+- **Excluded commands**: Added the ability to exclude/disable `palm` commands from a project's config
+- **`run_on_host`**: Added a new function, `ctx.obj.run_on_host`, to assist with developing new commands 
+to run on your local machine, standardizing the interface around Python's `subprocess` with platform
+and version agnostic support (well, version agnostic >= 3.6.9).
+- **Logo/Branding**: We have a logo!! It is 90's retro and it is cool. Also added branding guidelines
+
+Improvements:
+- **Command availability**: Added `lint` and `test` commands to the `palm` core plugin
+- **Workflow**: New Github Actions workflow to lint contributions to the project on new Pull Request
+- **Backwards compatibility**: Added backwards compatibility support for older Python versions through v3.6.9
+- **Documentation**: Added new docs and examples of `palm` use cases and impact
+
 ## 2.0.2
 
 > 11/22/2021
diff --git a/docs/source/_static/img/png/logo-dark.png b/docs/source/_static/img/png/logo-dark.png
new file mode 100644
index 0000000..c0cdc31
Binary files /dev/null and b/docs/source/_static/img/png/logo-dark.png differ
diff --git a/docs/source/_static/img/png/logo-stacked-dark.png b/docs/source/_static/img/png/logo-stacked-dark.png
new file mode 100644
index 0000000..13663b8
Binary files /dev/null and b/docs/source/_static/img/png/logo-stacked-dark.png differ
diff --git a/docs/source/_static/img/png/logo-stacked-white.png b/docs/source/_static/img/png/logo-stacked-white.png
new file mode 100644
index 0000000..f404f16
Binary files /dev/null and b/docs/source/_static/img/png/logo-stacked-white.png differ
diff --git a/docs/source/_static/img/png/logo-stacked.png b/docs/source/_static/img/png/logo-stacked.png
new file mode 100644
index 0000000..d5125b6
Binary files /dev/null and b/docs/source/_static/img/png/logo-stacked.png differ
diff --git a/docs/source/_static/img/png/logo-subheader-dark.png b/docs/source/_static/img/png/logo-subheader-dark.png
new file mode 100644
index 0000000..4c30fa5
Binary files /dev/null and b/docs/source/_static/img/png/logo-subheader-dark.png differ
diff --git a/docs/source/_static/img/png/logo-subheader-white.png b/docs/source/_static/img/png/logo-subheader-white.png
new file mode 100644
index 0000000..baf1451
Binary files /dev/null and b/docs/source/_static/img/png/logo-subheader-white.png differ
diff --git a/docs/source/_static/img/png/logo-subheader.png b/docs/source/_static/img/png/logo-subheader.png
new file mode 100644
index 0000000..ecfe07b
Binary files /dev/null and b/docs/source/_static/img/png/logo-subheader.png differ
diff --git a/docs/source/_static/img/png/logo-white.png b/docs/source/_static/img/png/logo-white.png
new file mode 100644
index 0000000..502a19a
Binary files /dev/null and b/docs/source/_static/img/png/logo-white.png differ
diff --git a/docs/source/_static/img/png/logo.png b/docs/source/_static/img/png/logo.png
new file mode 100644
index 0000000..8105b30
Binary files /dev/null and b/docs/source/_static/img/png/logo.png differ
diff --git a/docs/source/_static/img/png_large/.DS_Store b/docs/source/_static/img/png_large/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/docs/source/_static/img/png_large/.DS_Store differ
diff --git a/docs/source/_static/img/png_large/logo-dark-example.jpg b/docs/source/_static/img/png_large/logo-dark-example.jpg
new file mode 100644
index 0000000..6d31c33
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-dark-example.jpg differ
diff --git a/docs/source/_static/img/png_large/logo-dark.png b/docs/source/_static/img/png_large/logo-dark.png
new file mode 100644
index 0000000..ccfa71d
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-dark.png differ
diff --git a/docs/source/_static/img/png_large/logo-stacked-dark-example.jpg b/docs/source/_static/img/png_large/logo-stacked-dark-example.jpg
new file mode 100644
index 0000000..e78b967
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-stacked-dark-example.jpg differ
diff --git a/docs/source/_static/img/png_large/logo-stacked-dark.png b/docs/source/_static/img/png_large/logo-stacked-dark.png
new file mode 100644
index 0000000..d4f1145
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-stacked-dark.png differ
diff --git a/docs/source/_static/img/png_large/logo-stacked-white-example.jpg b/docs/source/_static/img/png_large/logo-stacked-white-example.jpg
new file mode 100644
index 0000000..fe1fe69
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-stacked-white-example.jpg differ
diff --git a/docs/source/_static/img/png_large/logo-stacked-white.png b/docs/source/_static/img/png_large/logo-stacked-white.png
new file mode 100644
index 0000000..60fd424
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-stacked-white.png differ
diff --git a/docs/source/_static/img/png_large/logo-stacked.png b/docs/source/_static/img/png_large/logo-stacked.png
new file mode 100644
index 0000000..ff1d6f6
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-stacked.png differ
diff --git a/docs/source/_static/img/png_large/logo-subheader-dark-example.jpg b/docs/source/_static/img/png_large/logo-subheader-dark-example.jpg
new file mode 100644
index 0000000..5a74e7f
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-subheader-dark-example.jpg differ
diff --git a/docs/source/_static/img/png_large/logo-subheader-dark.png b/docs/source/_static/img/png_large/logo-subheader-dark.png
new file mode 100644
index 0000000..a4ed1d0
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-subheader-dark.png differ
diff --git a/docs/source/_static/img/png_large/logo-subheader-white-example.jpg b/docs/source/_static/img/png_large/logo-subheader-white-example.jpg
new file mode 100644
index 0000000..d9b3f6a
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-subheader-white-example.jpg differ
diff --git a/docs/source/_static/img/png_large/logo-subheader-white.png b/docs/source/_static/img/png_large/logo-subheader-white.png
new file mode 100644
index 0000000..063ec02
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-subheader-white.png differ
diff --git a/docs/source/_static/img/png_large/logo-subheader.png b/docs/source/_static/img/png_large/logo-subheader.png
new file mode 100644
index 0000000..9449dcf
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-subheader.png differ
diff --git a/docs/source/_static/img/png_large/logo-white-example.jpg b/docs/source/_static/img/png_large/logo-white-example.jpg
new file mode 100644
index 0000000..b9f3f3f
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-white-example.jpg differ
diff --git a/docs/source/_static/img/png_large/logo-white.png b/docs/source/_static/img/png_large/logo-white.png
new file mode 100644
index 0000000..0d48459
Binary files /dev/null and b/docs/source/_static/img/png_large/logo-white.png differ
diff --git a/docs/source/_static/img/png_large/logo.png b/docs/source/_static/img/png_large/logo.png
new file mode 100644
index 0000000..0177144
Binary files /dev/null and b/docs/source/_static/img/png_large/logo.png differ
diff --git a/docs/source/_static/img/svg/logo-dark.svg b/docs/source/_static/img/svg/logo-dark.svg
new file mode 100644
index 0000000..409d290
--- /dev/null
+++ b/docs/source/_static/img/svg/logo-dark.svg
@@ -0,0 +1,35 @@
+<svg width="297" height="100" viewBox="0 0 297 100" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M152.803 28.263C158.219 28.263 161.973 30.2875 164.067 34.3364L165.469 40.4098C165.469 42.918 158.669 47.6925 145.069 54.7333C138.009 57.8686 134.332 59.8124 134.038 60.5649C132.948 62.661 132.247 63.709 131.936 63.709C131.157 64.354 130.456 65.3214 129.834 66.6114H129.366V66.8532L129.133 66.6114H128.899C128.57 66.6114 128.103 67.6684 127.498 69.7824H127.03L127.264 70.0243V70.2662C126.78 70.2662 125.603 72.21 123.734 76.0977C123.267 78.0326 122.333 79 120.931 79V78.5163H120.698L119.763 78.7581L119.504 78.5163H119.27L118.569 78.7581L118.102 78.2744L117.635 78.7581L116 76.8233V76.3395C116 74.7271 117.955 69.7108 121.866 61.2904L121.165 61.0486L121.398 60.8067V60.5649L120.231 59.5705L119.27 59.8124L118.803 59.0868L119.037 58.845V58.6031C118.102 58.6031 117.635 58.3612 117.635 57.8775C119.556 56.3009 122.601 54.4377 126.771 52.2879L131.469 42.3447H131.235C129.366 42.3447 127.567 40.4815 125.837 36.755V34.5783C127.117 32.8942 130.405 31.5237 135.699 30.4667C138.727 29.8038 144.428 29.0693 152.803 28.263ZM139.904 46.2413H140.137C145.224 43.7869 149.913 40.786 154.204 37.2388V36.9969H153.971C147.569 37.2477 144.368 37.7404 144.368 38.4749L139.904 46.2413Z" fill="white"/>
+<path d="M179.498 30.2248C183.667 30.2248 186.22 31.5058 187.154 34.0677C187.69 36.343 188.339 40.8577 189.101 47.6119L189.334 47.8537C189.421 48.9108 189.637 49.4393 189.983 49.4393L196.965 48.5256V48.9824H197.198L200.676 48.7674V49.1974L199.145 49.6543V49.8961H200.676L202.207 49.6543V50.1111C200.719 50.7202 199.56 51.0248 198.73 51.0248V51.4817L199.82 51.2398C200.823 51.5444 201.325 51.8489 201.325 52.1535L202.441 51.9116C205.348 52.0012 206.801 52.3058 206.801 52.8253L206.568 53.0403L208.099 53.4972V53.954C206.126 55.011 202.052 55.9158 195.875 56.6682L191.956 57.3401C193.842 65.0079 194.785 70.2124 194.785 72.9535V73.8403L194.136 74.539H193.902C193.418 74.539 192.916 74.3061 192.397 73.8403V74.539H191.956V74.0822L191.281 74.539L190.424 73.8403L188.244 74.754L186.479 72.9535C185.752 71.7352 184.662 67.2832 183.209 59.5974H183.001C173.831 62.2131 169.246 64.2555 169.246 65.7245C168.657 66.1008 166.91 68.4298 164.003 72.7116C162.999 73.9299 162.195 74.539 161.589 74.539L161.148 73.4103L160.94 73.6253H160.733C159.85 73.0879 159.409 72.4877 159.409 71.8248L159.201 72.0398H158.76V71.5829C158.155 71.5829 157.575 71.1351 157.021 70.2393C156.433 70.2393 156.139 70.087 156.139 69.7824V68.1969C156.139 66.5128 157.886 63.727 161.382 59.8393C162.87 57.2773 165.275 53.7301 168.597 49.1974L176.02 35.6532L177.525 31.1116C178.304 30.5204 178.961 30.2248 179.498 30.2248ZM177.759 52.1535V52.3685C180.233 51.7056 181.47 51.2577 181.47 51.0248L180.821 47.3969C180.423 47.5761 179.402 49.1616 177.759 52.1535ZM198.055 48.3106H198.496V48.7674H198.055V48.3106ZM198.288 49.8961V50.1111H198.73V49.8961H198.288Z" fill="white"/>
+<path d="M225.565 27H226.941C230.955 28.5228 232.962 30.5204 232.962 32.9928C231.924 34.7485 227.762 43.7511 220.478 60.0005L218.635 63.3597L232.962 62.3922L234.805 62.6341H236.18V63.1178H235.505V63.8434H236.881V64.3271L234.571 65.5096L235.038 66.9339H236.414L238.49 69.1106C238.49 69.5406 233.948 70.4095 224.864 71.7173C221.023 72.5235 215.789 73.8851 209.162 75.8021H208.928C208.081 75.8021 206.618 74.5211 204.542 71.9592V71.7173L204.776 71.5023L204.542 71.2605V68.8687C204.542 68.0625 205.234 67.104 206.618 65.9933C213.886 52.0729 219.12 40.2755 222.321 30.601L222.087 29.8755C223.056 27.9585 224.215 27 225.565 27Z" fill="white"/>
+<path d="M263.545 28.8005H264.713C266.495 28.8005 268.053 30.0098 269.385 32.4284L268.918 42.1028C268.918 44.826 269.307 47.0117 270.086 48.6599C270.414 48.642 271.98 47.0207 274.783 43.7959C275.302 43.6346 278.417 40.4904 284.127 34.3633C286.272 31.2997 288.461 29.768 290.693 29.768L292.328 29.5261C293.851 29.8844 294.707 30.3681 294.898 30.9773C295.244 30.9773 295.945 31.6222 297 32.9121V33.3959C297 35.0262 294.733 41.001 290.2 51.3204C288.66 55.1902 287.648 57.1251 287.163 57.1251L287.397 57.3669V57.6088L284.36 63.8972C284.084 63.9151 282.838 66.5845 280.623 71.9054L278.988 74.0822H277.353V73.5985L276.418 74.0822C276.418 73.7239 275.873 73.4014 274.783 73.1147L274.316 73.5985C273.884 73.5447 273.572 73.1416 273.382 72.3891C272.759 72.3891 272.447 72.2279 272.447 71.9054V70.2124C272.447 67.0772 274.783 61.0217 279.455 52.046C277.015 54.375 274.679 57.2773 272.447 60.753C271.928 60.753 271.219 61.2367 270.319 62.2041H270.086C268.425 61.0038 266.867 60.2782 265.414 60.0274C263.839 58.9166 262.438 55.6112 261.209 50.1111H260.976C254.176 66.271 250.43 74.6644 249.738 75.2915H249.27L248.102 74.5659L247.402 74.8078L247.168 74.5659L246.935 74.8078L246.467 73.8403L246 74.324L245.767 74.0822L243.664 74.5659C243.318 73.688 242.851 73.2043 242.263 73.1147V72.1473C242.263 68.2775 246.71 57.2953 255.603 39.2005C257.697 32.5897 259.41 29.2842 260.742 29.2842L263.545 28.8005Z" fill="white"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_92)"/>
+<mask id="mask0_12_92" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_92)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="#212121"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="#212121"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="#212121"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="#212121"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="#212121"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="#212121"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="#212121"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="#212121"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="#212121"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="#212121"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="#212121"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="#212121"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="#212121"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="#212121"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="#212121"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_92" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/_static/img/svg/logo-stacked-dark.svg b/docs/source/_static/img/svg/logo-stacked-dark.svg
new file mode 100644
index 0000000..86fe9a4
--- /dev/null
+++ b/docs/source/_static/img/svg/logo-stacked-dark.svg
@@ -0,0 +1,35 @@
+<svg width="100" height="138" viewBox="0 0 100 138" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M20.3331 110.68C23.3252 110.68 25.3997 111.77 26.5564 113.95L27.3307 117.221C27.3307 118.571 23.5738 121.142 16.06 124.933C12.1597 126.622 10.1283 127.668 9.9658 128.073C9.36355 129.202 8.97639 129.766 8.80432 129.766C8.37414 130.114 7.98698 130.635 7.64284 131.329H7.38473V131.459L7.25568 131.329H7.12663C6.94499 131.329 6.68689 131.898 6.3523 133.037H6.0942L6.22325 133.167V133.297C5.95558 133.297 5.30554 134.344 4.27311 136.437C4.015 137.479 3.49879 138 2.72446 138V137.74H2.59541L2.0792 137.87L1.9358 137.74H1.80675L1.41959 137.87L1.16148 137.609L0.903375 137.87L0 136.828V136.567C0 135.699 1.08023 132.998 3.24068 128.464L2.85352 128.334L2.98257 128.204V128.073L2.3373 127.538L1.80675 127.668L1.54864 127.278L1.6777 127.147V127.017C1.16148 127.017 0.903375 126.887 0.903375 126.626C1.96448 125.777 3.64696 124.774 5.9508 123.617L8.54621 118.263H8.41716C7.38473 118.263 6.39054 117.259 5.43459 115.253V114.081C6.14199 113.174 7.9583 112.436 10.8835 111.867C12.5564 111.51 15.7063 111.114 20.3331 110.68ZM13.2065 120.361H13.3355C16.146 119.039 18.7367 117.423 21.1074 115.513V115.383H20.9784C17.4414 115.518 15.6728 115.783 15.6728 116.179L13.2065 120.361Z" fill="white"/>
+<path d="M35.0815 111.736C37.3854 111.736 38.7954 112.426 39.3116 113.806C39.6079 115.031 39.9664 117.462 40.387 121.099L40.5161 121.229C40.5639 121.798 40.6834 122.083 40.8746 122.083L44.7319 121.591V121.837H44.8609L46.7824 121.721V121.952L45.9364 122.198V122.329H46.7824L47.6284 122.198V122.444C46.8063 122.772 46.1658 122.936 45.7069 122.936V123.182L46.3092 123.052C46.8636 123.216 47.1409 123.38 47.1409 123.544L47.7574 123.414C49.3634 123.462 50.1664 123.626 50.1664 123.906L50.0374 124.022L50.8834 124.268V124.514C49.7936 125.083 47.5424 125.57 44.1296 125.975L41.9644 126.337C43.0064 130.466 43.5274 133.268 43.5274 134.744V135.222L43.1689 135.598H43.0398C42.7722 135.598 42.4949 135.473 42.2081 135.222V135.598H41.9644V135.352L41.5915 135.598L41.1184 135.222L39.9139 135.714L38.9388 134.744C38.5373 134.088 37.935 131.691 37.132 127.552H37.0173C31.9508 128.961 29.4175 130.061 29.4175 130.852C29.0925 131.054 28.127 132.308 26.521 134.614C25.9665 135.27 25.522 135.598 25.1874 135.598L24.9436 134.99L24.8289 135.106H24.7142C24.2267 134.817 23.9829 134.493 23.9829 134.136L23.8682 134.252H23.6244V134.006C23.2898 134.006 22.9696 133.765 22.6637 133.283C22.3387 133.283 22.1762 133.201 22.1762 133.037V132.183C22.1762 131.276 23.1417 129.776 25.0727 127.683C25.8948 126.303 27.2236 124.393 29.059 121.952L33.16 114.659L33.9917 112.214C34.4219 111.896 34.7852 111.736 35.0815 111.736ZM34.1208 123.544V123.66C35.4878 123.303 36.1713 123.062 36.1713 122.936L35.8128 120.983C35.5929 121.079 35.0289 121.933 34.1208 123.544ZM45.3341 121.475H45.5779V121.721H45.3341V121.475ZM45.4632 122.329V122.444H45.7069V122.329H45.4632Z" fill="white"/>
+<path d="M60.5331 110H61.2931C63.5109 110.82 64.6198 111.896 64.6198 113.227C64.0463 114.172 61.7472 119.02 57.7226 127.77L56.7046 129.578L64.6198 129.057L65.6379 129.188H66.3979V129.448H66.0251V129.839H66.7851V130.099L65.5089 130.736L65.767 131.503H66.527L67.6741 132.675C67.6741 132.906 65.1647 133.374 60.146 134.079C58.0238 134.513 55.132 135.246 51.4707 136.278H51.3417C50.8732 136.278 50.0655 135.588 48.9183 134.209V134.079L49.0474 133.963L48.9183 133.833V132.545C48.9183 132.111 49.3007 131.594 50.0655 130.996C54.0805 123.501 56.9722 117.148 58.7407 111.939L58.6117 111.548C59.147 110.516 59.7875 110 60.5331 110Z" fill="white"/>
+<path d="M81.5167 110.97H82.1619C83.1466 110.97 84.0069 111.621 84.743 112.923L84.4849 118.132C84.4849 119.599 84.7 120.776 85.1302 121.663C85.3118 121.653 86.1769 120.78 87.7256 119.044C88.0124 118.957 89.7331 117.264 92.8877 113.965C94.0731 112.315 95.2824 111.49 96.5156 111.49L97.4189 111.36C98.2602 111.553 98.7334 111.814 98.8385 112.142C99.0297 112.142 99.4169 112.489 100 113.183V113.444C100 114.322 98.7477 117.539 96.2431 123.096C95.3923 125.179 94.8331 126.221 94.5654 126.221L94.6945 126.351V126.482L93.0168 129.868C92.8638 129.877 92.1755 131.315 90.9519 134.18L90.0485 135.352H89.1452V135.091L88.6289 135.352C88.6289 135.159 88.3278 134.985 87.7256 134.831L87.4675 135.091C87.2285 135.063 87.0564 134.845 86.9513 134.44C86.6071 134.44 86.435 134.353 86.435 134.18V133.268C86.435 131.58 87.7256 128.319 90.3066 123.486C88.9588 124.74 87.6682 126.303 86.435 128.175C86.1483 128.175 85.7563 128.435 85.2592 128.956H85.1302C84.2124 128.31 83.3521 127.919 82.5491 127.784C81.6792 127.186 80.9049 125.406 80.2261 122.444H80.0971C76.3402 131.146 74.2705 135.665 73.8882 136.003H73.6301L72.9848 135.612L72.5976 135.743L72.4686 135.612L72.3395 135.743L72.0814 135.222L71.8233 135.482L71.6942 135.352L70.5328 135.612C70.3416 135.14 70.0835 134.879 69.7584 134.831V134.31C69.7584 132.226 72.2152 126.313 77.1288 116.57C78.2855 113.01 79.2319 111.23 79.968 111.23L81.5167 110.97Z" fill="white"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_324)"/>
+<mask id="mask0_12_324" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_324)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="#212121"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="#212121"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="#212121"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="#212121"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="#212121"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="#212121"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="#212121"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="#212121"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="#212121"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="#212121"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="#212121"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="#212121"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="#212121"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="#212121"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="#212121"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_324" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/_static/img/svg/logo-stacked-white.svg b/docs/source/_static/img/svg/logo-stacked-white.svg
new file mode 100644
index 0000000..8b620b7
--- /dev/null
+++ b/docs/source/_static/img/svg/logo-stacked-white.svg
@@ -0,0 +1,35 @@
+<svg width="100" height="138" viewBox="0 0 100 138" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M20.3331 110.68C23.3252 110.68 25.3997 111.77 26.5564 113.95L27.3307 117.221C27.3307 118.571 23.5738 121.142 16.06 124.933C12.1597 126.622 10.1283 127.668 9.9658 128.073C9.36355 129.202 8.97639 129.766 8.80432 129.766C8.37414 130.114 7.98698 130.635 7.64284 131.329H7.38473V131.459L7.25568 131.329H7.12663C6.94499 131.329 6.68689 131.898 6.3523 133.037H6.0942L6.22325 133.167V133.297C5.95558 133.297 5.30554 134.344 4.27311 136.437C4.015 137.479 3.49879 138 2.72446 138V137.74H2.59541L2.0792 137.87L1.9358 137.74H1.80675L1.41959 137.87L1.16148 137.609L0.903375 137.87L0 136.828V136.567C0 135.699 1.08023 132.998 3.24068 128.464L2.85352 128.334L2.98257 128.204V128.073L2.3373 127.538L1.80675 127.668L1.54864 127.278L1.6777 127.147V127.017C1.16148 127.017 0.903375 126.887 0.903375 126.626C1.96448 125.777 3.64696 124.774 5.9508 123.617L8.54621 118.263H8.41716C7.38473 118.263 6.39054 117.259 5.43459 115.253V114.081C6.14199 113.174 7.9583 112.436 10.8835 111.867C12.5564 111.51 15.7063 111.114 20.3331 110.68ZM13.2065 120.361H13.3355C16.146 119.039 18.7367 117.423 21.1074 115.513V115.383H20.9784C17.4414 115.518 15.6728 115.783 15.6728 116.179L13.2065 120.361Z" fill="white"/>
+<path d="M35.0815 111.736C37.3854 111.736 38.7954 112.426 39.3116 113.806C39.6079 115.031 39.9664 117.462 40.387 121.099L40.5161 121.229C40.5639 121.798 40.6834 122.083 40.8746 122.083L44.7319 121.591V121.837H44.8609L46.7824 121.721V121.952L45.9364 122.198V122.329H46.7824L47.6284 122.198V122.444C46.8063 122.772 46.1658 122.936 45.7069 122.936V123.182L46.3092 123.052C46.8636 123.216 47.1409 123.38 47.1409 123.544L47.7574 123.414C49.3634 123.462 50.1664 123.626 50.1664 123.906L50.0374 124.022L50.8834 124.268V124.514C49.7936 125.083 47.5424 125.57 44.1296 125.975L41.9644 126.337C43.0064 130.466 43.5274 133.268 43.5274 134.744V135.222L43.1689 135.598H43.0398C42.7722 135.598 42.4949 135.473 42.2081 135.222V135.598H41.9644V135.352L41.5915 135.598L41.1184 135.222L39.9139 135.714L38.9388 134.744C38.5373 134.088 37.935 131.691 37.132 127.552H37.0173C31.9508 128.961 29.4175 130.061 29.4175 130.852C29.0925 131.054 28.127 132.308 26.521 134.614C25.9665 135.27 25.522 135.598 25.1874 135.598L24.9436 134.99L24.8289 135.106H24.7142C24.2267 134.817 23.9829 134.493 23.9829 134.136L23.8682 134.252H23.6244V134.006C23.2898 134.006 22.9696 133.765 22.6637 133.283C22.3387 133.283 22.1762 133.201 22.1762 133.037V132.183C22.1762 131.276 23.1417 129.776 25.0727 127.683C25.8948 126.303 27.2236 124.393 29.059 121.952L33.16 114.659L33.9917 112.214C34.4219 111.896 34.7852 111.736 35.0815 111.736ZM34.1208 123.544V123.66C35.4878 123.303 36.1713 123.062 36.1713 122.936L35.8128 120.983C35.5929 121.079 35.0289 121.933 34.1208 123.544ZM45.3341 121.475H45.5779V121.721H45.3341V121.475ZM45.4632 122.329V122.444H45.7069V122.329H45.4632Z" fill="white"/>
+<path d="M60.5331 110H61.2931C63.5109 110.82 64.6198 111.896 64.6198 113.227C64.0463 114.172 61.7472 119.02 57.7226 127.77L56.7046 129.578L64.6198 129.057L65.6379 129.188H66.3979V129.448H66.0251V129.839H66.7851V130.099L65.5089 130.736L65.767 131.503H66.527L67.6741 132.675C67.6741 132.906 65.1647 133.374 60.146 134.079C58.0238 134.513 55.132 135.246 51.4707 136.278H51.3417C50.8732 136.278 50.0655 135.588 48.9183 134.209V134.079L49.0474 133.963L48.9183 133.833V132.545C48.9183 132.111 49.3007 131.594 50.0655 130.996C54.0805 123.501 56.9722 117.148 58.7407 111.939L58.6117 111.548C59.147 110.516 59.7875 110 60.5331 110Z" fill="white"/>
+<path d="M81.5167 110.97H82.1619C83.1466 110.97 84.0069 111.621 84.743 112.923L84.4849 118.132C84.4849 119.599 84.7 120.776 85.1302 121.663C85.3118 121.653 86.1769 120.78 87.7256 119.044C88.0124 118.957 89.7331 117.264 92.8877 113.965C94.0731 112.315 95.2824 111.49 96.5156 111.49L97.4189 111.36C98.2602 111.553 98.7334 111.814 98.8385 112.142C99.0297 112.142 99.4169 112.489 100 113.183V113.444C100 114.322 98.7477 117.539 96.2431 123.096C95.3923 125.179 94.8331 126.221 94.5654 126.221L94.6945 126.351V126.482L93.0168 129.868C92.8638 129.877 92.1755 131.315 90.9519 134.18L90.0485 135.352H89.1452V135.091L88.6289 135.352C88.6289 135.159 88.3278 134.985 87.7256 134.831L87.4675 135.091C87.2285 135.063 87.0564 134.845 86.9513 134.44C86.6071 134.44 86.435 134.353 86.435 134.18V133.268C86.435 131.58 87.7256 128.319 90.3066 123.486C88.9588 124.74 87.6682 126.303 86.435 128.175C86.1483 128.175 85.7563 128.435 85.2592 128.956H85.1302C84.2124 128.31 83.3521 127.919 82.5491 127.784C81.6792 127.186 80.9049 125.406 80.2261 122.444H80.0971C76.3402 131.146 74.2705 135.665 73.8882 136.003H73.6301L72.9848 135.612L72.5976 135.743L72.4686 135.612L72.3395 135.743L72.0814 135.222L71.8233 135.482L71.6942 135.352L70.5328 135.612C70.3416 135.14 70.0835 134.879 69.7584 134.831V134.31C69.7584 132.226 72.2152 126.313 77.1288 116.57C78.2855 113.01 79.2319 111.23 79.968 111.23L81.5167 110.97Z" fill="white"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_362)"/>
+<mask id="mask0_12_362" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_362)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="white"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="white"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="white"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="white"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="white"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="white"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="white"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="white"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="white"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="white"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="white"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="white"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="white"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="white"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="white"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_362" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/_static/img/svg/logo-stacked.svg b/docs/source/_static/img/svg/logo-stacked.svg
new file mode 100644
index 0000000..e5655c3
--- /dev/null
+++ b/docs/source/_static/img/svg/logo-stacked.svg
@@ -0,0 +1,35 @@
+<svg width="100" height="138" viewBox="0 0 100 138" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M20.3331 110.68C23.3252 110.68 25.3997 111.77 26.5564 113.95L27.3307 117.221C27.3307 118.571 23.5738 121.142 16.06 124.933C12.1597 126.622 10.1283 127.668 9.9658 128.073C9.36355 129.202 8.97639 129.766 8.80432 129.766C8.37414 130.114 7.98698 130.635 7.64284 131.329H7.38473V131.459L7.25568 131.329H7.12663C6.94499 131.329 6.68689 131.898 6.3523 133.037H6.0942L6.22325 133.167V133.297C5.95558 133.297 5.30554 134.344 4.27311 136.437C4.015 137.479 3.49879 138 2.72446 138V137.74H2.59541L2.0792 137.87L1.9358 137.74H1.80675L1.41959 137.87L1.16148 137.609L0.903375 137.87L0 136.828V136.567C0 135.699 1.08023 132.998 3.24068 128.464L2.85352 128.334L2.98257 128.204V128.073L2.3373 127.538L1.80675 127.668L1.54864 127.278L1.6777 127.147V127.017C1.16148 127.017 0.903375 126.887 0.903375 126.626C1.96448 125.777 3.64696 124.774 5.9508 123.617L8.54621 118.263H8.41716C7.38473 118.263 6.39054 117.259 5.43459 115.253V114.081C6.14199 113.174 7.9583 112.436 10.8835 111.867C12.5564 111.51 15.7063 111.114 20.3331 110.68ZM13.2065 120.361H13.3355C16.146 119.039 18.7367 117.423 21.1074 115.513V115.383H20.9784C17.4414 115.518 15.6728 115.783 15.6728 116.179L13.2065 120.361Z" fill="#212121"/>
+<path d="M35.0815 111.736C37.3854 111.736 38.7954 112.426 39.3116 113.806C39.6079 115.031 39.9664 117.462 40.387 121.099L40.5161 121.229C40.5639 121.798 40.6834 122.083 40.8746 122.083L44.7319 121.591V121.837H44.8609L46.7824 121.721V121.952L45.9364 122.198V122.329H46.7824L47.6284 122.198V122.444C46.8063 122.772 46.1658 122.936 45.7069 122.936V123.182L46.3092 123.052C46.8636 123.216 47.1409 123.38 47.1409 123.544L47.7574 123.414C49.3634 123.462 50.1664 123.626 50.1664 123.906L50.0374 124.022L50.8834 124.268V124.514C49.7936 125.083 47.5424 125.57 44.1296 125.975L41.9644 126.337C43.0064 130.466 43.5274 133.268 43.5274 134.744V135.222L43.1689 135.598H43.0398C42.7722 135.598 42.4949 135.473 42.2081 135.222V135.598H41.9644V135.352L41.5915 135.598L41.1184 135.222L39.9139 135.714L38.9388 134.744C38.5373 134.088 37.935 131.691 37.132 127.552H37.0173C31.9508 128.961 29.4175 130.061 29.4175 130.852C29.0925 131.054 28.127 132.308 26.521 134.614C25.9665 135.27 25.522 135.598 25.1874 135.598L24.9436 134.99L24.8289 135.106H24.7142C24.2267 134.817 23.9829 134.493 23.9829 134.136L23.8682 134.252H23.6244V134.006C23.2898 134.006 22.9696 133.765 22.6637 133.283C22.3387 133.283 22.1762 133.201 22.1762 133.037V132.183C22.1762 131.276 23.1417 129.776 25.0727 127.683C25.8948 126.303 27.2236 124.393 29.059 121.952L33.16 114.659L33.9917 112.214C34.4219 111.896 34.7852 111.736 35.0815 111.736ZM34.1208 123.544V123.66C35.4878 123.303 36.1713 123.062 36.1713 122.936L35.8128 120.983C35.5929 121.079 35.0289 121.933 34.1208 123.544ZM45.3341 121.475H45.5779V121.721H45.3341V121.475ZM45.4632 122.329V122.444H45.7069V122.329H45.4632Z" fill="#212121"/>
+<path d="M60.5331 110H61.2931C63.5109 110.82 64.6198 111.896 64.6198 113.227C64.0463 114.172 61.7472 119.02 57.7226 127.77L56.7046 129.578L64.6198 129.057L65.6379 129.188H66.3979V129.448H66.0251V129.839H66.7851V130.099L65.5089 130.736L65.767 131.503H66.527L67.6741 132.675C67.6741 132.906 65.1647 133.374 60.146 134.079C58.0238 134.513 55.132 135.246 51.4707 136.278H51.3417C50.8732 136.278 50.0655 135.588 48.9183 134.209V134.079L49.0474 133.963L48.9183 133.833V132.545C48.9183 132.111 49.3007 131.594 50.0655 130.996C54.0805 123.501 56.9722 117.148 58.7407 111.939L58.6117 111.548C59.147 110.516 59.7875 110 60.5331 110Z" fill="#212121"/>
+<path d="M81.5167 110.97H82.1619C83.1466 110.97 84.0069 111.621 84.743 112.923L84.4849 118.132C84.4849 119.599 84.7 120.776 85.1302 121.663C85.3118 121.653 86.1769 120.78 87.7256 119.044C88.0124 118.957 89.7331 117.264 92.8877 113.965C94.0731 112.315 95.2824 111.49 96.5156 111.49L97.4189 111.36C98.2602 111.553 98.7334 111.814 98.8385 112.142C99.0297 112.142 99.4169 112.489 100 113.183V113.444C100 114.322 98.7477 117.539 96.2431 123.096C95.3923 125.179 94.8331 126.221 94.5654 126.221L94.6945 126.351V126.482L93.0168 129.868C92.8638 129.877 92.1755 131.315 90.9519 134.18L90.0485 135.352H89.1452V135.091L88.6289 135.352C88.6289 135.159 88.3278 134.985 87.7256 134.831L87.4675 135.091C87.2285 135.063 87.0564 134.845 86.9513 134.44C86.6071 134.44 86.435 134.353 86.435 134.18V133.268C86.435 131.58 87.7256 128.319 90.3066 123.486C88.9588 124.74 87.6682 126.303 86.435 128.175C86.1483 128.175 85.7563 128.435 85.2592 128.956H85.1302C84.2124 128.31 83.3521 127.919 82.5491 127.784C81.6792 127.186 80.9049 125.406 80.2261 122.444H80.0971C76.3402 131.146 74.2705 135.665 73.8882 136.003H73.6301L72.9848 135.612L72.5976 135.743L72.4686 135.612L72.3395 135.743L72.0814 135.222L71.8233 135.482L71.6942 135.352L70.5328 135.612C70.3416 135.14 70.0835 134.879 69.7584 134.831V134.31C69.7584 132.226 72.2152 126.313 77.1288 116.57C78.2855 113.01 79.2319 111.23 79.968 111.23L81.5167 110.97Z" fill="#212121"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_208)"/>
+<mask id="mask0_12_208" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_208)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="white"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="white"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="white"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="white"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="white"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="white"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="white"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="white"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="white"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="white"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="white"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="white"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="white"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="white"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="white"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_208" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/_static/img/svg/logo-subheader-dark.svg b/docs/source/_static/img/svg/logo-subheader-dark.svg
new file mode 100644
index 0000000..9160c29
--- /dev/null
+++ b/docs/source/_static/img/svg/logo-subheader-dark.svg
@@ -0,0 +1,47 @@
+<svg width="294" height="100" viewBox="0 0 294 100" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M150.994 14.2088C156.365 14.2088 160.088 16.1464 162.165 20.0216L163.555 25.8343C163.555 28.2348 156.811 32.8044 143.323 39.543C136.322 42.5437 132.676 44.4041 132.384 45.1243C131.303 47.1304 130.608 48.1335 130.299 48.1335C129.527 48.7508 128.832 49.6767 128.214 50.9113H127.751V51.1427L127.519 50.9113H127.287C126.961 50.9113 126.498 51.9229 125.897 53.9462H125.434L125.666 54.1777V54.4092C125.185 54.4092 124.018 56.2696 122.165 59.9904C121.702 61.8423 120.775 62.7682 119.385 62.7682V62.3052H119.154L118.227 62.5367L117.97 62.3052H117.738L117.043 62.5367L116.58 62.0737L116.116 62.5367L114.495 60.6849V60.2219C114.495 58.6787 116.434 53.8776 120.312 45.8187L119.617 45.5872L119.849 45.3557V45.1243L118.69 44.1726L117.738 44.4041L117.275 43.7097L117.506 43.4782V43.2467C116.58 43.2467 116.116 43.0152 116.116 42.5523C118.021 41.0434 121.041 39.2601 125.177 37.2025L129.836 27.6861H129.604C127.751 27.6861 125.966 25.9029 124.25 22.3364V20.253C125.52 18.6413 128.78 17.3295 134.031 16.3179C137.034 15.6835 142.688 14.9804 150.994 14.2088ZM138.201 31.4155H138.433C143.478 29.0664 148.128 26.1944 152.384 22.7993V22.5678H152.152C145.803 22.8079 142.628 23.2794 142.628 23.9824L138.201 31.4155Z" fill="white"/>
+<path d="M177.468 16.0864C181.603 16.0864 184.134 17.3124 185.061 19.7644C185.593 21.942 186.237 26.2629 186.992 32.7272L187.223 32.9587C187.309 33.9704 187.524 34.4762 187.867 34.4762L194.791 33.6017V34.039H195.022L198.472 33.8332V34.2447L196.953 34.682V34.9134H198.472L199.99 34.682V35.1192C198.514 35.7022 197.365 35.9937 196.541 35.9937V36.4309L197.622 36.1994C198.617 36.4909 199.115 36.7824 199.115 37.0739L200.222 36.8424C203.105 36.9282 204.546 37.2197 204.546 37.7169L204.314 37.9227L205.833 38.3599V38.7972C203.877 39.8088 199.836 40.6747 193.71 41.3949L189.823 42.0379C191.693 49.3766 192.629 54.3577 192.629 56.9812V57.8299L191.985 58.4987H191.753C191.273 58.4987 190.775 58.2758 190.261 57.8299V58.4987H189.823V58.0614L189.154 58.4987L188.304 57.8299L186.142 58.7044L184.392 56.9812C183.671 55.8152 182.59 51.5543 181.149 44.1983H180.943C171.848 46.7018 167.301 48.6565 167.301 50.0625C166.717 50.4226 164.984 52.6517 162.101 56.7497C161.106 57.9157 160.308 58.4987 159.707 58.4987L159.27 57.4184L159.064 57.6242H158.858C157.983 57.1098 157.545 56.5354 157.545 55.9009L157.339 56.1067H156.902V55.6695C156.301 55.6695 155.726 55.2408 155.177 54.3835C154.594 54.3835 154.302 54.2377 154.302 53.9462V52.4287C154.302 50.817 156.035 48.1507 159.502 44.4298C160.977 41.9779 163.362 38.5828 166.657 34.2447L174.019 21.2818L175.512 16.9352C176.284 16.3693 176.936 16.0864 177.468 16.0864ZM175.743 37.0739V37.2797C178.197 36.6452 179.424 36.2166 179.424 35.9937L178.781 32.5215C178.386 32.6929 177.373 34.2104 175.743 37.0739ZM195.872 33.396H196.309V33.8332H195.872V33.396ZM196.103 34.9134V35.1192H196.541V34.9134H196.103Z" fill="white"/>
+<path d="M223.155 13H224.519C228.5 14.4575 230.491 16.3693 230.491 18.7356C229.461 20.4159 225.334 29.0321 218.11 44.5841L216.282 47.7991L230.491 46.8732L232.318 47.1047H233.682V47.5677H233.013V48.2621H234.377V48.7251L232.087 49.8567L232.55 51.2199H233.914L235.973 53.3032C235.973 53.7147 231.469 54.5464 222.46 55.7981C218.65 56.5697 213.46 57.8728 206.887 59.7075H206.656C205.815 59.7075 204.365 58.4815 202.306 56.0295V55.7981L202.537 55.5923L202.306 55.3608V53.0717C202.306 52.3001 202.992 51.3828 204.365 50.3197C211.572 36.9968 216.763 25.7057 219.937 16.4465L219.706 15.752C220.667 13.9173 221.816 13 223.155 13Z" fill="white"/>
+<path d="M260.821 14.7232H261.98C263.747 14.7232 265.292 15.8806 266.613 18.1954L266.15 27.4546C266.15 30.0609 266.536 32.1528 267.308 33.7303C267.634 33.7132 269.187 32.1614 271.967 29.075C272.482 28.9207 275.57 25.9114 281.233 20.0473C283.361 17.1152 285.532 15.6492 287.745 15.6492L289.367 15.4177C290.877 15.7606 291.726 16.2236 291.915 16.8066C292.258 16.8066 292.953 17.4238 294 18.6584V19.1214C294 20.6817 291.752 26.4001 287.256 36.2766C285.729 39.9803 284.725 41.8321 284.245 41.8321L284.476 42.0636V42.2951L281.465 48.3135C281.19 48.3307 279.955 50.8855 277.758 55.9781L276.137 58.0614H274.515V57.5985L273.588 58.0614C273.588 57.7185 273.048 57.4099 271.967 57.1355L271.503 57.5985C271.074 57.547 270.766 57.1612 270.577 56.4411C269.959 56.4411 269.65 56.2867 269.65 55.9781V54.3577C269.65 51.3571 271.967 45.5615 276.6 36.971C274.18 39.2001 271.864 41.9779 269.65 45.3043C269.135 45.3043 268.432 45.7673 267.54 46.6932H267.308C265.661 45.5444 264.116 44.8499 262.675 44.6099C261.113 43.5468 259.723 40.3832 258.505 35.1192H258.273C251.529 50.5855 247.814 58.6187 247.128 59.2188H246.665L245.506 58.5244L244.811 58.7559L244.58 58.5244L244.348 58.7559L243.885 57.8299L243.421 58.2929L243.19 58.0614L241.105 58.5244C240.762 57.6842 240.298 57.2212 239.715 57.1355V56.2096C239.715 52.5059 244.125 41.995 252.945 24.6769C255.021 18.3498 256.72 15.1862 258.042 15.1862L260.821 14.7232Z" fill="white"/>
+<path d="M120.93 87C119.671 87 118.595 86.7799 117.701 86.3396C116.82 85.8993 116.109 85.327 115.567 84.6226C115.026 83.9181 114.629 83.1571 114.378 82.3395C114.126 81.5093 114 80.7105 114 79.9432V79.5281C114 78.6979 114.126 77.8676 114.378 77.0374C114.642 76.2072 115.045 75.4525 115.586 74.7732C116.127 74.0939 116.832 73.5468 117.701 73.1317C118.57 72.7165 119.608 72.509 120.817 72.509C122.655 72.509 124.102 72.9807 125.16 73.9241C126.23 74.855 126.853 76.1003 127.029 77.6601H125.141C124.977 76.4903 124.493 75.6223 123.687 75.0562C122.894 74.4902 121.937 74.2072 120.817 74.2072C119.734 74.2072 118.821 74.4587 118.079 74.9619C117.349 75.4525 116.801 76.1192 116.436 76.962C116.071 77.7922 115.888 78.723 115.888 79.7545C115.888 80.7357 116.071 81.6476 116.436 82.4904C116.814 83.3332 117.374 84.0125 118.116 84.5282C118.872 85.044 119.81 85.3018 120.93 85.3018C122.113 85.3018 123.108 85.0062 123.914 84.415C124.719 83.8238 125.21 82.9684 125.386 81.8489H127.275C127.149 82.7923 126.828 83.654 126.312 84.4339C125.808 85.2138 125.103 85.8364 124.197 86.3019C123.303 86.7673 122.214 87 120.93 87Z" fill="white"/>
+<path d="M131.088 86.6604V72.8864H132.938V84.9999H138.867V86.6604H131.088Z" fill="white"/>
+<path d="M142.53 86.6604V72.8864H144.38V86.6604H142.53Z" fill="white"/>
+<path d="M154.992 86.6604V78.0563H153.595V76.6978H154.992V76.0751C154.992 74.9556 155.288 74.1317 155.88 73.6034C156.472 73.0751 157.34 72.8109 158.486 72.8109H159.732V74.3204H158.184C157.718 74.3204 157.359 74.4525 157.107 74.7166C156.855 74.9682 156.73 75.3204 156.73 75.7732V76.6978H159.921V78.0563H156.73V86.6604H154.992Z" fill="white"/>
+<path d="M162.979 86.6604V76.5846H164.414V79.6035C164.565 78.5218 164.962 77.7293 165.604 77.2261C166.246 76.723 167.121 76.4714 168.228 76.4714H168.568V78.0941H167.926C166.919 78.0941 166.145 78.3645 165.604 78.9054C165.062 79.4337 164.792 80.2011 164.792 81.2074V86.6604H162.979Z" fill="white"/>
+<path d="M174.615 86.9245C173.469 86.9245 172.569 86.6415 171.914 86.0754C171.272 85.4968 170.951 84.6855 170.951 83.6414C170.951 82.5722 171.31 81.7671 172.028 81.2262C172.745 80.6728 173.759 80.396 175.068 80.396H177.617V80.1507C177.617 78.7545 176.912 78.0563 175.502 78.0563C174.923 78.0563 174.319 78.0689 173.689 78.0941C173.06 78.1192 172.538 78.1444 172.122 78.1695V76.5846C172.525 76.5469 172.972 76.5217 173.463 76.5091C173.966 76.484 174.445 76.4714 174.898 76.4714C176.446 76.4714 177.573 76.7544 178.278 77.3205C178.996 77.8865 179.354 78.874 179.354 80.2828V86.6604H177.919V84.6603C177.466 86.1698 176.365 86.9245 174.615 86.9245ZM174.992 85.4905C175.42 85.4905 175.83 85.415 176.22 85.2641C176.61 85.1006 176.931 84.8364 177.183 84.4716C177.447 84.0942 177.592 83.5785 177.617 82.9244V81.7546H174.992C174.262 81.7546 173.702 81.9307 173.312 82.2829C172.922 82.6351 172.726 83.0879 172.726 83.6414C172.726 84.1949 172.922 84.6414 173.312 84.9811C173.702 85.3207 174.262 85.4905 174.992 85.4905Z" fill="white"/>
+<path d="M183.814 86.6604V76.5846H185.25V78.9054C185.464 78.0626 185.841 77.4148 186.383 76.962C186.936 76.5091 187.654 76.2827 188.535 76.2827H188.611C189.467 76.2827 190.165 76.4965 190.707 76.9242C191.248 77.3519 191.632 77.9683 191.859 78.7733C192.098 77.9683 192.488 77.3519 193.029 76.9242C193.583 76.4965 194.288 76.2827 195.144 76.2827H195.22C196.416 76.2827 197.303 76.6915 197.882 77.5091C198.474 78.3142 198.77 79.4463 198.77 80.9055V86.6604H196.957V80.5092C196.957 79.6916 196.756 79.0627 196.353 78.6224C195.95 78.1695 195.39 77.9431 194.672 77.9431C193.929 77.9431 193.332 78.1821 192.878 78.6601C192.425 79.1255 192.199 79.7797 192.199 80.6224V86.6604H190.386V80.5092C190.386 79.6916 190.184 79.0627 189.781 78.6224C189.379 78.1695 188.818 77.9431 188.101 77.9431C187.358 77.9431 186.76 78.1821 186.307 78.6601C185.854 79.1255 185.627 79.7797 185.627 80.6224V86.6604H183.814Z" fill="white"/>
+<path d="M207.508 87C206.627 87 205.866 86.8491 205.224 86.5472C204.581 86.2453 204.059 85.849 203.656 85.3584C203.253 84.8553 202.951 84.2955 202.75 83.6791C202.561 83.0628 202.467 82.4338 202.467 81.7923V81.4527C202.467 80.7986 202.561 80.1633 202.75 79.5469C202.951 78.9306 203.253 78.3771 203.656 77.8865C204.059 77.3834 204.569 76.9871 205.186 76.6978C205.815 76.3959 206.552 76.245 207.395 76.245C208.49 76.245 209.39 76.484 210.095 76.962C210.813 77.4274 211.342 78.0312 211.682 78.7733C212.034 79.5155 212.21 80.308 212.21 81.1508V81.9621H204.204C204.267 82.9559 204.563 83.7798 205.091 84.4339C205.62 85.088 206.426 85.415 207.508 85.415C208.301 85.415 208.943 85.2389 209.434 84.8867C209.938 84.5345 210.24 84.1257 210.341 83.6603H212.04C211.826 84.7043 211.316 85.522 210.511 86.1132C209.705 86.7044 208.704 87 207.508 87ZM207.395 77.8299C206.489 77.8299 205.777 78.0878 205.261 78.6035C204.745 79.1067 204.418 79.7734 204.279 80.6036H210.435C210.322 79.7482 210.014 79.0752 209.51 78.5846C209.006 78.0815 208.301 77.8299 207.395 77.8299Z" fill="white"/>
+<path d="M217.448 86.6604L214.597 76.5846H216.334L218.714 85.2264H219.091L220.828 76.9242H223.283L225.304 85.2264H225.681L227.758 76.5846H229.401L226.928 86.6604H224.114L222.056 78.2828L220.281 86.6604H217.448Z" fill="white"/>
+<path d="M237.443 87C236.562 87 235.788 86.8491 235.121 86.5472C234.454 86.2453 233.887 85.849 233.421 85.3584C232.968 84.8553 232.622 84.2955 232.383 83.6791C232.156 83.0628 232.043 82.4338 232.043 81.7923V81.4527C232.043 80.8111 232.162 80.1822 232.402 79.5658C232.641 78.9369 232.993 78.3771 233.459 77.8865C233.925 77.3834 234.491 76.9871 235.159 76.6978C235.826 76.3959 236.587 76.245 237.443 76.245C238.299 76.245 239.061 76.3959 239.728 76.6978C240.395 76.9871 240.962 77.3834 241.428 77.8865C241.893 78.3771 242.246 78.9369 242.485 79.5658C242.724 80.1822 242.844 80.8111 242.844 81.4527V81.7923C242.844 82.4338 242.724 83.0628 242.485 83.6791C242.259 84.2955 241.912 84.8553 241.447 85.3584C240.993 85.849 240.433 86.2453 239.766 86.5472C239.099 86.8491 238.325 87 237.443 87ZM237.443 85.3773C238.199 85.3773 238.841 85.2138 239.369 84.8867C239.911 84.5471 240.32 84.0942 240.597 83.5282C240.886 82.9621 241.031 82.3269 241.031 81.6225C241.031 80.9055 240.886 80.2639 240.597 79.6979C240.307 79.1318 239.892 78.6853 239.351 78.3582C238.822 78.0312 238.186 77.8676 237.443 77.8676C236.713 77.8676 236.078 78.0312 235.536 78.3582C234.995 78.6853 234.579 79.1318 234.29 79.6979C234 80.2639 233.856 80.9055 233.856 81.6225C233.856 82.3269 233.994 82.9621 234.271 83.5282C234.561 84.0942 234.97 84.5471 235.498 84.8867C236.04 85.2138 236.688 85.3773 237.443 85.3773Z" fill="white"/>
+<path d="M246.692 86.6604V76.5846H248.127V79.6035C248.278 78.5218 248.675 77.7293 249.317 77.2261C249.959 76.723 250.834 76.4714 251.941 76.4714H252.281V78.0941H251.639C250.632 78.0941 249.858 78.3645 249.317 78.9054C248.775 79.4337 248.505 80.2011 248.505 81.2074V86.6604H246.692Z" fill="white"/>
+<path d="M255.57 86.6604V72.8864H257.383V81.5847L261.688 76.5846H263.595L259.875 80.8866L264.615 86.6604H262.519L258.723 81.9621H257.383V86.6604H255.57Z" fill="white"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_188)"/>
+<mask id="mask0_12_188" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_188)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="#212121"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="#212121"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="#212121"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="#212121"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="#212121"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="#212121"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="#212121"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="#212121"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="#212121"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="#212121"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="#212121"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="#212121"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="#212121"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="#212121"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="#212121"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_188" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/_static/img/svg/logo-subheader-white.svg b/docs/source/_static/img/svg/logo-subheader-white.svg
new file mode 100644
index 0000000..8c2daf8
--- /dev/null
+++ b/docs/source/_static/img/svg/logo-subheader-white.svg
@@ -0,0 +1,47 @@
+<svg width="294" height="100" viewBox="0 0 294 100" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M150.994 14.2088C156.365 14.2088 160.088 16.1464 162.165 20.0216L163.555 25.8343C163.555 28.2348 156.811 32.8044 143.323 39.543C136.322 42.5437 132.676 44.4041 132.384 45.1243C131.303 47.1304 130.608 48.1335 130.299 48.1335C129.527 48.7508 128.832 49.6767 128.214 50.9113H127.751V51.1427L127.519 50.9113H127.287C126.961 50.9113 126.498 51.9229 125.897 53.9462H125.434L125.666 54.1777V54.4092C125.185 54.4092 124.018 56.2696 122.165 59.9904C121.702 61.8423 120.775 62.7682 119.385 62.7682V62.3052H119.154L118.227 62.5367L117.97 62.3052H117.738L117.043 62.5367L116.58 62.0737L116.116 62.5367L114.495 60.6849V60.2219C114.495 58.6787 116.434 53.8776 120.312 45.8187L119.617 45.5872L119.849 45.3557V45.1243L118.69 44.1726L117.738 44.4041L117.275 43.7097L117.506 43.4782V43.2467C116.58 43.2467 116.116 43.0152 116.116 42.5523C118.021 41.0434 121.041 39.2601 125.177 37.2025L129.836 27.6861H129.604C127.751 27.6861 125.966 25.9029 124.25 22.3364V20.253C125.52 18.6413 128.78 17.3295 134.031 16.3179C137.034 15.6835 142.688 14.9804 150.994 14.2088ZM138.201 31.4155H138.433C143.478 29.0664 148.128 26.1944 152.384 22.7993V22.5678H152.152C145.803 22.8079 142.628 23.2794 142.628 23.9824L138.201 31.4155Z" fill="white"/>
+<path d="M177.468 16.0864C181.603 16.0864 184.134 17.3124 185.061 19.7644C185.593 21.942 186.237 26.2629 186.992 32.7272L187.223 32.9587C187.309 33.9704 187.524 34.4762 187.867 34.4762L194.791 33.6017V34.039H195.022L198.472 33.8332V34.2447L196.953 34.682V34.9134H198.472L199.99 34.682V35.1192C198.514 35.7022 197.365 35.9937 196.541 35.9937V36.4309L197.622 36.1994C198.617 36.4909 199.115 36.7824 199.115 37.0739L200.222 36.8424C203.105 36.9282 204.546 37.2197 204.546 37.7169L204.314 37.9227L205.833 38.3599V38.7972C203.877 39.8088 199.836 40.6747 193.71 41.3949L189.823 42.0379C191.693 49.3766 192.629 54.3577 192.629 56.9812V57.8299L191.985 58.4987H191.753C191.273 58.4987 190.775 58.2758 190.261 57.8299V58.4987H189.823V58.0614L189.154 58.4987L188.304 57.8299L186.142 58.7044L184.392 56.9812C183.671 55.8152 182.59 51.5543 181.149 44.1983H180.943C171.848 46.7018 167.301 48.6565 167.301 50.0625C166.717 50.4226 164.984 52.6517 162.101 56.7497C161.106 57.9157 160.308 58.4987 159.707 58.4987L159.27 57.4184L159.064 57.6242H158.858C157.983 57.1098 157.545 56.5354 157.545 55.9009L157.339 56.1067H156.902V55.6695C156.301 55.6695 155.726 55.2408 155.177 54.3835C154.594 54.3835 154.302 54.2377 154.302 53.9462V52.4287C154.302 50.817 156.035 48.1507 159.502 44.4298C160.977 41.9779 163.362 38.5828 166.657 34.2447L174.019 21.2818L175.512 16.9352C176.284 16.3693 176.936 16.0864 177.468 16.0864ZM175.743 37.0739V37.2797C178.197 36.6452 179.424 36.2166 179.424 35.9937L178.781 32.5215C178.386 32.6929 177.373 34.2104 175.743 37.0739ZM195.872 33.396H196.309V33.8332H195.872V33.396ZM196.103 34.9134V35.1192H196.541V34.9134H196.103Z" fill="white"/>
+<path d="M223.155 13H224.519C228.5 14.4575 230.491 16.3693 230.491 18.7356C229.461 20.4159 225.334 29.0321 218.11 44.5841L216.282 47.7991L230.491 46.8732L232.318 47.1047H233.682V47.5677H233.013V48.2621H234.377V48.7251L232.087 49.8567L232.55 51.2199H233.914L235.973 53.3032C235.973 53.7147 231.469 54.5464 222.46 55.7981C218.65 56.5697 213.46 57.8728 206.887 59.7075H206.656C205.815 59.7075 204.365 58.4815 202.306 56.0295V55.7981L202.537 55.5923L202.306 55.3608V53.0717C202.306 52.3001 202.992 51.3828 204.365 50.3197C211.572 36.9968 216.763 25.7057 219.937 16.4465L219.706 15.752C220.667 13.9173 221.816 13 223.155 13Z" fill="white"/>
+<path d="M260.821 14.7232H261.98C263.747 14.7232 265.292 15.8806 266.613 18.1954L266.15 27.4546C266.15 30.0609 266.536 32.1528 267.308 33.7303C267.634 33.7132 269.187 32.1614 271.967 29.075C272.482 28.9207 275.57 25.9114 281.233 20.0473C283.361 17.1152 285.532 15.6492 287.745 15.6492L289.367 15.4177C290.877 15.7606 291.726 16.2236 291.915 16.8066C292.258 16.8066 292.953 17.4238 294 18.6584V19.1214C294 20.6817 291.752 26.4001 287.256 36.2766C285.729 39.9803 284.725 41.8321 284.245 41.8321L284.476 42.0636V42.2951L281.465 48.3135C281.19 48.3307 279.955 50.8855 277.758 55.9781L276.137 58.0614H274.515V57.5985L273.588 58.0614C273.588 57.7185 273.048 57.4099 271.967 57.1355L271.503 57.5985C271.074 57.547 270.766 57.1612 270.577 56.4411C269.959 56.4411 269.65 56.2867 269.65 55.9781V54.3577C269.65 51.3571 271.967 45.5615 276.6 36.971C274.18 39.2001 271.864 41.9779 269.65 45.3043C269.135 45.3043 268.432 45.7673 267.54 46.6932H267.308C265.661 45.5444 264.116 44.8499 262.675 44.6099C261.113 43.5468 259.723 40.3832 258.505 35.1192H258.273C251.529 50.5855 247.814 58.6187 247.128 59.2188H246.665L245.506 58.5244L244.811 58.7559L244.58 58.5244L244.348 58.7559L243.885 57.8299L243.421 58.2929L243.19 58.0614L241.105 58.5244C240.762 57.6842 240.298 57.2212 239.715 57.1355V56.2096C239.715 52.5059 244.125 41.995 252.945 24.6769C255.021 18.3498 256.72 15.1862 258.042 15.1862L260.821 14.7232Z" fill="white"/>
+<path d="M120.93 87C119.671 87 118.595 86.7799 117.701 86.3396C116.82 85.8993 116.109 85.327 115.567 84.6226C115.026 83.9181 114.629 83.1571 114.378 82.3395C114.126 81.5093 114 80.7105 114 79.9432V79.5281C114 78.6979 114.126 77.8676 114.378 77.0374C114.642 76.2072 115.045 75.4525 115.586 74.7732C116.127 74.0939 116.832 73.5468 117.701 73.1317C118.57 72.7165 119.608 72.509 120.817 72.509C122.655 72.509 124.102 72.9807 125.16 73.9241C126.23 74.855 126.853 76.1003 127.029 77.6601H125.141C124.977 76.4903 124.493 75.6223 123.687 75.0562C122.894 74.4902 121.937 74.2072 120.817 74.2072C119.734 74.2072 118.821 74.4587 118.079 74.9619C117.349 75.4525 116.801 76.1192 116.436 76.962C116.071 77.7922 115.888 78.723 115.888 79.7545C115.888 80.7357 116.071 81.6476 116.436 82.4904C116.814 83.3332 117.374 84.0125 118.116 84.5282C118.872 85.044 119.81 85.3018 120.93 85.3018C122.113 85.3018 123.108 85.0062 123.914 84.415C124.719 83.8238 125.21 82.9684 125.386 81.8489H127.275C127.149 82.7923 126.828 83.654 126.312 84.4339C125.808 85.2138 125.103 85.8364 124.197 86.3019C123.303 86.7673 122.214 87 120.93 87Z" fill="white"/>
+<path d="M131.088 86.6604V72.8864H132.938V84.9999H138.867V86.6604H131.088Z" fill="white"/>
+<path d="M142.53 86.6604V72.8864H144.38V86.6604H142.53Z" fill="white"/>
+<path d="M154.992 86.6604V78.0563H153.595V76.6978H154.992V76.0751C154.992 74.9556 155.288 74.1317 155.88 73.6034C156.472 73.0751 157.34 72.8109 158.486 72.8109H159.732V74.3204H158.184C157.718 74.3204 157.359 74.4525 157.107 74.7166C156.855 74.9682 156.73 75.3204 156.73 75.7732V76.6978H159.921V78.0563H156.73V86.6604H154.992Z" fill="white"/>
+<path d="M162.979 86.6604V76.5846H164.414V79.6035C164.565 78.5218 164.962 77.7293 165.604 77.2261C166.246 76.723 167.121 76.4714 168.228 76.4714H168.568V78.0941H167.926C166.919 78.0941 166.145 78.3645 165.604 78.9054C165.062 79.4337 164.792 80.2011 164.792 81.2074V86.6604H162.979Z" fill="white"/>
+<path d="M174.615 86.9245C173.469 86.9245 172.569 86.6415 171.914 86.0754C171.272 85.4968 170.951 84.6855 170.951 83.6414C170.951 82.5722 171.31 81.7671 172.028 81.2262C172.745 80.6728 173.759 80.396 175.068 80.396H177.617V80.1507C177.617 78.7545 176.912 78.0563 175.502 78.0563C174.923 78.0563 174.319 78.0689 173.689 78.0941C173.06 78.1192 172.538 78.1444 172.122 78.1695V76.5846C172.525 76.5469 172.972 76.5217 173.463 76.5091C173.966 76.484 174.445 76.4714 174.898 76.4714C176.446 76.4714 177.573 76.7544 178.278 77.3205C178.996 77.8865 179.354 78.874 179.354 80.2828V86.6604H177.919V84.6603C177.466 86.1698 176.365 86.9245 174.615 86.9245ZM174.992 85.4905C175.42 85.4905 175.83 85.415 176.22 85.2641C176.61 85.1006 176.931 84.8364 177.183 84.4716C177.447 84.0942 177.592 83.5785 177.617 82.9244V81.7546H174.992C174.262 81.7546 173.702 81.9307 173.312 82.2829C172.922 82.6351 172.726 83.0879 172.726 83.6414C172.726 84.1949 172.922 84.6414 173.312 84.9811C173.702 85.3207 174.262 85.4905 174.992 85.4905Z" fill="white"/>
+<path d="M183.814 86.6604V76.5846H185.25V78.9054C185.464 78.0626 185.841 77.4148 186.383 76.962C186.936 76.5091 187.654 76.2827 188.535 76.2827H188.611C189.467 76.2827 190.165 76.4965 190.707 76.9242C191.248 77.3519 191.632 77.9683 191.859 78.7733C192.098 77.9683 192.488 77.3519 193.029 76.9242C193.583 76.4965 194.288 76.2827 195.144 76.2827H195.22C196.416 76.2827 197.303 76.6915 197.882 77.5091C198.474 78.3142 198.77 79.4463 198.77 80.9055V86.6604H196.957V80.5092C196.957 79.6916 196.756 79.0627 196.353 78.6224C195.95 78.1695 195.39 77.9431 194.672 77.9431C193.929 77.9431 193.332 78.1821 192.878 78.6601C192.425 79.1255 192.199 79.7797 192.199 80.6224V86.6604H190.386V80.5092C190.386 79.6916 190.184 79.0627 189.781 78.6224C189.379 78.1695 188.818 77.9431 188.101 77.9431C187.358 77.9431 186.76 78.1821 186.307 78.6601C185.854 79.1255 185.627 79.7797 185.627 80.6224V86.6604H183.814Z" fill="white"/>
+<path d="M207.508 87C206.627 87 205.866 86.8491 205.224 86.5472C204.581 86.2453 204.059 85.849 203.656 85.3584C203.253 84.8553 202.951 84.2955 202.75 83.6791C202.561 83.0628 202.467 82.4338 202.467 81.7923V81.4527C202.467 80.7986 202.561 80.1633 202.75 79.5469C202.951 78.9306 203.253 78.3771 203.656 77.8865C204.059 77.3834 204.569 76.9871 205.186 76.6978C205.815 76.3959 206.552 76.245 207.395 76.245C208.49 76.245 209.39 76.484 210.095 76.962C210.813 77.4274 211.342 78.0312 211.682 78.7733C212.034 79.5155 212.21 80.308 212.21 81.1508V81.9621H204.204C204.267 82.9559 204.563 83.7798 205.091 84.4339C205.62 85.088 206.426 85.415 207.508 85.415C208.301 85.415 208.943 85.2389 209.434 84.8867C209.938 84.5345 210.24 84.1257 210.341 83.6603H212.04C211.826 84.7043 211.316 85.522 210.511 86.1132C209.705 86.7044 208.704 87 207.508 87ZM207.395 77.8299C206.489 77.8299 205.777 78.0878 205.261 78.6035C204.745 79.1067 204.418 79.7734 204.279 80.6036H210.435C210.322 79.7482 210.014 79.0752 209.51 78.5846C209.006 78.0815 208.301 77.8299 207.395 77.8299Z" fill="white"/>
+<path d="M217.448 86.6604L214.597 76.5846H216.334L218.714 85.2264H219.091L220.828 76.9242H223.283L225.304 85.2264H225.681L227.758 76.5846H229.401L226.928 86.6604H224.114L222.056 78.2828L220.281 86.6604H217.448Z" fill="white"/>
+<path d="M237.443 87C236.562 87 235.788 86.8491 235.121 86.5472C234.454 86.2453 233.887 85.849 233.421 85.3584C232.968 84.8553 232.622 84.2955 232.383 83.6791C232.156 83.0628 232.043 82.4338 232.043 81.7923V81.4527C232.043 80.8111 232.162 80.1822 232.402 79.5658C232.641 78.9369 232.993 78.3771 233.459 77.8865C233.925 77.3834 234.491 76.9871 235.159 76.6978C235.826 76.3959 236.587 76.245 237.443 76.245C238.299 76.245 239.061 76.3959 239.728 76.6978C240.395 76.9871 240.962 77.3834 241.428 77.8865C241.893 78.3771 242.246 78.9369 242.485 79.5658C242.724 80.1822 242.844 80.8111 242.844 81.4527V81.7923C242.844 82.4338 242.724 83.0628 242.485 83.6791C242.259 84.2955 241.912 84.8553 241.447 85.3584C240.993 85.849 240.433 86.2453 239.766 86.5472C239.099 86.8491 238.325 87 237.443 87ZM237.443 85.3773C238.199 85.3773 238.841 85.2138 239.369 84.8867C239.911 84.5471 240.32 84.0942 240.597 83.5282C240.886 82.9621 241.031 82.3269 241.031 81.6225C241.031 80.9055 240.886 80.2639 240.597 79.6979C240.307 79.1318 239.892 78.6853 239.351 78.3582C238.822 78.0312 238.186 77.8676 237.443 77.8676C236.713 77.8676 236.078 78.0312 235.536 78.3582C234.995 78.6853 234.579 79.1318 234.29 79.6979C234 80.2639 233.856 80.9055 233.856 81.6225C233.856 82.3269 233.994 82.9621 234.271 83.5282C234.561 84.0942 234.97 84.5471 235.498 84.8867C236.04 85.2138 236.688 85.3773 237.443 85.3773Z" fill="white"/>
+<path d="M246.692 86.6604V76.5846H248.127V79.6035C248.278 78.5218 248.675 77.7293 249.317 77.2261C249.959 76.723 250.834 76.4714 251.941 76.4714H252.281V78.0941H251.639C250.632 78.0941 249.858 78.3645 249.317 78.9054C248.775 79.4337 248.505 80.2011 248.505 81.2074V86.6604H246.692Z" fill="white"/>
+<path d="M255.57 86.6604V72.8864H257.383V81.5847L261.688 76.5846H263.595L259.875 80.8866L264.615 86.6604H262.519L258.723 81.9621H257.383V86.6604H255.57Z" fill="white"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_381)"/>
+<mask id="mask0_12_381" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_381)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="white"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="white"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="white"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="white"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="white"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="white"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="white"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="white"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="white"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="white"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="white"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="white"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="white"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="white"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="white"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_381" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/_static/img/svg/logo-subheader.svg b/docs/source/_static/img/svg/logo-subheader.svg
new file mode 100644
index 0000000..a4d4c5c
--- /dev/null
+++ b/docs/source/_static/img/svg/logo-subheader.svg
@@ -0,0 +1,47 @@
+<svg width="294" height="100" viewBox="0 0 294 100" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M150.994 14.2088C156.365 14.2088 160.088 16.1464 162.165 20.0216L163.555 25.8343C163.555 28.2348 156.811 32.8044 143.323 39.543C136.322 42.5437 132.676 44.4041 132.384 45.1243C131.303 47.1304 130.608 48.1335 130.299 48.1335C129.527 48.7508 128.832 49.6767 128.214 50.9113H127.751V51.1427L127.519 50.9113H127.287C126.961 50.9113 126.498 51.9229 125.897 53.9462H125.434L125.666 54.1777V54.4092C125.185 54.4092 124.018 56.2696 122.165 59.9904C121.702 61.8423 120.775 62.7682 119.385 62.7682V62.3052H119.154L118.227 62.5367L117.97 62.3052H117.738L117.043 62.5367L116.58 62.0737L116.116 62.5367L114.495 60.6849V60.2219C114.495 58.6787 116.434 53.8776 120.312 45.8187L119.617 45.5872L119.849 45.3557V45.1243L118.69 44.1726L117.738 44.4041L117.275 43.7097L117.506 43.4782V43.2467C116.58 43.2467 116.116 43.0152 116.116 42.5523C118.021 41.0434 121.041 39.2601 125.177 37.2025L129.836 27.6861H129.604C127.751 27.6861 125.966 25.9029 124.25 22.3364V20.253C125.52 18.6413 128.78 17.3295 134.031 16.3179C137.034 15.6835 142.688 14.9804 150.994 14.2088ZM138.201 31.4155H138.433C143.478 29.0664 148.128 26.1944 152.384 22.7993V22.5678H152.152C145.803 22.8079 142.628 23.2794 142.628 23.9824L138.201 31.4155Z" fill="#212121"/>
+<path d="M177.468 16.0864C181.603 16.0864 184.134 17.3124 185.061 19.7644C185.593 21.942 186.237 26.2629 186.992 32.7272L187.223 32.9587C187.309 33.9704 187.524 34.4762 187.867 34.4762L194.791 33.6017V34.039H195.022L198.472 33.8332V34.2447L196.953 34.682V34.9134H198.472L199.99 34.682V35.1192C198.514 35.7022 197.365 35.9937 196.541 35.9937V36.4309L197.622 36.1994C198.617 36.4909 199.115 36.7824 199.115 37.0739L200.222 36.8424C203.105 36.9282 204.546 37.2197 204.546 37.7169L204.314 37.9227L205.833 38.3599V38.7972C203.877 39.8088 199.836 40.6747 193.71 41.3949L189.823 42.0379C191.693 49.3766 192.629 54.3577 192.629 56.9812V57.8299L191.985 58.4987H191.753C191.273 58.4987 190.775 58.2758 190.261 57.8299V58.4987H189.823V58.0614L189.154 58.4987L188.304 57.8299L186.142 58.7044L184.392 56.9812C183.671 55.8152 182.59 51.5543 181.149 44.1983H180.943C171.848 46.7018 167.301 48.6565 167.301 50.0625C166.717 50.4226 164.984 52.6517 162.101 56.7497C161.106 57.9157 160.308 58.4987 159.707 58.4987L159.27 57.4184L159.064 57.6242H158.858C157.983 57.1098 157.545 56.5354 157.545 55.9009L157.339 56.1067H156.902V55.6695C156.301 55.6695 155.726 55.2408 155.177 54.3835C154.594 54.3835 154.302 54.2377 154.302 53.9462V52.4287C154.302 50.817 156.035 48.1507 159.502 44.4298C160.977 41.9779 163.362 38.5828 166.657 34.2447L174.019 21.2818L175.512 16.9352C176.284 16.3693 176.936 16.0864 177.468 16.0864ZM175.743 37.0739V37.2797C178.197 36.6452 179.424 36.2166 179.424 35.9937L178.781 32.5215C178.386 32.6929 177.373 34.2104 175.743 37.0739ZM195.872 33.396H196.309V33.8332H195.872V33.396ZM196.103 34.9134V35.1192H196.541V34.9134H196.103Z" fill="#212121"/>
+<path d="M223.155 13H224.519C228.5 14.4575 230.491 16.3693 230.491 18.7356C229.461 20.4159 225.334 29.0321 218.11 44.5841L216.282 47.7991L230.491 46.8732L232.318 47.1047H233.682V47.5677H233.013V48.2621H234.377V48.7251L232.087 49.8567L232.55 51.2199H233.914L235.973 53.3032C235.973 53.7147 231.469 54.5464 222.46 55.7981C218.65 56.5697 213.46 57.8728 206.887 59.7075H206.656C205.815 59.7075 204.365 58.4815 202.306 56.0295V55.7981L202.537 55.5923L202.306 55.3608V53.0717C202.306 52.3001 202.992 51.3828 204.365 50.3197C211.572 36.9968 216.763 25.7057 219.937 16.4465L219.706 15.752C220.667 13.9173 221.816 13 223.155 13Z" fill="#212121"/>
+<path d="M260.821 14.7232H261.98C263.747 14.7232 265.292 15.8806 266.613 18.1954L266.15 27.4546C266.15 30.0609 266.536 32.1528 267.308 33.7303C267.634 33.7132 269.187 32.1614 271.967 29.075C272.482 28.9207 275.57 25.9114 281.233 20.0473C283.361 17.1152 285.532 15.6492 287.745 15.6492L289.367 15.4177C290.877 15.7606 291.726 16.2236 291.915 16.8066C292.258 16.8066 292.953 17.4238 294 18.6584V19.1214C294 20.6817 291.752 26.4001 287.256 36.2766C285.729 39.9803 284.725 41.8321 284.245 41.8321L284.476 42.0636V42.2951L281.465 48.3135C281.19 48.3307 279.955 50.8855 277.758 55.9781L276.137 58.0614H274.515V57.5985L273.588 58.0614C273.588 57.7185 273.048 57.4099 271.967 57.1355L271.503 57.5985C271.074 57.547 270.766 57.1612 270.577 56.4411C269.959 56.4411 269.65 56.2867 269.65 55.9781V54.3577C269.65 51.3571 271.967 45.5615 276.6 36.971C274.18 39.2001 271.864 41.9779 269.65 45.3043C269.135 45.3043 268.432 45.7673 267.54 46.6932H267.308C265.661 45.5444 264.116 44.8499 262.675 44.6099C261.113 43.5468 259.723 40.3832 258.505 35.1192H258.273C251.529 50.5855 247.814 58.6187 247.128 59.2188H246.665L245.506 58.5244L244.811 58.7559L244.58 58.5244L244.348 58.7559L243.885 57.8299L243.421 58.2929L243.19 58.0614L241.105 58.5244C240.762 57.6842 240.298 57.2212 239.715 57.1355V56.2096C239.715 52.5059 244.125 41.995 252.945 24.6769C255.021 18.3498 256.72 15.1862 258.042 15.1862L260.821 14.7232Z" fill="#212121"/>
+<path d="M120.93 87C119.671 87 118.595 86.7799 117.701 86.3396C116.82 85.8993 116.109 85.327 115.567 84.6226C115.026 83.9181 114.629 83.1571 114.378 82.3395C114.126 81.5093 114 80.7105 114 79.9432V79.5281C114 78.6979 114.126 77.8676 114.378 77.0374C114.642 76.2072 115.045 75.4525 115.586 74.7732C116.127 74.0939 116.832 73.5468 117.701 73.1317C118.57 72.7165 119.608 72.509 120.817 72.509C122.655 72.509 124.102 72.9807 125.16 73.9241C126.23 74.855 126.853 76.1003 127.029 77.6601H125.141C124.977 76.4903 124.493 75.6223 123.687 75.0562C122.894 74.4902 121.937 74.2072 120.817 74.2072C119.734 74.2072 118.821 74.4587 118.079 74.9619C117.349 75.4525 116.801 76.1192 116.436 76.962C116.071 77.7922 115.888 78.723 115.888 79.7545C115.888 80.7357 116.071 81.6476 116.436 82.4904C116.814 83.3332 117.374 84.0125 118.116 84.5282C118.872 85.044 119.81 85.3018 120.93 85.3018C122.113 85.3018 123.108 85.0062 123.914 84.415C124.719 83.8238 125.21 82.9684 125.386 81.8489H127.275C127.149 82.7923 126.828 83.654 126.312 84.4339C125.808 85.2138 125.103 85.8364 124.197 86.3019C123.303 86.7673 122.214 87 120.93 87Z" fill="#212121"/>
+<path d="M131.088 86.6604V72.8864H132.938V84.9999H138.867V86.6604H131.088Z" fill="#212121"/>
+<path d="M142.53 86.6604V72.8864H144.38V86.6604H142.53Z" fill="#212121"/>
+<path d="M154.992 86.6604V78.0563H153.595V76.6978H154.992V76.0751C154.992 74.9556 155.288 74.1317 155.88 73.6034C156.472 73.0751 157.34 72.8109 158.486 72.8109H159.732V74.3204H158.184C157.718 74.3204 157.359 74.4525 157.107 74.7166C156.855 74.9682 156.73 75.3204 156.73 75.7732V76.6978H159.921V78.0563H156.73V86.6604H154.992Z" fill="#212121"/>
+<path d="M162.979 86.6604V76.5846H164.414V79.6035C164.565 78.5218 164.962 77.7293 165.604 77.2261C166.246 76.723 167.121 76.4714 168.228 76.4714H168.568V78.0941H167.926C166.919 78.0941 166.145 78.3645 165.604 78.9054C165.062 79.4337 164.792 80.2011 164.792 81.2074V86.6604H162.979Z" fill="#212121"/>
+<path d="M174.615 86.9245C173.469 86.9245 172.569 86.6415 171.914 86.0754C171.272 85.4968 170.951 84.6855 170.951 83.6414C170.951 82.5722 171.31 81.7671 172.028 81.2262C172.745 80.6728 173.759 80.396 175.068 80.396H177.617V80.1507C177.617 78.7545 176.912 78.0563 175.502 78.0563C174.923 78.0563 174.319 78.0689 173.689 78.0941C173.06 78.1192 172.538 78.1444 172.122 78.1695V76.5846C172.525 76.5469 172.972 76.5217 173.463 76.5091C173.966 76.484 174.445 76.4714 174.898 76.4714C176.446 76.4714 177.573 76.7544 178.278 77.3205C178.996 77.8865 179.354 78.874 179.354 80.2828V86.6604H177.919V84.6603C177.466 86.1698 176.365 86.9245 174.615 86.9245ZM174.992 85.4905C175.42 85.4905 175.83 85.415 176.22 85.2641C176.61 85.1006 176.931 84.8364 177.183 84.4716C177.447 84.0942 177.592 83.5785 177.617 82.9244V81.7546H174.992C174.262 81.7546 173.702 81.9307 173.312 82.2829C172.922 82.6351 172.726 83.0879 172.726 83.6414C172.726 84.1949 172.922 84.6414 173.312 84.9811C173.702 85.3207 174.262 85.4905 174.992 85.4905Z" fill="#212121"/>
+<path d="M183.814 86.6604V76.5846H185.25V78.9054C185.464 78.0626 185.841 77.4148 186.383 76.962C186.936 76.5091 187.654 76.2827 188.535 76.2827H188.611C189.467 76.2827 190.165 76.4965 190.707 76.9242C191.248 77.3519 191.632 77.9683 191.859 78.7733C192.098 77.9683 192.488 77.3519 193.029 76.9242C193.583 76.4965 194.288 76.2827 195.144 76.2827H195.22C196.416 76.2827 197.303 76.6915 197.882 77.5091C198.474 78.3142 198.77 79.4463 198.77 80.9055V86.6604H196.957V80.5092C196.957 79.6916 196.756 79.0627 196.353 78.6224C195.95 78.1695 195.39 77.9431 194.672 77.9431C193.929 77.9431 193.332 78.1821 192.878 78.6601C192.425 79.1255 192.199 79.7797 192.199 80.6224V86.6604H190.386V80.5092C190.386 79.6916 190.184 79.0627 189.781 78.6224C189.379 78.1695 188.818 77.9431 188.101 77.9431C187.358 77.9431 186.76 78.1821 186.307 78.6601C185.854 79.1255 185.627 79.7797 185.627 80.6224V86.6604H183.814Z" fill="#212121"/>
+<path d="M207.508 87C206.627 87 205.866 86.8491 205.224 86.5472C204.581 86.2453 204.059 85.849 203.656 85.3584C203.253 84.8553 202.951 84.2955 202.75 83.6791C202.561 83.0628 202.467 82.4338 202.467 81.7923V81.4527C202.467 80.7986 202.561 80.1633 202.75 79.5469C202.951 78.9306 203.253 78.3771 203.656 77.8865C204.059 77.3834 204.569 76.9871 205.186 76.6978C205.815 76.3959 206.552 76.245 207.395 76.245C208.49 76.245 209.39 76.484 210.095 76.962C210.813 77.4274 211.342 78.0312 211.682 78.7733C212.034 79.5155 212.21 80.308 212.21 81.1508V81.9621H204.204C204.267 82.9559 204.563 83.7798 205.091 84.4339C205.62 85.088 206.426 85.415 207.508 85.415C208.301 85.415 208.943 85.2389 209.434 84.8867C209.938 84.5345 210.24 84.1257 210.341 83.6603H212.04C211.826 84.7043 211.316 85.522 210.511 86.1132C209.705 86.7044 208.704 87 207.508 87ZM207.395 77.8299C206.489 77.8299 205.777 78.0878 205.261 78.6035C204.745 79.1067 204.418 79.7734 204.279 80.6036H210.435C210.322 79.7482 210.014 79.0752 209.51 78.5846C209.006 78.0815 208.301 77.8299 207.395 77.8299Z" fill="#212121"/>
+<path d="M217.448 86.6604L214.597 76.5846H216.334L218.714 85.2264H219.091L220.828 76.9242H223.283L225.304 85.2264H225.681L227.758 76.5846H229.401L226.928 86.6604H224.114L222.056 78.2828L220.281 86.6604H217.448Z" fill="#212121"/>
+<path d="M237.443 87C236.562 87 235.788 86.8491 235.121 86.5472C234.454 86.2453 233.887 85.849 233.421 85.3584C232.968 84.8553 232.622 84.2955 232.383 83.6791C232.156 83.0628 232.043 82.4338 232.043 81.7923V81.4527C232.043 80.8111 232.162 80.1822 232.402 79.5658C232.641 78.9369 232.993 78.3771 233.459 77.8865C233.925 77.3834 234.491 76.9871 235.159 76.6978C235.826 76.3959 236.587 76.245 237.443 76.245C238.299 76.245 239.061 76.3959 239.728 76.6978C240.395 76.9871 240.962 77.3834 241.428 77.8865C241.893 78.3771 242.246 78.9369 242.485 79.5658C242.724 80.1822 242.844 80.8111 242.844 81.4527V81.7923C242.844 82.4338 242.724 83.0628 242.485 83.6791C242.259 84.2955 241.912 84.8553 241.447 85.3584C240.993 85.849 240.433 86.2453 239.766 86.5472C239.099 86.8491 238.325 87 237.443 87ZM237.443 85.3773C238.199 85.3773 238.841 85.2138 239.369 84.8867C239.911 84.5471 240.32 84.0942 240.597 83.5282C240.886 82.9621 241.031 82.3269 241.031 81.6225C241.031 80.9055 240.886 80.2639 240.597 79.6979C240.307 79.1318 239.892 78.6853 239.351 78.3582C238.822 78.0312 238.186 77.8676 237.443 77.8676C236.713 77.8676 236.078 78.0312 235.536 78.3582C234.995 78.6853 234.579 79.1318 234.29 79.6979C234 80.2639 233.856 80.9055 233.856 81.6225C233.856 82.3269 233.994 82.9621 234.271 83.5282C234.561 84.0942 234.97 84.5471 235.498 84.8867C236.04 85.2138 236.688 85.3773 237.443 85.3773Z" fill="#212121"/>
+<path d="M246.692 86.6604V76.5846H248.127V79.6035C248.278 78.5218 248.675 77.7293 249.317 77.2261C249.959 76.723 250.834 76.4714 251.941 76.4714H252.281V78.0941H251.639C250.632 78.0941 249.858 78.3645 249.317 78.9054C248.775 79.4337 248.505 80.2011 248.505 81.2074V86.6604H246.692Z" fill="#212121"/>
+<path d="M255.57 86.6604V72.8864H257.383V81.5847L261.688 76.5846H263.595L259.875 80.8866L264.615 86.6604H262.519L258.723 81.9621H257.383V86.6604H255.57Z" fill="#212121"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_165)"/>
+<mask id="mask0_12_165" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_165)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="white"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="white"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="white"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="white"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="white"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="white"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="white"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="white"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="white"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="white"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="white"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="white"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="white"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="white"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="white"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_165" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/_static/img/svg/logo-white.svg b/docs/source/_static/img/svg/logo-white.svg
new file mode 100644
index 0000000..c69f88b
--- /dev/null
+++ b/docs/source/_static/img/svg/logo-white.svg
@@ -0,0 +1,35 @@
+<svg width="297" height="100" viewBox="0 0 297 100" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M152.803 28.263C158.219 28.263 161.973 30.2875 164.067 34.3364L165.469 40.4098C165.469 42.918 158.669 47.6925 145.069 54.7333C138.009 57.8686 134.332 59.8124 134.038 60.5649C132.948 62.661 132.247 63.709 131.936 63.709C131.157 64.354 130.456 65.3214 129.834 66.6114H129.366V66.8532L129.133 66.6114H128.899C128.57 66.6114 128.103 67.6684 127.498 69.7824H127.03L127.264 70.0243V70.2662C126.78 70.2662 125.603 72.21 123.734 76.0977C123.267 78.0326 122.333 79 120.931 79V78.5163H120.698L119.763 78.7581L119.504 78.5163H119.27L118.569 78.7581L118.102 78.2744L117.635 78.7581L116 76.8233V76.3395C116 74.7271 117.955 69.7108 121.866 61.2904L121.165 61.0486L121.398 60.8067V60.5649L120.231 59.5705L119.27 59.8124L118.803 59.0868L119.037 58.845V58.6031C118.102 58.6031 117.635 58.3612 117.635 57.8775C119.556 56.3009 122.601 54.4377 126.771 52.2879L131.469 42.3447H131.235C129.366 42.3447 127.567 40.4815 125.837 36.755V34.5783C127.117 32.8942 130.405 31.5237 135.699 30.4667C138.727 29.8038 144.428 29.0693 152.803 28.263ZM139.904 46.2413H140.137C145.224 43.7869 149.913 40.786 154.204 37.2388V36.9969H153.971C147.569 37.2477 144.368 37.7404 144.368 38.4749L139.904 46.2413Z" fill="white"/>
+<path d="M179.498 30.2248C183.667 30.2248 186.22 31.5058 187.154 34.0677C187.69 36.343 188.339 40.8577 189.101 47.6119L189.334 47.8537C189.421 48.9108 189.637 49.4393 189.983 49.4393L196.965 48.5256V48.9824H197.198L200.676 48.7674V49.1974L199.145 49.6543V49.8961H200.676L202.207 49.6543V50.1111C200.719 50.7202 199.56 51.0248 198.73 51.0248V51.4817L199.82 51.2398C200.823 51.5444 201.325 51.8489 201.325 52.1535L202.441 51.9116C205.348 52.0012 206.801 52.3058 206.801 52.8253L206.568 53.0403L208.099 53.4972V53.954C206.126 55.011 202.052 55.9158 195.875 56.6682L191.956 57.3401C193.842 65.0079 194.785 70.2124 194.785 72.9535V73.8403L194.136 74.539H193.902C193.418 74.539 192.916 74.3061 192.397 73.8403V74.539H191.956V74.0822L191.281 74.539L190.424 73.8403L188.244 74.754L186.479 72.9535C185.752 71.7352 184.662 67.2832 183.209 59.5974H183.001C173.831 62.2131 169.246 64.2555 169.246 65.7245C168.657 66.1008 166.91 68.4298 164.003 72.7116C162.999 73.9299 162.195 74.539 161.589 74.539L161.148 73.4103L160.94 73.6253H160.733C159.85 73.0879 159.409 72.4877 159.409 71.8248L159.201 72.0398H158.76V71.5829C158.155 71.5829 157.575 71.1351 157.021 70.2393C156.433 70.2393 156.139 70.087 156.139 69.7824V68.1969C156.139 66.5128 157.886 63.727 161.382 59.8393C162.87 57.2773 165.275 53.7301 168.597 49.1974L176.02 35.6532L177.525 31.1116C178.304 30.5204 178.961 30.2248 179.498 30.2248ZM177.759 52.1535V52.3685C180.233 51.7056 181.47 51.2577 181.47 51.0248L180.821 47.3969C180.423 47.5761 179.402 49.1616 177.759 52.1535ZM198.055 48.3106H198.496V48.7674H198.055V48.3106ZM198.288 49.8961V50.1111H198.73V49.8961H198.288Z" fill="white"/>
+<path d="M225.565 27H226.941C230.955 28.5228 232.962 30.5204 232.962 32.9928C231.924 34.7485 227.762 43.7511 220.478 60.0005L218.635 63.3597L232.962 62.3922L234.805 62.6341H236.18V63.1178H235.505V63.8434H236.881V64.3271L234.571 65.5096L235.038 66.9339H236.414L238.49 69.1106C238.49 69.5406 233.948 70.4095 224.864 71.7173C221.023 72.5235 215.789 73.8851 209.162 75.8021H208.928C208.081 75.8021 206.618 74.5211 204.542 71.9592V71.7173L204.776 71.5023L204.542 71.2605V68.8687C204.542 68.0625 205.234 67.104 206.618 65.9933C213.886 52.0729 219.12 40.2755 222.321 30.601L222.087 29.8755C223.056 27.9585 224.215 27 225.565 27Z" fill="white"/>
+<path d="M263.545 28.8005H264.713C266.495 28.8005 268.053 30.0098 269.385 32.4284L268.918 42.1028C268.918 44.826 269.307 47.0117 270.086 48.6599C270.414 48.642 271.98 47.0207 274.783 43.7959C275.302 43.6346 278.417 40.4904 284.127 34.3633C286.272 31.2997 288.461 29.768 290.693 29.768L292.328 29.5261C293.851 29.8844 294.707 30.3681 294.898 30.9773C295.244 30.9773 295.945 31.6222 297 32.9121V33.3959C297 35.0262 294.733 41.001 290.2 51.3204C288.66 55.1902 287.648 57.1251 287.163 57.1251L287.397 57.3669V57.6088L284.36 63.8972C284.084 63.9151 282.838 66.5845 280.623 71.9054L278.988 74.0822H277.353V73.5985L276.418 74.0822C276.418 73.7239 275.873 73.4014 274.783 73.1147L274.316 73.5985C273.884 73.5447 273.572 73.1416 273.382 72.3891C272.759 72.3891 272.447 72.2279 272.447 71.9054V70.2124C272.447 67.0772 274.783 61.0217 279.455 52.046C277.015 54.375 274.679 57.2773 272.447 60.753C271.928 60.753 271.219 61.2367 270.319 62.2041H270.086C268.425 61.0038 266.867 60.2782 265.414 60.0274C263.839 58.9166 262.438 55.6112 261.209 50.1111H260.976C254.176 66.271 250.43 74.6644 249.738 75.2915H249.27L248.102 74.5659L247.402 74.8078L247.168 74.5659L246.935 74.8078L246.467 73.8403L246 74.324L245.767 74.0822L243.664 74.5659C243.318 73.688 242.851 73.2043 242.263 73.1147V72.1473C242.263 68.2775 246.71 57.2953 255.603 39.2005C257.697 32.5897 259.41 29.2842 260.742 29.2842L263.545 28.8005Z" fill="white"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_343)"/>
+<mask id="mask0_12_343" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_343)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="white"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="white"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="white"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="white"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="white"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="white"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="white"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="white"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="white"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="white"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="white"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="white"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="white"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="white"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="white"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_343" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/_static/img/svg/logo.svg b/docs/source/_static/img/svg/logo.svg
new file mode 100644
index 0000000..c5c4f5e
--- /dev/null
+++ b/docs/source/_static/img/svg/logo.svg
@@ -0,0 +1,35 @@
+<svg width="294" height="100" viewBox="0 0 294 100" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M150.906 29.0369C156.274 29.0369 159.995 30.9634 162.07 34.8165L163.459 40.5961C163.459 42.9829 156.72 47.5265 143.241 54.2267C136.245 57.2103 132.601 59.0601 132.309 59.7761C131.229 61.7709 130.535 62.7682 130.226 62.7682C129.454 63.382 128.76 64.3026 128.142 65.5302H127.679V65.7603L127.448 65.5302H127.216C126.891 65.5302 126.428 66.536 125.827 68.5478H125.364L125.596 68.778V69.0081C125.116 69.0081 123.95 70.858 122.098 74.5576C121.635 76.3989 120.709 77.3195 119.32 77.3195V76.8592H119.088L118.162 77.0893L117.905 76.8592H117.674L116.979 77.0893L116.516 76.629L116.053 77.0893L114.433 75.2481V74.7877C114.433 73.2533 116.37 68.4796 120.246 60.4666L119.551 60.2365L119.783 60.0063V59.7761L118.625 58.8299L117.674 59.0601L117.211 58.3696L117.442 58.1394V57.9093C116.516 57.9093 116.053 57.6791 116.053 57.2188C117.957 55.7185 120.975 53.9454 125.107 51.8995L129.763 42.4374H129.531C127.679 42.4374 125.896 40.6643 124.181 37.1181V35.0467C125.45 33.4441 128.708 32.1398 133.956 31.1339C136.957 30.5031 142.607 29.8041 150.906 29.0369ZM138.123 46.1455H138.354C143.396 43.8098 148.043 40.9541 152.295 37.5784V37.3483H152.064C145.719 37.587 142.547 38.0558 142.547 38.7548L138.123 46.1455Z" fill="#212121"/>
+<path d="M177.362 30.9038C181.495 30.9038 184.024 32.1228 184.95 34.5608C185.482 36.726 186.125 41.0223 186.879 47.4498L187.111 47.6799C187.197 48.6858 187.411 49.1888 187.754 49.1888L194.673 48.3193V48.754H194.905L198.352 48.5494V48.9586L196.834 49.3933V49.6235H198.352L199.869 49.3933V49.8281C198.394 50.4078 197.245 50.6976 196.422 50.6976V51.1323L197.503 50.9022C198.497 51.192 198.995 51.4818 198.995 51.7717L200.101 51.5415C202.981 51.6268 204.422 51.9166 204.422 52.411L204.19 52.6156L205.708 53.0503V53.4851C203.753 54.491 199.715 55.3519 193.593 56.068L189.709 56.7073C191.578 64.0043 192.513 68.957 192.513 71.5655V72.4094L191.87 73.0743H191.638C191.158 73.0743 190.661 72.8527 190.146 72.4094V73.0743H189.709V72.6396L189.04 73.0743L188.191 72.4094L186.031 73.2789L184.282 71.5655C183.561 70.4062 182.481 66.1695 181.041 58.8555H180.835C171.746 61.3446 167.202 63.2882 167.202 64.6862C166.619 65.0443 164.887 67.2606 162.006 71.3353C161.012 72.4946 160.214 73.0743 159.614 73.0743L159.177 72.0002L158.971 72.2048H158.765C157.891 71.6933 157.454 71.1222 157.454 70.4914L157.248 70.696H156.81V70.2612C156.21 70.2612 155.636 69.835 155.087 68.9826C154.504 68.9826 154.213 68.8377 154.213 68.5478V67.039C154.213 65.4364 155.944 62.7853 159.408 59.0857C160.883 56.6477 163.267 53.272 166.559 48.9586L173.916 36.0696L175.407 31.7477C176.179 31.1851 176.831 30.9038 177.362 30.9038ZM175.639 51.7717V51.9763C178.091 51.3454 179.317 50.9192 179.317 50.6976L178.674 47.2452C178.28 47.4157 177.268 48.9245 175.639 51.7717ZM195.754 48.1147H196.191V48.5494H195.754V48.1147ZM195.985 49.6235V49.8281H196.422V49.6235H195.985Z" fill="#212121"/>
+<path d="M223.018 27.835H224.381C228.359 29.2841 230.349 31.1851 230.349 33.5378C229.32 35.2086 225.196 43.7757 217.976 59.2391L216.15 62.4358L230.349 61.5151L232.175 61.7453H233.538V62.2056H232.869V62.8961H234.233V63.3564L231.943 64.4816L232.406 65.837H233.77L235.827 67.9085C235.827 68.3177 231.326 69.1445 222.323 70.3891C218.517 71.1563 213.329 72.452 206.762 74.2763H206.53C205.69 74.2763 204.241 73.0573 202.183 70.6193V70.3891L202.415 70.1845L202.183 69.9544V67.6783C202.183 66.9111 202.869 65.999 204.241 64.942C211.443 51.6949 216.63 40.4682 219.803 31.2618L219.571 30.5713C220.531 28.7471 221.68 27.835 223.018 27.835Z" fill="#212121"/>
+<path d="M260.658 29.5484H261.816C263.582 29.5484 265.125 30.6992 266.446 33.0008L265.983 42.2072C265.983 44.7987 266.369 46.8786 267.14 48.4471C267.466 48.4301 269.018 46.8871 271.796 43.8183C272.31 43.6649 275.397 40.6728 281.056 34.8421C283.182 31.9267 285.352 30.469 287.564 30.469L289.184 30.2389C290.693 30.5798 291.542 31.0402 291.731 31.6198C292.074 31.6198 292.768 32.2336 293.814 33.4611V33.9214C293.814 35.4729 291.568 41.1587 287.075 50.9789C285.549 54.6615 284.546 56.5027 284.065 56.5027L284.297 56.7329V56.9631L281.287 62.9472C281.013 62.9643 279.778 65.5046 277.583 70.5681L275.963 72.6396H274.342V72.1792L273.417 72.6396C273.417 72.2986 272.876 71.9917 271.796 71.7189L271.333 72.1792C270.904 72.1281 270.596 71.7445 270.407 71.0284C269.79 71.0284 269.481 70.875 269.481 70.5681V68.957C269.481 65.9734 271.796 60.2109 276.426 51.6694C274.008 53.8857 271.693 56.6477 269.481 59.9552C268.967 59.9552 268.264 60.4155 267.372 61.3361H267.14C265.494 60.1938 263.951 59.5034 262.51 59.2647C260.95 58.2076 259.561 55.0621 258.343 49.8281H258.112C251.373 65.2062 247.66 73.1937 246.974 73.7904H246.511L245.354 73.0999L244.659 73.33L244.428 73.0999L244.196 73.33L243.733 72.4094L243.27 72.8697L243.039 72.6396L240.955 73.0999C240.612 72.2645 240.149 71.8042 239.566 71.7189V70.7983C239.566 67.1157 243.973 56.6647 252.787 39.4453C254.862 33.1542 256.56 30.0087 257.88 30.0087L260.658 29.5484Z" fill="#212121"/>
+<circle cx="50" cy="50" r="50" fill="url(#paint0_linear_12_116)"/>
+<mask id="mask0_12_116" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="100" height="100">
+<circle cx="50" cy="50" r="50" fill="white"/>
+</mask>
+<g mask="url(#mask0_12_116)">
+<rect x="-7.32129" y="67.7378" width="114.967" height="1.89805" fill="white"/>
+<rect x="-7.32129" y="77.5776" width="114.967" height="3.79609" fill="white"/>
+<rect x="-7.32129" y="87.5747" width="114.932" height="6.44624" fill="white"/>
+<path d="M56.7781 29.9339C57.2047 28.6209 58.2287 27.5881 59.5379 27.1501L78.8045 20.7053C79.2407 20.5594 79.5757 21.1015 79.2502 21.4264L50.0812 50.5432L56.7781 29.9339Z" fill="white"/>
+<path d="M40.2632 26.7572C41.5761 27.1839 42.609 28.2079 43.047 29.5171L50.0795 50.5406L20.9327 21.3416C20.6095 21.0178 20.9403 20.4784 21.3754 20.6198L40.2632 26.7572Z" fill="white"/>
+<path d="M69.3994 40.7275C70.6302 40.1022 72.0846 40.0976 73.3193 40.7151L91.4895 49.8026C91.9008 50.0083 91.7537 50.6284 91.2938 50.6275L50.0796 50.5427L69.3994 40.7275Z" fill="white"/>
+<path d="M26.3462 40.6459C27.577 40.0206 29.0314 40.016 30.2661 40.6335L50.0932 50.5496L8.83656 50.4648C8.37907 50.4639 8.23236 49.8484 8.64023 49.6412L26.3462 40.6459Z" fill="white"/>
+<path d="M26.3592 60.5307C26.7767 59.2148 27.7936 58.1749 29.0998 57.7279L50.0742 50.5505L21.0771 79.8981C20.7555 80.2235 20.2139 79.8964 20.3523 79.4604L26.3592 60.5307Z" fill="white"/>
+<path d="M70.6417 57.3792C71.9516 57.815 72.9773 58.8462 73.4061 60.1584L79.7163 79.4695C79.8591 79.9067 79.3147 80.238 78.992 79.9103L50.0796 50.5387L70.6417 57.3792Z" fill="white"/>
+<path d="M50.0917 50.4697L54.5266 62.1224C54.7259 62.646 54.3392 63.207 53.7789 63.207H46.3563C45.7949 63.207 45.4081 62.6438 45.6097 62.1197L50.0917 50.4697Z" fill="white"/>
+<path d="M49.3286 60.4739C49.5721 59.7431 50.6064 59.7448 50.8474 60.4764L54.5932 71.8434C54.7638 72.3609 54.3783 72.8938 53.8334 72.8938H46.3011C45.7551 72.8938 45.3696 72.3589 45.5421 71.8409L49.3286 60.4739Z" fill="white"/>
+<path d="M49.3286 71.4178C49.5721 70.687 50.6064 70.6886 50.8474 71.4202L54.5932 82.7872C54.7638 83.3047 54.3783 83.8376 53.8334 83.8376H46.3011C45.7551 83.8376 45.3696 83.3028 45.5421 82.7848L49.3286 71.4178Z" fill="white"/>
+<path d="M49.3286 81.2845C49.5721 80.5537 50.6064 80.5553 50.8474 81.2869L54.5932 92.6539C54.7638 93.1714 54.3783 93.7043 53.8334 93.7043H46.3011C45.7551 93.7043 45.3696 93.1695 45.5421 92.6515L49.3286 81.2845Z" fill="white"/>
+<path d="M49.3286 88.6404C49.5721 87.9096 50.6064 87.9113 50.8474 88.6429L54.5932 100.01C54.7638 100.527 54.3783 101.06 53.8334 101.06H46.3011C45.7551 101.06 45.3696 100.525 45.5421 100.007L49.3286 88.6404Z" fill="white"/>
+<path d="M49.3286 98.1482C49.5721 97.4174 50.6064 97.4191 50.8474 98.1507L54.5932 109.518C54.7638 110.035 54.3783 110.568 53.8334 110.568H46.3011C45.7551 110.568 45.3696 110.033 45.5421 109.515L49.3286 98.1482Z" fill="white"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_12_116" x1="50" y1="0" x2="50" y2="100" gradientUnits="userSpaceOnUse">
+<stop stop-color="#A81AE0"/>
+<stop offset="0.36801" stop-color="#F1328C"/>
+<stop offset="0.74623" stop-color="#F7883F"/>
+<stop offset="1" stop-color="#ECA441"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/docs/source/branding/index.rst b/docs/source/branding/index.rst
new file mode 100644
index 0000000..c65ba41
--- /dev/null
+++ b/docs/source/branding/index.rst
@@ -0,0 +1,37 @@
+.. _branding:
+
+========
+Branding
+========
+
+.. image:: /_static/img/png_large/logo-subheader.png
+   :width: 500
+
+Brand Assets
+============
+.. toctree::
+   :titlesonly:
+   
+   logos
+
+Palm is empowering and inclusive by design, enabling Developers and Engineers 
+With diverse skill sets to create and evolve software without homogeneous programming know-how. With palm, contributors can focus on being experts in a way that generates the most value, and skip “sweating the small stuff” of rote interface memorization.
+We are proud of what palm is and what it represents. These branding guidelines and associated assets are part of that representation and are intended to enhance and promote the public integrity of the project. 
+
+In plain words, we are proud of palm, and we want these branding guidelines and assets to be used freely in an open and positive way. 
+
+Basic Use Guidelines
+================
+
+**1.1 Capitalization**: 
+    Palm is an `improper (or common) <https://en.wiktionary.org/wiki/common_noun#English>`_ noun, and should follow appropriate grammar rules. Most notably, palm is spelled with a capital “P” (Palm) as the first word in a sentence, and with a lowercase “p” (palm) otherwise.
+
+Logo Usage
+=========
+
+Palm :doc:`logos` can be used anywhere palm software is incorporated or used as part of a project or workflow, referenced, compared or combined. Basically, if you are using or discussing palm software, we encourage you to use palm logos as you see fit. Palm logos cannot be used for projects or as part of media unrelated to palm - for example, please do not open a nightclub named “Palm” and use our logo. If you are unsure if your use violates these guidelines, drop us a line at data-analytics-team@palmetto.com and we will be happy to advise. 
+
+Swag
+====
+
+We are excited that you are excited about palm! so feel free to create t-shirts, hats, parade floats etc with the palm logo for personal or team use. If you intend to sell palm-branded merchandise for profit, please drop us a line at data-analytics-team@palmetto.com so we can discuss. 
\ No newline at end of file
diff --git a/docs/source/branding/logos.rst b/docs/source/branding/logos.rst
new file mode 100644
index 0000000..b2631db
--- /dev/null
+++ b/docs/source/branding/logos.rst
@@ -0,0 +1,70 @@
+=====
+Logos
+=====
+
+Usage of palm logos is subject to our :ref:`branding guidelines <branding>`.  
+
+Standard Color Scheme
+^^^^^^^^^^^^^^^^^^^^^
+
+.. figure:: /_static/img/png_large/logo.png
+   :width: 934
+:download:`png: 934W x 319H</_static/img/png_large/logo.png>`
+*||* :download:`png: 294W x 100H</_static/img/png/logo.png>`
+*||* :download:`svg</_static/img/svg/logo.svg>`
+
+.. figure:: /_static/img/png_large/logo-stacked.png
+   :width: 380
+:download:`380W x 467H</_static/img/png_large/logo-stacked.png>`
+*||* :download:`100W x 138H</_static/img/png/logo-stacked.png>`
+*||* :download:`svg</_static/img/svg/logo-stacked.svg>`
+
+.. figure:: /_static/img/png_large/logo-subheader.png
+   :width: 934
+:download:`934W x 319H</_static/img/png_large/logo-subheader.png>`
+*||* :download:`294W x 100H</_static/img/png/logo-subheader.png>`
+*||* :download:`svg</_static/img/svg/logo-subheader.svg>`
+
+
+Dark Color Scheme (transparent)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. figure:: /_static/img/png_large/logo-dark-example.jpg
+   :width: 934
+:download:`png: 934W x 319H</_static/img/png_large/logo-dark.png>`
+*||* :download:`png: 294W x 100H</_static/img/png/logo-dark.png>`
+*||* :download:`svg</_static/img/svg/logo-dark.svg>`
+
+.. figure:: /_static/img/png_large/logo-stacked-dark-example.jpg
+   :width: 380
+:download:`380W x 467H</_static/img/png_large/logo-stacked-dark.png>`
+*||* :download:`100W x 138H</_static/img/png/logo-stacked-dark.png>`
+*||* :download:`svg</_static/img/svg/logo-stacked-dark.svg>`
+
+.. figure:: /_static/img/png_large/logo-subheader-dark-example.jpg
+   :width: 934
+:download:`934W x 319H</_static/img/png_large/logo-subheader-dark.png>`
+*||* :download:`294W x 100H</_static/img/png/logo-subheader-dark.png>`
+*||* :download:`svg</_static/img/svg/logo-subheader-dark.svg>`
+
+
+White Color Scheme (transparent) 
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. figure:: /_static/img/png_large/logo-white-example.jpg
+   :width: 934
+:download:`934W x 319H</_static/img/png_large/logo-white.png>`
+*||* :download:`png: 294W x 100H</_static/img/png/logo-white.png>`
+*||* :download:`svg</_static/img/svg/logo-white.svg>`
+
+.. figure:: /_static/img/png_large/logo-stacked-white-example.jpg
+   :width: 380
+:download:`380W x 467H</_static/img/png_large/logo-stacked-white.png>`
+*||* :download:`100W x 138H</_static/img/png/logo-stacked-white.png>`
+*||* :download:`svg</_static/img/svg/logo-stacked-white.svg>`
+
+.. figure:: /_static/img/png_large/logo-subheader-white-example.jpg
+   :width: 934
+:download:`934W x 319H</_static/img/png_large/logo-subheader-white.png>`
+*||* :download:`294W x 100H</_static/img/png/logo-subheader-white.png>`
+*||* :download:`svg</_static/img/svg/logo-subheader-white.svg>`
\ No newline at end of file
diff --git a/docs/source/commands.rst b/docs/source/commands.rst
index 21c734f..2a6bcce 100644
--- a/docs/source/commands.rst
+++ b/docs/source/commands.rst
@@ -36,6 +36,19 @@ the order of overriding would be determined by the order of plugins in your proj
 ``.palm/config.yaml`` file. Finally, if you define a ``build`` command in your project,
 as a repo command, it would override all other definitions of the ``build`` command.
 
+Excluding commands from your project
+------------------------------------
+
+Sometimes, you may want to exclude commands from your project. This is done by
+adding the ``excluded_commands`` configuration to your project's ``.palm/config.yaml``.
+
+Example:
+
+.. code:: yaml
+    excluded_commands:
+      - containerize
+
+
 Command Groups
 ==============
 
@@ -95,6 +108,21 @@ is provided via the palm context. If you want to use ``run_in_docker`` in your
 own command, ensure you use the ``@click.pass_context`` decorator for your command, 
 then use ``ctx.obj.run_in_docker(command)``.
 
+**Run on Host**:
+
+Palm provides a simple interface for running shell commands directly on your machine via
+the context (similarly to how ``run_in_docker`` is accessed, via ``ctx.obj``). We highly
+recommend using ``run_on_host`` over rolling your own subprocess commands.
+
+.. warning:: 
+
+  **Why Not Use subprocess?**
+
+  The prime directive of palm is to give all your developers an identical interface and 
+  experience, regardless of environment. Different versions of python running on different
+  operating systems can behave differently when calling ``subprocess``; palm normalizes this
+  behavior in ```ctx.obj.run_on_host``. 
+
 **Importing code**:
 
 When writing "repo" commands in your project, you will not be able to use 
@@ -103,3 +131,30 @@ the context of palm. If you need to share logic between commands, or import code
 from your project, you must do this with the ``ctx.obj.import_module`` function. 
 This function is provided via the palm context and uses importlib to ensure
 your shared code is imported from the correct location at run time.
+
+**Examples**:
+
+Maybe you want a command that kicks off a slow-building container
+as a background process, but you want to see it complete before moving it back. 
+That could look something like this:
+
+.. code:: python
+
+  ## ./palm/cmd_slow_starter.py
+  ...
+  @click.command('slow_starter')
+  @click.pass_context
+  def cli(ctx):
+      """Starts the container as daemon, watches the logs, then exits"""
+      ctx.run_on_host("docker-compose run -d super_slow_starting_django_app",
+                           check=True)
+        
+      ## this is where we watch, pseudo-blocking
+      building_logs = str()
+      while "Starting local webserver via runserver on port 8080..." \
+        not in building_logs:
+          logs, _, _ = ctx.run_on_host("docker-compose logs static_app")
+            if logs != building_logs:
+                building_logs = logs
+                click.echo(logs)
+      click.secho("Super-slow app is _finally_ ready!", fg="green")
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
index b7fcad4..a5b6c9a 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -22,7 +22,7 @@
 author = 'Palmetto Data Team'
 
 # The full version, including alpha/beta/rc tags
-release = '2.0.2'
+release = '2.1.0'
 
 
 # -- General configuration ---------------------------------------------------
@@ -47,6 +47,8 @@
 # a list of builtin themes.
 #
 html_theme = 'sphinx_rtd_theme'
+html_logo = "_static/img/svg/logo-subheader-white.svg"
+html_theme_options = {"logo_only": True}
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
diff --git a/docs/source/containerization.rst b/docs/source/containerization.rst
new file mode 100644
index 0000000..ea5b86a
--- /dev/null
+++ b/docs/source/containerization.rst
@@ -0,0 +1,75 @@
+================
+Containerization
+================
+
+**Beta Feature**
+Note that this feature is intended to provide a basic baseline for containerization.
+For more complicated projects, we recommend spending some time to implement your own
+containerization solution. The code generated by Palm may serve as a good starting point.
+
+Containerization (with Docker) is a pre-requisite for using Palm with your project.
+We understand that you may not be a Docker pro, but we can help you get started with
+dockerizing your project so that you can use Palm!
+
+
+How to containerize your project
+================================
+
+Palm ships with basic containerization for Python projects.
+
+**Before you start**
+
+- Make sure your project is initialized with ``palm init``, the image_name 
+  configuration will be used by the containerization tool.
+- You should ensure you have a .env file in your project root directory. This file
+  should include the environment variables you need to run your project. It should
+  also be added to your .gitignore file.
+- You need to be using requirements.txt or poetry.lock to manage your dependencies.
+  If you are using a different package management system, please open an issue on 
+  Github and we will consider adding support for it.
+
+Use ``palm containerize`` to set up your project with Docker.
+
+See ``palm containerize --help`` for more information.
+
+
+How containerization works
+===========================
+
+Palm containerization generates the following files in your project root directory:
+
+- Dockerfile: The Dockerfile used to build your project
+- docker-compose.yml: Docker compose is used to load the .env file and volume 
+  mount your project code so that you can make changes without having to rebuild 
+  or restart the container.
+- scripts/entrypoint.sh: This script is used to run your project. It is executed 
+  by the Dockerfile as it's entrypoint. This is where your dependencies are 
+  installed. Note: we do not recommend executing your project code directly in 
+  the entrypoint as this limits the flexibility of your container, instead use 
+  palm commands to run your project, this allows you to determine what each instance
+  of the container is doing (run, test, etc.).
+
+
+Implement your own containerization solution
+============================================
+
+Palm containerization is intended to provide a basic baseline for containerization
+for Python projects. For projects using a specific framework, or a different language,
+we recommend that you implement your own containerization solution. To do this,
+you will need to:
+
+- Create a new containerizer command in your project 
+  (``palm scaffold command --name containerize``).
+- Duplicate the templates from ``palm/plugins/core/templates/containerize`` and 
+  add them to your project. Make the necessary changes to support your 
+  containerization needs.
+- Subclass the ``Containerizer`` class and override the ``run()`` and 
+  ``package_manager()`` methods.
+- Open up cmd_containerize.py and implement any logic + Call YourSubclass.run() 
+  in your command.
+
+To see an example of custom containerization, see ``cmd_containerize.py`` in the
+``palm-dbt`` plugin!
+
+Once you have implemented your containerization solution, consider releasing it
+to the community as a palm plugin!
\ No newline at end of file
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 90bd21b..ec5b7e4 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -4,6 +4,11 @@ Palm CLI Documentation
 
 **Palm** — the extensible CLI at your fingertips!
 
+**Check Out Some** :doc:`Example Use Cases <introduction/examples>`
+
+**Understanding The Palm Viewpoint:** :doc:`Why do my CLIs need a CLI?<introduction/viewpoint>`
+
+
 What is Palm?
 =============
 
@@ -15,6 +20,7 @@ What is Palm?
 - A tool for building and managing your own CLI commands.
 - Built with python and click
 
+
 Contents
 --------
 
@@ -25,7 +31,9 @@ Contents
    commands
    code-generation
    plugins
-
+   containerization
+   branding/index
+   
 Usage
 -----
 
diff --git a/docs/source/introduction/examples.rst b/docs/source/introduction/examples.rst
new file mode 100644
index 0000000..2298621
--- /dev/null
+++ b/docs/source/introduction/examples.rst
@@ -0,0 +1,136 @@
+========
+Examples
+========
+
+Onboarding
+==========
+
+Setting up a new full-time employee for success is the most straightforward example
+of how palm can immediately impact productivity. 
+
+Let’s say today is your first day as an Analytics Engineer for a shop that uses dbt. 
+Let’s also say this shop also uses palm, with the palm-dbt plugin. 
+
+Day one goes something like this:
+
+1. You install Docker, git, your text editor and palm
+2. You get all your secrets assigned and SSH set up with github
+3. You clone the working dbt repo and run `palm` from root. You see something like this: 
+
+.. code:: bash
+
+   $ palm
+   Commands: 
+   run          executes dbt run in the namespaced schema for your branch
+   cycle        executes dbt run, test, run, test 
+   cleanup      cleans the local and removes all remote artifacts from testing in the data warehouse
+  
+   # compile, test etc.
+  
+
+4. Using the gitflow naming pattern of ``<branch-type>/<ticket-key>/<description>`` you check out your first work ticket: 
+
+.. code:: bash
+
+   $ git checkout -b feature/DATA-204/fix-sales-column-name
+
+5. You run ``palm cycle`` as a baseline: 
+
+.. code:: bash
+
+   $ palm cycle
+   running command `dbt seed && dbt run --vars '{"exclude_ods_keys":"yes", "first_transfer": 20210901}'`
+   against schema `TEST.feature_data_204_fix_sales_column_name`
+   ## ... dbt run details here
+   success. dbt completed with 96 models and 144 tests, run 2x each in 120 seconds.
+   cleaning up the remote target... 
+   clean. 
+
+Your development work executes in a sophisticated environment with automated namespacing, 
+automated cleanup, and idempotency testing. 
+
+There was near-zero learning curve for you, no tribal knowledge transfer needed, and you were able to start adding value hours into your first day on the team.
+
+
+Cross Platform
+==============
+Palm is written in Python, giving you the interoperability of a higher level programming language, 
+and relies heavily on the ``docker`` and ``docker-compose`` APIs to create OS-agnostic 
+development environments. Leveraging palm's native `run_in_docker` commands, you can run the same code
+on any system and get the same results. 
+
+
+Context Switching
+=================
+
+Possibly the most powerful long-term impact of palm is the way it removes internal barriers between software workflows. 
+Let’s say you are a developer at a modern e-commerce platform. The ecom site is powered by Ruby on Rails. The highly-trafficked content site uses WordPress. Your virtual dressing room software is built on Rocket, and the whole of the infrastructure is managed by Terraform. 
+A new feature is rolling out that uses the virtual dressing room. First, you update the Rocket application to enable the feature. You start by reviewing your options (it’s been a minute since you have worked in this repo): 
+
+.. code:: bash 
+
+   $ cd ~/Repos/virtual_dressing_room && palm 
+   Commands:
+   launch     launches the vdr as a request server (daemon)
+   request    starts an interactive request terminal to to the local server
+   test          runs all the non-destructive tests locally
+   launch-test    runs tests that will destroy the UAT environment, should only be run before a deployment
+
+Once the Rocket code is updated and merged, you launch the feature on the ecom site. 
+
+.. code:: bash 
+
+   $ cd ~/Repos/ecommerce_site && palm up
+
+You make your changes, testing with ``palm test``. The same happens with the WordPress and your infra work.
+ 
+**Here is where it gets interesting!** 
+
+You get a panicked call from the finance team.
+
+It appears the only Data Engineer is on vacation and they forgot a CCPA request due today! 
+You quickly clone the data team’s ``ccpa_privacy`` repo, and do this:
+
+.. code:: bash
+
+   $ cd ~/Repos/ccpa_privacy && palm
+   Commands:
+   delete       deletes (or obfuscates) a user by email address. Enforces financial retention per our privacy policy.
+   report       generates a right-of-portability report of the data we have on a user by email address. non-destructive. 
+
+   $ palm report --help 
+     Generates a json report of all the found data relating to a given email address. 
+
+     Args: email-address: the email to look up
+   
+   $ palm report dave@requestedprivacy.com
+   Generating report… 
+   Report done. Saved to ~/Documents/privacy_report_123.json 
+
+When an organization adopts palm, moving from one codebase to another becomes fluid, and without hard context switches. 
+Developers can confidently pick up and start working with any code, anywhere in the organization - including code they have never seen before. 
+
+
+
+Palm & The Modern Work Dynamic
+==============================
+
+Consulting
+^^^^^^^^^^
+*Coming Soon!*
+
+Offshoring & Nearshoring
+^^^^^^^^^^^^^^^^^^^^^^^^
+*Coming Soon!*
+
+Gig Work - For the Organization
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+*Coming Soon!*
+
+Gig Work - For the Gig Worker
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+*Coming Soon!*
+
+Open Source Software
+^^^^^^^^^^^^^^^^^^^^
+*Coming Soon!*
\ No newline at end of file
diff --git a/docs/source/introduction/viewpoint.rst b/docs/source/introduction/viewpoint.rst
new file mode 100644
index 0000000..98570ca
--- /dev/null
+++ b/docs/source/introduction/viewpoint.rst
@@ -0,0 +1,131 @@
+================================
+Wait. Why Do My CLIs need a CLI?
+================================
+
+For a seasoned Engineer, the idea of wrapping public software interfaces in an abstraction layer will probably set off some warning bells. Admittedly, at first glance palm can appear to add unnecessary complexity and “magic” to an already polished API. For example, bringing up a docker-compose service stack:
+
+.. code:: bash
+    
+    # via native docker-compose
+    $ docker-compose up -d 
+    Creating network my-project… done
+
+    # via palm
+    $ palm up
+    Creating network my-project… done
+
+
+In this case, it is hard to see the argument for palm’s usefulness. But modern software development rarely stays that simple for long. 
+Let’s look at a real-world use case where we want to run tests on the Django webapp portion of our monorepo. 
+In this case the stack is down and the needed port is allocated by an orphan container.
+
+.. code:: bash 
+
+   # via native bash + docker-compose
+   $ docker-compose exec --rm --service-ports my_app /bin/bash -c “pytest webapp/tests/webapp”
+   ERROR: No such service: my_app
+   
+   $ docker-compose up -d 
+   ERROR: Bind for 0.0.0.0:8080 failed: port is already allocated
+   
+   $ docker ps
+   CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
+   I98ds8sd90gsd    django1    /bin/bash        2 days ago  running
+   
+   $ docker kill I98ds8sd90gsd
+   I98ds8sd90gsd
+   
+   $ docker-compose up -d 
+   Creating network my-project… done
+
+   $ docker-compose exec --rm --service-ports my_app /bin/bash -c “pytest webapp/tests/webapp”
+   Running 84 tests via pytest…
+
+   # same thing, via palm
+
+   $ palm test
+   Starting compose…
+   Unable to compose, stopping orphan container… Stopped.
+   Starting compose… Started.
+   Running 84 tests via pytest…
+
+Suddenly, palm starts to make a lot of sense. The abstraction layer that palm provides allows you to architect simplicity and consistency into your development environments across languages, frameworks, and infrastructure designs. You decide what each command does, designing the workflow interface for each repo. A simple single-container Jekyll app, and a complex multi-cloud microservices ecosystem, each implemented by different teams with completely different skills, can share a common interface. 
+
+Palm Is Working Software
+====================
+
+    *Through this work we have come to value...
+    Working software over comprehensive documentation*
+
+        ~ `Agile Manifesto <https://agilemanifesto.org/#:~:text=processes%20and%20tools-,Working%20software,-over%20comprehensive%20documentation>`_
+
+A core concept in quality programming is `Self-documenting code <https://en.wikipedia.org/wiki/Self-documenting_code>`_. 
+Most seasoned Engineers would cringe if they came across a function like this:
+
+.. code:: javascript
+   
+   /* Function for determining customer balance.
+       This function takes the current known balance, 
+       queries the bank api with the customer account,
+       then if the api returns a new balance it applies it to… (etc etc)
+   */ 
+   function customerBalance(custId){
+      // awful code goes here 
+   }
+
+And yet, the first instinct when engineering a development environment is 
+often to generate reams of stagnant documentation! 
+For example, let’s say a team of Developers randomly suffer from this error: 
+
+.. code:: bash
+
+   $ docker-compose up -d 
+   ERROR: unable to read file app/conf: file does not exist or access denied
+
+After hours of painful debugging, it is discovered that this is not a permission or mounting issue,
+but that docker is actually out of memory. 
+The fix is to clean up the docker environment. 
+Convention is to add this find to the project Readme.md, like this: 
+
+.. code::  
+
+   #Readme.md
+      
+   ## Troubleshooting
+   **“ERROR: unable to read file app/conf: file does not exist or access denied”** : 
+   your docker environment may be out of memory. Start by running `docker rm -f $(docker ps -qa)` … 
+
+But what if, instead of writing docs - docs the Developers will likely forget to check, 
+with steps that will need to be methodically replicated -  
+what if the fix was automated? Enter palm. 
+
+.. code:: python
+
+   #.palm/cmd_up.py
+
+   def cmd_up(ctx):
+       “”” starts the compose stack”””
+       echo(“Starting docker stack…”)
+       exit_code, out, err = ctx.docker_up(capture_output=True)
+       cryptic_message_indicating_no_memory = “ERROR: unable to read file app/conf: file does not exist or access denied”
+       if cryptic_message_indicating_no_memory in err:
+           red_echo(“Docker may be out of memory, cleaning up first…”)
+           ctx.docker_full_clean()
+           ctx.docker_up(bubble_error=True)
+           green_echo(“Docker stack started.”)       
+	
+Now and forever, your developers will see this when they run out of memory:
+
+.. code:: bash
+
+   $ palm up 
+   Starting docker stack…
+   Docker may be out of memory, cleaning up first...
+   Docker stack started.
+
+Of course this solution is very basic. In a real implementation we might want to 
+check that the file exists and has the correct permissions, prompt the developer before nuking the docker environment etc. 
+
+**As Engineers, we preach the value of automation and scoff at repetitive, error-prone manual tasks.
+Palm is a way for us to practice what we preach.** 
+
diff --git a/docs/source/write-a-plugin.rst b/docs/source/write-a-plugin.rst
index 6e2f446..bb4499c 100644
--- a/docs/source/write-a-plugin.rst
+++ b/docs/source/write-a-plugin.rst
@@ -6,40 +6,27 @@ Hello there, friend! Thank you in advance for your interest in writing a plugin
 Palm CLI! If you have questions or want to discuss your ideas, please feel free to
 contact the Core team at <data-analytics-team@palmetto.com>
 
-.. TODO: DATA-423: Update this documentation with plugin generation instructions
 
 Getting started
 ===============
 
-At the time of writing, the process for creating a new plugin is not well defined.
-We intend to implement a plugin generator in the near future, which will enable 
-you to create the boilerplate for a plugin with very little effort. Given this 
-planned feature will change documentation in the near future, we have decided to
-keep documentation minimal at this time.
-
-The shape of a plugin
-=====================
-
-- A Plugin is a python module that follows a set of conventions and provides an instance 
-  of a Plugin that is loadable by the Palm CLI Plugin manager.
-- The plugin module must use setuptools to be installable. setup.py must include:
-    - A name that matches ``palm-{{name}}``
-    - packages=find_namespace_packages(include=['palm', 'palm.*']),
-    - install_requires=['palm>=2.0.0'],
-- An ``__init__.py`` file must be present at ``palm/plugins/{{name}}/__init__.py``
-- The ``__init__.py`` must include a ``Plugin`` variable which is an instance of
-  the palm BasePlugin class, or an instance of a subclass of the BasePlugin class.
-- The current convention is to create a ``/commands`` directory as a sibling of the
-  plugin module. This directory must also contain an ``__init__.py`` file. This is
-  where you will create the plugin's commands.
+Palm includes a command to generate a plugin skeleton. You can use it to get started.
+
+1. cd into an active project - this is necessary at the moment as palm commands 
+   are not currently available outside of an initialized git repository.
+2. Run ``palm plugin new --name <plugin-name>`` and follow the prompts.
+3. Your new plugin skeleton is created and ready for you to add commands!
 
 Installing your plugin during local development
 ===============================================
 
-When developing a new plugin, it can be very useful to install your plugin
-so that you can test it out. To do this, run the following command from
-your plugin's root directory
+When developing a new plugin, you will want to install your plugin
+so that you can test it out.  To do this, run the following command from
+your plugin's root directory:
 
 .. code:: bash
   
   python3 -m pip install .
+
+**Note**: Due to the way plugins are used by palm, you will need to re-install 
+the plugin every time you want to test changes to the plugin
diff --git a/palm/cli.py b/palm/cli.py
index 025a34f..d08893d 100644
--- a/palm/cli.py
+++ b/palm/cli.py
@@ -3,14 +3,13 @@
 import importlib
 import os
 import pkg_resources
-import subprocess
 from pathlib import Path
 from typing import Optional, Any, Callable, List
 
 from .environment import Environment
 from .palm_config import PalmConfig
 from .plugin_manager import PluginManager
-from .utils import is_cmd_file, cmd_name_from_file
+from .utils import is_cmd_file, cmd_name_from_file, run_on_host
 
 CONTEXT_SETTINGS = dict(auto_envvar_prefix="PALM")
 
@@ -59,6 +58,8 @@ def list_commands(self, ctx) -> List[str]:
         dedupe = set(cmds)
         cmds = list(dedupe)
         cmds.sort()
+        project_excluded_commands = self.palm.config.get('excluded_commands', [])
+        cmds = filter(lambda x: x not in project_excluded_commands, cmds)
         return cmds
 
     def get_command(self, ctx, cmd_name: str) -> click.Command:
@@ -87,28 +88,26 @@ def get_version():
 
 
 def required_dependencies_ready():
-    docker_installed = subprocess.run(
-        'docker --version', shell=True, capture_output=True
-    )
-    docker_compose_installed = subprocess.run(
-        'docker-compose --version', shell=True, capture_output=True
-    )
-    docker_running = subprocess.run('docker ps', shell=True, capture_output=True)
-
-    if docker_installed.returncode != 0:
-        click.secho('Docker is not installed, please install it first', fg="red")
-    if docker_compose_installed.returncode != 0:
-        click.secho(
-            'Docker Compose is not installed, please install it first', fg="red"
-        )
-    if docker_running.returncode != 0:
-        click.secho('Docker is not running, please start it first', fg="red")
 
-    return (
-        docker_installed.returncode == 0
-        and docker_compose_installed.returncode == 0
-        and docker_running.returncode == 0
+    docker_checks = (
+        (
+            "docker --version",
+            "Docker is not installed, please install it first",
+        ),
+        (
+            "docker-compose --version",
+            "Docker Compose is not installed, please install it first",
+        ),
+        (
+            "docker ps",
+            "Docker is not running, please start it first",
+        ),
     )
+    for cmd, msg in docker_checks:
+        if run_on_host(cmd, capture_output=True)[0] > 0:
+            click.secho(msg, fg="red")
+            return False
+    return True
 
 
 @click.group(cls=PalmCLI, context_settings=CONTEXT_SETTINGS)
diff --git a/palm/containerizer.py b/palm/containerizer.py
new file mode 100644
index 0000000..4f3ca13
--- /dev/null
+++ b/palm/containerizer.py
@@ -0,0 +1,193 @@
+from abc import ABC, abstractmethod
+from typing import Dict, Optional
+from pathlib import Path
+import re
+import click
+import sys
+from palm.palm_exceptions import AbortPalm
+import palm.project_setup_utils as psu
+
+
+class Containerizer(ABC):
+    """Abstract base class for containerizer classes
+
+    Containerizer.run() is the main entry point for a containerizer.
+    Implementations of run() should call check_setup() and generate()
+    """
+
+    def __init__(self, ctx, template_dir: Path) -> None:
+        """Containerizer constructor
+
+        Args:
+            ctx (click.context): The click context object from the calling command
+            template_dir (Path): Path to the templates directory
+        """
+        self.ctx = ctx
+        # By default, image name is read from .palm/config.yaml since this is used
+        # to execute commands in the container. This may be overridden in a containerizer
+        # but you would need to ensure the image_name matches in config.yaml
+        self.project_name = ctx.obj.palm.image_name
+        self.template_dir = template_dir
+
+    @abstractmethod
+    def run(self) -> None:
+        """Entrypoint for containerization
+
+        Must call check_setup() and generate()
+        """
+        pass
+
+    def generate(self, target_dir: Path, replacements: Dict) -> None:
+        """Generate files for containerization
+
+        Args:
+            target_dir (Path): Path to directory where generated files should be placed
+            replacements (dict): Dict of replacements to be made in template files
+        """
+        self.ctx.obj.generate(self.template_dir, target_dir, replacements)
+        psu.make_executable(Path(target_dir, "scripts", "entrypoint.sh"))
+
+    def check_setup(self) -> None:
+        """Check if containerization is possible
+
+        Raises:
+            AbortPalm: If the project is already containerized, or has no .env file
+        """
+        if self.has_containerization():
+            raise AbortPalm("Containerization already exists")
+
+        if not self.has_env():
+            try:
+                psu.optionally_create_env()
+            except AbortPalm:
+                raise AbortPalm("Aborting Containerization")
+
+    def has_containerization(self) -> bool:
+        """Check whether the project has containerization
+
+        Returns:
+            bool: true if Dockerfile or docker-compose.yaml exists
+        """
+        containerization_files = ['docker-compose.yaml', 'Dockerfile']
+
+        for file in containerization_files:
+            if Path(file).exists():
+                return True
+
+        return False
+
+    def has_env(self) -> bool:
+        """Check whether the project has an .env file
+
+        Returns:
+            bool: true if .env file exists
+        """
+        return psu.has_env()
+
+
+class PythonContainerizer(Containerizer):
+    """Containerizer for Python projects"""
+
+    def __init__(
+        self, ctx, template_dir: Path, python_version: Optional[str] = '3.8'
+    ) -> None:
+        """PythonContainerizer constructor
+
+        Args:
+            ctx (click.context): The click context object from the calling command
+            template_dir (Path): Path to the templates directory
+        """
+        self.ctx = ctx
+        self.project_name = ctx.obj.palm.image_name
+        self.template_dir = template_dir
+        self.python_version = python_version
+        self.package_manager = ''
+
+    def run(self) -> None:
+        """Run the containerizer"""
+        self.check_setup()
+        self.package_manager = self.detect_package_manager()
+
+        super().generate(self.target_dir, self.replacements)
+
+    @property
+    def replacements(self) -> Dict:
+        """Dict of replacements to be made in template files"""
+        return {
+            "project_name": self.project_name,
+            "package_manager": self.package_manager,
+            "python_version": self.python_version,
+        }
+
+    @property
+    def target_dir(self) -> Path:
+        """Get the target directory for containerization
+
+        Returns:
+            Path: Path to the target directory
+        """
+        return Path.cwd()
+
+    def check_setup(self) -> None:
+        if not self.validate_python_version():
+            click.secho(f"Invalid python version: {self.python_version}", fg="red")
+            return
+
+        try:
+            super().check_setup()
+        except AbortPalm as e:
+            click.secho(str(e), fg="red")
+            return
+
+    def detect_package_manager(self) -> str:
+        """Determine which package manager is in use,
+        supports pip3 and poetry, returns "unknown" if neither are found
+
+        Returns:
+            str: pip3 | poetry | unknown
+        """
+        if self.has_requirements_txt():
+            return "pip3"
+        if self.has_poetry():
+            return "poetry"
+        # Unknown package manager, prompt to setup requirements.txt
+        try:
+            self.optionally_add_requirements_txt()
+        except AbortPalm:
+            click.secho("Aborting containerization", fg="red")
+            sys.exit(1)
+        return "pip3"
+
+    def has_requirements_txt(self) -> bool:
+        """Check for a requirements.txt file in the project root"""
+        return Path("requirements.txt").exists()
+
+    def has_poetry(self) -> bool:
+        """Check for a poetry.lock file in the project root"""
+        return Path("poetry.lock").exists()
+
+    def optionally_add_requirements_txt(self):
+        """Optionally, add a requirements.txt file to the project root if it doesn't exist
+
+        Raises:
+            AbortPalm: Abort if user does not want to add requirements.txt
+        """
+        use_pip = click.confirm(
+            "Unable to detect python package manger, requirements.txt will be used by default. Continue?"
+        )
+        if use_pip:
+            Path("requirements.txt").touch()
+        else:
+            raise AbortPalm("Aborting")
+
+    def validate_python_version(self) -> bool:
+        """Validate the python version provided by the user
+
+        Args:
+            python_version (str): The python version to validate
+
+        Returns:
+            bool: True if the python version is valid
+        """
+        match = re.match(r"^3\.[0-9]{1,2}$", self.python_version)
+        return bool(match)
diff --git a/palm/environment.py b/palm/environment.py
index 49a7e8d..597f806 100644
--- a/palm/environment.py
+++ b/palm/environment.py
@@ -1,8 +1,9 @@
+from typing import Optional, Tuple
 import importlib
 from pathlib import Path
-import subprocess
 from typing import Optional, List, Tuple
 import click
+from palm.utils import run_on_host
 from palm.plugin_manager import PluginManager
 from .palm_config import PalmConfig
 from .code_generator import CodeGenerator
@@ -30,19 +31,32 @@ def run_in_docker(
         docker_cmd.append(self.palm.image_name)
         docker_cmd.append(f'/bin/bash -c "{cmd}" ')
 
-        subprocess.run(' '.join(docker_cmd), shell=True, check=True)
-        return (True, 'Success! Palm completed with exit code 0')
+        ex_code, _, _ = run_on_host(' '.join(docker_cmd))
+        if ex_code == 0:
+            return (True, 'Success! Palm completed with exit code 0')
+        return (False, f"Fail! Palm exited with code {ex_code}")
 
     def run_in_shell(self, cmd: str, env_vars: Optional[dict] = {}):
         """deprecated - use run_in_docker"""
 
-        deprecation_msg = 'DEPRECATION: run_in_shell has been renamed to \
-run_in_docker and will be removed in a future version. Please update your \
-commands to use ctx.obj.run_in_docker'
+        deprecation_msg = (
+            "DEPRECATION: run_in_shell has been renamed to "
+            "`run_in_docker` and will be removed in a future version. "
+            "Please update your commands to use ctx.obj.run_in_docker"
+        )
         click.secho(deprecation_msg, fg="yellow")
         success, msg = self.run_in_docker(cmd, env_vars)
         click.secho(msg, fg="green" if success else "red")
 
+    def run_on_host(
+        self,
+        cmd: str,
+        check: Optional[bool] = False,
+        capture_output: Optional[bool] = False,
+    ) -> Tuple[int, str, str]:
+        """context wrapper for :obj:`palm.utils.run_on_host`"""
+        return run_on_host(cmd, check, capture_output)
+
     def import_module(self, module_name: str, module_path: Path):
         """Imports a module from a path
 
diff --git a/palm/palm_exceptions.py b/palm/palm_exceptions.py
new file mode 100644
index 0000000..d20692a
--- /dev/null
+++ b/palm/palm_exceptions.py
@@ -0,0 +1,2 @@
+class AbortPalm(Exception):
+    pass
diff --git a/palm/plugins/base.py b/palm/plugins/base.py
index 6e3336a..bec75ae 100644
--- a/palm/plugins/base.py
+++ b/palm/plugins/base.py
@@ -1,8 +1,7 @@
 import importlib
-import subprocess
 from typing import List, Optional, Tuple
 from pathlib import Path
-from palm.utils import is_cmd_file, cmd_name_from_file
+from palm.utils import is_cmd_file, cmd_name_from_file, run_on_host
 
 
 class BasePlugin:
@@ -20,7 +19,7 @@ def __init__(
             name (str): Name of the plugin
             command_dir (Path): Path to the directory containing commands
             version (Optional[str], optional): Plugin version. Defaults to "unknown".
-            package_location (Optional[str], optional): Either pypi package name 
+            package_location (Optional[str], optional): Either pypi package name
                 or github https URL. Used for installation Defaults to None.
         """
         self.name = name
@@ -82,6 +81,5 @@ def update(self) -> Tuple[bool, str]:
         upgrade_cmd = f"python3 -m pip install {install_url}"
 
         for cmd in (uninstall_cmd, upgrade_cmd):
-            subprocess.run(cmd, check=True, shell=True)
-
+            _, _, _ = run_on_host(cmd, check=True)
         return (True, 'Plugin upgraded successfully')
diff --git a/palm/plugins/core/commands/cmd_containerize.py b/palm/plugins/core/commands/cmd_containerize.py
new file mode 100644
index 0000000..5b1eefb
--- /dev/null
+++ b/palm/plugins/core/commands/cmd_containerize.py
@@ -0,0 +1,17 @@
+import click
+from pathlib import Path
+from palm.containerizer import PythonContainerizer
+
+
+@click.command("containerize")
+@click.option(
+    "--version",
+    multiple=False,
+    default="3.8",
+    help="Python version to use (default 3.8)",
+)
+@click.pass_context
+def cli(ctx, version: str):
+    template_dir = Path(Path(__file__).parents[1], "templates") / "containerize"
+    PythonContainerizer(ctx, template_dir, version).run()
+    click.secho(f"Containerized {ctx.obj.palm.image_name}", fg="green")
diff --git a/.palm/cmd_lint.py b/palm/plugins/core/commands/cmd_lint.py
similarity index 100%
rename from .palm/cmd_lint.py
rename to palm/plugins/core/commands/cmd_lint.py
diff --git a/palm/plugins/core/commands/cmd_plugin.py b/palm/plugins/core/commands/cmd_plugin.py
index 6d152c4..c71040c 100644
--- a/palm/plugins/core/commands/cmd_plugin.py
+++ b/palm/plugins/core/commands/cmd_plugin.py
@@ -1,4 +1,5 @@
 from typing import Optional
+from pathlib import Path
 import click
 
 
@@ -7,6 +8,52 @@ def cli():
     pass
 
 
+@cli.command()
+@click.option("--name", multiple=False, required=True, help="Name of the plugin")
+@click.option("--author", multiple=False, help="Name of the plugin author")
+@click.option(
+    "--author-email", multiple=False, help="Email address of the plugin author"
+)
+@click.pass_context
+def new(ctx, name: str, author: Optional[str], author_email: Optional[str]):
+    """
+    Generate a new plugin
+    """
+    if not author:
+        author = click.prompt("What is the author name")
+
+    if not author_email:
+        author_email = click.prompt("What is the email address for the author?")
+
+    # TODO: Currently, this generator has to be run from withing an existing project
+    # This isn't ideal, but it works. In the future I'd like to move this command
+    # out of the core plugin and into a separate system-wide plugin.
+    default_target_dir = Path(Path.cwd().parent, name)
+    target_dir = click.prompt(
+        "Where do you want to create the plugin?", default=default_target_dir
+    )
+    if not target_dir.exists():
+        click.secho("Target directory does not exist", fg="yellow")
+        create_target_dir = click.confirm(
+            "Do you want to create the target directory?", default=True
+        )
+        if not create_target_dir:
+            click.secho("Aborting", fg="red")
+            return
+        target_dir.mkdir(parents=True)
+
+    template_path = Path(Path(__file__).parents[1], "templates") / 'plugin'
+    replacements = {
+        'plugin_name': name,
+        'plugin_class_name': f"{name.title().replace('_', '')}Plugin",
+        'author': author,
+        'author_email': author_email,
+    }
+
+    ctx.obj.generate(template_path, target_dir, replacements)
+    click.secho(f'{name} plugin created in {target_dir}', fg='green')
+
+
 @cli.command()
 @click.option("--name", multiple=False, help="Name of the plugin")
 @click.pass_context
diff --git a/palm/plugins/core/commands/cmd_scaffold.py b/palm/plugins/core/commands/cmd_scaffold.py
index eca1c93..fc3dec9 100644
--- a/palm/plugins/core/commands/cmd_scaffold.py
+++ b/palm/plugins/core/commands/cmd_scaffold.py
@@ -1,7 +1,5 @@
 from typing import Optional, List
 import click
-import shutil
-import fileinput
 from pathlib import Path
 from palm.plugins.core.create_files import *
 
diff --git a/palm/plugins/core/commands/cmd_shell.py b/palm/plugins/core/commands/cmd_shell.py
new file mode 100644
index 0000000..2e55141
--- /dev/null
+++ b/palm/plugins/core/commands/cmd_shell.py
@@ -0,0 +1,8 @@
+import click
+
+
+@click.command('shell')
+@click.pass_context
+def cli(ctx):
+    """Bash into your docker image to run arbitrary commands"""
+    ctx.obj.run_in_docker('bash')
diff --git a/palm/plugins/core/commands/cmd_update.py b/palm/plugins/core/commands/cmd_update.py
index 033bc7d..7b97fcf 100644
--- a/palm/plugins/core/commands/cmd_update.py
+++ b/palm/plugins/core/commands/cmd_update.py
@@ -15,8 +15,10 @@ def cli(local: bool):
         return
 
     uninstall_cmd = "python3 -m pip uninstall -y palm"
-    source = " . " if local else " git+https://github.com/palmetto/palm-cli.git "
-    upgrade_cmd = f"python3 -m pip install {source}"
+    if local:
+        upgrade_cmd = f"python3 -m pip install ."
+    else:
+        upgrade_cmd = f"pip install palm"
 
     for cmd in (
         uninstall_cmd,
diff --git a/palm/plugins/core/core_plugin.py b/palm/plugins/core/core_plugin.py
index be8f8bd..8234f3d 100644
--- a/palm/plugins/core/core_plugin.py
+++ b/palm/plugins/core/core_plugin.py
@@ -1,4 +1,7 @@
 from pathlib import Path
 from palm.plugins.base import BasePlugin
 
-CorePlugin = BasePlugin(name='core', command_dir=Path(__file__).parent / 'commands',)
+CorePlugin = BasePlugin(
+    name='core',
+    command_dir=Path(__file__).parent / 'commands',
+)
diff --git a/palm/plugins/core/templates/containerize/Dockerfile.txt b/palm/plugins/core/templates/containerize/Dockerfile.txt
new file mode 100644
index 0000000..78df5bb
--- /dev/null
+++ b/palm/plugins/core/templates/containerize/Dockerfile.txt
@@ -0,0 +1,7 @@
+FROM python:{{python_version}}
+
+COPY . /app/
+WORKDIR /app
+ENV PYTHONPATH=${PYTHONPATH}:${PWD}
+
+RUN ./scripts/entrypoint.sh
\ No newline at end of file
diff --git a/palm/plugins/core/templates/containerize/docker-compose.yaml b/palm/plugins/core/templates/containerize/docker-compose.yaml
new file mode 100644
index 0000000..b453e77
--- /dev/null
+++ b/palm/plugins/core/templates/containerize/docker-compose.yaml
@@ -0,0 +1,11 @@
+version: "3.5"
+services:
+  {{project_name}}:
+    image: {{project_name}}
+    build:
+      context: .
+      dockerfile: Dockerfile
+    volumes:
+      - ./:/app
+    env_file:
+      - .env
\ No newline at end of file
diff --git a/palm/plugins/core/templates/containerize/entrypoint.sh.txt b/palm/plugins/core/templates/containerize/entrypoint.sh.txt
new file mode 100644
index 0000000..f297bd2
--- /dev/null
+++ b/palm/plugins/core/templates/containerize/entrypoint.sh.txt
@@ -0,0 +1,15 @@
+#! /bin/bash -x
+# Entrypoint script for docker
+{% if package_manager == 'poetry' %}
+pip3 install poetry
+poetry config virtualenvs.create false
+poetry install
+{% endif %}
+{% if package_manager == 'pip3' %}
+pip3 install -r requirements.txt
+pip3 install pytest
+{% endif %}
+{% if package_manager == 'unknown' %}
+# Palm was unable to detect which package manager you are using.
+# You will need to update this entrypoint script before your container can run
+{% endif %}
\ No newline at end of file
diff --git a/palm/plugins/core/templates/containerize/template-config.yaml b/palm/plugins/core/templates/containerize/template-config.yaml
new file mode 100644
index 0000000..a734cc0
--- /dev/null
+++ b/palm/plugins/core/templates/containerize/template-config.yaml
@@ -0,0 +1,6 @@
+directories:
+  - "scripts"
+files:
+  - Dockerfile.txt: "Dockerfile"
+  - docker-compose.yaml: "docker-compose.yaml"
+  - entrypoint.sh.txt: "scripts/entrypoint.sh"
\ No newline at end of file
diff --git a/palm/plugins/core/templates/plugin/empty_file.py b/palm/plugins/core/templates/plugin/empty_file.py
new file mode 100644
index 0000000..e69de29
diff --git a/palm/plugins/core/templates/plugin/plugin_init.tpl.py b/palm/plugins/core/templates/plugin/plugin_init.tpl.py
new file mode 100644
index 0000000..83ee9a8
--- /dev/null
+++ b/palm/plugins/core/templates/plugin/plugin_init.tpl.py
@@ -0,0 +1,3 @@
+from palm.plugins.{{plugin_name}}.{{plugin_name}}_plugin import {{plugin_class_name}}
+
+Plugin = {{plugin_class_name}}
diff --git a/palm/plugins/core/templates/plugin/plugin_template.tpl.py b/palm/plugins/core/templates/plugin/plugin_template.tpl.py
new file mode 100644
index 0000000..28c3132
--- /dev/null
+++ b/palm/plugins/core/templates/plugin/plugin_template.tpl.py
@@ -0,0 +1,17 @@
+from pathlib import Path
+from palm.plugins.base import BasePlugin
+import pkg_resources
+
+def get_version():
+    try:
+        version = pkg_resources.require("palm-{{plugin_name}}")[0].version
+    except pkg_resources.DistributionNotFound:
+        version = 'unknown'
+    return version
+
+
+{{plugin_class_name}} = BasePlugin(
+    name = '{{plugin_name}}', 
+    command_dir = Path(__file__).parent / 'commands',
+    version = get_version(),
+)
diff --git a/palm/plugins/core/templates/plugin/setup.tpl.py b/palm/plugins/core/templates/plugin/setup.tpl.py
new file mode 100644
index 0000000..98bd761
--- /dev/null
+++ b/palm/plugins/core/templates/plugin/setup.tpl.py
@@ -0,0 +1,36 @@
+from distutils.core import setup
+from pathlib import Path
+import sys
+
+# require version of setuptools that supports find_namespace_packages
+from setuptools import setup
+
+try:
+    from setuptools import find_namespace_packages
+except ImportError:
+    # the user has a downlevel version of setuptools.
+    print('Error: palm requires setuptools v40.1.0 or higher.')
+    print(
+        'Please upgrade setuptools with "pip install --upgrade setuptools" and try again'
+    )
+    sys.exit(1)
+
+# User-friendly description from README.md
+this_directory = Path(__file__).parent
+long_description = Path(this_directory, 'README.md').read_text()
+
+setup(
+    name='palm-{{plugin_name}}',
+    version='0.0.1',
+    description='{{plugin_name}} extension for Palm CLI',
+    long_description=long_description,
+    long_description_content_type='text/markdown',
+    author='{{author}}',
+    author_email='{{author_email}}',
+    url='',
+    packages=find_namespace_packages(include=['palm', 'palm.*']),
+    package_data={'': ['*.yaml', '*.yml']},
+    install_requires=['palm>=2.0.0'],
+    license='',
+    classifiers=[],
+)
diff --git a/palm/plugins/core/templates/plugin/template-config.yaml b/palm/plugins/core/templates/plugin/template-config.yaml
new file mode 100644
index 0000000..c7465aa
--- /dev/null
+++ b/palm/plugins/core/templates/plugin/template-config.yaml
@@ -0,0 +1,11 @@
+directories:
+- palm
+- palm/plugins
+- palm/plugins/{{plugin_name}}
+- palm/plugins/{{plugin_name}}/commands
+files:
+    - plugin_init.tpl.py: 'palm/plugins/{{plugin_name}}/__init__.py'
+    - plugin_template.tpl.py: 'palm/plugins/{{plugin_name}}/{{plugin_name}}_plugin.py'
+    - empty_file.py: 'palm/plugins/{{plugin_name}}/commands/__init__.py'
+    - empty_file.py: 'README.md'
+    - setup.py: 'setup.py'
\ No newline at end of file
diff --git a/palm/plugins/repo/repo_plugin.py b/palm/plugins/repo/repo_plugin.py
index f050d91..4ab89c7 100644
--- a/palm/plugins/repo/repo_plugin.py
+++ b/palm/plugins/repo/repo_plugin.py
@@ -1,4 +1,7 @@
 from pathlib import Path
 from palm.plugins.base import BasePlugin
 
-RepoPlugin = BasePlugin(name='repo', command_dir=Path.cwd() / '.palm',)
+RepoPlugin = BasePlugin(
+    name='repo',
+    command_dir=Path.cwd() / '.palm',
+)
diff --git a/palm/project_setup_utils.py b/palm/project_setup_utils.py
new file mode 100644
index 0000000..3006fdb
--- /dev/null
+++ b/palm/project_setup_utils.py
@@ -0,0 +1,36 @@
+import os
+from pathlib import Path
+import click
+from palm.palm_exceptions import AbortPalm
+
+
+def has_env() -> bool:
+    """Check for a .env file in the project root"""
+    return Path(".env").exists()
+
+
+def optionally_create_env():
+    """Optionally, create a .env file if it doesn't exist
+
+    Raises:
+        AbortPalm: abort if the user doesn't want to create a .env file
+    """
+    create_env = click.confirm("Would you like palm to create an empty .env file?")
+    if create_env:
+        Path(".env").touch()
+        click.secho(
+            "Created an empty .env - please add your ENV vars there", fg="green"
+        )
+    else:
+        raise AbortPalm("Aborting")
+
+
+def make_executable(path: Path) -> None:
+    """Make a file executable
+
+    Args:
+        path (Path): Path to file
+    """
+    mode = os.stat(path).st_mode
+    mode |= (mode & 0o444) >> 2  # copy R bits to X
+    os.chmod(path, mode)
diff --git a/palm/utils.py b/palm/utils.py
index 1eea70f..560360f 100644
--- a/palm/utils.py
+++ b/palm/utils.py
@@ -1,6 +1,55 @@
+from typing import Optional, Tuple
+import subprocess
+from sys import version_info
+
+
+class UnsupportedVersion(Exception):
+    pass
+
+
 def is_cmd_file(filename: str) -> bool:
     return filename.endswith(".py") and filename.startswith("cmd")
 
 
 def cmd_name_from_file(filename: str) -> str:
     return filename[4:-3]
+
+
+def run_on_host(
+    cmd: str,
+    check: Optional[bool] = False,
+    capture_output: Optional[bool] = False,
+) -> Tuple[int, str, str]:
+    """A simplifed, platform-and-version agnostic interface
+    for subprocess.
+    By default run_on_host makes some strong
+    conventional choices:
+     - calls are run as a shell
+     - calls are blocking
+     - errors in the shell are NOT bubbled up by default
+    Args:
+        cmd: the command to run.
+        check: if True raise a `CalledProcessError<https://docs.python.org/3.6/library/subprocess.html#subprocess.CalledProcessError>`_
+        capture_output: if True, stdout and stderr will be suppressed
+    Returns:
+        Tuple: status code, stdout, stderr
+
+    """
+    major, minor, patch, _, _ = version_info
+    kwargs = dict(shell=True, check=check)
+    if major < 3 or minor < 5:
+        raise UnsupportedVersion(f"Python version {major}.{minor} is not supported.")
+    if minor < 7:
+        from subprocess import PIPE
+
+        if capture_output:
+            kwargs.update(dict(stdout=PIPE, stderr=PIPE))
+    else:
+        kwargs.update(dict(capture_output=capture_output))
+
+    completed = subprocess.run(cmd, **kwargs)
+    return (
+        completed.returncode,
+        completed.stdout.decode("utf-8") if completed.stdout else "",
+        completed.stderr.decode("utf-8") if completed.stderr else "",
+    )
diff --git a/setup.py b/setup.py
index f72e931..40054dc 100644
--- a/setup.py
+++ b/setup.py
@@ -22,7 +22,7 @@
 
 setup(
     name='palm',
-    version='2.0.2',  # Don't forget to bump the version in docs/source/conf.py too!
+    version='2.1.0',  # Don't forget to bump the version in docs/source/conf.py too!
     description='Palm CLI',
     long_description=long_description,
     long_description_content_type='text/markdown',


Test patch:
diff --git a/.palm/cmd_test.py b/palm/plugins/core/commands/cmd_test.py
similarity index 77%
rename from .palm/cmd_test.py
rename to palm/plugins/core/commands/cmd_test.py
index 0f8d42a..97c8b5b 100644
--- a/.palm/cmd_test.py
+++ b/palm/plugins/core/commands/cmd_test.py
@@ -4,6 +4,6 @@
 @click.command('test')
 @click.pass_context
 def cli(ctx):
-    """test"""
+    """Run tests for your application (pytest)"""
     click.echo("test command running!")
     ctx.obj.run_in_docker('pytest', {'PALM_TEST': True})
diff --git a/palm/plugins/test_internal/test_internal_plugin.py b/palm/plugins/test_internal/test_internal_plugin.py
index d101c70..67f1e39 100644
--- a/palm/plugins/test_internal/test_internal_plugin.py
+++ b/palm/plugins/test_internal/test_internal_plugin.py
@@ -5,5 +5,6 @@
 # It is not intended to be used in production.
 
 TestInternalPlugin = BasePlugin(
-    name='test_internal', command_dir=Path(__file__).parent / 'commands',
+    name='test_internal',
+    command_dir=Path(__file__).parent / 'commands',
 )
diff --git a/tests/fixtures.py b/tests/fixtures.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/unit/test_containerizer.py b/tests/unit/test_containerizer.py
new file mode 100644
index 0000000..815846f
--- /dev/null
+++ b/tests/unit/test_containerizer.py
@@ -0,0 +1,66 @@
+import os
+from pathlib import Path
+from palm.containerizer import Containerizer
+
+
+class MockContext:
+    def __init__(self, **kwargs):
+        self.__dict__.update(kwargs)
+
+
+# Clear abstract methods to allow testing ABC
+Containerizer.__abstractmethods__ = set()
+
+
+def test_project_name_matches_palm_config_image_name(tmp_path, environment):
+    ctx = MockContext(obj=environment)
+    c = Containerizer(ctx, tmp_path)
+
+    assert c.project_name == 'test_project_name_matches_palm0'
+
+
+def test_check_has_containerization(tmp_path, environment):
+    os.chdir(tmp_path)
+    ctx = MockContext(obj=environment)
+    result = Containerizer(ctx, tmp_path).has_containerization()
+
+    assert result == False
+    Path('Dockerfile').touch()
+    result = Containerizer(ctx, tmp_path).has_containerization()
+    assert result
+
+
+def test_has_env(tmp_path, environment):
+    os.chdir(tmp_path)
+    ctx = MockContext(obj=environment)
+    result = Containerizer(ctx, tmp_path).has_env()
+    assert result == False
+
+    Path('.env').touch()
+    result = Containerizer(ctx, tmp_path).has_env()
+    assert result
+
+
+def test_generate(tmp_path, environment):
+    templates_dir = (
+        Path(__file__).parents[2] / 'palm/plugins/core/templates/containerize'
+    )
+    ctx = MockContext(obj=environment)
+    c = Containerizer(ctx, templates_dir)
+    c.generate(tmp_path, {})
+
+    assert Path(tmp_path, 'Dockerfile').exists()
+    assert Path(tmp_path, 'docker-compose.yaml').exists()
+    assert Path(tmp_path, 'scripts/entrypoint.sh').exists()
+
+
+def test_generated_entrypoint_is_executable(tmp_path, environment):
+    templates_dir = (
+        Path(__file__).parents[2] / 'palm/plugins/core/templates/containerize'
+    )
+    ctx = MockContext(obj=environment)
+    c = Containerizer(ctx, templates_dir)
+    c.generate(tmp_path, {})
+
+    entrypoint = Path(tmp_path, 'scripts/entrypoint.sh')
+    assert os.access(entrypoint, os.X_OK)
diff --git a/tests/unit/test_environment.py b/tests/unit/test_environment.py
index 53fc6ca..40ec068 100644
--- a/tests/unit/test_environment.py
+++ b/tests/unit/test_environment.py
@@ -5,8 +5,14 @@
 
 
 def test_run_in_docker(environment, monkeypatch):
-    monkeypatch.setattr(subprocess, 'run', lambda *args, **kwargs: True)
-
+    class MockCompletedProcess:
+        returncode = 0
+        stdout = b'tested'
+        stderr = b''
+
+    monkeypatch.setattr(
+        subprocess, 'run', lambda *args, **kwargs: MockCompletedProcess()
+    )
     success, msg = environment.run_in_docker('test')
     assert success is True
     assert msg == 'Success! Palm completed with exit code 0'
diff --git a/tests/unit/test_project_setup_utils.py b/tests/unit/test_project_setup_utils.py
new file mode 100644
index 0000000..7faa078
--- /dev/null
+++ b/tests/unit/test_project_setup_utils.py
@@ -0,0 +1,26 @@
+import os
+from pathlib import Path
+import click
+import palm.project_setup_utils as project_setup_utils
+
+
+def test_has_env(tmp_path):
+    os.chdir(tmp_path)
+    assert not project_setup_utils.has_env()
+
+    Path('.env').touch()
+    assert project_setup_utils.has_env()
+
+
+def test_optionally_create_env(tmp_path, monkeypatch):
+    monkeypatch.setattr(click, 'confirm', lambda x: True)
+    os.chdir(tmp_path)
+    project_setup_utils.optionally_create_env()
+    assert Path('.env').exists()
+
+
+def test_make_executable(tmp_path):
+    os.chdir(tmp_path)
+    Path('file.sh').touch()
+    project_setup_utils.make_executable('file.sh')
+    assert os.access('file.sh', os.X_OK)
diff --git a/tests/unit/test_python_containerizer.py b/tests/unit/test_python_containerizer.py
new file mode 100644
index 0000000..bc299ff
--- /dev/null
+++ b/tests/unit/test_python_containerizer.py
@@ -0,0 +1,77 @@
+import os
+import pytest
+from pathlib import Path
+from palm.containerizer import PythonContainerizer
+
+
+class MockContext:
+    def __init__(self, **kwargs):
+        self.__dict__.update(kwargs)
+
+
+# Clear abstract methods to allow testing ABC
+PythonContainerizer.__abstractmethods__ = set()
+
+
+def test_detect_package_manager(tmp_path, environment):
+    os.chdir(tmp_path)
+    ctx = MockContext(obj=environment)
+    pc = PythonContainerizer(ctx, tmp_path)
+
+    with pytest.raises(Exception):
+        pc.detect_package_manager()
+
+    Path('poetry.lock').touch()
+    assert pc.detect_package_manager() == 'poetry'
+    Path('requirements.txt').touch()
+    assert pc.detect_package_manager() == 'pip3'
+
+
+def test_has_requirements_txt(tmp_path, environment):
+    os.chdir(tmp_path)
+    ctx = MockContext(obj=environment)
+    c = PythonContainerizer(ctx, tmp_path)
+
+    assert not c.has_requirements_txt()
+    Path('requirements.txt').touch()
+    assert c.has_requirements_txt()
+
+
+def test_has_poetry(tmp_path, environment):
+    os.chdir(tmp_path)
+    ctx = MockContext(obj=environment)
+    c = PythonContainerizer(ctx, tmp_path)
+
+    assert not c.has_poetry()
+    Path('poetry.lock').touch()
+    assert c.has_poetry()
+
+
+def test_run(tmp_path, environment):
+    templates_dir = (
+        Path(__file__).parents[2] / 'palm/plugins/core/templates/containerize'
+    )
+
+    os.chdir(tmp_path)
+    Path('.env').touch()
+    Path('requirements.txt').touch()
+    ctx = MockContext(obj=environment)
+    c = PythonContainerizer(ctx, templates_dir)
+    c.run()
+
+    assert Path(tmp_path, 'Dockerfile').exists()
+    assert Path(tmp_path, 'docker-compose.yaml').exists()
+    assert Path(tmp_path, 'scripts/entrypoint.sh').exists()
+
+
+def test_validate_python_version(tmp_path, environment):
+    ctx = MockContext(obj=environment)
+    default_version_pc = PythonContainerizer(ctx, tmp_path)
+    assert default_version_pc.validate_python_version()
+    valid_version_pc = PythonContainerizer(ctx, tmp_path, '3.9')
+    assert valid_version_pc.validate_python_version()
+
+    invalid_version_pc = PythonContainerizer(ctx, tmp_path, '2.8')
+    assert not invalid_version_pc.validate_python_version()
+    invalid_value_pc = PythonContainerizer(ctx, tmp_path, 'foo')
+    assert not invalid_value_pc.validate_python_version()
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
index 2bac8b8..284d656 100644
--- a/tests/unit/test_utils.py
+++ b/tests/unit/test_utils.py
@@ -10,3 +10,19 @@ def test_is_cmd_file():
 def test_cmd_name_from_file():
     assert cmd_name_from_file('cmd_foo.py') == 'foo'
     assert cmd_name_from_file('cmd_foo_bar.py') == 'foo_bar'
+
+
+def test_run_on_host_happy_path():
+    cmd = "echo 'hello world!'"
+    success, out, err = run_on_host(cmd, capture_output=True)
+    assert success == 0
+    assert out == "hello world!\n"
+    assert err == ''
+
+
+def test_run_on_host_without_capture():
+    cmd = "echo 'hello world!'"
+    success, out, err = run_on_host(cmd, capture_output=False)
+    assert success == 0
+    assert out == ""
+    assert err == ""