
Apache Superset Community Update: January 2026
Welcome to the January 2026 Apache Superset update! With 344 pull requests merged from 72 contributors (including 31 first-timers!), January has been one of our most productive months yet. The highlights span the full spectrum — from a completely revamped documentation system and Developer Portal launch, to SQL Lab UX redesigns, MongoDB support, dynamic multi-currency formatting, and a pluggable editor architecture. Let's dive in!
Highlights
Developer Portal & Documentation Overhaul
January's biggest narrative is the shift toward self-maintaining documentation — leveraging metadata already built into the codebase so docs generate themselves rather than requiring manual upkeep. The Developer Portal is now officially launched in the site's global navigation, serving as a dedicated hub for extension developers with component docs, API references, and contribution guides. See the full Documentation section below for the complete story.
SQL Lab Redesign
SQL Lab received two major UX upgrades: a virtualized treeview sidebar that replaces the sluggish dropdown-based schema browser with smooth scrolling across thousands of tables, and a multi-stage progress bar showing exactly where your query is in the pending → running → fetching pipeline with percentage-based tracking. Full details in SQL Lab Updates.
MongoDB Database Support
Apache Superset now supports MongoDB (#37368), implementing SIP-195. Users can connect to both MongoDB Atlas Cloud and self-hosted deployments, executing SQL queries on MongoDB collections via the PyMongoSQL dialect. The integration includes comprehensive datetime conversion methods and time grain expressions for temporal queries.
Dynamic Currency Formatting
A new dynamic currency feature (#36416) allows currency formatting to be driven by a column in the dataset, implementing SIP-193. When a metric's currency is set to "Auto-detect," Superset queries the dataset's designated currency code column to determine the appropriate symbol — so a single chart can correctly display USD, EUR, and GBP values side by side. Mixed-currency scenarios gracefully fall back to neutral numeric formatting, and Table/PivotTable charts perform per-cell detection. Over 11 chart types have been updated.
Chart Query Timestamps
A new "Last queried at" timestamp feature (#36934) gives users visibility into data freshness with relative time formatting (e.g., "Last queried at: 2 minutes ago"). The feature includes a dashboard-level toggle in Dashboard Properties → Styling, is always visible in Explore view and Force Refresh tooltips, and works with both fresh and cached results — so you always know exactly how stale your data might be.
Documentation Overhaul
January saw a major push toward self-maintaining documentation — leveraging metadata already built into the codebase so that docs generate themselves rather than requiring manual upkeep:
Auto-Generated Database Documentation
The database documentation system (#36805) was completely rebuilt from the ground up. The old approach — a 1,150+ line DATABASE_DOCS dictionary manually maintained in lib.py — was replaced with metadata attributes directly in each of the 60+ database engine spec files. A generator script now produces individual MDX pages and a searchable overview table automatically, and a metadata linter tracks documentation completeness across all connectors. The result: database documentation that stays in sync with the code by definition.
Interactive API Reference
The API documentation (#37434) was overhauled using docusaurus-openapi-docs, replacing the old single-page Swagger UI with structured, auto-generated documentation covering all 242 API endpoints. Every endpoint now includes code samples in cURL, Python, and JavaScript, detailed request/response schemas, and organization by functional category (Core Resources, Data Exploration, Security, etc.).
Component Documentation
Storybook stories are now the single source of truth for component documentation (#37502). A generator script extracts props, controls, and examples from story metadata to produce interactive MDX pages with live code editors and prop controls for 10+ components. The philosophy: "Fix issues in the story, not the generator" — keeping documentation in sync with the actual component code.
Feature Flags Documentation
Feature flags (#36756) are now annotated directly in config.py with @lifecycle, @docs, and @category decorators. An extraction script generates JSON that the docs site renders dynamically, and a pre-commit hook ensures the JSON stays in sync with the source code — so new feature flags are automatically documented the moment they're added.
Site & Community
- The Developer Portal is now officially launched and featured in the site's global navigation (#37313) — a dedicated hub for extension developers with sections for Extensions, Testing, Guidelines, and Contributing
- Consolidated scattered markdown and wiki content (#36756) into the Developer Portal, reducing reliance on the GitHub wiki and making all developer documentation discoverable in one place
- Added Netlify deploy previews (#36908) — every docs PR now automatically builds a live preview site that contributors and reviewers can reference, powered by Netlify's Open Source plan
- Redesigned community page (#37536) with card grid layout
- Quickstart updated for 6.0.0 (#37446)
- Playwright screenshot generator (#37494) for automated doc screenshots
SQL Lab Updates
Treeview Table Selection UI
A new SQLLab sidebar treeview UI (#37298) based on SIP-111 addresses critical performance problems with the old dropdown-based schema browser. The previous implementation suffered from severe scrolling jank when databases had hundreds or thousands of tables. The new version uses react-arborist — a virtualized tree component — for smooth scrolling at any scale. A segmented control lets users toggle between the hierarchical treeview and the traditional dropdown for those who prefer the classic workflow. The database/catalog/schema selector was also converted from a dropdown to a modal dialog, resolving UI cutoff issues caused by overflow:hidden on the editor panel.
Enhanced Query Status Indicator
SQL Lab's query status indicator (#36936) was completely redesigned with a multi-stage progress bar showing distinct phases — pending, running, and fetching results — with percentage-based progress tracking. The new QueryStatusBar component helps users anticipate query completion and understand exactly where time is being spent during execution.
Results Panel Redesign & Extension Points
The Results panel toolbar was redesigned (#37255), enabling extensions to contribute toolbar actions. Primary and secondary action extensions were added to SQL Lab (#36644), and a new getActivePanel API (#37448) enables extensions to track panel visibility. See the Extensions System section for more details.
Jinja Template Improvements
Template processing received several fixes:
- Undefined template variables are now handled safely (#35009)
- SQL validation no longer shows errors for valid Jinja syntax (#36422)
- Template parameters work correctly with SQL Lab's validation endpoint
Trino Query Progress
Trino query progress tracking (#36872) now uses cursor stats to show real-time progress information, and additional running states like "Scheduled" and "Queued" are exposed through a new progress_text field (#36909).
Performance & Fixes
A long-standing over-rendering issue on result tables was finally resolved (#30857). A stale closure bug causing text selection to break was fixed (#37550), and the virtual dataset banner now only shows when appropriate (#37184). The text selection color is now visible via a new colorEditorSelection token (#36932).
Extensions System
Replaceable Editors
The extensions system now supports replacing editors (#37499) across all of Superset — SQL Lab, Dashboard Properties, CSS editors, Annotation Modal, Theme Modal, and more. Extensions can swap the default Ace editor with Monaco, CodeMirror, SimpleMDE, or any custom implementation by declaring editor contributions in their manifest. A new EditorHost component resolves the appropriate editor based on language (SQL, JSON, CSS, markdown, YAML), and the standardized EditorHandle API ensures consistent functionality — focus management, cursor positioning, selection handling, hotkeys — regardless of the underlying editor framework.
SQL Lab Extensions
SQL Lab actions are now extension-driven (#36644), with primary and secondary action areas that can be customized. The Results panel toolbar was redesigned (#37255) to enable toolbar action contributions, and a new getActivePanel() API (#37448) provides panel visibility tracking for extensions.
Embedded SDK
The Embedded SDK gained a resolvePermalinkUrl callback (#36924) for custom permalink URL resolution. Host applications can now intercept the "Copy Link" flow and redirect users to their own domain with custom URL formats — e.g., https://my-app.com/share/xyz789 — while preserving the full permalink functionality. The PR also adds iframeAllowExtras for Permissions Policy configuration and fixes anchor scrolling in embedded mode.
Stability Improvements
Duplicate initialization of the LOCAL_EXTENSIONS watcher was prevented (#37250), the extensions CLI dev mode error was fixed (#37024), and dist directory rebuilding is now handled gracefully (#37025).
Dashboard Improvements
Filter and Display Controls
The dashboard filtering system received a major UX redesign. Filters and chart customizations are now unified in a single modal interface (#36062) with collapsible Filters and Customization sections. A new "+ New" dropdown button offers three options — Filter, Customization, and Divider — and chart customizations use a plugin-based architecture, so they can be added dynamically just like filters. The terminology was updated from "chart customization" to "display controls" (#37462) for better clarity.
A critical bug where editing one native filter would clear all other applied filters (#37253) was fixed, and deleted filters now properly disappear from the dashboard without requiring a page refresh (#37012). Native filter scope now correctly respects nested tabs (#37139), the Apply button properly enables when selecting a Boolean FALSE value (#37017), and filters with default values now auto-apply when extraFormData is present (#36927).
Deck.gl Layer Visibility Control
A new chart customization (#36062) enables users to selectively hide layers in deck.gl multi-layer charts from the dashboard. This functions as an inverse selection multiselect field where all layers are visible by default, and users select which layers to exclude.
Tab Selection for Chart Saves
Users can now select specific dashboard tabs when saving charts (#36332). The save modal includes a new TreeSelect component showing available tabs, and the system automatically positions the chart on the selected tab with predefined dimensions — with graceful fallback if tab placement fails.
Infinite Rerender Fix
A critical bug causing infinite rerenders with nested tabs was resolved (#37018), and the tab empty state now has a proper droppable area (#37210).
Dataset & Display
Dataset column labels now appear in "View as table" mode (#37140). The DatasourceNotFound error is now caught gracefully in get_datasets to prevent 404s (#37503). Dropdown popup positioning was fixed (#36963), and cell hover/active colors were reverted to grayscale (#36991).
Chart Enhancements
AG Grid Interactive Table
The AG Grid Table received major upgrades, bringing it to feature parity with the standard Table plugin. Server-side filtering (#35683) converts AG Grid column filter conditions into SQL queries that execute on the backend — enabling filtering across millions of rows rather than just the current page. The implementation supports all common filter types (text, numeric, date, set, boolean, blank/not-blank) with AND/OR logic, automatically separates dimension filters (WHERE) from metric filters (HAVING) for optimal SQL performance, and includes SQL injection protection. The UX is thoughtful: filter popovers auto-reopen after server refresh with focus preserved on the correct input field.
Time comparison (#37072) was also enabled, allowing "1 week ago" or "1 month ago" comparisons directly in tables with dashboard filter override support and expanded columns showing main value, absolute difference, delta, and percentage change.
Matrixify
The Matrixify feature received several improvements, including interactive column sorting (#36050), proper tag indicators in the Explore header and list views (#37247), and smarter control panel integration that hides the Matrixify tab for incompatible chart types like tables and pivot tables (#37163). The tag label was refined to "Matrixified" (#37402), data-zoom rendering was corrected (#37134), values are now preserved on save (#37090), and dashboard context is properly maintained for embedded scenarios (#37495).
Time Series Improvements
Several improvements enhance time series visualizations:
- The last month label on x-axes now displays correctly (#37181)
- Time comparison series in Line Charts now render with clearly visible dashed lines (#37135)
- Horizontal bar chart value labels no longer get cut off (#36989)
- Calendar Heatmap charts now display the correct month across all timezones (#37064)
- Mixed Timeseries prevents duplicate legend entries (#37217)
Deck.gl Enhancements
Multiple deck.gl improvements landed this month:
- Fixed Scatterplot chart errors when using fixed point size (#36890)
- Implemented geohash decoding for Polygon charts (#37027)
- Changed Path layer default line width unit to meters (#37248)
- Added auto zoom option in deck.gl Multiple Layers (#37221)
- Fixed WebGL freeze by clamping and auto-scaling cellSize in Contour charts (#37244)
Table and Pivot Table Updates
Tables received numerous enhancements:
- Column headers now show descriptive tooltips from dataset metadata (#37179)
- Group headers align correctly when filtering time comparison columns (#37236)
- Time comparison totals now return correct values instead of null (#37111)
- Dataset column labels now appear in "View as table" mode (#37140)
- Pivot table interactive column sorting was added (#36050)
- Currency formatting now preserves d3-format semantics (#37039)
Other Chart Fixes
- Big Number drill to details now uses correct column data (#37068)
- Sunburst "Show Total" text is now theme-aware (#37177)
- Mapbox charts now correctly handle numerical columns for Point Radius (#36962)
- Mapbox global opacity prop is now properly applied (#37168)
- HTML detection in tables now works correctly (#37171)
- Multi Chart now displays the correct icon in quick switcher (#37256)
- ECharts error responses are now properly parsed (#37130)
MCP (Model Context Protocol)
The MCP integration saw heavy development this month, with many improvements from @aminghadersohi:
- Stacked bar/area chart support (#37188) — LLM clients can now create stacked charts by setting
stacked: truein the XY chart config - Time grain parameter for XY chart generation (#37182)
- Redis EventStore (#37216) for multi-pod Kubernetes deployments — session state (SSE events, progress updates) is now shared across pods via configurable Redis storage with prefix wrapping to prevent key collisions, supporting SSL for AWS ElastiCache
- AG Grid Interactive Table support (#37191)
- Big Number chart handling with non-blocking semantic warnings (#37142)
- Preview-first workflow:
save_chartnow defaults toFalse(#36935) - JWT auth fix for tool listing (#37377)
- Column filtering restored in list tools (#37213, #37505)
- Improved prompts and instructions clarity (#37389)
- Multiple stability fixes: Flask app context (#37309, #37190), circular import resolution (#37023), session binding (#37548), singleton corruption prevention (#37252)
- FastMCP bumped to 2.14.3 (#37410)
Database Connectivity
New Database Support
- MongoDB (#37368): Full support for MongoDB Atlas and self-hosted deployments via the PyMongoSQL dialect (see Highlights)
- StarRocks Catalog Support (#37026): Comprehensive catalog support enabling users to browse and query data across multiple catalogs (e.g., iceberg, hive, default_catalog) with dynamic catalog switching and
catalog.schemaURI format
Database Improvements
- AWS Cross-Account IAM Authentication (#37585): Eliminates long-lived database credentials for AWS services — Aurora PostgreSQL, Aurora MySQL, Redshift Serverless, and provisioned Redshift — using STS AssumeRole with automatic token generation and 50-minute credential caching
- Athena Dynamic Schema Support (#36003): Proper dynamic schema switching for Athena connections
- Athena Dialect for sqlglot parsing (#36747)
- Redshift Table Name Normalization (#37019): Fixes CSV upload failures with uppercase table names
- MotherDuck/DuckDB version updated to follow official versioning (#36834)
- MongoDB Configuration Export (#36958):
configuration_methodnow included in database export/import flow
Security Updates
OAuth2 Enhancements
Multiple OAuth2 improvements landed:
- PKCE support (#37067) protects against authorization code interception attacks using cryptographic verification (SHA-256 code challenges). The
code_verifieris stored in a key-value store and automatically cleaned up after token exchange — fully backward compatible with databases that don't support PKCE - The base DB engine spec was refactored to use standard OAuth2 parameter names (#37010), making it easier to add OAuth2 to new database engines
- OAuth2 dance now works with TableSelector (#37315)
- Various OAuth2 token handling and redirect URI fixes (#37350, #37398)
FIPS Compliance
Flask-caching's hash algorithm is now configurable (#37361), enabling FIPS-compliant deployments where MD5 is disabled at the OS level. A new ConfigurableHashMethod class defers hash algorithm selection to runtime — solving the timing issue where @memoize() decorators are evaluated before Flask app context exists — with SHA-256 as the default and MD5 as a fallback option.
Access Control
The Public role now has appropriate permissions to read themes (#37295). Reports now use the authenticated user as recipient (#36981), closing a gap where report recipients weren't properly validated. The head_custom_extra template block was moved above the CSRF token input (#37173) for proper template ordering.
Dependency Security Updates
Critical security vulnerabilities were addressed (#37552) by updating urllib3, werkzeug, brotli, filelock, and pyasn1 to their latest secure versions, fixing decompression bomb attacks, path traversal issues, and TOCTOU symlink vulnerabilities. Flask-CORS was bumped to 6.0.0 (#36640).
Performance & Reliability
Streaming Export Fixes
Multiple streaming export issues were resolved:
- Fixed Flask context loss during streaming exports (#36950)
- URL prefix handling now works correctly for subdirectory deployments (#36771)
- NaN values are properly handled for Athena connections (#37071)
Query Performance
Several optimizations improve query performance:
- Log pruning now uses index scans instead of sequential scans (#37138)
- Date parser regex quantifiers bounded for deterministic parsing performance (#36983)
- Over-rendering in SQL Lab result tables was eliminated (#30857)
- Dashboard refresh with nested tabs no longer causes infinite rerenders (#37018)
Developer Experience
Examples Modernization
Example data loading was modernized to use Parquet files and YAML configs (#36538), replacing the old Python-based loaders. The migration reduces data size by 27% (79MB → 58MB), organizes examples into self-contained dashboard-centric directories with auto-discovery, and eliminates dataset-specific Python modules. A new "Export as Example" feature in the Dashboard header lets anyone export an existing dashboard in the new format — making it easy to contribute new examples. Virtual dataset SQL is now transpiled on import (#37311) for cross-database compatibility.
Build & Tooling
- PostgreSQL extra installation eliminated on Python 3.12 Docker images (#37587)
- ForkTsCheckerWebpackPlugin memory limit increased to fix OOM errors (#37583)
- Websocket Node version synced to LTS v22 (#37102)
- Translations and logging moved to new core module (#36929)
- Backend extension stack traces now include paths (#37300)
- TypeScript migration continues:
Divider.jsx→Divider.tsx(#36335)
User Experience Improvements
Theme and Styling
- Application name is now configurable via
brandAppNametheme token (#37370) - Dark mode issues on "In The Wild" page were fixed (#37034)
- Action icons sizing and tooltips restored (#37409)
- Sans-serif font fallback added (#37172)
List Views & Forms
- Card view now has pagination (#36288) with a centered row count display — previously, card/thumbnail view only showed the first 25 items with no way to page through the rest
- Saved query card actions styling unified across all home page cards (#36671)
- Bulk action buttons no longer cut off in filter selects (#37453)
NumberControlnow allows field clearing (#37007)- Advanced Analytics section no longer leaves extra spacing when hidden (#37456)
- Time range modals for out-of-scope filters display correctly (#36996)
Internationalization
A complete Maori translation was added (#37443), achieving 100% translation coverage — a great example of community-driven localization expanding Superset's global reach.
Dependency Updates
This month saw extensive dependency maintenance with over 150 automated updates from Dependabot, including:
- Major Updates: jQuery 3.7.1 → 4.0.0, AG Grid 34.x → 35.x, babel-loader 9.x → 10.x
- Security Updates: lodash, diff, urllib3, werkzeug, brotli, filelock, pyasn1
- Framework Updates: React-related packages, TypeScript ESLint tooling, Babel ecosystem
- Build Tools: Webpack 5.103 → 5.104, webpack-dev-server, css-loader, html-webpack-plugin
- Testing Tools: Playwright, Jest-related packages, Applitools Eyes
- Backend: FastMCP 2.14.0 → 2.14.3
- Websocket: Hot-shots 12.1.0 → 13.1.0, ws 8.18.3 → 8.19.0
Contributors
This release was made possible by 72 contributors:
- alex-poor
- alexandrusoare
- Alok-kumar-priyadarshi
- amaannawab923
- aminghadersohi
- amsharm2
- amym-li
- ankitajhanwar2001
- ASolarers-Rodriguez
- betodealmeida
- bouk
- connorshea
- DamianPendrak
- declan-zhao
- dheeraj12347
- dpgaspar
- elefeint
- EnxDev
- eschutho
- FelipeGLopez
- gabotorresruiz
- geido
- geier
- hainenber
- hlyda0601
- iercan
- innovark37
- isaac-jaynes-imperva
- ishmulyan
- JCelento
- jeroenhabets
- justinpark
- kgabryje
- LevisNgigi
- lion90
- LuisSanchez
- luizotavio32
- martyngigg
- massucattoj
- michael-s-molina
- msyavuz
- nilmonto
- nitishagar
- nytai
- ompharate
- passren
- Pegoku
- pgoslatara
- phmoraesrodrigues
- qf-jonathan
- rad-pat
- ramiroaquinoromero
- rebenitez1802
- reynoldmorel
- richardfogaca
- rusackas
- sadpandajoe
- SakshiiRohida
- SBIN2010
- sfirke
- SkinnyPigeon
- stockarea
- Tilakmahajan
- tiya-9975
- tt-a1i
- tzercin
- VanessaGiannoni
- villebro
- Vitor-Avila
- yousoph
- YousufFFFF
First-Time Contributors
A special welcome to our 31 first-time contributors this month!
- alex-poor
- Alok-kumar-priyadarshi
- amsharm2
- ankitajhanwar2001
- ASolarers-Rodriguez
- bouk
- connorshea
- dheeraj12347
- elefeint
- geier
- hlyda0601
- isaac-jaynes-imperva
- ishmulyan
- JCelento
- jeroenhabets
- lion90
- massucattoj
- nitishagar
- Pegoku
- pgoslatara
- phmoraesrodrigues
- qf-jonathan
- ramiroaquinoromero
- reynoldmorel
- SakshiiRohida
- stockarea
- Tilakmahajan
- tiya-9975
- tt-a1i
- tzercin
- VanessaGiannoni
Get Involved
Interested in contributing to Apache Superset? Here's how to get started:
- Contributing Guide: https://superset.apache.org/docs/contributing/
- Community Slack: https://bit.ly/join-superset-slack
- GitHub Repository: https://github.com/apache/superset
- Developer Portal: https://superset.apache.org/developer_portal/
Thank you to everyone who contributed to making January 2026 such an incredible month for Apache Superset. Your dedication to improving the platform — whether through code, documentation, bug reports, or community support — is what makes this project thrive.