This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new b8995561300 docs: Superset 6.1 documentation catch-up (security, 
alerts/reports, theming, config) (#39440)
b8995561300 is described below

commit b8995561300cd9854a65fee558e54e792bb1899d
Author: Evan Rusackas <[email protected]>
AuthorDate: Fri May 8 10:11:09 2026 -0700

    docs: Superset 6.1 documentation catch-up (security, alerts/reports, 
theming, config) (#39440)
    
    Co-authored-by: Superset Dev <[email protected]>
    Co-authored-by: Claude Sonnet 4.6 <[email protected]>
---
 docs/admin_docs/configuration/alerts-reports.mdx   | 81 ++++++++++++++++++++++
 .../configuration/configuring-superset.mdx         | 32 +++++++++
 docs/admin_docs/configuration/theming.mdx          | 17 ++++-
 docs/admin_docs/security/security.mdx              | 51 ++++++++++++++
 4 files changed, 180 insertions(+), 1 deletion(-)

diff --git a/docs/admin_docs/configuration/alerts-reports.mdx 
b/docs/admin_docs/configuration/alerts-reports.mdx
index b66f641e290..f5c4efc42ed 100644
--- a/docs/admin_docs/configuration/alerts-reports.mdx
+++ b/docs/admin_docs/configuration/alerts-reports.mdx
@@ -81,6 +81,87 @@ SLACK_CACHE_TIMEOUT = int(timedelta(days=2).total_seconds())
 SLACK_API_RATE_LIMIT_RETRY_COUNT = 5
 ```
 
+### Webhook integration
+
+Superset can send alert and report notifications to any HTTP endpoint — useful 
for chat platforms, incident management tools, or custom automation.
+
+#### Enabling Webhooks
+
+Enable the feature flag in `superset_config.py`:
+
+```python
+FEATURE_FLAGS = {
+    "ALERT_REPORTS": True,
+    "ALERT_REPORT_WEBHOOK": True,
+}
+```
+
+#### Configuring a Webhook Recipient
+
+When creating or editing an alert or report, select **Webhook** as the 
notification method and enter your endpoint URL.
+
+#### Payload Format
+
+Superset sends an HTTP POST with `Content-Type: application/json`:
+
+```json
+{
+  "name": "My Alert",
+  "header": {
+    "notification_format": "JSON",
+    "notification_type": "Alert",
+    "notification_source": "Alert",
+    "chart_id": 42,
+    "dashboard_id": null
+  },
+  "text": "Alert condition met: value exceeded threshold",
+  "description": "Monthly revenue dropped below target",
+  "url": "https://your-superset-host/superset/dashboard/1/";
+}
+```
+
+When a report includes file attachments (CSV, PDF, or PNG screenshots), the 
request is sent as `multipart/form-data` instead. In that case, each top-level 
payload field (`name`, `text`, `description`, `url`) becomes its own form 
field, and nested structures like `header` are serialized as a JSON-encoded 
string in their own field. Every attachment is added as a repeated form field 
named `files`:
+
+```
+POST /webhook HTTP/1.1
+Content-Type: multipart/form-data; boundary=...
+
+--...
+Content-Disposition: form-data; name="name"
+
+My Alert
+--...
+Content-Disposition: form-data; name="header"
+
+{"notification_format": "JSON", "notification_type": "Alert", ...}
+--...
+Content-Disposition: form-data; name="text"
+
+Alert condition met: value exceeded threshold
+--...
+Content-Disposition: form-data; name="files"; filename="report.csv"
+Content-Type: text/csv
+
+<file bytes>
+--...
+```
+
+Webhook consumers should branch on `Content-Type`: parse the body as JSON when 
`application/json`, or read the individual form fields (decoding `header` as 
JSON) when `multipart/form-data`.
+
+#### HTTPS Enforcement
+
+To require HTTPS webhook URLs (recommended for production), set:
+
+```python
+ALERT_REPORTS_WEBHOOK_HTTPS_ONLY = True
+```
+
+When enabled, Superset rejects webhook configurations that use `http://` URLs.
+
+#### Retry Behavior
+
+Superset automatically retries webhook deliveries on `429 Too Many Requests` 
and `5xx` server errors using exponential backoff.
+
 ### Kubernetes-specific
 
 - You must have a `celery beat` pod running. If you're using the chart 
included in the GitHub repository under 
[helm/superset](https://github.com/apache/superset/tree/master/helm/superset), 
you need to put `supersetCeleryBeat.enabled = true` in your values override.
diff --git a/docs/admin_docs/configuration/configuring-superset.mdx 
b/docs/admin_docs/configuration/configuring-superset.mdx
index becdf70888b..daf92b1c943 100644
--- a/docs/admin_docs/configuration/configuring-superset.mdx
+++ b/docs/admin_docs/configuration/configuring-superset.mdx
@@ -472,6 +472,38 @@ FEATURE_FLAGS = {
 
 A current list of feature flags can be found in the [Feature 
Flags](/admin-docs/configuration/feature-flags) documentation.
 
+## Security Configuration
+
+### HASH_ALGORITHM
+
+Controls the hashing algorithm used for internal checksums and cache keys 
(thumbnails, cache keys, etc.). The default is `sha256`, which satisfies 
environments with stricter compliance requirements (e.g., FedRAMP). Set it to 
`md5` to retain the legacy behavior from older Superset deployments:
+
+```python
+HASH_ALGORITHM = "sha256"  # default; set to "md5" for legacy behavior
+```
+
+A companion `HASH_ALGORITHM_FALLBACKS` list (default: `["md5"]`) lets UUID 
lookups fall back to older algorithms, which enables gradual migration without 
breaking existing entries. Set it to `[]` for strict mode (use only 
`HASH_ALGORITHM`).
+
+:::note
+This setting affects internal Superset operations only, not user passwords or 
authentication tokens. Changing it in an existing deployment may invalidate 
cached values but does not require a database migration.
+:::
+
+## SQL Lab Query History Pruning
+
+SQL Lab query history is stored in the metadata database and is **not** pruned 
by default. To trim older rows, enable the `prune_query` Celery beat task by 
uncommenting it in `CELERY_BEAT_SCHEDULE` and choosing a retention window:
+
+```python
+CELERY_BEAT_SCHEDULE = {
+    "prune_query": {
+        "task": "prune_query",
+        "schedule": crontab(minute=0, hour=0, day_of_month=1),
+        "kwargs": {"retention_period_days": 180},
+    },
+}
+```
+
+Adjust `retention_period_days` to control how long query rows are kept. 
Companion opt-in tasks (`prune_logs`, `prune_tasks`) exist for pruning the logs 
and tasks tables; see the commented-out examples in `superset/config.py`. 
Without enabling these tasks, the metadata database will grow unbounded over 
time.
+
 :::resources
 - [Blog: Feature Flags in Apache 
Superset](https://preset.io/blog/feature-flags-in-apache-superset-and-preset/)
 :::
diff --git a/docs/admin_docs/configuration/theming.mdx 
b/docs/admin_docs/configuration/theming.mdx
index c13e42617a0..92e4fcd8e59 100644
--- a/docs/admin_docs/configuration/theming.mdx
+++ b/docs/admin_docs/configuration/theming.mdx
@@ -122,6 +122,17 @@ When `ENABLE_UI_THEME_ADMINISTRATION = True`:
 3. Administrators can change system themes without restarting Superset
 4. Configuration file themes serve as fallbacks when no UI themes are set
 
+### Theme Validation and Fallback
+
+Superset validates theme JSON when it is saved, either through the UI or via 
configuration. If a theme contains invalid tokens or an unrecognized structure, 
Superset logs a warning and falls back to the built-in default theme rather 
than applying a broken configuration. This prevents a bad theme from rendering 
the application unusable.
+
+The fallback order is:
+1. **UI-configured system theme** (highest priority, if 
`ENABLE_UI_THEME_ADMINISTRATION = True`)
+2. **`THEME_DEFAULT` / `THEME_DARK`** from `superset_config.py`
+3. **Built-in Superset default theme** (always present as a safety net)
+
+If you see unexpected styling after a config change, check the Superset server 
logs for theme validation warnings.
+
 ### Copying Themes Between Systems
 
 To export a theme for use in configuration files or another instance:
@@ -143,7 +154,11 @@ Superset supports custom fonts through the theme 
configuration, allowing you to
 
 ### Default Fonts
 
-By default, Superset uses Inter and Fira Code fonts which are bundled with the 
application via `@fontsource` packages. These fonts work offline and require no 
external network calls.
+By default, Superset uses **Inter** for UI text and **IBM Plex Mono** for code 
(SQL editors, JSON fields, and other monospace contexts). Both fonts are 
bundled with the application via `@fontsource` packages and work offline 
without any external network calls.
+
+:::note
+IBM Plex Mono replaced Fira Code as the default code font in Superset 6.1. If 
you have an existing theme that explicitly sets `fontFamilyCode: "Fira Code, 
..."`, you may want to update it.
+:::
 
 ### Configuring Custom Fonts
 
diff --git a/docs/admin_docs/security/security.mdx 
b/docs/admin_docs/security/security.mdx
index b4261c60bf5..6190925d8ab 100644
--- a/docs/admin_docs/security/security.mdx
+++ b/docs/admin_docs/security/security.mdx
@@ -205,6 +205,57 @@ FAB_ADD_SECURITY_API = True
 
 Once configured, the documentation for additional "Security" endpoints will be 
visible in Swagger for you to explore.
 
+### API Key Authentication
+
+Superset supports long-lived API keys for service accounts, CI/CD pipelines, 
and programmatic integrations (including MCP clients).
+
+#### Enabling API Key Authentication
+
+API key authentication is **disabled by default**. To turn it on, set the 
Flask-AppBuilder config value in `superset_config.py` and also enable the 
matching feature flag so the management UI is exposed:
+
+```python
+FAB_API_KEY_ENABLED = True
+
+FEATURE_FLAGS = {
+    "FAB_API_KEY_ENABLED": True,
+}
+```
+
+The config value registers the `ApiKeyApi` blueprint on the backend; the 
feature flag controls whether the UI for managing keys appears for the user. 
See the [Feature Flags](/admin-docs/configuration/feature-flags) documentation 
for more on feature flag configuration.
+
+#### Creating an API Key
+
+Once enabled, each user manages their own keys from their profile page:
+
+1. Open the user menu (top-right) and click **Info** to navigate to the User 
Info page
+2. Expand the **API Keys** section
+3. Click **+ API Key**
+4. Enter a name and (optionally) an expiration date
+5. Copy the generated token — it is shown only once
+
+Only users with the `can_read` and `can_write` permissions on `ApiKey` 
(granted by default to Admins) can manage API keys.
+
+#### Using an API Key
+
+Pass the key as a Bearer token in the `Authorization` header:
+
+```
+Authorization: Bearer <your-api-key>
+```
+
+This works for all REST API endpoints and the MCP server. The request is 
executed with the permissions of the user who created the key.
+
+#### Use Cases
+
+- **CI/CD pipelines** — automated chart/dashboard exports and imports
+- **MCP integrations** — connect AI assistants without interactive login
+- **External services** — dashboards embedded in other applications
+- **Service accounts** — long-lived credentials that don't expire with session 
cookies
+
+:::caution
+Store API keys securely. Anyone with a valid key can make requests on behalf 
of the creating user. Revoke keys promptly if they are compromised by deleting 
them from the **API Keys** section of your User Info page.
+:::
+
 ### Customizing Permissions
 
 The permissions exposed by FAB are very granular and allow for a great level of

Reply via email to