You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@superset.apache.org by "Nuno23C (via GitHub)" <gi...@apache.org> on 2026/05/22 08:52:16 UTC

[I] Partial override of THEME_DEFAULT in superset_config.py crashes the frontend with a white screen on 6.1.0 [superset]

Nuno23C opened a new issue, #40375:
URL: https://github.com/apache/superset/issues/40375

   ### Bug description
   
   ## How to reproduce the bug
   
   1. Start from a stock Superset 6.1.0 deployment (e.g. `apache/superset:6.1.0`).
   2. Add the following to `superset_config.py` — a minimal partial override of `THEME_DEFAULT`, matching the pattern shown in PR #35220's own testing instructions:
   
      ```python
      THEME_DEFAULT = {
          "token": {
              "colorPrimary": "#ff0000",
          },
          "algorithm": "default",
      }
      ```
   
   3. Restart the web container.
   4. Open `/login/` in a browser with DevTools → Console open.
   
   ### Expected results
   
   The login page renders with the customized `colorPrimary`. Unspecified token fields fall back to the built-in defaults (consistent with what the official theming docs promise: *"Superset validates theme JSON… falls back to the built-in default theme rather than applying a broken configuration."*).
   
   ### Actual results
   
   The page is blank. The console shows:
   
   ```
   Failed to apply theme: TypeError: Cannot read properties of undefined (reading 'startsWith')
       at n (vendors.<hash>.entry.js:8:21553)
       at es (8085.<hash>.entry.js:8:735:950)
       at ii (vendors.<hash>.entry.js:550:51407)
       at iW (vendors.<hash>.entry.js:550:60874)
       at c (vendors.<hash>.entry.js:554:22700)
       ...
   ```
   
   The React app crashes during boot. Subsequent calls to `/api/v1/theme/?q=(filters:!((col:is_system_default,opr:eq,value:!t)))` return `401 Unauthorized` (unauthenticated, because the user is on the login page) but those are downstream of the crash, not its cause.
   
   ### Evidence
   
   In a working pod, the partial-override config produces this `bootstrapData?.common?.theme` (queryable via `JSON.parse(document.querySelector('#app').dataset.bootstrap)` in the console):
   
   ```js
   {
     default: {
       algorithm: "default",
       token: {
         colorPrimary: "#ff0000",   // ← only the user-supplied field
       }                            // ← ~22 expected fields missing
     },
     dark: {
       algorithm: "dark",
       token: {
         brandAppName: "Apache Superset",
         brandLogoHref: "/",
         fontFamily: "Inter, Helvetica, Arial, sans-serif",
         // ... 22 more fields, all populated from upstream defaults
       }
     }
   }
   ```
   
   The active `default.token` has **1 field** (the user override) and `dark.token` has the full upstream set. Dark mode renders correctly (with upstream blue colors, not the user override) because its token was constructed in `config.py` via `{**THEME_DEFAULT, "token": {**THEME_DEFAULT["token"], ...}, "algorithm": "dark"}` *before* the user override took effect, so the snapshot is complete.
   
   ### Environment
   
   - Superset 6.1.0 (apache/superset:6.1.0 official image)
   - Reproducible with any partial `THEME_DEFAULT` override in `superset_config.py`
   - Not specific to any browser, OS, database, or deployment topology
   
   ---
   
   ## Regression analysis
   
   On 6.0.0, `THEME_DEFAULT` in `superset/config.py` was effectively empty (`{"algorithm": "default"}`) and the same partial-override pattern worked. On 6.1.0, [PR #35220](https://github.com/apache/superset/pull/35220) populated `THEME_DEFAULT` with ~22 token fields and reframed it as the canonical base theme for the application. After that PR, a partial override no longer falls back gracefully — the React app crashes on boot because token fields it expects to be present are `undefined`. We have not pinpointed which specific frontend code path calls `.startsWith()` on which missing field.
   
   ---
   
   ## Suggested fix
   
   A partial override of `THEME_DEFAULT` in `superset_config.py` should preserve unspecified token fields from the upstream default — matching what users reasonably expect from a "base theme" customization. Concretely: setting only `THEME_DEFAULT["token"]["colorPrimary"]` should still leave the other 21 upstream token fields in the effective theme that ships to the frontend.
   
   ---
   
   ## Workaround (for anyone who lands here via search)
   
   Until this is fixed upstream, extend the default theme rather than replace it:
   
   ```python
   from superset.config import THEME_DEFAULT as _UPSTREAM_THEME_DEFAULT
   
   THEME_DEFAULT = {
       **_UPSTREAM_THEME_DEFAULT,
       "token": {
           **_UPSTREAM_THEME_DEFAULT["token"],
           # your overrides here:
           "colorPrimary": "#ff0000",
       },
   }
   ```
   
   This restores the full 22-field token while applying your customizations on top.
   
   ### Screenshots/recordings
   
   _No response_
   
   ### Superset version
   
   master / latest-dev
   
   ### Python version
   
   3.9
   
   ### Node version
   
   16
   
   ### Browser
   
   Chrome
   
   ### Additional context
   
   _No response_
   
   ### Checklist
   
   - [ ] I have searched Superset docs and Slack and didn't find a solution to my problem.
   - [x] I have searched the GitHub issue tracker and didn't find a similar bug report.
   - [ ] I have checked Superset's logs for errors and if I found a relevant Python stacktrace, I included it here as text in the "additional context" section.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org


Re: [I] Partial override of THEME_DEFAULT in superset_config.py crashes the frontend with a white screen on 6.1.0 [superset]

Posted by "rusackas (via GitHub)" <gi...@apache.org>.
rusackas commented on issue #40375:
URL: https://github.com/apache/superset/issues/40375#issuecomment-4594773608

   Can you open the PR against Superset's `master` if you want others to benefit here?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org


Re: [I] Partial override of THEME_DEFAULT in superset_config.py crashes the frontend with a white screen on 6.1.0 [superset]

Posted by "rusackas (via GitHub)" <gi...@apache.org>.
rusackas closed issue #40375: Partial override of THEME_DEFAULT in superset_config.py crashes the frontend with a white screen on 6.1.0
URL: https://github.com/apache/superset/issues/40375


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org


Re: [I] Partial override of THEME_DEFAULT in superset_config.py crashes the frontend with a white screen on 6.1.0 [superset]

Posted by "dosubot[bot] (via GitHub)" <gi...@apache.org>.
dosubot[bot] commented on issue #40375:
URL: https://github.com/apache/superset/issues/40375#issuecomment-4517210470

   <!-- Greeting -->
   Hi @Nuno23C! I'm [Dosu](https://go.dosu.dev/dosubot) and I’m helping the superset team.
   
   <!-- Answer -->
   This is a confirmed issue — another user reported the exact same `"Cannot read properties of undefined (reading 'startsWith')"` crash in [#39855](https://github.com/apache/superset/issues/39855) [[1]](https://github.com/apache/superset/issues/39855) when using partial theme configurations in `superset_config.py`.
   
   Your root cause analysis is spot-on. The Python backend does a **simple dictionary replacement** — there is no deep-merge logic for theme config overrides [[2]](https://github.com/apache/superset/blob/829e4d92d91ceae4b43b1ed3b063ffe45377799c/superset/config.py). The frontend *does* have token-level merging in `Theme.setConfig()` via spread operator (`{...Theme.defaultTokens, ...(antdConfig.token || {})}`) [[3]](https://github.com/apache/superset/blob/829e4d92d91ceae4b43b1ed3b063ffe45377799c/superset-frontend/packages/superset-ui-core/src/theme/Theme.tsx#L154-L161), but by the time a partial token object reaches that code path, other parts of the app have already attempted to read missing properties and crashed.
   
   Interestingly, the **UI-based theme editor** works correctly with partial overrides because it uses `_merge_theme_dicts()` — the recursive merge function introduced in PR #35220 for database-stored themes . That same merge logic was never applied to `superset_config.py` overrides, which is the inconsistency.
   
   Your workaround (importing and spreading over `THEME_DEFAULT`) is the correct approach until a fix lands. The fix itself would be straightforward — apply the same `_merge_theme_dicts()` logic to config-file themes before passing them to bootstrap data [[4]](https://github.com/apache/superset/blob/829e4d92d91ceae4b43b1ed3b063ffe45377799c/superset/views/base.py#L374).
   
   
   <!-- Dosu Comment Footer -->
   *To reply, just mention [@dosu](https://go.dosu.dev/dosubot?utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=reply-with-mention&utm_term=apache%2Fsuperset).*
   
   ---
   
   Docs are dead. Just use [Dosu](https://dosu.dev?utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=static-docs-tagline&utm_term=apache%2Fsuperset).
   
   [![Leave Feedback](https://img.shields.io/badge/Leave%20Feedback-555555?style=flat)](https://app.dosu.dev/response-feedback?utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=static-docs-feedback&utm_term=apache%2Fsuperset&message_id=34c24461-b783-4fe2-9b38-59a8179ccba5) [![Ask Dosu about superset](https://img.shields.io/badge/Ask%20Dosu%20about%20superset-2f7b3f?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iODYiIGhlaWdodD0iODkiIHZpZXdCb3g9IjAgMCA4NiA4OSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTIzNiAxMi43OTI4TDE3Ljc1OTMgNi42ODE4OFY3Mi41NjY3TDUuMjkyMzYgODQuMDYxOFYxMi43OTI4WiIgZmlsbD0iI0I0QkI5MSIvPjxwYXRoIGQ9Ik0xOC4yNTc1IDczLjExOTZMNTkuMTMyOSA3Mi43NDhMNTEuNzAxMSA4Mi40MDk1TDI5LjAzMzggODYuMjkxTDYuMjM5NjIgODUuMTU1NEwxOC4yNTc1IDczLjExOTZaIiBmaWxsPSIjNzc4NTYxIi8%2BPHBhdGggZD0iTTE3LjQ5MTYgMy43MzYzM0wzLjU4NTU3IDEyLjcwOTlWODMuNTc5MkMzLjU4NTU3IDg0Ljc1NDIgNC45ODU2MyA4NS4zNjUyIDUuODQ3M
 DUgODQuNTY2TDE5LjYyOTYgNzEuNzgwMSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSI2LjQyODQ0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48bWFzayBpZD0iZG9zdS1kLWN1dG91dCIgZmlsbD0id2hpdGUiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDAuNzA0IDAuNTE4MDY2SDE3LjA0MzlWNzYuMjIyMUg0MC43MDRINDIuNTgwNUg0Ny44MDEzQzY4LjcwNjQgNzYuMjIyMSA4NS42NTMzIDU5LjI3NTIgODUuNjUzMyAzOC4zNzAxQzg1LjY1MzMgMTcuNDY1IDY4LjcwNjMgMC41MTgwNjYgNDcuODAxMyAwLjUxODA2Nkg0Mi41ODA1SDQwLjcwNFoiLz48L21hc2s%2BPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MC43MDQgMC41MTgwNjZIMTcuMDQzOVY3Ni4yMjIxSDQwLjcwNEg0Mi41ODA1SDQ3LjgwMTNDNjguNzA2NCA3Ni4yMjIxIDg1LjY1MzMgNTkuMjc1MiA4NS42NTMzIDM4LjM3MDFDODUuNjUzMyAxNy40NjUgNjguNzA2MyAwLjUxODA2NiA0Ny44MDEzIDAuNTE4MDY2SDQyLjU4MDVINDAuNzA0WiIgZmlsbD0iI0YzRjZGMSIvPjxwYXRoIGQ9Ik0xNy4wNDM5IDAuNTE4MDY2Vi02LjU3OTE5SDkuOTQ2NjlWMC41MTgwNjZIMTcuMDQzOVpNMTcuMDQzOSA3Ni4yMjIxSDkuOTQ2NjlWODMuMzE5NEgxNy4wNDM5Vjc2LjIyMjFaTTE3LjA0MzkgNy42MTUzMkg0MC43MDRWLTYuNTc5MTlIMTcuMDQzOVY3LjYxNTMy
 Wk0yNC4xNDEyIDc2LjIyMjFWMC41MTgwNjZIOS45NDY2OVY3Ni4yMjIxSDI0LjE0MTJaTTQwLjcwNCA2OS4xMjQ5SDE3LjA0MzlWODMuMzE5NEg0MC43MDRWNjkuMTI0OVpNNDIuNTgwNSA2OS4xMjQ5SDQwLjcwNFY4My4zMTk0SDQyLjU4MDVWNjkuMTI0OVpNNDcuODAxMyA2OS4xMjQ5SDQyLjU4MDVWODMuMzE5NEg0Ny44MDEzVjY5LjEyNDlaTTc4LjU1NiAzOC4zNzAxQzc4LjU1NiA1NS4zNTU1IDY0Ljc4NjcgNjkuMTI0OSA0Ny44MDEzIDY5LjEyNDlWODMuMzE5NEM3Mi42MjYxIDgzLjMxOTQgOTIuNzUwNSA2My4xOTQ5IDkyLjc1MDUgMzguMzcwMUg3OC41NTZaTTQ3LjgwMTMgNy42MTUzMkM2NC43ODY2IDcuNjE1MzIgNzguNTU2IDIxLjM4NDcgNzguNTU2IDM4LjM3MDFIOTIuNzUwNUM5Mi43NTA1IDEzLjU0NTMgNzIuNjI2IC02LjU3OTE5IDQ3LjgwMTMgLTYuNTc5MTlWNy42MTUzMlpNNDIuNTgwNSA3LjYxNTMySDQ3LjgwMTNWLTYuNTc5MTlINDIuNTgwNVY3LjYxNTMyWk00MC43MDQgNy42MTUzMkg0Mi41ODA1Vi02LjU3OTE5SDQwLjcwNFY3LjYxNTMyWiIgZmlsbD0iYmxhY2siIG1hc2s9InVybCgjZG9zdS1kLWN1dG91dCkiLz48cGF0aCBkPSJNNjguOTIxNSAzNi4wMTM1QzY4LjkyMTUgMzYuMDEzNSA2NS43MzY5IDQ5LjQ3MzggNTEuNDIzMSA0OS40NzM4QzM3LjEwOTMgNDkuNDczOCAzMi41Nzg3IDM3LjM1OTYgMzIuNTc4NyAzNi4wMTM1IiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjcuNjkxN
 jEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0wLjM0ODYzMyA4NS40OTQ2QzAuMzQ4NjMzIDg1LjQ5NDYgMjkuNDg1NiA4NS44MzA5IDM0LjgwOSA4NS42OThDNDQuODMzNyA4NS40NDc3IDUxLjI4NzIgODQuNDAyIDU3LjUyNjkgNzguOTcyNEM2Mi44MTI5IDc0LjM3MjcgNzUuMTM0MiA1OS42ODM2IDc1LjEzNDIgNTkuNjgzNiIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSI2LjE2NDgyIi8%2BPC9zdmc%2B)](https://github.dosu.com/apache/superset?utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=static-docs-ask-repo&utm_term=apache%2Fsuperset) [![Share Dosu with your team](https://img.shields.io/badge/Share%20Dosu%20with%20your%20team-1f6feb?style=flat)](https://app.dosu.dev/signup?referrer=openSource&source=github-footer&utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=static-docs-share-team&utm_term=apache%2Fsuperset)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org