deploying docs: chore(docs): bump version number in docs example (#27038) (apache/superset@c222464d05c7057e0035370a061e2cf276b19038)
diff --git a/404.html b/404.html
index 0149631..5612abb 100644
--- a/404.html
+++ b/404.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/assets/js/f9cc156b.5f7bb57c.js b/assets/js/f9cc156b.08631d99.js
similarity index 98%
rename from assets/js/f9cc156b.5f7bb57c.js
rename to assets/js/f9cc156b.08631d99.js
index e58914d..a3b007a 100644
--- a/assets/js/f9cc156b.5f7bb57c.js
+++ b/assets/js/f9cc156b.08631d99.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[4800],{95788:(e,n,t)=>{t.d(n,{Iu:()=>d,yg:()=>g});var r=t(11504);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function s(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var l=r.createContext({}),u=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},d=function(e){var n=u(e.components);return r.createElement(l.Provider,{value:n},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},h=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=u(t),h=a,g=p["".concat(l,".").concat(h)]||p[h]||c[h]||o;return t?r.createElement(g,i(i({ref:n},d),{},{components:t})):r.createElement(g,i({ref:n},d))}));function g(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=h;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var u=2;u<o;u++)i[u]=t[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}h.displayName="MDXCreateElement"},35236:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var r=t(86404),a=(t(11504),t(95788));const o={title:"Alerts and Reports",hide_title:!0,sidebar_position:10,version:2},i=void 0,s={unversionedId:"installation/alerts-reports",id:"installation/alerts-reports",title:"Alerts and Reports",description:"Alerts and Reports",source:"@site/docs/installation/alerts-reports.mdx",sourceDirName:"installation",slug:"/installation/alerts-reports",permalink:"/docs/installation/alerts-reports",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/installation/alerts-reports.mdx",tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Alerts and Reports",hide_title:!0,sidebar_position:10,version:2},sidebar:"tutorialSidebar",previous:{title:"Async Queries via Celery",permalink:"/docs/installation/async-queries-celery"},next:{title:"SQL Templating",permalink:"/docs/installation/sql-templating"}},l={},u=[{value:"Alerts and Reports",id:"alerts-and-reports",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Commons",id:"commons",level:4},{value:"In your <code>superset_config.py</code> or <code>superset_config_docker.py</code>",id:"in-your-superset_configpy-or-superset_config_dockerpy",level:5},{value:"Disable dry-run mode",id:"disable-dry-run-mode",level:6},{value:"In your <code>Dockerfile</code>",id:"in-your-dockerfile",level:5},{value:"Slack integration",id:"slack-integration",level:4},{value:"Kubernetes-specific",id:"kubernetes-specific",level:4},{value:"Docker Compose specific",id:"docker-compose-specific",level:4},{value:"You must have in your <code>docker-compose.yml</code>",id:"you-must-have-in-your-docker-composeyml",level:5},{value:"Detailed config",id:"detailed-config",level:3},{value:"Custom Dockerfile",id:"custom-dockerfile",level:3},{value:"Using Firefox",id:"using-firefox",level:4},{value:"Using Chrome",id:"using-chrome",level:4},{value:"Troubleshooting",id:"troubleshooting",level:3},{value:"Confirm feature flag is enabled and you have sufficient permissions",id:"confirm-feature-flag-is-enabled-and-you-have-sufficient-permissions",level:4},{value:"Check the logs of your Celery worker",id:"check-the-logs-of-your-celery-worker",level:4},{value:"Check web browser and webdriver installation",id:"check-web-browser-and-webdriver-installation",level:4},{value:"Send a test email",id:"send-a-test-email",level:4},{value:"Browse to your report from the worker",id:"browse-to-your-report-from-the-worker",level:4},{value:"Scheduling Queries as Reports",id:"scheduling-queries-as-reports",level:3}],d={toc:u},p="wrapper";function c(e){let{components:n,...t}=e;return(0,a.yg)(p,(0,r.c)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"alerts-and-reports"},"Alerts and Reports"),(0,a.yg)("p",null,"Users can configure automated alerts and reports to send dashboards or charts to an email recipient or Slack channel."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("em",{parentName:"li"},"Alerts")," are sent when a SQL condition is reached"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("em",{parentName:"li"},"Reports")," are sent on a schedule")),(0,a.yg)("p",null,"Alerts and reports are disabled by default. To turn them on, you need to do some setup, described here."),(0,a.yg)("h3",{id:"requirements"},"Requirements"),(0,a.yg)("h4",{id:"commons"},"Commons"),(0,a.yg)("h5",{id:"in-your-superset_configpy-or-superset_config_dockerpy"},"In your ",(0,a.yg)("inlineCode",{parentName:"h5"},"superset_config.py")," or ",(0,a.yg)("inlineCode",{parentName:"h5"},"superset_config_docker.py")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},'"ALERT_REPORTS"')," ",(0,a.yg)("a",{parentName:"li",href:"/docs/installation/configuring-superset#feature-flags"},"feature flag")," must be turned to True."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"beat_schedule")," in CeleryConfig must contain schedule for ",(0,a.yg)("inlineCode",{parentName:"li"},"reports.scheduler"),"."),(0,a.yg)("li",{parentName:"ul"},"At least one of those must be configured, depending on what you want to use:",(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"emails: ",(0,a.yg)("inlineCode",{parentName:"li"},"SMTP_*")," settings"),(0,a.yg)("li",{parentName:"ul"},"Slack messages: ",(0,a.yg)("inlineCode",{parentName:"li"},"SLACK_API_TOKEN"))))),(0,a.yg)("h6",{id:"disable-dry-run-mode"},"Disable dry-run mode"),(0,a.yg)("p",null,"Screenshots will be taken but no messages actually sent as long as ",(0,a.yg)("inlineCode",{parentName:"p"},"ALERT_REPORTS_NOTIFICATION_DRY_RUN = True"),", its default value in ",(0,a.yg)("inlineCode",{parentName:"p"},"docker/pythonpath_dev/superset_config.py"),".  To disable dry-run mode and start receiving email/Slack notifications, set ",(0,a.yg)("inlineCode",{parentName:"p"},"ALERT_REPORTS_NOTIFICATION_DRY_RUN")," to ",(0,a.yg)("inlineCode",{parentName:"p"},"False")," in ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/apache/superset/blob/master/docker/pythonpath_dev/superset_config.py"},"superset config"),"."),(0,a.yg)("h5",{id:"in-your-dockerfile"},"In your ",(0,a.yg)("inlineCode",{parentName:"h5"},"Dockerfile")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"You must install a headless browser, for taking screenshots of the charts and dashboards. Only Firefox and Chrome are currently supported.",(0,a.yg)("blockquote",{parentName:"li"},(0,a.yg)("p",{parentName:"blockquote"},"If you choose Chrome, you must also change the value of ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_TYPE")," to ",(0,a.yg)("inlineCode",{parentName:"p"},'"chrome"')," in your ",(0,a.yg)("inlineCode",{parentName:"p"},"superset_config.py"),".")))),(0,a.yg)("p",null,"Note: All the components required (Firefox headless browser, Redis, Postgres db, celery worker and celery beat) are present in the ",(0,a.yg)("em",{parentName:"p"},"dev")," docker image if you are following ",(0,a.yg)("a",{parentName:"p",href:"/docs/installation/installing-superset-using-docker-compose/"},"Installing Superset Locally"),".\nAll you need to do is add the required config variables described in this guide (See ",(0,a.yg)("inlineCode",{parentName:"p"},"Detailed Config"),")."),(0,a.yg)("p",null,"If you are running a non-dev docker image, e.g., a stable release like ",(0,a.yg)("inlineCode",{parentName:"p"},"apache/superset:2.0.1"),", that image does not include a headless browser.  Only the ",(0,a.yg)("inlineCode",{parentName:"p"},"superset_worker"),' container needs this headless browser to browse to the target chart or dashboard.\nYou can either install and configure the headless browser - see "Custom Dockerfile" section below - or when deploying via ',(0,a.yg)("inlineCode",{parentName:"p"},"docker compose"),", modify your ",(0,a.yg)("inlineCode",{parentName:"p"},"docker-compose.yml")," file to use a dev image for the worker container and a stable release image for the ",(0,a.yg)("inlineCode",{parentName:"p"},"superset_app")," container."),(0,a.yg)("p",null,(0,a.yg)("em",{parentName:"p"},"Note"),': In this context, a "dev image" is the same application software as its corresponding non-dev image, just bundled with additional tools.  So an image like ',(0,a.yg)("inlineCode",{parentName:"p"},"2.0.1-dev")," is identical to ",(0,a.yg)("inlineCode",{parentName:"p"},"2.0.1"),' when it comes to stability, functionality, and running in production.  The actual "in-development" versions of Superset - cutting-edge and unstable - are not tagged with version numbers on Docker Hub and will display version ',(0,a.yg)("inlineCode",{parentName:"p"},"0.0.0-dev")," within the Superset UI."),(0,a.yg)("h4",{id:"slack-integration"},"Slack integration"),(0,a.yg)("p",null,"To send alerts and reports to Slack channels, you need to create a new Slack Application on your workspace."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Connect to your Slack workspace, then head to ",(0,a.yg)("a",{parentName:"li",href:"https://api.slack.com/apps"},"https://api.slack.com/apps"),"."),(0,a.yg)("li",{parentName:"ol"},"Create a new app."),(0,a.yg)("li",{parentName:"ol"},'Go to "OAuth & Permissions" section, and give the following scopes to your app:',(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"incoming-webhook")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"files:write")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"chat:write")))),(0,a.yg)("li",{parentName:"ol"},'At the top of the "OAuth and Permissions" section, click "install to workspace".'),(0,a.yg)("li",{parentName:"ol"},"Select a default channel for your app and continue.\n(You can post to any channel by inviting your Superset app into that channel)."),(0,a.yg)("li",{parentName:"ol"},'The app should now be installed in your workspace, and a "Bot User OAuth Access Token" should have been created. Copy that token in the ',(0,a.yg)("inlineCode",{parentName:"li"},"SLACK_API_TOKEN")," variable of your ",(0,a.yg)("inlineCode",{parentName:"li"},"superset_config.py"),"."),(0,a.yg)("li",{parentName:"ol"},"Restart the service (or run ",(0,a.yg)("inlineCode",{parentName:"li"},"superset init"),") to pull in the new configuration.")),(0,a.yg)("p",null,"Note: when you configure an alert or a report, the Slack channel list takes channel names without the leading '#' e.g. use ",(0,a.yg)("inlineCode",{parentName:"p"},"alerts")," instead of ",(0,a.yg)("inlineCode",{parentName:"p"},"#alerts"),"."),(0,a.yg)("h4",{id:"kubernetes-specific"},"Kubernetes-specific"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"You must have a ",(0,a.yg)("inlineCode",{parentName:"li"},"celery beat")," pod running. If you're using the chart included in the GitHub repository under ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/apache/superset/tree/master/helm/superset"},"helm/superset"),", you need to put ",(0,a.yg)("inlineCode",{parentName:"li"},"supersetCeleryBeat.enabled = true")," in your values override."),(0,a.yg)("li",{parentName:"ul"},"You can see the dedicated docs about ",(0,a.yg)("a",{parentName:"li",href:"/docs/installation/running-on-kubernetes"},"Kubernetes installation")," for more generic details.")),(0,a.yg)("h4",{id:"docker-compose-specific"},"Docker Compose specific"),(0,a.yg)("h5",{id:"you-must-have-in-your-docker-composeyml"},"You must have in your ",(0,a.yg)("inlineCode",{parentName:"h5"},"docker-compose.yml")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"A Redis message broker"),(0,a.yg)("li",{parentName:"ul"},"PostgreSQL DB instead of SQLlite"),(0,a.yg)("li",{parentName:"ul"},"One or more ",(0,a.yg)("inlineCode",{parentName:"li"},"celery worker")),(0,a.yg)("li",{parentName:"ul"},"A single ",(0,a.yg)("inlineCode",{parentName:"li"},"celery beat"))),(0,a.yg)("p",null,"This process also works in a Docker swarm environment, you would just need to add ",(0,a.yg)("inlineCode",{parentName:"p"},"Deploy:")," to the Superset, Redis and Postgres services along with your specific configs for your swarm."),(0,a.yg)("h3",{id:"detailed-config"},"Detailed config"),(0,a.yg)("p",null,"The following configurations need to be added to the ",(0,a.yg)("inlineCode",{parentName:"p"},"superset_config.py")," file. This file is loaded when the image runs, and any configurations in it will override the default configurations found in the ",(0,a.yg)("inlineCode",{parentName:"p"},"config.py"),"."),(0,a.yg)("p",null,"You can find documentation about each field in the default ",(0,a.yg)("inlineCode",{parentName:"p"},"config.py")," in the GitHub repository under ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/apache/superset/blob/master/superset/config.py"},"superset/config.py"),"."),(0,a.yg)("p",null,"You need to replace default values with your custom Redis, Slack and/or SMTP config."),(0,a.yg)("p",null,"Superset uses Celery beat and Celery worker(s) to send alerts and reports."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"The beat is the scheduler that tells the worker when to perform its tasks. This schedule is defined when you create the alert or report."),(0,a.yg)("li",{parentName:"ul"},"The worker will process the  tasks that need to be performed when an alert or report is fired.")),(0,a.yg)("p",null,"In the ",(0,a.yg)("inlineCode",{parentName:"p"},"CeleryConfig"),", only the ",(0,a.yg)("inlineCode",{parentName:"p"},"beat_schedule")," is relevant to this feature, the rest of the ",(0,a.yg)("inlineCode",{parentName:"p"},"CeleryConfig")," can be changed for your needs."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},'from celery.schedules import crontab\n\nFEATURE_FLAGS = {\n    "ALERT_REPORTS": True\n}\n\nREDIS_HOST = "superset_cache"\nREDIS_PORT = "6379"\n\nclass CeleryConfig:\n    broker_url = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"\n    imports = (\n        "superset.sql_lab",\n        "superset.tasks.scheduler",\n    )\n    result_backend = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"\n    worker_prefetch_multiplier = 10\n    task_acks_late = True\n    task_annotations = {\n        "sql_lab.get_sql_results": {\n            "rate_limit": "100/s",\n        },\n    }\n    beat_schedule = {\n        "reports.scheduler": {\n            "task": "reports.scheduler",\n            "schedule": crontab(minute="*", hour="*"),\n        },\n        "reports.prune_log": {\n            "task": "reports.prune_log",\n            "schedule": crontab(minute=0, hour=0),\n        },\n    }\nCELERY_CONFIG = CeleryConfig\n\nSCREENSHOT_LOCATE_WAIT = 100\nSCREENSHOT_LOAD_WAIT = 600\n\n# Slack configuration\nSLACK_API_TOKEN = "xoxb-"\n\n# Email configuration\nSMTP_HOST = "smtp.sendgrid.net" # change to your host\nSMTP_PORT = 2525 # your port, e.g. 587\nSMTP_STARTTLS = True\nSMTP_SSL_SERVER_AUTH = True # If your using an SMTP server with a valid certificate\nSMTP_SSL = False\nSMTP_USER = "your_user" # use the empty string "" if using an unauthenticated SMTP server\nSMTP_PASSWORD = "your_password" # use the empty string "" if using an unauthenticated SMTP server\nSMTP_MAIL_FROM = "noreply@youremail.com"\nEMAIL_REPORTS_SUBJECT_PREFIX = "[Superset] " # optional - overwrites default value in config.py of "[Report] "\n\n# WebDriver configuration\n# If you use Firefox, you can stick with default values\n# If you use Chrome, then add the following WEBDRIVER_TYPE and WEBDRIVER_OPTION_ARGS\nWEBDRIVER_TYPE = "chrome"\nWEBDRIVER_OPTION_ARGS = [\n    "--force-device-scale-factor=2.0",\n    "--high-dpi-support=2.0",\n    "--headless",\n    "--disable-gpu",\n    "--disable-dev-shm-usage",\n    "--no-sandbox",\n    "--disable-setuid-sandbox",\n    "--disable-extensions",\n]\n\n# This is for internal use, you can keep http\nWEBDRIVER_BASEURL = "http://superset:8088"\n# This is the link sent to the recipient. Change to your domain, e.g. https://superset.mydomain.com\nWEBDRIVER_BASEURL_USER_FRIENDLY = "http://localhost:8088"\n')),(0,a.yg)("p",null,"You also need\nto specify on behalf of which username to render the dashboards. In general dashboards and charts\nare not accessible to unauthorized requests, that is why the worker needs to take over credentials\nof an existing user to take a snapshot."),(0,a.yg)("p",null,"By default, Alerts and Reports are executed as the owner of the alert/report object. To use a fixed user account,\njust change the config as follows (",(0,a.yg)("inlineCode",{parentName:"p"},"admin")," in this example):"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},"from superset.tasks.types import ExecutorType\n\nTHUMBNAIL_SELENIUM_USER = 'admin'\nALERT_REPORTS_EXECUTE_AS = [ExecutorType.SELENIUM]\n")),(0,a.yg)("p",null,"Please refer to ",(0,a.yg)("inlineCode",{parentName:"p"},"ExecutorType")," in the codebase for other executor types."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Important notes")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Be mindful of the concurrency setting for celery (using ",(0,a.yg)("inlineCode",{parentName:"li"},"-c 4"),"). Selenium/webdriver instances can\nconsume a lot of CPU / memory on your servers."),(0,a.yg)("li",{parentName:"ul"},"In some cases, if you notice a lot of leaked geckodriver processes, try running your celery\nprocesses with ",(0,a.yg)("inlineCode",{parentName:"li"},"celery worker --pool=prefork --max-tasks-per-child=128 ...")),(0,a.yg)("li",{parentName:"ul"},"It is recommended to run separate workers for the ",(0,a.yg)("inlineCode",{parentName:"li"},"sql_lab")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"email_reports")," tasks. This can be\ndone using the ",(0,a.yg)("inlineCode",{parentName:"li"},"queue")," field in ",(0,a.yg)("inlineCode",{parentName:"li"},"task_annotations"),"."),(0,a.yg)("li",{parentName:"ul"},"Adjust ",(0,a.yg)("inlineCode",{parentName:"li"},"WEBDRIVER_BASEURL")," in your configuration file if celery workers can\u2019t access Superset via\nits default value of ",(0,a.yg)("inlineCode",{parentName:"li"},"http://0.0.0.0:8080/"),".")),(0,a.yg)("h3",{id:"custom-dockerfile"},"Custom Dockerfile"),(0,a.yg)("p",null,"If you're running the dev version of a released Superset image, like ",(0,a.yg)("inlineCode",{parentName:"p"},"apache/superset:2.0.1-dev"),", you should be set with the above."),(0,a.yg)("p",null,"But if you're building your own image, or starting with a non-dev version, a webdriver (and headless browser) is needed to capture screenshots of the charts and dashboards which are then sent to the recipient.\nHere's how you can modify your Dockerfile to take the screenshots either with Firefox or Chrome."),(0,a.yg)("h4",{id:"using-firefox"},"Using Firefox"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-docker"},"FROM apache/superset:2.0.1\n\nUSER root\n\nRUN apt-get update && \\\n    apt-get install --no-install-recommends -y firefox-esr\n\nENV GECKODRIVER_VERSION=0.29.0\nRUN wget -q https://github.com/mozilla/geckodriver/releases/download/v${GECKODRIVER_VERSION}/geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz && \\\n    tar -x geckodriver -zf geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz -O > /usr/bin/geckodriver && \\\n    chmod 755 /usr/bin/geckodriver && \\\n    rm geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz\n\nRUN pip install --no-cache gevent psycopg2 redis\n\nUSER superset\n")),(0,a.yg)("h4",{id:"using-chrome"},"Using Chrome"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-docker"},"FROM apache/superset:2.0.1\n\nUSER root\n\nRUN apt-get update && \\\n    wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \\\n    apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb && \\\n    rm -f google-chrome-stable_current_amd64.deb\n\nRUN export CHROMEDRIVER_VERSION=$(curl --silent https://chromedriver.storage.googleapis.com/LATEST_RELEASE_102) && \\\n    wget -q https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip && \\\n    unzip chromedriver_linux64.zip -d /usr/bin && \\\n    chmod 755 /usr/bin/chromedriver && \\\n    rm -f chromedriver_linux64.zip\n\nRUN pip install --no-cache gevent psycopg2 redis\n\nUSER superset\n")),(0,a.yg)("p",null,"Don't forget to set ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_TYPE")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_OPTION_ARGS")," in your config if you use Chrome."),(0,a.yg)("h3",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"There are many reasons that reports might not be working.  Try these steps to check for specific issues."),(0,a.yg)("h4",{id:"confirm-feature-flag-is-enabled-and-you-have-sufficient-permissions"},"Confirm feature flag is enabled and you have sufficient permissions"),(0,a.yg)("p",null,'If you don\'t see "Alerts & Reports" under the ',(0,a.yg)("em",{parentName:"p"},"Manage")," section of the Settings dropdown in the Superset UI, you need to enable the ",(0,a.yg)("inlineCode",{parentName:"p"},"ALERT_REPORTS")," feature flag (see above). Enable another feature flag and check to see that it took effect, to verify that your config file is getting loaded."),(0,a.yg)("p",null,"Log in as an admin user to ensure you have adequate permissions."),(0,a.yg)("h4",{id:"check-the-logs-of-your-celery-worker"},"Check the logs of your Celery worker"),(0,a.yg)("p",null,"This is the best source of information about the problem.  In a docker compose deployment, you can do this with a command like ",(0,a.yg)("inlineCode",{parentName:"p"},"docker logs superset_worker --since 1h"),"."),(0,a.yg)("h4",{id:"check-web-browser-and-webdriver-installation"},"Check web browser and webdriver installation"),(0,a.yg)("p",null,"To take a screenshot, the worker visits the dashboard or chart using a headless browser, then takes a screenshot. If you are able to send a chart as CSV or text but can't send as PNG, your problem may lie with the browser."),(0,a.yg)("p",null,"Superset docker images that have a tag ending with ",(0,a.yg)("inlineCode",{parentName:"p"},"-dev")," have the Firefox headless browser and geckodriver already installed. You can test that these are installed and in the proper path by entering your Superset worker and running ",(0,a.yg)("inlineCode",{parentName:"p"},"firefox --headless")," and then ",(0,a.yg)("inlineCode",{parentName:"p"},"geckodriver"),". Both commands should start those applications."),(0,a.yg)("p",null,"If you are handling the installation of that software on your own, or wish to use Chromium instead, do your own verification to ensure that the headless browser opens successfully in the worker environment."),(0,a.yg)("h4",{id:"send-a-test-email"},"Send a test email"),(0,a.yg)("p",null,"One symptom of an invalid connection to an email server is receiving an error of ",(0,a.yg)("inlineCode",{parentName:"p"},"[Errno 110] Connection timed out")," in your logs when the report tries to send."),(0,a.yg)("p",null,"Confirm via testing that your outbound email configuration is correct.  Here is the simplest test, for an un-authenticated email SMTP email service running on port 25.  If you are sending over SSL, for instance, study how ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/apache/superset/blob/master/superset/utils/core.py#L818"},"Superset's codebase sends emails")," and then test with those commands and arguments."),(0,a.yg)("p",null,"Start Python in your worker environment, replace all example values, and run:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},"import smtplib\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.text import MIMEText\n\nfrom_email = 'superset_emails@example.com'\nto_email = 'your_email@example.com'\nmsg = MIMEMultipart()\nmsg['From'] = from_email\nmsg['To'] = to_email\nmsg['Subject'] = 'Superset SMTP config test'\nmessage = 'It worked'\nmsg.attach(MIMEText(message))\nmailserver = smtplib.SMTP('smtpmail.example.com', 25)\nmailserver.sendmail(from_email, to_email, msg.as_string())\nmailserver.quit()\n")),(0,a.yg)("p",null,"This should send an email."),(0,a.yg)("p",null,"Possible fixes:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Some cloud hosts disable outgoing unauthenticated SMTP email to prevent spam.  For instance, ",(0,a.yg)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/virtual-network/troubleshoot-outbound-smtp-connectivity"},"Azure blocks port 25 by default on some machines"),". Enable that port or use another sending method."),(0,a.yg)("li",{parentName:"ul"},"Use another set of SMTP credentials that you verify works in this setup.")),(0,a.yg)("h4",{id:"browse-to-your-report-from-the-worker"},"Browse to your report from the worker"),(0,a.yg)("p",null,"The worker may be unable to reach the report. It will use the value of ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_BASEURL")," to browse to the report.  If that route is invalid, or presents an authentication challenge that the worker can't pass, the report screenshot will fail."),(0,a.yg)("p",null,"Check this by attempting to ",(0,a.yg)("inlineCode",{parentName:"p"},"curl")," the URL of a report that you see in the error logs of your worker. For instance, from the worker environment, run ",(0,a.yg)("inlineCode",{parentName:"p"},"curl http://superset_app:8088/superset/dashboard/1/"),". You may get different responses depending on whether the dashboard exists - for example, you may need to change the ",(0,a.yg)("inlineCode",{parentName:"p"},"1")," in that URL. If there's a URL in your logs from a failed report screenshot, that's a good place to start. The goal is to determine a valid value for ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_BASEURL")," and determine if an issue like HTTPS or authentication is redirecting your worker."),(0,a.yg)("p",null,"In a deployment with authentication measures enabled like HTTPS and Single Sign-On, it may make sense to have the worker navigate directly to the Superset application running in the same location, avoiding the need to sign in.  For instance, you could use ",(0,a.yg)("inlineCode",{parentName:"p"},'WEBDRIVER_BASEURL="http://superset_app:8088"')," for a docker compose deployment, and set ",(0,a.yg)("inlineCode",{parentName:"p"},'"force_https": False,')," in your ",(0,a.yg)("inlineCode",{parentName:"p"},"TALISMAN_CONFIG"),"."),(0,a.yg)("h3",{id:"scheduling-queries-as-reports"},"Scheduling Queries as Reports"),(0,a.yg)("p",null,"You can optionally allow your users to schedule queries directly in SQL Lab. This is done by adding\nextra metadata to saved queries, which are then picked up by an external scheduled (like\n",(0,a.yg)("a",{parentName:"p",href:"https://airflow.apache.org/"},"Apache Airflow"),")."),(0,a.yg)("p",null,"To allow scheduled queries, add the following to ",(0,a.yg)("inlineCode",{parentName:"p"},"SCHEDULED_QUERIES")," in your configuration file:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},"SCHEDULED_QUERIES = {\n    # This information is collected when the user clicks \"Schedule query\",\n    # and saved into the `extra` field of saved queries.\n    # See: https://github.com/mozilla-services/react-jsonschema-form\n    'JSONSCHEMA': {\n        'title': 'Schedule',\n        'description': (\n            'In order to schedule a query, you need to specify when it '\n            'should start running, when it should stop running, and how '\n            'often it should run. You can also optionally specify '\n            'dependencies that should be met before the query is '\n            'executed. Please read the documentation for best practices '\n            'and more information on how to specify dependencies.'\n        ),\n        'type': 'object',\n        'properties': {\n            'output_table': {\n                'type': 'string',\n                'title': 'Output table name',\n            },\n            'start_date': {\n                'type': 'string',\n                'title': 'Start date',\n                # date-time is parsed using the chrono library, see\n                # https://www.npmjs.com/package/chrono-node#usage\n                'format': 'date-time',\n                'default': 'tomorrow at 9am',\n            },\n            'end_date': {\n                'type': 'string',\n                'title': 'End date',\n                # date-time is parsed using the chrono library, see\n                # https://www.npmjs.com/package/chrono-node#usage\n                'format': 'date-time',\n                'default': '9am in 30 days',\n            },\n            'schedule_interval': {\n                'type': 'string',\n                'title': 'Schedule interval',\n            },\n            'dependencies': {\n                'type': 'array',\n                'title': 'Dependencies',\n                'items': {\n                    'type': 'string',\n                },\n            },\n        },\n    },\n    'UISCHEMA': {\n        'schedule_interval': {\n            'ui:placeholder': '@daily, @weekly, etc.',\n        },\n        'dependencies': {\n            'ui:help': (\n                'Check the documentation for the correct format when '\n                'defining dependencies.'\n            ),\n        },\n    },\n    'VALIDATION': [\n        # ensure that start_date <= end_date\n        {\n            'name': 'less_equal',\n            'arguments': ['start_date', 'end_date'],\n            'message': 'End date cannot be before start date',\n            # this is where the error message is shown\n            'container': 'end_date',\n        },\n    ],\n    # link to the scheduler; this example links to an Airflow pipeline\n    # that uses the query id and the output table as its name\n    'linkback': (\n        'https://airflow.example.com/admin/airflow/tree?'\n        'dag_id=query_${id}_${extra_json.schedule_info.output_table}'\n    ),\n}\n")),(0,a.yg)("p",null,"This configuration is based on\n",(0,a.yg)("a",{parentName:"p",href:"https://github.com/mozilla-services/react-jsonschema-form"},"react-jsonschema-form")," and will add a\nmenu item called \u201cSchedule\u201d to SQL Lab. When the menu item is clicked, a modal will show up where\nthe user can add the metadata required for scheduling the query."),(0,a.yg)("p",null,"This information can then be retrieved from the endpoint ",(0,a.yg)("inlineCode",{parentName:"p"},"/savedqueryviewapi/api/read")," and used to\nschedule the queries that have ",(0,a.yg)("inlineCode",{parentName:"p"},"scheduled_queries")," in their JSON metadata. For schedulers other than\nAirflow, additional fields can be easily added to the configuration file above."))}c.isMDXComponent=!0}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[4800],{95788:(e,n,t)=>{t.d(n,{Iu:()=>d,yg:()=>g});var r=t(11504);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function s(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var l=r.createContext({}),u=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},d=function(e){var n=u(e.components);return r.createElement(l.Provider,{value:n},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},h=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=u(t),h=a,g=p["".concat(l,".").concat(h)]||p[h]||c[h]||o;return t?r.createElement(g,i(i({ref:n},d),{},{components:t})):r.createElement(g,i({ref:n},d))}));function g(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=h;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var u=2;u<o;u++)i[u]=t[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}h.displayName="MDXCreateElement"},35236:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var r=t(86404),a=(t(11504),t(95788));const o={title:"Alerts and Reports",hide_title:!0,sidebar_position:10,version:2},i=void 0,s={unversionedId:"installation/alerts-reports",id:"installation/alerts-reports",title:"Alerts and Reports",description:"Alerts and Reports",source:"@site/docs/installation/alerts-reports.mdx",sourceDirName:"installation",slug:"/installation/alerts-reports",permalink:"/docs/installation/alerts-reports",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/installation/alerts-reports.mdx",tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Alerts and Reports",hide_title:!0,sidebar_position:10,version:2},sidebar:"tutorialSidebar",previous:{title:"Async Queries via Celery",permalink:"/docs/installation/async-queries-celery"},next:{title:"SQL Templating",permalink:"/docs/installation/sql-templating"}},l={},u=[{value:"Alerts and Reports",id:"alerts-and-reports",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Commons",id:"commons",level:4},{value:"In your <code>superset_config.py</code> or <code>superset_config_docker.py</code>",id:"in-your-superset_configpy-or-superset_config_dockerpy",level:5},{value:"Disable dry-run mode",id:"disable-dry-run-mode",level:6},{value:"In your <code>Dockerfile</code>",id:"in-your-dockerfile",level:5},{value:"Slack integration",id:"slack-integration",level:4},{value:"Kubernetes-specific",id:"kubernetes-specific",level:4},{value:"Docker Compose specific",id:"docker-compose-specific",level:4},{value:"You must have in your <code>docker-compose.yml</code>",id:"you-must-have-in-your-docker-composeyml",level:5},{value:"Detailed config",id:"detailed-config",level:3},{value:"Custom Dockerfile",id:"custom-dockerfile",level:3},{value:"Using Firefox",id:"using-firefox",level:4},{value:"Using Chrome",id:"using-chrome",level:4},{value:"Troubleshooting",id:"troubleshooting",level:3},{value:"Confirm feature flag is enabled and you have sufficient permissions",id:"confirm-feature-flag-is-enabled-and-you-have-sufficient-permissions",level:4},{value:"Check the logs of your Celery worker",id:"check-the-logs-of-your-celery-worker",level:4},{value:"Check web browser and webdriver installation",id:"check-web-browser-and-webdriver-installation",level:4},{value:"Send a test email",id:"send-a-test-email",level:4},{value:"Browse to your report from the worker",id:"browse-to-your-report-from-the-worker",level:4},{value:"Scheduling Queries as Reports",id:"scheduling-queries-as-reports",level:3}],d={toc:u},p="wrapper";function c(e){let{components:n,...t}=e;return(0,a.yg)(p,(0,r.c)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"alerts-and-reports"},"Alerts and Reports"),(0,a.yg)("p",null,"Users can configure automated alerts and reports to send dashboards or charts to an email recipient or Slack channel."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("em",{parentName:"li"},"Alerts")," are sent when a SQL condition is reached"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("em",{parentName:"li"},"Reports")," are sent on a schedule")),(0,a.yg)("p",null,"Alerts and reports are disabled by default. To turn them on, you need to do some setup, described here."),(0,a.yg)("h3",{id:"requirements"},"Requirements"),(0,a.yg)("h4",{id:"commons"},"Commons"),(0,a.yg)("h5",{id:"in-your-superset_configpy-or-superset_config_dockerpy"},"In your ",(0,a.yg)("inlineCode",{parentName:"h5"},"superset_config.py")," or ",(0,a.yg)("inlineCode",{parentName:"h5"},"superset_config_docker.py")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},'"ALERT_REPORTS"')," ",(0,a.yg)("a",{parentName:"li",href:"/docs/installation/configuring-superset#feature-flags"},"feature flag")," must be turned to True."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"beat_schedule")," in CeleryConfig must contain schedule for ",(0,a.yg)("inlineCode",{parentName:"li"},"reports.scheduler"),"."),(0,a.yg)("li",{parentName:"ul"},"At least one of those must be configured, depending on what you want to use:",(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"emails: ",(0,a.yg)("inlineCode",{parentName:"li"},"SMTP_*")," settings"),(0,a.yg)("li",{parentName:"ul"},"Slack messages: ",(0,a.yg)("inlineCode",{parentName:"li"},"SLACK_API_TOKEN"))))),(0,a.yg)("h6",{id:"disable-dry-run-mode"},"Disable dry-run mode"),(0,a.yg)("p",null,"Screenshots will be taken but no messages actually sent as long as ",(0,a.yg)("inlineCode",{parentName:"p"},"ALERT_REPORTS_NOTIFICATION_DRY_RUN = True"),", its default value in ",(0,a.yg)("inlineCode",{parentName:"p"},"docker/pythonpath_dev/superset_config.py"),".  To disable dry-run mode and start receiving email/Slack notifications, set ",(0,a.yg)("inlineCode",{parentName:"p"},"ALERT_REPORTS_NOTIFICATION_DRY_RUN")," to ",(0,a.yg)("inlineCode",{parentName:"p"},"False")," in ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/apache/superset/blob/master/docker/pythonpath_dev/superset_config.py"},"superset config"),"."),(0,a.yg)("h5",{id:"in-your-dockerfile"},"In your ",(0,a.yg)("inlineCode",{parentName:"h5"},"Dockerfile")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"You must install a headless browser, for taking screenshots of the charts and dashboards. Only Firefox and Chrome are currently supported.",(0,a.yg)("blockquote",{parentName:"li"},(0,a.yg)("p",{parentName:"blockquote"},"If you choose Chrome, you must also change the value of ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_TYPE")," to ",(0,a.yg)("inlineCode",{parentName:"p"},'"chrome"')," in your ",(0,a.yg)("inlineCode",{parentName:"p"},"superset_config.py"),".")))),(0,a.yg)("p",null,"Note: All the components required (Firefox headless browser, Redis, Postgres db, celery worker and celery beat) are present in the ",(0,a.yg)("em",{parentName:"p"},"dev")," docker image if you are following ",(0,a.yg)("a",{parentName:"p",href:"/docs/installation/installing-superset-using-docker-compose/"},"Installing Superset Locally"),".\nAll you need to do is add the required config variables described in this guide (See ",(0,a.yg)("inlineCode",{parentName:"p"},"Detailed Config"),")."),(0,a.yg)("p",null,"If you are running a non-dev docker image, e.g., a stable release like ",(0,a.yg)("inlineCode",{parentName:"p"},"apache/superset:3.1.0"),", that image does not include a headless browser.  Only the ",(0,a.yg)("inlineCode",{parentName:"p"},"superset_worker"),' container needs this headless browser to browse to the target chart or dashboard.\nYou can either install and configure the headless browser - see "Custom Dockerfile" section below - or when deploying via ',(0,a.yg)("inlineCode",{parentName:"p"},"docker compose"),", modify your ",(0,a.yg)("inlineCode",{parentName:"p"},"docker-compose.yml")," file to use a dev image for the worker container and a stable release image for the ",(0,a.yg)("inlineCode",{parentName:"p"},"superset_app")," container."),(0,a.yg)("p",null,(0,a.yg)("em",{parentName:"p"},"Note"),': In this context, a "dev image" is the same application software as its corresponding non-dev image, just bundled with additional tools.  So an image like ',(0,a.yg)("inlineCode",{parentName:"p"},"3.1.0-dev")," is identical to ",(0,a.yg)("inlineCode",{parentName:"p"},"3.1.0"),' when it comes to stability, functionality, and running in production.  The actual "in-development" versions of Superset - cutting-edge and unstable - are not tagged with version numbers on Docker Hub and will display version ',(0,a.yg)("inlineCode",{parentName:"p"},"0.0.0-dev")," within the Superset UI."),(0,a.yg)("h4",{id:"slack-integration"},"Slack integration"),(0,a.yg)("p",null,"To send alerts and reports to Slack channels, you need to create a new Slack Application on your workspace."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Connect to your Slack workspace, then head to ",(0,a.yg)("a",{parentName:"li",href:"https://api.slack.com/apps"},"https://api.slack.com/apps"),"."),(0,a.yg)("li",{parentName:"ol"},"Create a new app."),(0,a.yg)("li",{parentName:"ol"},'Go to "OAuth & Permissions" section, and give the following scopes to your app:',(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"incoming-webhook")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"files:write")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("inlineCode",{parentName:"li"},"chat:write")))),(0,a.yg)("li",{parentName:"ol"},'At the top of the "OAuth and Permissions" section, click "install to workspace".'),(0,a.yg)("li",{parentName:"ol"},"Select a default channel for your app and continue.\n(You can post to any channel by inviting your Superset app into that channel)."),(0,a.yg)("li",{parentName:"ol"},'The app should now be installed in your workspace, and a "Bot User OAuth Access Token" should have been created. Copy that token in the ',(0,a.yg)("inlineCode",{parentName:"li"},"SLACK_API_TOKEN")," variable of your ",(0,a.yg)("inlineCode",{parentName:"li"},"superset_config.py"),"."),(0,a.yg)("li",{parentName:"ol"},"Restart the service (or run ",(0,a.yg)("inlineCode",{parentName:"li"},"superset init"),") to pull in the new configuration.")),(0,a.yg)("p",null,"Note: when you configure an alert or a report, the Slack channel list takes channel names without the leading '#' e.g. use ",(0,a.yg)("inlineCode",{parentName:"p"},"alerts")," instead of ",(0,a.yg)("inlineCode",{parentName:"p"},"#alerts"),"."),(0,a.yg)("h4",{id:"kubernetes-specific"},"Kubernetes-specific"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"You must have a ",(0,a.yg)("inlineCode",{parentName:"li"},"celery beat")," pod running. If you're using the chart included in the GitHub repository under ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/apache/superset/tree/master/helm/superset"},"helm/superset"),", you need to put ",(0,a.yg)("inlineCode",{parentName:"li"},"supersetCeleryBeat.enabled = true")," in your values override."),(0,a.yg)("li",{parentName:"ul"},"You can see the dedicated docs about ",(0,a.yg)("a",{parentName:"li",href:"/docs/installation/running-on-kubernetes"},"Kubernetes installation")," for more generic details.")),(0,a.yg)("h4",{id:"docker-compose-specific"},"Docker Compose specific"),(0,a.yg)("h5",{id:"you-must-have-in-your-docker-composeyml"},"You must have in your ",(0,a.yg)("inlineCode",{parentName:"h5"},"docker-compose.yml")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"A Redis message broker"),(0,a.yg)("li",{parentName:"ul"},"PostgreSQL DB instead of SQLlite"),(0,a.yg)("li",{parentName:"ul"},"One or more ",(0,a.yg)("inlineCode",{parentName:"li"},"celery worker")),(0,a.yg)("li",{parentName:"ul"},"A single ",(0,a.yg)("inlineCode",{parentName:"li"},"celery beat"))),(0,a.yg)("p",null,"This process also works in a Docker swarm environment, you would just need to add ",(0,a.yg)("inlineCode",{parentName:"p"},"Deploy:")," to the Superset, Redis and Postgres services along with your specific configs for your swarm."),(0,a.yg)("h3",{id:"detailed-config"},"Detailed config"),(0,a.yg)("p",null,"The following configurations need to be added to the ",(0,a.yg)("inlineCode",{parentName:"p"},"superset_config.py")," file. This file is loaded when the image runs, and any configurations in it will override the default configurations found in the ",(0,a.yg)("inlineCode",{parentName:"p"},"config.py"),"."),(0,a.yg)("p",null,"You can find documentation about each field in the default ",(0,a.yg)("inlineCode",{parentName:"p"},"config.py")," in the GitHub repository under ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/apache/superset/blob/master/superset/config.py"},"superset/config.py"),"."),(0,a.yg)("p",null,"You need to replace default values with your custom Redis, Slack and/or SMTP config."),(0,a.yg)("p",null,"Superset uses Celery beat and Celery worker(s) to send alerts and reports."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"The beat is the scheduler that tells the worker when to perform its tasks. This schedule is defined when you create the alert or report."),(0,a.yg)("li",{parentName:"ul"},"The worker will process the  tasks that need to be performed when an alert or report is fired.")),(0,a.yg)("p",null,"In the ",(0,a.yg)("inlineCode",{parentName:"p"},"CeleryConfig"),", only the ",(0,a.yg)("inlineCode",{parentName:"p"},"beat_schedule")," is relevant to this feature, the rest of the ",(0,a.yg)("inlineCode",{parentName:"p"},"CeleryConfig")," can be changed for your needs."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},'from celery.schedules import crontab\n\nFEATURE_FLAGS = {\n    "ALERT_REPORTS": True\n}\n\nREDIS_HOST = "superset_cache"\nREDIS_PORT = "6379"\n\nclass CeleryConfig:\n    broker_url = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"\n    imports = (\n        "superset.sql_lab",\n        "superset.tasks.scheduler",\n    )\n    result_backend = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"\n    worker_prefetch_multiplier = 10\n    task_acks_late = True\n    task_annotations = {\n        "sql_lab.get_sql_results": {\n            "rate_limit": "100/s",\n        },\n    }\n    beat_schedule = {\n        "reports.scheduler": {\n            "task": "reports.scheduler",\n            "schedule": crontab(minute="*", hour="*"),\n        },\n        "reports.prune_log": {\n            "task": "reports.prune_log",\n            "schedule": crontab(minute=0, hour=0),\n        },\n    }\nCELERY_CONFIG = CeleryConfig\n\nSCREENSHOT_LOCATE_WAIT = 100\nSCREENSHOT_LOAD_WAIT = 600\n\n# Slack configuration\nSLACK_API_TOKEN = "xoxb-"\n\n# Email configuration\nSMTP_HOST = "smtp.sendgrid.net" # change to your host\nSMTP_PORT = 2525 # your port, e.g. 587\nSMTP_STARTTLS = True\nSMTP_SSL_SERVER_AUTH = True # If your using an SMTP server with a valid certificate\nSMTP_SSL = False\nSMTP_USER = "your_user" # use the empty string "" if using an unauthenticated SMTP server\nSMTP_PASSWORD = "your_password" # use the empty string "" if using an unauthenticated SMTP server\nSMTP_MAIL_FROM = "noreply@youremail.com"\nEMAIL_REPORTS_SUBJECT_PREFIX = "[Superset] " # optional - overwrites default value in config.py of "[Report] "\n\n# WebDriver configuration\n# If you use Firefox, you can stick with default values\n# If you use Chrome, then add the following WEBDRIVER_TYPE and WEBDRIVER_OPTION_ARGS\nWEBDRIVER_TYPE = "chrome"\nWEBDRIVER_OPTION_ARGS = [\n    "--force-device-scale-factor=2.0",\n    "--high-dpi-support=2.0",\n    "--headless",\n    "--disable-gpu",\n    "--disable-dev-shm-usage",\n    "--no-sandbox",\n    "--disable-setuid-sandbox",\n    "--disable-extensions",\n]\n\n# This is for internal use, you can keep http\nWEBDRIVER_BASEURL = "http://superset:8088"\n# This is the link sent to the recipient. Change to your domain, e.g. https://superset.mydomain.com\nWEBDRIVER_BASEURL_USER_FRIENDLY = "http://localhost:8088"\n')),(0,a.yg)("p",null,"You also need\nto specify on behalf of which username to render the dashboards. In general dashboards and charts\nare not accessible to unauthorized requests, that is why the worker needs to take over credentials\nof an existing user to take a snapshot."),(0,a.yg)("p",null,"By default, Alerts and Reports are executed as the owner of the alert/report object. To use a fixed user account,\njust change the config as follows (",(0,a.yg)("inlineCode",{parentName:"p"},"admin")," in this example):"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},"from superset.tasks.types import ExecutorType\n\nTHUMBNAIL_SELENIUM_USER = 'admin'\nALERT_REPORTS_EXECUTE_AS = [ExecutorType.SELENIUM]\n")),(0,a.yg)("p",null,"Please refer to ",(0,a.yg)("inlineCode",{parentName:"p"},"ExecutorType")," in the codebase for other executor types."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Important notes")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Be mindful of the concurrency setting for celery (using ",(0,a.yg)("inlineCode",{parentName:"li"},"-c 4"),"). Selenium/webdriver instances can\nconsume a lot of CPU / memory on your servers."),(0,a.yg)("li",{parentName:"ul"},"In some cases, if you notice a lot of leaked geckodriver processes, try running your celery\nprocesses with ",(0,a.yg)("inlineCode",{parentName:"li"},"celery worker --pool=prefork --max-tasks-per-child=128 ...")),(0,a.yg)("li",{parentName:"ul"},"It is recommended to run separate workers for the ",(0,a.yg)("inlineCode",{parentName:"li"},"sql_lab")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"email_reports")," tasks. This can be\ndone using the ",(0,a.yg)("inlineCode",{parentName:"li"},"queue")," field in ",(0,a.yg)("inlineCode",{parentName:"li"},"task_annotations"),"."),(0,a.yg)("li",{parentName:"ul"},"Adjust ",(0,a.yg)("inlineCode",{parentName:"li"},"WEBDRIVER_BASEURL")," in your configuration file if celery workers can\u2019t access Superset via\nits default value of ",(0,a.yg)("inlineCode",{parentName:"li"},"http://0.0.0.0:8080/"),".")),(0,a.yg)("h3",{id:"custom-dockerfile"},"Custom Dockerfile"),(0,a.yg)("p",null,"If you're running the dev version of a released Superset image, like ",(0,a.yg)("inlineCode",{parentName:"p"},"apache/superset:3.1.0-dev"),", you should be set with the above."),(0,a.yg)("p",null,"But if you're building your own image, or starting with a non-dev version, a webdriver (and headless browser) is needed to capture screenshots of the charts and dashboards which are then sent to the recipient.\nHere's how you can modify your Dockerfile to take the screenshots either with Firefox or Chrome."),(0,a.yg)("h4",{id:"using-firefox"},"Using Firefox"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-docker"},"FROM apache/superset:3.1.0\n\nUSER root\n\nRUN apt-get update && \\\n    apt-get install --no-install-recommends -y firefox-esr\n\nENV GECKODRIVER_VERSION=0.29.0\nRUN wget -q https://github.com/mozilla/geckodriver/releases/download/v${GECKODRIVER_VERSION}/geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz && \\\n    tar -x geckodriver -zf geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz -O > /usr/bin/geckodriver && \\\n    chmod 755 /usr/bin/geckodriver && \\\n    rm geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz\n\nRUN pip install --no-cache gevent psycopg2 redis\n\nUSER superset\n")),(0,a.yg)("h4",{id:"using-chrome"},"Using Chrome"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-docker"},"FROM apache/superset:3.1.0\n\nUSER root\n\nRUN apt-get update && \\\n    wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \\\n    apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb && \\\n    rm -f google-chrome-stable_current_amd64.deb\n\nRUN export CHROMEDRIVER_VERSION=$(curl --silent https://chromedriver.storage.googleapis.com/LATEST_RELEASE_102) && \\\n    wget -q https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip && \\\n    unzip chromedriver_linux64.zip -d /usr/bin && \\\n    chmod 755 /usr/bin/chromedriver && \\\n    rm -f chromedriver_linux64.zip\n\nRUN pip install --no-cache gevent psycopg2 redis\n\nUSER superset\n")),(0,a.yg)("p",null,"Don't forget to set ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_TYPE")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_OPTION_ARGS")," in your config if you use Chrome."),(0,a.yg)("h3",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"There are many reasons that reports might not be working.  Try these steps to check for specific issues."),(0,a.yg)("h4",{id:"confirm-feature-flag-is-enabled-and-you-have-sufficient-permissions"},"Confirm feature flag is enabled and you have sufficient permissions"),(0,a.yg)("p",null,'If you don\'t see "Alerts & Reports" under the ',(0,a.yg)("em",{parentName:"p"},"Manage")," section of the Settings dropdown in the Superset UI, you need to enable the ",(0,a.yg)("inlineCode",{parentName:"p"},"ALERT_REPORTS")," feature flag (see above). Enable another feature flag and check to see that it took effect, to verify that your config file is getting loaded."),(0,a.yg)("p",null,"Log in as an admin user to ensure you have adequate permissions."),(0,a.yg)("h4",{id:"check-the-logs-of-your-celery-worker"},"Check the logs of your Celery worker"),(0,a.yg)("p",null,"This is the best source of information about the problem.  In a docker compose deployment, you can do this with a command like ",(0,a.yg)("inlineCode",{parentName:"p"},"docker logs superset_worker --since 1h"),"."),(0,a.yg)("h4",{id:"check-web-browser-and-webdriver-installation"},"Check web browser and webdriver installation"),(0,a.yg)("p",null,"To take a screenshot, the worker visits the dashboard or chart using a headless browser, then takes a screenshot. If you are able to send a chart as CSV or text but can't send as PNG, your problem may lie with the browser."),(0,a.yg)("p",null,"Superset docker images that have a tag ending with ",(0,a.yg)("inlineCode",{parentName:"p"},"-dev")," have the Firefox headless browser and geckodriver already installed. You can test that these are installed and in the proper path by entering your Superset worker and running ",(0,a.yg)("inlineCode",{parentName:"p"},"firefox --headless")," and then ",(0,a.yg)("inlineCode",{parentName:"p"},"geckodriver"),". Both commands should start those applications."),(0,a.yg)("p",null,"If you are handling the installation of that software on your own, or wish to use Chromium instead, do your own verification to ensure that the headless browser opens successfully in the worker environment."),(0,a.yg)("h4",{id:"send-a-test-email"},"Send a test email"),(0,a.yg)("p",null,"One symptom of an invalid connection to an email server is receiving an error of ",(0,a.yg)("inlineCode",{parentName:"p"},"[Errno 110] Connection timed out")," in your logs when the report tries to send."),(0,a.yg)("p",null,"Confirm via testing that your outbound email configuration is correct.  Here is the simplest test, for an un-authenticated email SMTP email service running on port 25.  If you are sending over SSL, for instance, study how ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/apache/superset/blob/master/superset/utils/core.py#L818"},"Superset's codebase sends emails")," and then test with those commands and arguments."),(0,a.yg)("p",null,"Start Python in your worker environment, replace all example values, and run:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},"import smtplib\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.text import MIMEText\n\nfrom_email = 'superset_emails@example.com'\nto_email = 'your_email@example.com'\nmsg = MIMEMultipart()\nmsg['From'] = from_email\nmsg['To'] = to_email\nmsg['Subject'] = 'Superset SMTP config test'\nmessage = 'It worked'\nmsg.attach(MIMEText(message))\nmailserver = smtplib.SMTP('smtpmail.example.com', 25)\nmailserver.sendmail(from_email, to_email, msg.as_string())\nmailserver.quit()\n")),(0,a.yg)("p",null,"This should send an email."),(0,a.yg)("p",null,"Possible fixes:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Some cloud hosts disable outgoing unauthenticated SMTP email to prevent spam.  For instance, ",(0,a.yg)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/virtual-network/troubleshoot-outbound-smtp-connectivity"},"Azure blocks port 25 by default on some machines"),". Enable that port or use another sending method."),(0,a.yg)("li",{parentName:"ul"},"Use another set of SMTP credentials that you verify works in this setup.")),(0,a.yg)("h4",{id:"browse-to-your-report-from-the-worker"},"Browse to your report from the worker"),(0,a.yg)("p",null,"The worker may be unable to reach the report. It will use the value of ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_BASEURL")," to browse to the report.  If that route is invalid, or presents an authentication challenge that the worker can't pass, the report screenshot will fail."),(0,a.yg)("p",null,"Check this by attempting to ",(0,a.yg)("inlineCode",{parentName:"p"},"curl")," the URL of a report that you see in the error logs of your worker. For instance, from the worker environment, run ",(0,a.yg)("inlineCode",{parentName:"p"},"curl http://superset_app:8088/superset/dashboard/1/"),". You may get different responses depending on whether the dashboard exists - for example, you may need to change the ",(0,a.yg)("inlineCode",{parentName:"p"},"1")," in that URL. If there's a URL in your logs from a failed report screenshot, that's a good place to start. The goal is to determine a valid value for ",(0,a.yg)("inlineCode",{parentName:"p"},"WEBDRIVER_BASEURL")," and determine if an issue like HTTPS or authentication is redirecting your worker."),(0,a.yg)("p",null,"In a deployment with authentication measures enabled like HTTPS and Single Sign-On, it may make sense to have the worker navigate directly to the Superset application running in the same location, avoiding the need to sign in.  For instance, you could use ",(0,a.yg)("inlineCode",{parentName:"p"},'WEBDRIVER_BASEURL="http://superset_app:8088"')," for a docker compose deployment, and set ",(0,a.yg)("inlineCode",{parentName:"p"},'"force_https": False,')," in your ",(0,a.yg)("inlineCode",{parentName:"p"},"TALISMAN_CONFIG"),"."),(0,a.yg)("h3",{id:"scheduling-queries-as-reports"},"Scheduling Queries as Reports"),(0,a.yg)("p",null,"You can optionally allow your users to schedule queries directly in SQL Lab. This is done by adding\nextra metadata to saved queries, which are then picked up by an external scheduled (like\n",(0,a.yg)("a",{parentName:"p",href:"https://airflow.apache.org/"},"Apache Airflow"),")."),(0,a.yg)("p",null,"To allow scheduled queries, add the following to ",(0,a.yg)("inlineCode",{parentName:"p"},"SCHEDULED_QUERIES")," in your configuration file:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-python"},"SCHEDULED_QUERIES = {\n    # This information is collected when the user clicks \"Schedule query\",\n    # and saved into the `extra` field of saved queries.\n    # See: https://github.com/mozilla-services/react-jsonschema-form\n    'JSONSCHEMA': {\n        'title': 'Schedule',\n        'description': (\n            'In order to schedule a query, you need to specify when it '\n            'should start running, when it should stop running, and how '\n            'often it should run. You can also optionally specify '\n            'dependencies that should be met before the query is '\n            'executed. Please read the documentation for best practices '\n            'and more information on how to specify dependencies.'\n        ),\n        'type': 'object',\n        'properties': {\n            'output_table': {\n                'type': 'string',\n                'title': 'Output table name',\n            },\n            'start_date': {\n                'type': 'string',\n                'title': 'Start date',\n                # date-time is parsed using the chrono library, see\n                # https://www.npmjs.com/package/chrono-node#usage\n                'format': 'date-time',\n                'default': 'tomorrow at 9am',\n            },\n            'end_date': {\n                'type': 'string',\n                'title': 'End date',\n                # date-time is parsed using the chrono library, see\n                # https://www.npmjs.com/package/chrono-node#usage\n                'format': 'date-time',\n                'default': '9am in 30 days',\n            },\n            'schedule_interval': {\n                'type': 'string',\n                'title': 'Schedule interval',\n            },\n            'dependencies': {\n                'type': 'array',\n                'title': 'Dependencies',\n                'items': {\n                    'type': 'string',\n                },\n            },\n        },\n    },\n    'UISCHEMA': {\n        'schedule_interval': {\n            'ui:placeholder': '@daily, @weekly, etc.',\n        },\n        'dependencies': {\n            'ui:help': (\n                'Check the documentation for the correct format when '\n                'defining dependencies.'\n            ),\n        },\n    },\n    'VALIDATION': [\n        # ensure that start_date <= end_date\n        {\n            'name': 'less_equal',\n            'arguments': ['start_date', 'end_date'],\n            'message': 'End date cannot be before start date',\n            # this is where the error message is shown\n            'container': 'end_date',\n        },\n    ],\n    # link to the scheduler; this example links to an Airflow pipeline\n    # that uses the query id and the output table as its name\n    'linkback': (\n        'https://airflow.example.com/admin/airflow/tree?'\n        'dag_id=query_${id}_${extra_json.schedule_info.output_table}'\n    ),\n}\n")),(0,a.yg)("p",null,"This configuration is based on\n",(0,a.yg)("a",{parentName:"p",href:"https://github.com/mozilla-services/react-jsonschema-form"},"react-jsonschema-form")," and will add a\nmenu item called \u201cSchedule\u201d to SQL Lab. When the menu item is clicked, a modal will show up where\nthe user can add the metadata required for scheduling the query."),(0,a.yg)("p",null,"This information can then be retrieved from the endpoint ",(0,a.yg)("inlineCode",{parentName:"p"},"/savedqueryviewapi/api/read")," and used to\nschedule the queries that have ",(0,a.yg)("inlineCode",{parentName:"p"},"scheduled_queries")," in their JSON metadata. For schedulers other than\nAirflow, additional fields can be easily added to the configuration file above."))}c.isMDXComponent=!0}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.9f067fb1.js b/assets/js/runtime~main.05e9de70.js
similarity index 98%
rename from assets/js/runtime~main.9f067fb1.js
rename to assets/js/runtime~main.05e9de70.js
index 066b048..5aae4d3 100644
--- a/assets/js/runtime~main.9f067fb1.js
+++ b/assets/js/runtime~main.05e9de70.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i<e.length;i++){c=e[i][0],f=e[i][1],d=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&d||b>=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d<b&&(b=d));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({196:"1c42a294",264:"e0a8f778",616:"3c585fdb",652:"0ae8b3d4",984:"dbb131dd",1008:"eb23a929",1032:"1c734f75",1156:"5818c28e",1204:"07f0ce13",1328:"1ce51947",1420:"30334fcd",1436:"3ec2c3f7",1524:"b92f705c",1528:"dc737160",1620:"2bafca50",1688:"69a4ab96",1748:"d76e6194",1856:"74876495",1933:"f5f07875",2104:"0c21af39",2572:"30256b0d",2644:"9d6fd8ea",2730:"6edc47f3",2751:"67158350",3128:"3c835dee",3480:"cd90435d",3548:"eb3b0997",3664:"f4a6e698",3808:"bd23e567",3904:"40974919",4111:"2c412ea7",4152:"9791fd42",4204:"1f391b9e",4244:"6a90d500",4304:"fe0957ee",4348:"30ec1363",4744:"afef705c",4760:"dc3fdd24",4800:"f9cc156b",5020:"25f17725",5056:"fa1a3aa0",5112:"d5417e33",5132:"4e664dc4",5164:"a9e1a7f6",5180:"57b59cd4",5336:"cf6ffe2f",5496:"a584ba2a",5680:"88eaec5a",5696:"935f2afb",5964:"600a9360",6040:"070b53d1",6044:"c296437a",6084:"6948bca1",6148:"496bf018",6200:"0a0a6d3c",6264:"36ea7a08",6452:"972382ea",6500:"0e9953cd",6544:"d83b78fc",6690:"da60bc8f",6752:"17896441",6872:"35a5de3c",7052:"729f57ad",7116:"507542a3",7140:"18cf5ace",7144:"71cf7fe6",7180:"e7c796a6",7228:"2f1b3cda",7268:"5e50ba72",7300:"c1424005",7344:"904d61ef",7504:"ce3fa444",7560:"9a9c044b",7652:"393be207",7672:"21b4b958",7752:"58160c0b",7800:"b46ab14b",7840:"e187e321",7852:"31e90f3c",7936:"6432bc55",7988:"f8409a7e",8396:"19682bb8",8400:"dd0670d3",8552:"1df93b7f",8644:"53bb5fc4",8696:"8660bbc8",9496:"471df853",9560:"5ea65e65",9648:"1a4e3797",9656:"1be78505",9684:"262418cd",9704:"640bc8a0",9748:"a309f86e",9792:"c76f729d",9892:"ee5d850a",9908:"4cc2c078",9980:"2461ffa2"}[e]||e)+"."+{196:"07756f2f",264:"111b369c",456:"0a43e8bd",616:"926e12a2",652:"88586be6",708:"6715539c",984:"ccd3ef0e",1008:"2ef565e1",1032:"d07a67ce",1156:"15235393",1204:"aeab4c0d",1328:"496d544b",1420:"8c0aae70",1436:"4601f230",1524:"f1d21336",1528:"0a9b2c5d",1620:"474a2771",1676:"f81be4a9",1688:"4dfd7b47",1748:"5e67678b",1856:"6779ab86",1933:"302703fc",2104:"ea8a155e",2528:"180a6744",2572:"1519568c",2644:"e473e204",2730:"57549d33",2751:"095f6992",3128:"d9616ed1",3480:"772bac47",3548:"f650488b",3664:"a6b2bba5",3808:"7342209d",3848:"0206d333",3873:"ec6955db",3904:"c62c12a4",4111:"0baf963f",4152:"07a967e3",4204:"e5c7194c",4212:"1177bc8f",4244:"fdcb1e68",4304:"9519c909",4348:"043c3eb0",4744:"b2a68843",4760:"e61e70d5",4800:"5f7bb57c",5020:"634997bc",5056:"5f53a68f",5112:"dd78596c",5132:"3800bb75",5164:"970db985",5180:"f9677471",5336:"2b85a77b",5496:"ab43e9cb",5680:"22b07e8e",5696:"600f9ef4",5964:"cf1054dd",6040:"946d3250",6044:"aec17881",6084:"a9d06778",6148:"a1046866",6200:"e8bb01d2",6264:"82771ef9",6452:"b4f9cb64",6500:"c2a7dcf2",6544:"e3f38e18",6690:"08bbe64d",6752:"da474beb",6872:"8ea7a28d",7052:"666a44b8",7116:"0913296f",7140:"33bc1e14",7144:"96377dc0",7180:"7d957be0",7228:"da0ec954",7268:"44632851",7300:"393c0a75",7344:"0b14a947",7504:"72ee4ccf",7560:"3fda4ee6",7652:"a1a51f64",7672:"933403c5",7752:"49547371",7800:"2b66cf4f",7840:"ca1a1917",7852:"5352f67c",7936:"c87142eb",7988:"3b600e7a",8396:"abce88d4",8400:"15ae7709",8448:"3e391ac5",8552:"00b8cce5",8644:"acc59122",8696:"915e4a1c",8879:"2f35bcd7",9160:"165b8bb4",9496:"9c4559a5",9560:"98b3aefa",9648:"15293a86",9656:"45fc67a8",9684:"444425c6",9704:"35b8fcbe",9748:"aad32515",9772:"d7658691",9792:"f92be5b3",9892:"c68b9e1f",9908:"297fb08f",9980:"14a88b0e"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="docs-v-2:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var l=n[i];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==d+c){t=l;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",d+c),t.src=e),f[e]=[a];var u=(a,c)=>{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={17896441:"6752",40974919:"3904",67158350:"2751",74876495:"1856","1c42a294":"196",e0a8f778:"264","3c585fdb":"616","0ae8b3d4":"652",dbb131dd:"984",eb23a929:"1008","1c734f75":"1032","5818c28e":"1156","07f0ce13":"1204","1ce51947":"1328","30334fcd":"1420","3ec2c3f7":"1436",b92f705c:"1524",dc737160:"1528","2bafca50":"1620","69a4ab96":"1688",d76e6194:"1748",f5f07875:"1933","0c21af39":"2104","30256b0d":"2572","9d6fd8ea":"2644","6edc47f3":"2730","3c835dee":"3128",cd90435d:"3480",eb3b0997:"3548",f4a6e698:"3664",bd23e567:"3808","2c412ea7":"4111","9791fd42":"4152","1f391b9e":"4204","6a90d500":"4244",fe0957ee:"4304","30ec1363":"4348",afef705c:"4744",dc3fdd24:"4760",f9cc156b:"4800","25f17725":"5020",fa1a3aa0:"5056",d5417e33:"5112","4e664dc4":"5132",a9e1a7f6:"5164","57b59cd4":"5180",cf6ffe2f:"5336",a584ba2a:"5496","88eaec5a":"5680","935f2afb":"5696","600a9360":"5964","070b53d1":"6040",c296437a:"6044","6948bca1":"6084","496bf018":"6148","0a0a6d3c":"6200","36ea7a08":"6264","972382ea":"6452","0e9953cd":"6500",d83b78fc:"6544",da60bc8f:"6690","35a5de3c":"6872","729f57ad":"7052","507542a3":"7116","18cf5ace":"7140","71cf7fe6":"7144",e7c796a6:"7180","2f1b3cda":"7228","5e50ba72":"7268",c1424005:"7300","904d61ef":"7344",ce3fa444:"7504","9a9c044b":"7560","393be207":"7652","21b4b958":"7672","58160c0b":"7752",b46ab14b:"7800",e187e321:"7840","31e90f3c":"7852","6432bc55":"7936",f8409a7e:"7988","19682bb8":"8396",dd0670d3:"8400","1df93b7f":"8552","53bb5fc4":"8644","8660bbc8":"8696","471df853":"9496","5ea65e65":"9560","1a4e3797":"9648","1be78505":"9656","262418cd":"9684","640bc8a0":"9704",a309f86e:"9748",c76f729d:"9792",ee5d850a:"9892","4cc2c078":"9908","2461ffa2":"9980"}[e]||e,r.p+r.u(e)},(()=>{var e={296:0,2176:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^2(17|9)6$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n<b.length;n++)d=b[n],r.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return r.O(i)},c=self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[];c.forEach(a.bind(null,0)),c.push=a.bind(null,c.push.bind(c))})()})();
\ No newline at end of file
+(()=>{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i<e.length;i++){c=e[i][0],f=e[i][1],d=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&d||b>=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d<b&&(b=d));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({196:"1c42a294",264:"e0a8f778",616:"3c585fdb",652:"0ae8b3d4",984:"dbb131dd",1008:"eb23a929",1032:"1c734f75",1156:"5818c28e",1204:"07f0ce13",1328:"1ce51947",1420:"30334fcd",1436:"3ec2c3f7",1524:"b92f705c",1528:"dc737160",1620:"2bafca50",1688:"69a4ab96",1748:"d76e6194",1856:"74876495",1933:"f5f07875",2104:"0c21af39",2572:"30256b0d",2644:"9d6fd8ea",2730:"6edc47f3",2751:"67158350",3128:"3c835dee",3480:"cd90435d",3548:"eb3b0997",3664:"f4a6e698",3808:"bd23e567",3904:"40974919",4111:"2c412ea7",4152:"9791fd42",4204:"1f391b9e",4244:"6a90d500",4304:"fe0957ee",4348:"30ec1363",4744:"afef705c",4760:"dc3fdd24",4800:"f9cc156b",5020:"25f17725",5056:"fa1a3aa0",5112:"d5417e33",5132:"4e664dc4",5164:"a9e1a7f6",5180:"57b59cd4",5336:"cf6ffe2f",5496:"a584ba2a",5680:"88eaec5a",5696:"935f2afb",5964:"600a9360",6040:"070b53d1",6044:"c296437a",6084:"6948bca1",6148:"496bf018",6200:"0a0a6d3c",6264:"36ea7a08",6452:"972382ea",6500:"0e9953cd",6544:"d83b78fc",6690:"da60bc8f",6752:"17896441",6872:"35a5de3c",7052:"729f57ad",7116:"507542a3",7140:"18cf5ace",7144:"71cf7fe6",7180:"e7c796a6",7228:"2f1b3cda",7268:"5e50ba72",7300:"c1424005",7344:"904d61ef",7504:"ce3fa444",7560:"9a9c044b",7652:"393be207",7672:"21b4b958",7752:"58160c0b",7800:"b46ab14b",7840:"e187e321",7852:"31e90f3c",7936:"6432bc55",7988:"f8409a7e",8396:"19682bb8",8400:"dd0670d3",8552:"1df93b7f",8644:"53bb5fc4",8696:"8660bbc8",9496:"471df853",9560:"5ea65e65",9648:"1a4e3797",9656:"1be78505",9684:"262418cd",9704:"640bc8a0",9748:"a309f86e",9792:"c76f729d",9892:"ee5d850a",9908:"4cc2c078",9980:"2461ffa2"}[e]||e)+"."+{196:"07756f2f",264:"111b369c",456:"0a43e8bd",616:"926e12a2",652:"88586be6",708:"6715539c",984:"ccd3ef0e",1008:"2ef565e1",1032:"d07a67ce",1156:"15235393",1204:"aeab4c0d",1328:"496d544b",1420:"8c0aae70",1436:"4601f230",1524:"f1d21336",1528:"0a9b2c5d",1620:"474a2771",1676:"f81be4a9",1688:"4dfd7b47",1748:"5e67678b",1856:"6779ab86",1933:"302703fc",2104:"ea8a155e",2528:"180a6744",2572:"1519568c",2644:"e473e204",2730:"57549d33",2751:"095f6992",3128:"d9616ed1",3480:"772bac47",3548:"f650488b",3664:"a6b2bba5",3808:"7342209d",3848:"0206d333",3873:"ec6955db",3904:"c62c12a4",4111:"0baf963f",4152:"07a967e3",4204:"e5c7194c",4212:"1177bc8f",4244:"fdcb1e68",4304:"9519c909",4348:"043c3eb0",4744:"b2a68843",4760:"e61e70d5",4800:"08631d99",5020:"634997bc",5056:"5f53a68f",5112:"dd78596c",5132:"3800bb75",5164:"970db985",5180:"f9677471",5336:"2b85a77b",5496:"ab43e9cb",5680:"22b07e8e",5696:"600f9ef4",5964:"cf1054dd",6040:"946d3250",6044:"aec17881",6084:"a9d06778",6148:"a1046866",6200:"e8bb01d2",6264:"82771ef9",6452:"b4f9cb64",6500:"c2a7dcf2",6544:"e3f38e18",6690:"08bbe64d",6752:"da474beb",6872:"8ea7a28d",7052:"666a44b8",7116:"0913296f",7140:"33bc1e14",7144:"96377dc0",7180:"7d957be0",7228:"da0ec954",7268:"44632851",7300:"393c0a75",7344:"0b14a947",7504:"72ee4ccf",7560:"3fda4ee6",7652:"a1a51f64",7672:"933403c5",7752:"49547371",7800:"2b66cf4f",7840:"ca1a1917",7852:"5352f67c",7936:"c87142eb",7988:"3b600e7a",8396:"abce88d4",8400:"15ae7709",8448:"3e391ac5",8552:"00b8cce5",8644:"acc59122",8696:"915e4a1c",8879:"2f35bcd7",9160:"165b8bb4",9496:"9c4559a5",9560:"98b3aefa",9648:"15293a86",9656:"45fc67a8",9684:"444425c6",9704:"35b8fcbe",9748:"aad32515",9772:"d7658691",9792:"f92be5b3",9892:"c68b9e1f",9908:"297fb08f",9980:"14a88b0e"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="docs-v-2:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var l=n[i];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==d+c){t=l;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",d+c),t.src=e),f[e]=[a];var u=(a,c)=>{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={17896441:"6752",40974919:"3904",67158350:"2751",74876495:"1856","1c42a294":"196",e0a8f778:"264","3c585fdb":"616","0ae8b3d4":"652",dbb131dd:"984",eb23a929:"1008","1c734f75":"1032","5818c28e":"1156","07f0ce13":"1204","1ce51947":"1328","30334fcd":"1420","3ec2c3f7":"1436",b92f705c:"1524",dc737160:"1528","2bafca50":"1620","69a4ab96":"1688",d76e6194:"1748",f5f07875:"1933","0c21af39":"2104","30256b0d":"2572","9d6fd8ea":"2644","6edc47f3":"2730","3c835dee":"3128",cd90435d:"3480",eb3b0997:"3548",f4a6e698:"3664",bd23e567:"3808","2c412ea7":"4111","9791fd42":"4152","1f391b9e":"4204","6a90d500":"4244",fe0957ee:"4304","30ec1363":"4348",afef705c:"4744",dc3fdd24:"4760",f9cc156b:"4800","25f17725":"5020",fa1a3aa0:"5056",d5417e33:"5112","4e664dc4":"5132",a9e1a7f6:"5164","57b59cd4":"5180",cf6ffe2f:"5336",a584ba2a:"5496","88eaec5a":"5680","935f2afb":"5696","600a9360":"5964","070b53d1":"6040",c296437a:"6044","6948bca1":"6084","496bf018":"6148","0a0a6d3c":"6200","36ea7a08":"6264","972382ea":"6452","0e9953cd":"6500",d83b78fc:"6544",da60bc8f:"6690","35a5de3c":"6872","729f57ad":"7052","507542a3":"7116","18cf5ace":"7140","71cf7fe6":"7144",e7c796a6:"7180","2f1b3cda":"7228","5e50ba72":"7268",c1424005:"7300","904d61ef":"7344",ce3fa444:"7504","9a9c044b":"7560","393be207":"7652","21b4b958":"7672","58160c0b":"7752",b46ab14b:"7800",e187e321:"7840","31e90f3c":"7852","6432bc55":"7936",f8409a7e:"7988","19682bb8":"8396",dd0670d3:"8400","1df93b7f":"8552","53bb5fc4":"8644","8660bbc8":"8696","471df853":"9496","5ea65e65":"9560","1a4e3797":"9648","1be78505":"9656","262418cd":"9684","640bc8a0":"9704",a309f86e:"9748",c76f729d:"9792",ee5d850a:"9892","4cc2c078":"9908","2461ffa2":"9980"}[e]||e,r.p+r.u(e)},(()=>{var e={296:0,2176:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^2(17|9)6$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n<b.length;n++)d=b[n],r.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return r.O(i)},c=self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[];c.forEach(a.bind(null,0)),c.push=a.bind(null,c.push.bind(c))})()})();
\ No newline at end of file
diff --git a/community/index.html b/community/index.html
index ccbc1bc..e48f1c6 100644
--- a/community/index.html
+++ b/community/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/api/index.html b/docs/api/index.html
index 9e3b1cd..ccb5caf 100644
--- a/docs/api/index.html
+++ b/docs/api/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -48,7 +48,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/contributing-page/index.html b/docs/contributing/contributing-page/index.html
index 72fc68e..0b9f36e 100644
--- a/docs/contributing/contributing-page/index.html
+++ b/docs/contributing/contributing-page/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/conventions-and-typing/index.html b/docs/contributing/conventions-and-typing/index.html
index 647eea1..6f19493 100644
--- a/docs/contributing/conventions-and-typing/index.html
+++ b/docs/contributing/conventions-and-typing/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -49,7 +49,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/creating-viz-plugins/index.html b/docs/contributing/creating-viz-plugins/index.html
index da7e834..56bc965 100644
--- a/docs/contributing/creating-viz-plugins/index.html
+++ b/docs/contributing/creating-viz-plugins/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -61,7 +61,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/hooks-and-linting/index.html b/docs/contributing/hooks-and-linting/index.html
index ab9b230..005e1cd 100644
--- a/docs/contributing/hooks-and-linting/index.html
+++ b/docs/contributing/hooks-and-linting/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/local-backend/index.html b/docs/contributing/local-backend/index.html
index bbf3127..2add3ac 100644
--- a/docs/contributing/local-backend/index.html
+++ b/docs/contributing/local-backend/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -48,7 +48,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/pull-request-guidelines/index.html b/docs/contributing/pull-request-guidelines/index.html
index 9d60f24..5362b12 100644
--- a/docs/contributing/pull-request-guidelines/index.html
+++ b/docs/contributing/pull-request-guidelines/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/style-guide/index.html b/docs/contributing/style-guide/index.html
index 9870232..bfc3df6 100644
--- a/docs/contributing/style-guide/index.html
+++ b/docs/contributing/style-guide/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -48,7 +48,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/testing-locally/index.html b/docs/contributing/testing-locally/index.html
index 867aadc..34374a9 100644
--- a/docs/contributing/testing-locally/index.html
+++ b/docs/contributing/testing-locally/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -52,7 +52,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/translations/index.html b/docs/contributing/translations/index.html
index 962dfd9..2a00290 100644
--- a/docs/contributing/translations/index.html
+++ b/docs/contributing/translations/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -76,7 +76,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/types-of-contributions/index.html b/docs/contributing/types-of-contributions/index.html
index cac55c3..bac5353 100644
--- a/docs/contributing/types-of-contributions/index.html
+++ b/docs/contributing/types-of-contributions/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -56,7 +56,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/creating-charts-dashboards/creating-your-first-dashboard/index.html b/docs/creating-charts-dashboards/creating-your-first-dashboard/index.html
index 5e62302..397594f 100644
--- a/docs/creating-charts-dashboards/creating-your-first-dashboard/index.html
+++ b/docs/creating-charts-dashboards/creating-your-first-dashboard/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -88,7 +88,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/creating-charts-dashboards/exploring-data/index.html b/docs/creating-charts-dashboards/exploring-data/index.html
index cfddd11..19d6eab 100644
--- a/docs/creating-charts-dashboards/exploring-data/index.html
+++ b/docs/creating-charts-dashboards/exploring-data/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -150,7 +150,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/ascend/index.html b/docs/databases/ascend/index.html
index 2075f64..c230075 100644
--- a/docs/databases/ascend/index.html
+++ b/docs/databases/ascend/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/athena/index.html b/docs/databases/athena/index.html
index bda68e5..48e3dc5 100644
--- a/docs/databases/athena/index.html
+++ b/docs/databases/athena/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/bigquery/index.html b/docs/databases/bigquery/index.html
index cfaa1d4..e43e61a 100644
--- a/docs/databases/bigquery/index.html
+++ b/docs/databases/bigquery/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -52,7 +52,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/clickhouse/index.html b/docs/databases/clickhouse/index.html
index 524c8e4..4793229 100644
--- a/docs/databases/clickhouse/index.html
+++ b/docs/databases/clickhouse/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/cockroachdb/index.html b/docs/databases/cockroachdb/index.html
index 665f07e..95f3c8e 100644
--- a/docs/databases/cockroachdb/index.html
+++ b/docs/databases/cockroachdb/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/cratedb/index.html b/docs/databases/cratedb/index.html
index cdb630d..af7ea1b 100644
--- a/docs/databases/cratedb/index.html
+++ b/docs/databases/cratedb/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -49,7 +49,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/databend/index.html b/docs/databases/databend/index.html
index b88bf46..9342f6a 100644
--- a/docs/databases/databend/index.html
+++ b/docs/databases/databend/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/databricks/index.html b/docs/databases/databricks/index.html
index 72eb8ff..395d749 100644
--- a/docs/databases/databricks/index.html
+++ b/docs/databases/databricks/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/db-connection-ui/index.html b/docs/databases/db-connection-ui/index.html
index dd9b4b6..4db2a39 100644
--- a/docs/databases/db-connection-ui/index.html
+++ b/docs/databases/db-connection-ui/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/docker-add-drivers/index.html b/docs/databases/docker-add-drivers/index.html
index 43b5bf9..b9fe2da 100644
--- a/docs/databases/docker-add-drivers/index.html
+++ b/docs/databases/docker-add-drivers/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/doris/index.html b/docs/databases/doris/index.html
index 86905c8..3864b6c 100644
--- a/docs/databases/doris/index.html
+++ b/docs/databases/doris/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/dremio/index.html b/docs/databases/dremio/index.html
index 5cf29c2..78fb078 100644
--- a/docs/databases/dremio/index.html
+++ b/docs/databases/dremio/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/drill/index.html b/docs/databases/drill/index.html
index 07f9953..da7dfe3 100644
--- a/docs/databases/drill/index.html
+++ b/docs/databases/drill/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -52,7 +52,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/druid/index.html b/docs/databases/druid/index.html
index f413bd2..b2f2feb 100644
--- a/docs/databases/druid/index.html
+++ b/docs/databases/druid/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -58,7 +58,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/dynamodb/index.html b/docs/databases/dynamodb/index.html
index 8dde712..1754c68 100644
--- a/docs/databases/dynamodb/index.html
+++ b/docs/databases/dynamodb/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/elasticsearch/index.html b/docs/databases/elasticsearch/index.html
index 47da68f..0989ca6 100644
--- a/docs/databases/elasticsearch/index.html
+++ b/docs/databases/elasticsearch/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -52,7 +52,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/exasol/index.html b/docs/databases/exasol/index.html
index f71d6a2..a43552a 100644
--- a/docs/databases/exasol/index.html
+++ b/docs/databases/exasol/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/extra-settings/index.html b/docs/databases/extra-settings/index.html
index 3e67de4..3577d0b 100644
--- a/docs/databases/extra-settings/index.html
+++ b/docs/databases/extra-settings/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -55,7 +55,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/firebird/index.html b/docs/databases/firebird/index.html
index a55a079..c62a0f4 100644
--- a/docs/databases/firebird/index.html
+++ b/docs/databases/firebird/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/firebolt/index.html b/docs/databases/firebolt/index.html
index d5497c5..9e79d1c 100644
--- a/docs/databases/firebolt/index.html
+++ b/docs/databases/firebolt/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/google-sheets/index.html b/docs/databases/google-sheets/index.html
index d0f271c..63e7cad 100644
--- a/docs/databases/google-sheets/index.html
+++ b/docs/databases/google-sheets/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -49,7 +49,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/hana/index.html b/docs/databases/hana/index.html
index 70832b4..de98636 100644
--- a/docs/databases/hana/index.html
+++ b/docs/databases/hana/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/hive/index.html b/docs/databases/hive/index.html
index e8acaf8..db51462 100644
--- a/docs/databases/hive/index.html
+++ b/docs/databases/hive/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/hologres/index.html b/docs/databases/hologres/index.html
index f7c2de3..3a62b76 100644
--- a/docs/databases/hologres/index.html
+++ b/docs/databases/hologres/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/ibm-db2/index.html b/docs/databases/ibm-db2/index.html
index 15d46c2..aeb9b81 100644
--- a/docs/databases/ibm-db2/index.html
+++ b/docs/databases/ibm-db2/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/impala/index.html b/docs/databases/impala/index.html
index d0ee82e..52f9490 100644
--- a/docs/databases/impala/index.html
+++ b/docs/databases/impala/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/installing-database-drivers/index.html b/docs/databases/installing-database-drivers/index.html
index a1b2d9b..bfd3f21 100644
--- a/docs/databases/installing-database-drivers/index.html
+++ b/docs/databases/installing-database-drivers/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -56,7 +56,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/kusto/index.html b/docs/databases/kusto/index.html
index 8048f6c..2fa94e4 100644
--- a/docs/databases/kusto/index.html
+++ b/docs/databases/kusto/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/kylin/index.html b/docs/databases/kylin/index.html
index 5c4ed40..bd49a40 100644
--- a/docs/databases/kylin/index.html
+++ b/docs/databases/kylin/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/meta-database/index.html b/docs/databases/meta-database/index.html
index 28ce85e..cb12d0b 100644
--- a/docs/databases/meta-database/index.html
+++ b/docs/databases/meta-database/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/mysql/index.html b/docs/databases/mysql/index.html
index 759a14c..8344d8a 100644
--- a/docs/databases/mysql/index.html
+++ b/docs/databases/mysql/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/netezza/index.html b/docs/databases/netezza/index.html
index bcda7d9..1bb3c5e 100644
--- a/docs/databases/netezza/index.html
+++ b/docs/databases/netezza/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/ocient/index.html b/docs/databases/ocient/index.html
index e4780b3..b7f6915 100644
--- a/docs/databases/ocient/index.html
+++ b/docs/databases/ocient/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/oracle/index.html b/docs/databases/oracle/index.html
index 22bb8a8..9032092 100644
--- a/docs/databases/oracle/index.html
+++ b/docs/databases/oracle/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/pinot/index.html b/docs/databases/pinot/index.html
index a9466fa..8a1d6e7 100644
--- a/docs/databases/pinot/index.html
+++ b/docs/databases/pinot/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/postgres/index.html b/docs/databases/postgres/index.html
index 45c2c47..c625a80 100644
--- a/docs/databases/postgres/index.html
+++ b/docs/databases/postgres/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -50,7 +50,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/presto/index.html b/docs/databases/presto/index.html
index aea6f5e..aa55b1a 100644
--- a/docs/databases/presto/index.html
+++ b/docs/databases/presto/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/redshift/index.html b/docs/databases/redshift/index.html
index efad6a1..aa8db65 100644
--- a/docs/databases/redshift/index.html
+++ b/docs/databases/redshift/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/risingwave/index.html b/docs/databases/risingwave/index.html
index eaa00ce..00b3a54 100644
--- a/docs/databases/risingwave/index.html
+++ b/docs/databases/risingwave/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/rockset/index.html b/docs/databases/rockset/index.html
index accf7de..d642e61 100644
--- a/docs/databases/rockset/index.html
+++ b/docs/databases/rockset/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/snowflake/index.html b/docs/databases/snowflake/index.html
index 1343d93..a36828a 100644
--- a/docs/databases/snowflake/index.html
+++ b/docs/databases/snowflake/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -55,7 +55,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/solr/index.html b/docs/databases/solr/index.html
index 3d2ea50..36ee000 100644
--- a/docs/databases/solr/index.html
+++ b/docs/databases/solr/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/spark-sql/index.html b/docs/databases/spark-sql/index.html
index 5fcd81a..c45cf85 100644
--- a/docs/databases/spark-sql/index.html
+++ b/docs/databases/spark-sql/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/sql-server/index.html b/docs/databases/sql-server/index.html
index 93f38e5..bd385a2 100644
--- a/docs/databases/sql-server/index.html
+++ b/docs/databases/sql-server/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/starrocks/index.html b/docs/databases/starrocks/index.html
index 40240dc..fbc8af5 100644
--- a/docs/databases/starrocks/index.html
+++ b/docs/databases/starrocks/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/teradata/index.html b/docs/databases/teradata/index.html
index bca5235..9bd9ef2 100644
--- a/docs/databases/teradata/index.html
+++ b/docs/databases/teradata/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -52,7 +52,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/timescaledb/index.html b/docs/databases/timescaledb/index.html
index f8e8a13..4a22634 100644
--- a/docs/databases/timescaledb/index.html
+++ b/docs/databases/timescaledb/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -46,7 +46,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/trino/index.html b/docs/databases/trino/index.html
index bd69195..6c9fdf1 100644
--- a/docs/databases/trino/index.html
+++ b/docs/databases/trino/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/vertica/index.html b/docs/databases/vertica/index.html
index 8cf90b0..64fb365 100644
--- a/docs/databases/vertica/index.html
+++ b/docs/databases/vertica/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/databases/yugabytedb/index.html b/docs/databases/yugabytedb/index.html
index bbaeff2..13c935d 100644
--- a/docs/databases/yugabytedb/index.html
+++ b/docs/databases/yugabytedb/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/frequently-asked-questions/index.html b/docs/frequently-asked-questions/index.html
index e16894a..d15941f 100644
--- a/docs/frequently-asked-questions/index.html
+++ b/docs/frequently-asked-questions/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -133,7 +133,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/alerts-reports/index.html b/docs/installation/alerts-reports/index.html
index 1362153..d1123dd 100644
--- a/docs/installation/alerts-reports/index.html
+++ b/docs/installation/alerts-reports/index.html
@@ -18,14 +18,14 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/superset-logo-horiz.svg" alt="Superset Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/superset-logo-horiz-dark.svg" alt="Superset Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div></a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Documentation</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/intro">Getting Started</a></li><li><a class="dropdown__link" href="/docs/frequently-asked-questions">FAQ</a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Community</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/community">Resources</a></li><li><a href="https://github.com/apache/superset" target="_blank" rel="noopener noreferrer" class="dropdown__link">GitHub<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="http://bit.ly/join-superset-slack" target="_blank" rel="noopener noreferrer" class="dropdown__link">Slack<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://lists.apache.org/list.html?dev@superset.apache.org" target="_blank" rel="noopener noreferrer" class="dropdown__link">Mailing List<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://stackoverflow.com/questions/tagged/apache-superset" target="_blank" rel="noopener noreferrer" class="dropdown__link">Stack Overflow<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link default-button-theme get-started-button" href="/docs/intro">Get Started</a><a href="https://github.com/apache/superset" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link github-button"></a><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/intro">Introduction</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/quickstart">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" href="/docs/installation/installing-superset-using-docker-compose">Installation and Configuration</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/installing-superset-using-docker-compose">Installing Locally Using Docker Compose</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/installing-superset-from-scratch">Installing From Scratch</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/running-on-kubernetes">Installing on Kubernetes</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/configuring-superset">Configuring Superset</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/networking-settings">Additional Networking Settings</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/cache">Caching</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/event-logging">Event Logging</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/upgrading-superset">Upgrading Superset</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/async-queries-celery">Async Queries via Celery</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/installation/alerts-reports">Alerts and Reports</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/sql-templating">SQL Templating</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/setup-ssh-tunneling">Setup SSH Tunneling</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/installation/docker">Docker Images and Tags</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/creating-charts-dashboards/creating-your-first-dashboard">Creating Charts and Dashboards</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/databases/installing-database-drivers">Connecting to Databases</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/miscellaneous/country-map-tools">Miscellaneous</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/contributing/contributing-page">Contributing</a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/frequently-asked-questions">Frequently Asked Questions</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/security/">Security</a><button aria-label="Toggle the collapsible sidebar category &#x27;Security&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/api">API</a></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Installation and Configuration</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Alerts and Reports</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h2 class="anchor anchorWithStickyNavbar_LWe7" id="alerts-and-reports">Alerts and Reports<a href="#alerts-and-reports" class="hash-link" aria-label="Direct link to Alerts and Reports" title="Direct link to Alerts and Reports">​</a></h2><p>Users can configure automated alerts and reports to send dashboards or charts to an email recipient or Slack channel.</p><ul><li><em>Alerts</em> are sent when a SQL condition is reached</li><li><em>Reports</em> are sent on a schedule</li></ul><p>Alerts and reports are disabled by default. To turn them on, you need to do some setup, described here.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="requirements">Requirements<a href="#requirements" class="hash-link" aria-label="Direct link to Requirements" title="Direct link to Requirements">​</a></h3><h4 class="anchor anchorWithStickyNavbar_LWe7" id="commons">Commons<a href="#commons" class="hash-link" aria-label="Direct link to Commons" title="Direct link to Commons">​</a></h4><h5 class="anchor anchorWithStickyNavbar_LWe7" id="in-your-superset_configpy-or-superset_config_dockerpy">In your <code>superset_config.py</code> or <code>superset_config_docker.py</code><a href="#in-your-superset_configpy-or-superset_config_dockerpy" class="hash-link" aria-label="Direct link to in-your-superset_configpy-or-superset_config_dockerpy" title="Direct link to in-your-superset_configpy-or-superset_config_dockerpy">​</a></h5><ul><li><code>&quot;ALERT_REPORTS&quot;</code> <a href="/docs/installation/configuring-superset#feature-flags">feature flag</a> must be turned to True.</li><li><code>beat_schedule</code> in CeleryConfig must contain schedule for <code>reports.scheduler</code>.</li><li>At least one of those must be configured, depending on what you want to use:<ul><li>emails: <code>SMTP_*</code> settings</li><li>Slack messages: <code>SLACK_API_TOKEN</code></li></ul></li></ul><h6 class="anchor anchorWithStickyNavbar_LWe7" id="disable-dry-run-mode">Disable dry-run mode<a href="#disable-dry-run-mode" class="hash-link" aria-label="Direct link to Disable dry-run mode" title="Direct link to Disable dry-run mode">​</a></h6><p>Screenshots will be taken but no messages actually sent as long as <code>ALERT_REPORTS_NOTIFICATION_DRY_RUN = True</code>, its default value in <code>docker/pythonpath_dev/superset_config.py</code>.  To disable dry-run mode and start receiving email/Slack notifications, set <code>ALERT_REPORTS_NOTIFICATION_DRY_RUN</code> to <code>False</code> in <a href="https://github.com/apache/superset/blob/master/docker/pythonpath_dev/superset_config.py" target="_blank" rel="noopener noreferrer">superset config</a>.</p><h5 class="anchor anchorWithStickyNavbar_LWe7" id="in-your-dockerfile">In your <code>Dockerfile</code><a href="#in-your-dockerfile" class="hash-link" aria-label="Direct link to in-your-dockerfile" title="Direct link to in-your-dockerfile">​</a></h5><ul><li>You must install a headless browser, for taking screenshots of the charts and dashboards. Only Firefox and Chrome are currently supported.<blockquote><p>If you choose Chrome, you must also change the value of <code>WEBDRIVER_TYPE</code> to <code>&quot;chrome&quot;</code> in your <code>superset_config.py</code>.</p></blockquote></li></ul><p>Note: All the components required (Firefox headless browser, Redis, Postgres db, celery worker and celery beat) are present in the <em>dev</em> docker image if you are following <a href="/docs/installation/installing-superset-using-docker-compose/">Installing Superset Locally</a>.
-All you need to do is add the required config variables described in this guide (See <code>Detailed Config</code>).</p><p>If you are running a non-dev docker image, e.g., a stable release like <code>apache/superset:2.0.1</code>, that image does not include a headless browser.  Only the <code>superset_worker</code> container needs this headless browser to browse to the target chart or dashboard.
-You can either install and configure the headless browser - see &quot;Custom Dockerfile&quot; section below - or when deploying via <code>docker compose</code>, modify your <code>docker-compose.yml</code> file to use a dev image for the worker container and a stable release image for the <code>superset_app</code> container.</p><p><em>Note</em>: In this context, a &quot;dev image&quot; is the same application software as its corresponding non-dev image, just bundled with additional tools.  So an image like <code>2.0.1-dev</code> is identical to <code>2.0.1</code> when it comes to stability, functionality, and running in production.  The actual &quot;in-development&quot; versions of Superset - cutting-edge and unstable - are not tagged with version numbers on Docker Hub and will display version <code>0.0.0-dev</code> within the Superset UI.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="slack-integration">Slack integration<a href="#slack-integration" class="hash-link" aria-label="Direct link to Slack integration" title="Direct link to Slack integration">​</a></h4><p>To send alerts and reports to Slack channels, you need to create a new Slack Application on your workspace.</p><ol><li>Connect to your Slack workspace, then head to <a href="https://api.slack.com/apps" target="_blank" rel="noopener noreferrer">https://api.slack.com/apps</a>.</li><li>Create a new app.</li><li>Go to &quot;OAuth &amp; Permissions&quot; section, and give the following scopes to your app:<ul><li><code>incoming-webhook</code></li><li><code>files:write</code></li><li><code>chat:write</code></li></ul></li><li>At the top of the &quot;OAuth and Permissions&quot; section, click &quot;install to workspace&quot;.</li><li>Select a default channel for your app and continue.
+All you need to do is add the required config variables described in this guide (See <code>Detailed Config</code>).</p><p>If you are running a non-dev docker image, e.g., a stable release like <code>apache/superset:3.1.0</code>, that image does not include a headless browser.  Only the <code>superset_worker</code> container needs this headless browser to browse to the target chart or dashboard.
+You can either install and configure the headless browser - see &quot;Custom Dockerfile&quot; section below - or when deploying via <code>docker compose</code>, modify your <code>docker-compose.yml</code> file to use a dev image for the worker container and a stable release image for the <code>superset_app</code> container.</p><p><em>Note</em>: In this context, a &quot;dev image&quot; is the same application software as its corresponding non-dev image, just bundled with additional tools.  So an image like <code>3.1.0-dev</code> is identical to <code>3.1.0</code> when it comes to stability, functionality, and running in production.  The actual &quot;in-development&quot; versions of Superset - cutting-edge and unstable - are not tagged with version numbers on Docker Hub and will display version <code>0.0.0-dev</code> within the Superset UI.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="slack-integration">Slack integration<a href="#slack-integration" class="hash-link" aria-label="Direct link to Slack integration" title="Direct link to Slack integration">​</a></h4><p>To send alerts and reports to Slack channels, you need to create a new Slack Application on your workspace.</p><ol><li>Connect to your Slack workspace, then head to <a href="https://api.slack.com/apps" target="_blank" rel="noopener noreferrer">https://api.slack.com/apps</a>.</li><li>Create a new app.</li><li>Go to &quot;OAuth &amp; Permissions&quot; section, and give the following scopes to your app:<ul><li><code>incoming-webhook</code></li><li><code>files:write</code></li><li><code>chat:write</code></li></ul></li><li>At the top of the &quot;OAuth and Permissions&quot; section, click &quot;install to workspace&quot;.</li><li>Select a default channel for your app and continue.
 (You can post to any channel by inviting your Superset app into that channel).</li><li>The app should now be installed in your workspace, and a &quot;Bot User OAuth Access Token&quot; should have been created. Copy that token in the <code>SLACK_API_TOKEN</code> variable of your <code>superset_config.py</code>.</li><li>Restart the service (or run <code>superset init</code>) to pull in the new configuration.</li></ol><p>Note: when you configure an alert or a report, the Slack channel list takes channel names without the leading &#x27;#&#x27; e.g. use <code>alerts</code> instead of <code>#alerts</code>.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="kubernetes-specific">Kubernetes-specific<a href="#kubernetes-specific" class="hash-link" aria-label="Direct link to Kubernetes-specific" title="Direct link to Kubernetes-specific">​</a></h4><ul><li>You must have a <code>celery beat</code> pod running. If you&#x27;re using the chart included in the GitHub repository under <a href="https://github.com/apache/superset/tree/master/helm/superset" target="_blank" rel="noopener noreferrer">helm/superset</a>, you need to put <code>supersetCeleryBeat.enabled = true</code> in your values override.</li><li>You can see the dedicated docs about <a href="/docs/installation/running-on-kubernetes">Kubernetes installation</a> for more generic details.</li></ul><h4 class="anchor anchorWithStickyNavbar_LWe7" id="docker-compose-specific">Docker Compose specific<a href="#docker-compose-specific" class="hash-link" aria-label="Direct link to Docker Compose specific" title="Direct link to Docker Compose specific">​</a></h4><h5 class="anchor anchorWithStickyNavbar_LWe7" id="you-must-have-in-your-docker-composeyml">You must have in your <code>docker-compose.yml</code><a href="#you-must-have-in-your-docker-composeyml" class="hash-link" aria-label="Direct link to you-must-have-in-your-docker-composeyml" title="Direct link to you-must-have-in-your-docker-composeyml">​</a></h5><ul><li>A Redis message broker</li><li>PostgreSQL DB instead of SQLlite</li><li>One or more <code>celery worker</code></li><li>A single <code>celery beat</code></li></ul><p>This process also works in a Docker swarm environment, you would just need to add <code>Deploy:</code> to the Superset, Redis and Postgres services along with your specific configs for your swarm.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="detailed-config">Detailed config<a href="#detailed-config" class="hash-link" aria-label="Direct link to Detailed config" title="Direct link to Detailed config">​</a></h3><p>The following configurations need to be added to the <code>superset_config.py</code> file. This file is loaded when the image runs, and any configurations in it will override the default configurations found in the <code>config.py</code>.</p><p>You can find documentation about each field in the default <code>config.py</code> in the GitHub repository under <a href="https://github.com/apache/superset/blob/master/superset/config.py" target="_blank" rel="noopener noreferrer">superset/config.py</a>.</p><p>You need to replace default values with your custom Redis, Slack and/or SMTP config.</p><p>Superset uses Celery beat and Celery worker(s) to send alerts and reports.</p><ul><li>The beat is the scheduler that tells the worker when to perform its tasks. This schedule is defined when you create the alert or report.</li><li>The worker will process the  tasks that need to be performed when an alert or report is fired.</li></ul><p>In the <code>CeleryConfig</code>, only the <code>beat_schedule</code> is relevant to this feature, the rest of the <code>CeleryConfig</code> can be changed for your needs.</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> celery</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">schedules </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> crontab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FEATURE_FLAGS </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;ALERT_REPORTS&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">REDIS_HOST </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;superset_cache&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">REDIS_PORT </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;6379&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">CeleryConfig</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    broker_url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f&quot;redis://</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">REDIS_HOST</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">:</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">REDIS_PORT</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/0&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    imports </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&quot;superset.sql_lab&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&quot;superset.tasks.scheduler&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    result_backend </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f&quot;redis://</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">REDIS_HOST</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">:</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">REDIS_PORT</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/0&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    worker_prefetch_multiplier </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    task_acks_late </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    task_annotations </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&quot;sql_lab.get_sql_results&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&quot;rate_limit&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;100/s&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    beat_schedule </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&quot;reports.scheduler&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&quot;task&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;reports.scheduler&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&quot;schedule&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> crontab</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">minute</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">&quot;*&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> hour</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">&quot;*&quot;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&quot;reports.prune_log&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&quot;task&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;reports.prune_log&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&quot;schedule&quot;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> crontab</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">minute</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> hour</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CELERY_CONFIG </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> CeleryConfig</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SCREENSHOT_LOCATE_WAIT </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SCREENSHOT_LOAD_WAIT </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">600</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Slack configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SLACK_API_TOKEN </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;xoxb-&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Email configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SMTP_HOST </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;smtp.sendgrid.net&quot;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># change to your host</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SMTP_PORT </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2525</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># your port, e.g. 587</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SMTP_STARTTLS </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SMTP_SSL_SERVER_AUTH </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># If your using an SMTP server with a valid certificate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SMTP_SSL </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SMTP_USER </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;your_user&quot;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># use the empty string &quot;&quot; if using an unauthenticated SMTP server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SMTP_PASSWORD </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;your_password&quot;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># use the empty string &quot;&quot; if using an unauthenticated SMTP server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SMTP_MAIL_FROM </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;noreply@youremail.com&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EMAIL_REPORTS_SUBJECT_PREFIX </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;[Superset] &quot;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># optional - overwrites default value in config.py of &quot;[Report] &quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># WebDriver configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># If you use Firefox, you can stick with default values</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># If you use Chrome, then add the following WEBDRIVER_TYPE and WEBDRIVER_OPTION_ARGS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WEBDRIVER_TYPE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;chrome&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WEBDRIVER_OPTION_ARGS </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;--force-device-scale-factor=2.0&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;--high-dpi-support=2.0&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;--headless&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;--disable-gpu&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;--disable-dev-shm-usage&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;--no-sandbox&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;--disable-setuid-sandbox&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&quot;--disable-extensions&quot;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># This is for internal use, you can keep http</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WEBDRIVER_BASEURL </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;http://superset:8088&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># This is the link sent to the recipient. Change to your domain, e.g. https://superset.mydomain.com</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WEBDRIVER_BASEURL_USER_FRIENDLY </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;http://localhost:8088&quot;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You also need
 to specify on behalf of which username to render the dashboards. In general dashboards and charts
 are not accessible to unauthorized requests, that is why the worker needs to take over credentials
@@ -34,8 +34,8 @@
 consume a lot of CPU / memory on your servers.</li><li>In some cases, if you notice a lot of leaked geckodriver processes, try running your celery
 processes with <code>celery worker --pool=prefork --max-tasks-per-child=128 ...</code></li><li>It is recommended to run separate workers for the <code>sql_lab</code> and <code>email_reports</code> tasks. This can be
 done using the <code>queue</code> field in <code>task_annotations</code>.</li><li>Adjust <code>WEBDRIVER_BASEURL</code> in your configuration file if celery workers can’t access Superset via
-its default value of <code>http://0.0.0.0:8080/</code>.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="custom-dockerfile">Custom Dockerfile<a href="#custom-dockerfile" class="hash-link" aria-label="Direct link to Custom Dockerfile" title="Direct link to Custom Dockerfile">​</a></h3><p>If you&#x27;re running the dev version of a released Superset image, like <code>apache/superset:2.0.1-dev</code>, you should be set with the above.</p><p>But if you&#x27;re building your own image, or starting with a non-dev version, a webdriver (and headless browser) is needed to capture screenshots of the charts and dashboards which are then sent to the recipient.
-Here&#x27;s how you can modify your Dockerfile to take the screenshots either with Firefox or Chrome.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="using-firefox">Using Firefox<a href="#using-firefox" class="hash-link" aria-label="Direct link to Using Firefox" title="Direct link to Using Firefox">​</a></h4><div class="language-docker codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-docker codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">FROM apache/superset:2.0.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN apt-get update &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    apt-get install --no-install-recommends -y firefox-esr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ENV GECKODRIVER_VERSION=0.29.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN wget -q https://github.com/mozilla/geckodriver/releases/download/v${GECKODRIVER_VERSION}/geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tar -x geckodriver -zf geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz -O &gt; /usr/bin/geckodriver &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    chmod 755 /usr/bin/geckodriver &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rm geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN pip install --no-cache gevent psycopg2 redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER superset</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="using-chrome">Using Chrome<a href="#using-chrome" class="hash-link" aria-label="Direct link to Using Chrome" title="Direct link to Using Chrome">​</a></h4><div class="language-docker codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-docker codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">FROM apache/superset:2.0.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN apt-get update &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rm -f google-chrome-stable_current_amd64.deb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN export CHROMEDRIVER_VERSION=$(curl --silent https://chromedriver.storage.googleapis.com/LATEST_RELEASE_102) &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    wget -q https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    unzip chromedriver_linux64.zip -d /usr/bin &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    chmod 755 /usr/bin/chromedriver &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rm -f chromedriver_linux64.zip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN pip install --no-cache gevent psycopg2 redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER superset</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Don&#x27;t forget to set <code>WEBDRIVER_TYPE</code> and <code>WEBDRIVER_OPTION_ARGS</code> in your config if you use Chrome.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="troubleshooting">Troubleshooting<a href="#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting">​</a></h3><p>There are many reasons that reports might not be working.  Try these steps to check for specific issues.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="confirm-feature-flag-is-enabled-and-you-have-sufficient-permissions">Confirm feature flag is enabled and you have sufficient permissions<a href="#confirm-feature-flag-is-enabled-and-you-have-sufficient-permissions" class="hash-link" aria-label="Direct link to Confirm feature flag is enabled and you have sufficient permissions" title="Direct link to Confirm feature flag is enabled and you have sufficient permissions">​</a></h4><p>If you don&#x27;t see &quot;Alerts &amp; Reports&quot; under the <em>Manage</em> section of the Settings dropdown in the Superset UI, you need to enable the <code>ALERT_REPORTS</code> feature flag (see above). Enable another feature flag and check to see that it took effect, to verify that your config file is getting loaded.</p><p>Log in as an admin user to ensure you have adequate permissions.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="check-the-logs-of-your-celery-worker">Check the logs of your Celery worker<a href="#check-the-logs-of-your-celery-worker" class="hash-link" aria-label="Direct link to Check the logs of your Celery worker" title="Direct link to Check the logs of your Celery worker">​</a></h4><p>This is the best source of information about the problem.  In a docker compose deployment, you can do this with a command like <code>docker logs superset_worker --since 1h</code>.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="check-web-browser-and-webdriver-installation">Check web browser and webdriver installation<a href="#check-web-browser-and-webdriver-installation" class="hash-link" aria-label="Direct link to Check web browser and webdriver installation" title="Direct link to Check web browser and webdriver installation">​</a></h4><p>To take a screenshot, the worker visits the dashboard or chart using a headless browser, then takes a screenshot. If you are able to send a chart as CSV or text but can&#x27;t send as PNG, your problem may lie with the browser.</p><p>Superset docker images that have a tag ending with <code>-dev</code> have the Firefox headless browser and geckodriver already installed. You can test that these are installed and in the proper path by entering your Superset worker and running <code>firefox --headless</code> and then <code>geckodriver</code>. Both commands should start those applications.</p><p>If you are handling the installation of that software on your own, or wish to use Chromium instead, do your own verification to ensure that the headless browser opens successfully in the worker environment.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="send-a-test-email">Send a test email<a href="#send-a-test-email" class="hash-link" aria-label="Direct link to Send a test email" title="Direct link to Send a test email">​</a></h4><p>One symptom of an invalid connection to an email server is receiving an error of <code>[Errno 110] Connection timed out</code> in your logs when the report tries to send.</p><p>Confirm via testing that your outbound email configuration is correct.  Here is the simplest test, for an un-authenticated email SMTP email service running on port 25.  If you are sending over SSL, for instance, study how <a href="https://github.com/apache/superset/blob/master/superset/utils/core.py#L818" target="_blank" rel="noopener noreferrer">Superset&#x27;s codebase sends emails</a> and then test with those commands and arguments.</p><p>Start Python in your worker environment, replace all example values, and run:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> smtplib</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">multipart </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> MIMEMultipart</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">text </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> MIMEText</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">from_email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;superset_emails@example.com&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">to_email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;your_email@example.com&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> MIMEMultipart</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;From&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> from_email</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;To&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> to_email</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;Subject&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;Superset SMTP config test&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">message </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;It worked&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">attach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">MIMEText</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mailserver </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> smtplib</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SMTP</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">&#x27;smtpmail.example.com&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">25</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mailserver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sendmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">from_email</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> to_email</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">as_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mailserver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">quit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This should send an email.</p><p>Possible fixes:</p><ul><li>Some cloud hosts disable outgoing unauthenticated SMTP email to prevent spam.  For instance, <a href="https://learn.microsoft.com/en-us/azure/virtual-network/troubleshoot-outbound-smtp-connectivity" target="_blank" rel="noopener noreferrer">Azure blocks port 25 by default on some machines</a>. Enable that port or use another sending method.</li><li>Use another set of SMTP credentials that you verify works in this setup.</li></ul><h4 class="anchor anchorWithStickyNavbar_LWe7" id="browse-to-your-report-from-the-worker">Browse to your report from the worker<a href="#browse-to-your-report-from-the-worker" class="hash-link" aria-label="Direct link to Browse to your report from the worker" title="Direct link to Browse to your report from the worker">​</a></h4><p>The worker may be unable to reach the report. It will use the value of <code>WEBDRIVER_BASEURL</code> to browse to the report.  If that route is invalid, or presents an authentication challenge that the worker can&#x27;t pass, the report screenshot will fail.</p><p>Check this by attempting to <code>curl</code> the URL of a report that you see in the error logs of your worker. For instance, from the worker environment, run <code>curl http://superset_app:8088/superset/dashboard/1/</code>. You may get different responses depending on whether the dashboard exists - for example, you may need to change the <code>1</code> in that URL. If there&#x27;s a URL in your logs from a failed report screenshot, that&#x27;s a good place to start. The goal is to determine a valid value for <code>WEBDRIVER_BASEURL</code> and determine if an issue like HTTPS or authentication is redirecting your worker.</p><p>In a deployment with authentication measures enabled like HTTPS and Single Sign-On, it may make sense to have the worker navigate directly to the Superset application running in the same location, avoiding the need to sign in.  For instance, you could use <code>WEBDRIVER_BASEURL=&quot;http://superset_app:8088&quot;</code> for a docker compose deployment, and set <code>&quot;force_https&quot;: False,</code> in your <code>TALISMAN_CONFIG</code>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="scheduling-queries-as-reports">Scheduling Queries as Reports<a href="#scheduling-queries-as-reports" class="hash-link" aria-label="Direct link to Scheduling Queries as Reports" title="Direct link to Scheduling Queries as Reports">​</a></h3><p>You can optionally allow your users to schedule queries directly in SQL Lab. This is done by adding
+its default value of <code>http://0.0.0.0:8080/</code>.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="custom-dockerfile">Custom Dockerfile<a href="#custom-dockerfile" class="hash-link" aria-label="Direct link to Custom Dockerfile" title="Direct link to Custom Dockerfile">​</a></h3><p>If you&#x27;re running the dev version of a released Superset image, like <code>apache/superset:3.1.0-dev</code>, you should be set with the above.</p><p>But if you&#x27;re building your own image, or starting with a non-dev version, a webdriver (and headless browser) is needed to capture screenshots of the charts and dashboards which are then sent to the recipient.
+Here&#x27;s how you can modify your Dockerfile to take the screenshots either with Firefox or Chrome.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="using-firefox">Using Firefox<a href="#using-firefox" class="hash-link" aria-label="Direct link to Using Firefox" title="Direct link to Using Firefox">​</a></h4><div class="language-docker codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-docker codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">FROM apache/superset:3.1.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN apt-get update &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    apt-get install --no-install-recommends -y firefox-esr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ENV GECKODRIVER_VERSION=0.29.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN wget -q https://github.com/mozilla/geckodriver/releases/download/v${GECKODRIVER_VERSION}/geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tar -x geckodriver -zf geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz -O &gt; /usr/bin/geckodriver &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    chmod 755 /usr/bin/geckodriver &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rm geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN pip install --no-cache gevent psycopg2 redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER superset</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="using-chrome">Using Chrome<a href="#using-chrome" class="hash-link" aria-label="Direct link to Using Chrome" title="Direct link to Using Chrome">​</a></h4><div class="language-docker codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-docker codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">FROM apache/superset:3.1.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN apt-get update &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rm -f google-chrome-stable_current_amd64.deb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN export CHROMEDRIVER_VERSION=$(curl --silent https://chromedriver.storage.googleapis.com/LATEST_RELEASE_102) &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    wget -q https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    unzip chromedriver_linux64.zip -d /usr/bin &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    chmod 755 /usr/bin/chromedriver &amp;&amp; \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rm -f chromedriver_linux64.zip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RUN pip install --no-cache gevent psycopg2 redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">USER superset</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Don&#x27;t forget to set <code>WEBDRIVER_TYPE</code> and <code>WEBDRIVER_OPTION_ARGS</code> in your config if you use Chrome.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="troubleshooting">Troubleshooting<a href="#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting">​</a></h3><p>There are many reasons that reports might not be working.  Try these steps to check for specific issues.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="confirm-feature-flag-is-enabled-and-you-have-sufficient-permissions">Confirm feature flag is enabled and you have sufficient permissions<a href="#confirm-feature-flag-is-enabled-and-you-have-sufficient-permissions" class="hash-link" aria-label="Direct link to Confirm feature flag is enabled and you have sufficient permissions" title="Direct link to Confirm feature flag is enabled and you have sufficient permissions">​</a></h4><p>If you don&#x27;t see &quot;Alerts &amp; Reports&quot; under the <em>Manage</em> section of the Settings dropdown in the Superset UI, you need to enable the <code>ALERT_REPORTS</code> feature flag (see above). Enable another feature flag and check to see that it took effect, to verify that your config file is getting loaded.</p><p>Log in as an admin user to ensure you have adequate permissions.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="check-the-logs-of-your-celery-worker">Check the logs of your Celery worker<a href="#check-the-logs-of-your-celery-worker" class="hash-link" aria-label="Direct link to Check the logs of your Celery worker" title="Direct link to Check the logs of your Celery worker">​</a></h4><p>This is the best source of information about the problem.  In a docker compose deployment, you can do this with a command like <code>docker logs superset_worker --since 1h</code>.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="check-web-browser-and-webdriver-installation">Check web browser and webdriver installation<a href="#check-web-browser-and-webdriver-installation" class="hash-link" aria-label="Direct link to Check web browser and webdriver installation" title="Direct link to Check web browser and webdriver installation">​</a></h4><p>To take a screenshot, the worker visits the dashboard or chart using a headless browser, then takes a screenshot. If you are able to send a chart as CSV or text but can&#x27;t send as PNG, your problem may lie with the browser.</p><p>Superset docker images that have a tag ending with <code>-dev</code> have the Firefox headless browser and geckodriver already installed. You can test that these are installed and in the proper path by entering your Superset worker and running <code>firefox --headless</code> and then <code>geckodriver</code>. Both commands should start those applications.</p><p>If you are handling the installation of that software on your own, or wish to use Chromium instead, do your own verification to ensure that the headless browser opens successfully in the worker environment.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="send-a-test-email">Send a test email<a href="#send-a-test-email" class="hash-link" aria-label="Direct link to Send a test email" title="Direct link to Send a test email">​</a></h4><p>One symptom of an invalid connection to an email server is receiving an error of <code>[Errno 110] Connection timed out</code> in your logs when the report tries to send.</p><p>Confirm via testing that your outbound email configuration is correct.  Here is the simplest test, for an un-authenticated email SMTP email service running on port 25.  If you are sending over SSL, for instance, study how <a href="https://github.com/apache/superset/blob/master/superset/utils/core.py#L818" target="_blank" rel="noopener noreferrer">Superset&#x27;s codebase sends emails</a> and then test with those commands and arguments.</p><p>Start Python in your worker environment, replace all example values, and run:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> smtplib</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">multipart </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> MIMEMultipart</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">text </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> MIMEText</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">from_email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;superset_emails@example.com&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">to_email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;your_email@example.com&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> MIMEMultipart</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;From&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> from_email</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;To&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> to_email</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;Subject&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;Superset SMTP config test&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">message </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;It worked&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">attach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">MIMEText</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mailserver </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> smtplib</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SMTP</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">&#x27;smtpmail.example.com&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">25</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mailserver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sendmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">from_email</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> to_email</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">as_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mailserver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">quit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This should send an email.</p><p>Possible fixes:</p><ul><li>Some cloud hosts disable outgoing unauthenticated SMTP email to prevent spam.  For instance, <a href="https://learn.microsoft.com/en-us/azure/virtual-network/troubleshoot-outbound-smtp-connectivity" target="_blank" rel="noopener noreferrer">Azure blocks port 25 by default on some machines</a>. Enable that port or use another sending method.</li><li>Use another set of SMTP credentials that you verify works in this setup.</li></ul><h4 class="anchor anchorWithStickyNavbar_LWe7" id="browse-to-your-report-from-the-worker">Browse to your report from the worker<a href="#browse-to-your-report-from-the-worker" class="hash-link" aria-label="Direct link to Browse to your report from the worker" title="Direct link to Browse to your report from the worker">​</a></h4><p>The worker may be unable to reach the report. It will use the value of <code>WEBDRIVER_BASEURL</code> to browse to the report.  If that route is invalid, or presents an authentication challenge that the worker can&#x27;t pass, the report screenshot will fail.</p><p>Check this by attempting to <code>curl</code> the URL of a report that you see in the error logs of your worker. For instance, from the worker environment, run <code>curl http://superset_app:8088/superset/dashboard/1/</code>. You may get different responses depending on whether the dashboard exists - for example, you may need to change the <code>1</code> in that URL. If there&#x27;s a URL in your logs from a failed report screenshot, that&#x27;s a good place to start. The goal is to determine a valid value for <code>WEBDRIVER_BASEURL</code> and determine if an issue like HTTPS or authentication is redirecting your worker.</p><p>In a deployment with authentication measures enabled like HTTPS and Single Sign-On, it may make sense to have the worker navigate directly to the Superset application running in the same location, avoiding the need to sign in.  For instance, you could use <code>WEBDRIVER_BASEURL=&quot;http://superset_app:8088&quot;</code> for a docker compose deployment, and set <code>&quot;force_https&quot;: False,</code> in your <code>TALISMAN_CONFIG</code>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="scheduling-queries-as-reports">Scheduling Queries as Reports<a href="#scheduling-queries-as-reports" class="hash-link" aria-label="Direct link to Scheduling Queries as Reports" title="Direct link to Scheduling Queries as Reports">​</a></h3><p>You can optionally allow your users to schedule queries directly in SQL Lab. This is done by adding
 extra metadata to saved queries, which are then picked up by an external scheduled (like
 <a href="https://airflow.apache.org/" target="_blank" rel="noopener noreferrer">Apache Airflow</a>).</p><p>To allow scheduled queries, add the following to <code>SCHEDULED_QUERIES</code> in your configuration file:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">SCHEDULED_QUERIES </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># This information is collected when the user clicks &quot;Schedule query&quot;,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># and saved into the `extra` field of saved queries.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># See: https://github.com/mozilla-services/react-jsonschema-form</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&#x27;JSONSCHEMA&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&#x27;title&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;Schedule&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&#x27;description&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;In order to schedule a query, you need to specify when it &#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;should start running, when it should stop running, and how &#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;often it should run. You can also optionally specify &#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;dependencies that should be met before the query is &#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;executed. Please read the documentation for best practices &#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;and more information on how to specify dependencies.&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&#x27;type&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;object&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&#x27;properties&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;output_table&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;type&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;string&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;title&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;Output table name&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;start_date&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;type&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;string&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;title&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;Start date&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># date-time is parsed using the chrono library, see</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># https://www.npmjs.com/package/chrono-node#usage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;format&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;date-time&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;default&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;tomorrow at 9am&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;end_date&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;type&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;string&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;title&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;End date&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># date-time is parsed using the chrono library, see</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># https://www.npmjs.com/package/chrono-node#usage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;format&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;date-time&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;default&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;9am in 30 days&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;schedule_interval&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;type&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;string&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;title&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;Schedule interval&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;dependencies&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;type&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;array&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;title&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;Dependencies&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;items&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token string" style="color:#e3116c">&#x27;type&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;string&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&#x27;UISCHEMA&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&#x27;schedule_interval&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;ui:placeholder&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;@daily, @weekly, etc.&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&#x27;dependencies&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;ui:help&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;Check the documentation for the correct format when &#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">&#x27;defining dependencies.&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&#x27;VALIDATION&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># ensure that start_date &lt;= end_date</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;name&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;less_equal&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;arguments&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">&#x27;start_date&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;end_date&#x27;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;message&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;End date cannot be before start date&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># this is where the error message is shown</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">&#x27;container&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&#x27;end_date&#x27;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># link to the scheduler; this example links to an Airflow pipeline</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># that uses the query id and the output table as its name</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">&#x27;linkback&#x27;</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&#x27;https://airflow.example.com/admin/airflow/tree?&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">&#x27;dag_id=query_${id}_${extra_json.schedule_info.output_table}&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This configuration is based on
 <a href="https://github.com/mozilla-services/react-jsonschema-form" target="_blank" rel="noopener noreferrer">react-jsonschema-form</a> and will add a
@@ -64,7 +64,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/async-queries-celery/index.html b/docs/installation/async-queries-celery/index.html
index d77528b..407eab6 100644
--- a/docs/installation/async-queries-celery/index.html
+++ b/docs/installation/async-queries-celery/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -61,7 +61,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/cache/index.html b/docs/installation/cache/index.html
index c770026..21df710 100644
--- a/docs/installation/cache/index.html
+++ b/docs/installation/cache/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -64,7 +64,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/configuring-superset/index.html b/docs/installation/configuring-superset/index.html
index 5d0ae45..2157ec2 100644
--- a/docs/installation/configuring-superset/index.html
+++ b/docs/installation/configuring-superset/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -98,7 +98,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/docker/index.html b/docs/installation/docker/index.html
index 6d87fc1..067b081 100644
--- a/docs/installation/docker/index.html
+++ b/docs/installation/docker/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -70,7 +70,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/event-logging/index.html b/docs/installation/event-logging/index.html
index 78d82a0..263fa96 100644
--- a/docs/installation/event-logging/index.html
+++ b/docs/installation/event-logging/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -51,7 +51,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/installing-superset-from-scratch/index.html b/docs/installation/installing-superset-from-scratch/index.html
index 120cb27..2622530 100644
--- a/docs/installation/installing-superset-from-scratch/index.html
+++ b/docs/installation/installing-superset-from-scratch/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -54,7 +54,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/installing-superset-using-docker-compose/index.html b/docs/installation/installing-superset-using-docker-compose/index.html
index 6946479..ebff62b 100644
--- a/docs/installation/installing-superset-using-docker-compose/index.html
+++ b/docs/installation/installing-superset-using-docker-compose/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -71,7 +71,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/networking-settings/index.html b/docs/installation/networking-settings/index.html
index 9c49c92..0cf2cc9 100644
--- a/docs/installation/networking-settings/index.html
+++ b/docs/installation/networking-settings/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -55,7 +55,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/running-on-kubernetes/index.html b/docs/installation/running-on-kubernetes/index.html
index 0c9cc7f..54cbe6b 100644
--- a/docs/installation/running-on-kubernetes/index.html
+++ b/docs/installation/running-on-kubernetes/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -53,7 +53,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/setup-ssh-tunneling/index.html b/docs/installation/setup-ssh-tunneling/index.html
index c0ad7dc..cb99045 100644
--- a/docs/installation/setup-ssh-tunneling/index.html
+++ b/docs/installation/setup-ssh-tunneling/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/sql-templating/index.html b/docs/installation/sql-templating/index.html
index 267ca19..94a9596 100644
--- a/docs/installation/sql-templating/index.html
+++ b/docs/installation/sql-templating/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -80,7 +80,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/installation/upgrading-superset/index.html b/docs/installation/upgrading-superset/index.html
index 65068db..c5d4e17 100644
--- a/docs/installation/upgrading-superset/index.html
+++ b/docs/installation/upgrading-superset/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -47,7 +47,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/intro/index.html b/docs/intro/index.html
index 0ca8511..711d4f0 100644
--- a/docs/intro/index.html
+++ b/docs/intro/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -57,7 +57,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/miscellaneous/chart-params/index.html b/docs/miscellaneous/chart-params/index.html
index d9dde4a..7645420 100644
--- a/docs/miscellaneous/chart-params/index.html
+++ b/docs/miscellaneous/chart-params/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/miscellaneous/country-map-tools/index.html b/docs/miscellaneous/country-map-tools/index.html
index 2990fce..17f9487 100644
--- a/docs/miscellaneous/country-map-tools/index.html
+++ b/docs/miscellaneous/country-map-tools/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -51,7 +51,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/miscellaneous/importing-exporting-datasources/index.html b/docs/miscellaneous/importing-exporting-datasources/index.html
index 2d864dd..30c135a 100644
--- a/docs/miscellaneous/importing-exporting-datasources/index.html
+++ b/docs/miscellaneous/importing-exporting-datasources/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -56,7 +56,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/miscellaneous/issue-codes/index.html b/docs/miscellaneous/issue-codes/index.html
index 4cff280..c3ef180 100644
--- a/docs/miscellaneous/issue-codes/index.html
+++ b/docs/miscellaneous/issue-codes/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -74,7 +74,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/miscellaneous/timezones/index.html b/docs/miscellaneous/timezones/index.html
index c72b3a5..5d294a1 100644
--- a/docs/miscellaneous/timezones/index.html
+++ b/docs/miscellaneous/timezones/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/quickstart/index.html b/docs/quickstart/index.html
index 2edbd84..5bac1fa 100644
--- a/docs/quickstart/index.html
+++ b/docs/quickstart/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -53,7 +53,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/security/cves/index.html b/docs/security/cves/index.html
index ea7b2e1..53fdaf7 100644
--- a/docs/security/cves/index.html
+++ b/docs/security/cves/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/security/index.html b/docs/security/index.html
index e8da9dd..a3e6ffc 100644
--- a/docs/security/index.html
+++ b/docs/security/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -144,7 +144,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/index.html b/index.html
index f82f63b..27a3052 100644
--- a/index.html
+++ b/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/markdown-page/index.html b/markdown-page/index.html
index f4179ec..b8a4b5b 100644
--- a/markdown-page/index.html
+++ b/markdown-page/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/search/index.html b/search/index.html
index e5f360f..09590d4 100644
--- a/search/index.html
+++ b/search/index.html
@@ -18,7 +18,7 @@
 
 <script src="/script/matomo.js"></script>
 <script src="https://www.bugherd.com/sidebarv2.js?apikey=enilpiu7bgexxsnoqfjtxa" async></script><link rel="stylesheet" href="/assets/css/styles.3fc392a0.css">
-<link rel="preload" href="/assets/js/runtime~main.9f067fb1.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.05e9de70.js" as="script">
 <link rel="preload" href="/assets/js/main.12e27125.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -45,7 +45,7 @@
           <!-- telemetry/analytics pixel: -->
           <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68">
           </div></div></div></footer></div>
-<script src="/assets/js/runtime~main.9f067fb1.js"></script>
+<script src="/assets/js/runtime~main.05e9de70.js"></script>
 <script src="/assets/js/main.12e27125.js"></script>
 </body>
 </html>
\ No newline at end of file