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 672e9a14771 fix(docs): tighten onBrokenLinks to throw and fix surfaced 
broken links (#40102)
672e9a14771 is described below

commit 672e9a14771bc549bc268ed3c0eb566ab2c3a864
Author: Evan Rusackas <[email protected]>
AuthorDate: Thu May 14 11:07:18 2026 -0700

    fix(docs): tighten onBrokenLinks to throw and fix surfaced broken links 
(#40102)
    
    Co-authored-by: Claude Code <[email protected]>
---
 .github/workflows/superset-docs-verify.yml         |   7 +
 .../components/design-system/index.mdx             |  14 +-
 docs/developer_docs/components/index.mdx           |   2 +-
 docs/developer_docs/components/ui/index.mdx        |  92 ++++-----
 docs/developer_docs/contributing/code-review.md    |   8 +-
 .../contributing/development-setup.md              |   2 +-
 docs/developer_docs/contributing/guidelines.md     |   2 +-
 docs/developer_docs/contributing/howtos.md         |   2 +-
 .../developer_docs/contributing/issue-reporting.md |   4 +-
 docs/developer_docs/contributing/overview.md       |  10 +-
 .../developer_docs/contributing/release-process.md |   2 +-
 docs/developer_docs/contributing/submitting-pr.md  |   6 +-
 docs/developer_docs/extensions/architecture.md     |   8 +-
 .../developer_docs/extensions/components/index.mdx |   4 +-
 .../extensions/contribution-types.md               |   8 +-
 docs/developer_docs/extensions/dependencies.md     |   6 +-
 docs/developer_docs/extensions/development.md      |   2 +-
 .../extensions/extension-points/editors.md         |   6 +-
 .../extensions/extension-points/sqllab.md          |  10 +-
 docs/developer_docs/extensions/mcp.md              |   4 +-
 docs/developer_docs/extensions/overview.md         |  20 +-
 docs/developer_docs/extensions/quick-start.md      |  16 +-
 docs/developer_docs/extensions/security.md         |   2 +-
 .../guidelines/backend-style-guidelines.md         |   2 +-
 .../guidelines/frontend-style-guidelines.md        |   8 +-
 .../frontend/component-style-guidelines.md         |   4 +-
 docs/developer_docs/testing/overview.md            |   8 +-
 docs/docusaurus.config.ts                          |   2 +-
 docs/package.json                                  |   1 +
 docs/scripts/generate-superset-components.mjs      |  12 +-
 docs/scripts/lint-docs-links.mjs                   | 230 +++++++++++++++++++++
 .../version-6.0.0/configuration/alerts-reports.mdx |   8 +-
 .../version-6.0.0/configuration/cache.mdx          |   4 +-
 .../configuration/configuring-superset.mdx         |   6 +-
 .../version-6.0.0/configuration/databases.mdx      | 108 +++++-----
 .../configuration/networking-settings.mdx          |   2 +-
 .../version-6.0.0/configuration/sql-templating.mdx |   2 +-
 .../version-6.0.0/configuration/timezones.mdx      |   2 +-
 .../version-6.0.0/contributing/contributing.mdx    |   2 +-
 .../version-6.0.0/contributing/development.mdx     |   4 +-
 .../version-6.0.0/contributing/guidelines.mdx      |   2 +-
 docs/versioned_docs/version-6.0.0/faq.mdx          |  14 +-
 .../version-6.0.0/installation/architecture.mdx    |  12 +-
 .../version-6.0.0/installation/docker-compose.mdx  |   2 +-
 .../installation/installation-methods.mdx          |  10 +-
 .../version-6.0.0/installation/kubernetes.mdx      |   4 +-
 docs/versioned_docs/version-6.0.0/intro.md         |   2 +-
 docs/versioned_docs/version-6.0.0/quickstart.mdx   |  12 +-
 .../creating-your-first-dashboard.mdx              |   4 +-
 49 files changed, 475 insertions(+), 229 deletions(-)

diff --git a/.github/workflows/superset-docs-verify.yml 
b/.github/workflows/superset-docs-verify.yml
index d9892b1620b..82944f79c9b 100644
--- a/.github/workflows/superset-docs-verify.yml
+++ b/.github/workflows/superset-docs-verify.yml
@@ -78,6 +78,13 @@ jobs:
       - name: yarn install
         run: |
           yarn install --check-cache
+      - name: Lint docs links
+        # Fast source-level check for bare relative internal links
+        # like `[Foo](../foo)` that Docusaurus's onBrokenLinks
+        # setting can't catch. Runs in seconds; fails fast before
+        # the expensive build step.
+        run: |
+          yarn lint:docs-links
       - name: yarn typecheck
         run: |
           yarn typecheck
diff --git a/docs/developer_docs/components/design-system/index.mdx 
b/docs/developer_docs/components/design-system/index.mdx
index 2f4c4e30e84..03eb7f824fb 100644
--- a/docs/developer_docs/components/design-system/index.mdx
+++ b/docs/developer_docs/components/design-system/index.mdx
@@ -29,10 +29,10 @@ sidebar_position: 1
 
 ## Components
 
-- [DropdownContainer](./dropdowncontainer)
-- [Flex](./flex)
-- [Grid](./grid)
-- [Layout](./layout)
-- [MetadataBar](./metadatabar)
-- [Space](./space)
-- [Table](./table)
+- [DropdownContainer](./dropdowncontainer.mdx)
+- [Flex](./flex.mdx)
+- [Grid](./grid.mdx)
+- [Layout](./layout.mdx)
+- [MetadataBar](./metadatabar.mdx)
+- [Space](./space.mdx)
+- [Table](./table.mdx)
diff --git a/docs/developer_docs/components/index.mdx 
b/docs/developer_docs/components/index.mdx
index 270e24163c4..ee90cdcd45a 100644
--- a/docs/developer_docs/components/index.mdx
+++ b/docs/developer_docs/components/index.mdx
@@ -62,7 +62,7 @@ This documentation is auto-generated from Storybook stories. 
To add or update co
 4. Run `yarn generate:superset-components` in the `docs/` directory
 
 :::info Work in Progress
-This component library is actively being documented. See the [Components 
TODO](./TODO) page for a list of components awaiting documentation.
+This component library is actively being documented. See the [Components 
TODO](./TODO.md) page for a list of components awaiting documentation.
 :::
 
 ---
diff --git a/docs/developer_docs/components/ui/index.mdx 
b/docs/developer_docs/components/ui/index.mdx
index 2a0d1aa8d41..1bcc81edc15 100644
--- a/docs/developer_docs/components/ui/index.mdx
+++ b/docs/developer_docs/components/ui/index.mdx
@@ -29,49 +29,49 @@ sidebar_position: 1
 
 ## Components
 
-- [AutoComplete](./autocomplete)
-- [Avatar](./avatar)
-- [Badge](./badge)
-- [Breadcrumb](./breadcrumb)
-- [Button](./button)
-- [ButtonGroup](./buttongroup)
-- [CachedLabel](./cachedlabel)
-- [Card](./card)
-- [Checkbox](./checkbox)
-- [Collapse](./collapse)
-- [DatePicker](./datepicker)
-- [Divider](./divider)
-- [EditableTitle](./editabletitle)
-- [EmptyState](./emptystate)
-- [FaveStar](./favestar)
-- [IconButton](./iconbutton)
-- [Icons](./icons)
-- [IconTooltip](./icontooltip)
-- [InfoTooltip](./infotooltip)
-- [Input](./input)
-- [Label](./label)
-- [List](./list)
-- [ListViewCard](./listviewcard)
-- [Loading](./loading)
-- [Menu](./menu)
-- [Modal](./modal)
-- [ModalTrigger](./modaltrigger)
-- [Popover](./popover)
-- [ProgressBar](./progressbar)
-- [Radio](./radio)
-- [SafeMarkdown](./safemarkdown)
-- [Select](./select)
-- [Skeleton](./skeleton)
-- [Slider](./slider)
-- [Steps](./steps)
-- [Switch](./switch)
-- [TableCollection](./tablecollection)
-- [TableView](./tableview)
-- [Tabs](./tabs)
-- [Timer](./timer)
-- [Tooltip](./tooltip)
-- [Tree](./tree)
-- [TreeSelect](./treeselect)
-- [Typography](./typography)
-- [UnsavedChangesModal](./unsavedchangesmodal)
-- [Upload](./upload)
+- [AutoComplete](./autocomplete.mdx)
+- [Avatar](./avatar.mdx)
+- [Badge](./badge.mdx)
+- [Breadcrumb](./breadcrumb.mdx)
+- [Button](./button.mdx)
+- [ButtonGroup](./buttongroup.mdx)
+- [CachedLabel](./cachedlabel.mdx)
+- [Card](./card.mdx)
+- [Checkbox](./checkbox.mdx)
+- [Collapse](./collapse.mdx)
+- [DatePicker](./datepicker.mdx)
+- [Divider](./divider.mdx)
+- [EditableTitle](./editabletitle.mdx)
+- [EmptyState](./emptystate.mdx)
+- [FaveStar](./favestar.mdx)
+- [IconButton](./iconbutton.mdx)
+- [Icons](./icons.mdx)
+- [IconTooltip](./icontooltip.mdx)
+- [InfoTooltip](./infotooltip.mdx)
+- [Input](./input.mdx)
+- [Label](./label.mdx)
+- [List](./list.mdx)
+- [ListViewCard](./listviewcard.mdx)
+- [Loading](./loading.mdx)
+- [Menu](./menu.mdx)
+- [Modal](./modal.mdx)
+- [ModalTrigger](./modaltrigger.mdx)
+- [Popover](./popover.mdx)
+- [ProgressBar](./progressbar.mdx)
+- [Radio](./radio.mdx)
+- [SafeMarkdown](./safemarkdown.mdx)
+- [Select](./select.mdx)
+- [Skeleton](./skeleton.mdx)
+- [Slider](./slider.mdx)
+- [Steps](./steps.mdx)
+- [Switch](./switch.mdx)
+- [TableCollection](./tablecollection.mdx)
+- [TableView](./tableview.mdx)
+- [Tabs](./tabs.mdx)
+- [Timer](./timer.mdx)
+- [Tooltip](./tooltip.mdx)
+- [Tree](./tree.mdx)
+- [TreeSelect](./treeselect.mdx)
+- [Typography](./typography.mdx)
+- [UnsavedChangesModal](./unsavedchangesmodal.mdx)
+- [Upload](./upload.mdx)
diff --git a/docs/developer_docs/contributing/code-review.md 
b/docs/developer_docs/contributing/code-review.md
index a6a0ea29d74..f002c78d7ca 100644
--- a/docs/developer_docs/contributing/code-review.md
+++ b/docs/developer_docs/contributing/code-review.md
@@ -327,13 +327,13 @@ stats.sort_stats('cumulative').print_stats(10)
 ## Resources
 
 ### Internal
-- [Coding Guidelines](../guidelines/design-guidelines)
-- [Testing Guide](../testing/overview)
-- [Extension Architecture](../extensions/architecture)
+- [Coding Guidelines](../guidelines/design-guidelines.md)
+- [Testing Guide](../testing/overview.md)
+- [Extension Architecture](../extensions/architecture.md)
 
 ### External
 - [Google's Code Review Guide](https://google.github.io/eng-practices/review/)
 - [Best Practices for Code 
Review](https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/)
 - [The Art of Readable 
Code](https://www.oreilly.com/library/view/the-art-of/9781449318482/)
 
-Next: [Reporting issues effectively](./issue-reporting)
+Next: [Reporting issues effectively](./issue-reporting.md)
diff --git a/docs/developer_docs/contributing/development-setup.md 
b/docs/developer_docs/contributing/development-setup.md
index 07d07eebb2b..6a8bca85fd2 100644
--- a/docs/developer_docs/contributing/development-setup.md
+++ b/docs/developer_docs/contributing/development-setup.md
@@ -668,7 +668,7 @@ A series of checks will now run when you make a git commit.
 
 ## Linting
 
-See [how tos](./howtos#linting)
+See [how tos](./howtos.md#linting)
 
 ## GitHub Actions and `act`
 
diff --git a/docs/developer_docs/contributing/guidelines.md 
b/docs/developer_docs/contributing/guidelines.md
index 63f808a5e7d..c62b6d4eca8 100644
--- a/docs/developer_docs/contributing/guidelines.md
+++ b/docs/developer_docs/contributing/guidelines.md
@@ -77,7 +77,7 @@ Finally, never submit a PR that will put master branch in 
broken state. If the P
     in `requirements.txt` pinned to a specific version which ensures that the 
application
     build is deterministic.
   - For TypeScript/JavaScript, include new libraries in `package.json`
-- **Tests:** The pull request should include tests, either as doctests, unit 
tests, or both. Make sure to resolve all errors and test failures. See 
[Testing](./howtos#testing) for how to run tests.
+- **Tests:** The pull request should include tests, either as doctests, unit 
tests, or both. Make sure to resolve all errors and test failures. See 
[Testing](./howtos.md#testing) for how to run tests.
 - **Documentation:** If the pull request adds functionality, the docs should 
be updated as part of the same PR.
 - **CI:** Reviewers will not review the code until all CI tests are passed. 
Sometimes there can be flaky tests. You can close and open PR to re-run CI 
test. Please report if the issue persists. After the CI fix has been deployed 
to `master`, please rebase your PR.
 - **Code coverage:** Please ensure that code coverage does not decrease.
diff --git a/docs/developer_docs/contributing/howtos.md 
b/docs/developer_docs/contributing/howtos.md
index e01d54de334..40ae473183f 100644
--- a/docs/developer_docs/contributing/howtos.md
+++ b/docs/developer_docs/contributing/howtos.md
@@ -282,7 +282,7 @@ You can now launch your VSCode debugger with the same 
config as above. VSCode wi
 
 ### Storybook
 
-See the dedicated [Storybook documentation](../testing/storybook) for 
information on running Storybook locally and adding new stories.
+See the dedicated [Storybook documentation](../testing/storybook.md) for 
information on running Storybook locally and adding new stories.
 
 ## Contributing Translations
 
diff --git a/docs/developer_docs/contributing/issue-reporting.md 
b/docs/developer_docs/contributing/issue-reporting.md
index de6d3e96c96..3bf1de8dc90 100644
--- a/docs/developer_docs/contributing/issue-reporting.md
+++ b/docs/developer_docs/contributing/issue-reporting.md
@@ -413,6 +413,6 @@ Consider:
 - **Feature Request**: Use feature request template
 - **Question**: Use GitHub Discussions
 - **Configuration Help**: Ask in Slack
-- **Development Help**: See [Contributing Guide](./overview)
+- **Development Help**: See [Contributing Guide](./overview.md)
 
-Next: [Understanding the release process](./release-process)
+Next: [Understanding the release process](./release-process.md)
diff --git a/docs/developer_docs/contributing/overview.md 
b/docs/developer_docs/contributing/overview.md
index 46958ea6249..d0e6c5ba659 100644
--- a/docs/developer_docs/contributing/overview.md
+++ b/docs/developer_docs/contributing/overview.md
@@ -94,7 +94,7 @@ Look through the GitHub issues. Issues tagged with
 Superset could always use better documentation,
 whether as part of the official Superset docs,
 in docstrings, `docs/*.rst` or even on the web as blog posts or
-articles. See [Documentation](./howtos#contributing-to-documentation) for more 
details.
+articles. See [Documentation](./howtos.md#contributing-to-documentation) for 
more details.
 
 ### Add Translations
 
@@ -103,7 +103,7 @@ text strings from Superset's UI. You can jump into the 
existing
 language dictionaries at
 `superset/translations/<language_code>/LC_MESSAGES/messages.po`, or
 even create a dictionary for a new language altogether.
-See [Translating](./howtos#contributing-translations) for more details.
+See [Translating](./howtos.md#contributing-translations) for more details.
 
 ### Ask Questions
 
@@ -158,9 +158,9 @@ Security team members should also follow these general 
expectations:
 
 Ready to contribute? Here's how to get started:
 
-1. **[Set up your environment](./development-setup)** - Get Superset running 
locally
+1. **[Set up your environment](./development-setup.md)** - Get Superset 
running locally
 2. **[Find something to work on](#types-of-contributions)** - Pick an issue or 
feature
-3. **[Submit your contribution](./submitting-pr)** - Create a pull request
-4. **[Follow guidelines](./guidelines)** - Ensure code quality
+3. **[Submit your contribution](./submitting-pr.md)** - Create a pull request
+4. **[Follow guidelines](./guidelines.md)** - Ensure code quality
 
 Welcome to the Apache Superset community! 🚀
diff --git a/docs/developer_docs/contributing/release-process.md 
b/docs/developer_docs/contributing/release-process.md
index 32d375b2943..c0664cb0140 100644
--- a/docs/developer_docs/contributing/release-process.md
+++ b/docs/developer_docs/contributing/release-process.md
@@ -466,4 +466,4 @@ Credit:
 - [Release 
Scripts](https://github.com/apache/superset/tree/master/scripts/release)
 - [Superset Repository 
Scripts](https://github.com/apache/superset/tree/master/scripts)
 
-Next: Return to [Contributing Overview](./overview)
+Next: Return to [Contributing Overview](./overview.md)
diff --git a/docs/developer_docs/contributing/submitting-pr.md 
b/docs/developer_docs/contributing/submitting-pr.md
index 18479ae1cb8..4836aa47f63 100644
--- a/docs/developer_docs/contributing/submitting-pr.md
+++ b/docs/developer_docs/contributing/submitting-pr.md
@@ -31,11 +31,11 @@ Learn how to create and submit high-quality pull requests 
to Apache Superset.
 ### Prerequisites
 - [ ] Development environment is set up
 - [ ] You've forked and cloned the repository
-- [ ] You've read the [contributing overview](./overview)
+- [ ] You've read the [contributing overview](./overview.md)
 - [ ] You've found or created an issue to work on
 
 ### PR Readiness Checklist
-- [ ] Code follows [coding guidelines](../guidelines/design-guidelines)
+- [ ] Code follows [coding guidelines](../guidelines/design-guidelines.md)
 - [ ] Tests are passing locally
 - [ ] Linting passes (`pre-commit run --all-files`)
 - [ ] Documentation is updated if needed
@@ -318,4 +318,4 @@ git push origin master
 - **GitHub**: Tag @apache/superset-committers for attention
 - **Mailing List**: [email protected]
 
-Next: [Understanding code review process](./code-review)
+Next: [Understanding code review process](./code-review.md)
diff --git a/docs/developer_docs/extensions/architecture.md 
b/docs/developer_docs/extensions/architecture.md
index 2dd642fd997..4a445703129 100644
--- a/docs/developer_docs/extensions/architecture.md
+++ b/docs/developer_docs/extensions/architecture.md
@@ -233,7 +233,7 @@ This architecture provides several key benefits:
 
 Now that you understand the architecture, explore:
 
-- **[Dependencies](./dependencies)** - Managing dependencies and understanding 
API stability
-- **[Quick Start](./quick-start)** - Build your first extension
-- **[Contribution Types](./contribution-types)** - What kinds of extensions 
you can build
-- **[Development](./development)** - Project structure, APIs, and development 
workflow
+- **[Dependencies](./dependencies.md)** - Managing dependencies and 
understanding API stability
+- **[Quick Start](./quick-start.md)** - Build your first extension
+- **[Contribution Types](./contribution-types.md)** - What kinds of extensions 
you can build
+- **[Development](./development.md)** - Project structure, APIs, and 
development workflow
diff --git a/docs/developer_docs/extensions/components/index.mdx 
b/docs/developer_docs/extensions/components/index.mdx
index d4b4eaa5921..0786fd0c801 100644
--- a/docs/developer_docs/extensions/components/index.mdx
+++ b/docs/developer_docs/extensions/components/index.mdx
@@ -29,7 +29,7 @@ These UI components are available to Superset extension 
developers through the `
 
 ## Available Components
 
-- [Alert](./alert)
+- [Alert](./alert.mdx)
 
 ## Usage
 
@@ -90,4 +90,4 @@ InteractiveMyComponent.argTypes = {
 
 ## Interactive Documentation
 
-For interactive examples with controls, visit the 
[Storybook](/storybook/?path=/docs/extension-components--docs).
+For interactive examples with controls, run Storybook locally — see the 
[Storybook documentation](/developer-docs/testing/storybook).
diff --git a/docs/developer_docs/extensions/contribution-types.md 
b/docs/developer_docs/extensions/contribution-types.md
index 6e66aa8a67c..e765c5009c4 100644
--- a/docs/developer_docs/extensions/contribution-types.md
+++ b/docs/developer_docs/extensions/contribution-types.md
@@ -110,7 +110,7 @@ editors.registerEditor(
 );
 ```
 
-See [Editors Extension Point](./extension-points/editors) for implementation 
details.
+See [Editors Extension Point](./extension-points/editors.md) for 
implementation details.
 
 ## Backend
 
@@ -146,7 +146,7 @@ class MyExtensionAPI(RestApi):
 from .api import MyExtensionAPI
 ```
 
-**Note**: The [`@api`](superset-core/src/superset_core/rest_api/decorators.py) 
decorator automatically detects context and generates appropriate paths:
+**Note**: The 
[`@api`](https://github.com/apache/superset/blob/master/superset-core/src/superset_core/rest_api/decorators.py)
 decorator automatically detects context and generates appropriate paths:
 
 - **Extension context**: `/extensions/{publisher}/{name}/` with ID prefixed as 
`extensions.{publisher}.{name}.{id}`
 - **Host context**: `/api/v1/` with original ID
@@ -193,7 +193,7 @@ def get_summary() -> dict:
     return {"status": "success", "result": {"queries_today": 42}}
 ```
 
-See [MCP Integration](./mcp) for implementation details.
+See [MCP Integration](./mcp.md) for implementation details.
 
 ### MCP Prompts
 
@@ -223,7 +223,7 @@ async def analysis_guide(ctx: Context) -> str:
     """
 ```
 
-See [MCP Integration](./mcp) for implementation details.
+See [MCP Integration](./mcp.md) for implementation details.
 
 ### Semantic Layers
 
diff --git a/docs/developer_docs/extensions/dependencies.md 
b/docs/developer_docs/extensions/dependencies.md
index 8fb9e61e988..a061028f8d7 100644
--- a/docs/developer_docs/extensions/dependencies.md
+++ b/docs/developer_docs/extensions/dependencies.md
@@ -161,6 +161,6 @@ Until then, monitor the Superset release notes and test 
your extensions with eac
 
 ## Next Steps
 
-- **[Architecture](./architecture)** - Understand the extension system design
-- **[Development](./development)** - Learn about APIs and development workflow
-- **[Quick Start](./quick-start)** - Build your first extension
+- **[Architecture](./architecture.md)** - Understand the extension system 
design
+- **[Development](./development.md)** - Learn about APIs and development 
workflow
+- **[Quick Start](./quick-start.md)** - Build your first extension
diff --git a/docs/developer_docs/extensions/development.md 
b/docs/developer_docs/extensions/development.md
index 838db2f1c76..939b1f2d846 100644
--- a/docs/developer_docs/extensions/development.md
+++ b/docs/developer_docs/extensions/development.md
@@ -252,7 +252,7 @@ class DatasetReferencesAPI(RestApi):
 
 ### Automatic Context Detection
 
-The [`@api`](superset-core/src/superset_core/rest_api/decorators.py) decorator 
automatically detects whether it's being used in host or extension code:
+The 
[`@api`](https://github.com/apache/superset/blob/master/superset-core/src/superset_core/rest_api/decorators.py)
 decorator automatically detects whether it's being used in host or extension 
code:
 
 - **Extension APIs**: Registered under `/extensions/{publisher}/{name}/` with 
IDs prefixed as `extensions.{publisher}.{name}.{id}`
 - **Host APIs**: Registered under `/api/v1/` with original IDs
diff --git a/docs/developer_docs/extensions/extension-points/editors.md 
b/docs/developer_docs/extensions/extension-points/editors.md
index 7eec293d8bd..aff1156b3ff 100644
--- a/docs/developer_docs/extensions/extension-points/editors.md
+++ b/docs/developer_docs/extensions/extension-points/editors.md
@@ -217,6 +217,6 @@ const disposable = 
handle.registerCompletionProvider(provider);
 
 ## Next Steps
 
-- **[SQL Lab Extension Points](./sqllab)** - Learn about other SQL Lab 
customizations
-- **[Contribution Types](../contribution-types)** - Explore other contribution 
types
-- **[Development](../development)** - Set up your development environment
+- **[SQL Lab Extension Points](./sqllab.md)** - Learn about other SQL Lab 
customizations
+- **[Contribution Types](../contribution-types.md)** - Explore other 
contribution types
+- **[Development](../development.md)** - Set up your development environment
diff --git a/docs/developer_docs/extensions/extension-points/sqllab.md 
b/docs/developer_docs/extensions/extension-points/sqllab.md
index fd31f7b22b6..959e89fa3ae 100644
--- a/docs/developer_docs/extensions/extension-points/sqllab.md
+++ b/docs/developer_docs/extensions/extension-points/sqllab.md
@@ -51,7 +51,7 @@ SQL Lab provides 4 extension points where extensions can 
contribute custom UI co
 | **Right Sidebar** | `sqllab.rightSidebar` | ✓     | —     | Custom panels 
(AI assistants, query analysis)  |
 | **Panels**        | `sqllab.panels`       | âś“     | âś“     | Custom tabs + 
toolbar actions (data profiling) |
 
-\*Editor views are contributed via [Editor Contributions](./editors), not 
standard view contributions.
+\*Editor views are contributed via [Editor Contributions](./editors.md), not 
standard view contributions.
 
 ## Customization Types
 
@@ -78,7 +78,7 @@ Extensions can add toolbar actions to **Left Sidebar**, 
**Editor**, and **Panels
 
 ### Custom Editors
 
-Extensions can replace the default SQL editor with custom implementations 
(Monaco, CodeMirror, etc.). See [Editor Contributions](./editors) for details.
+Extensions can replace the default SQL editor with custom implementations 
(Monaco, CodeMirror, etc.). See [Editor Contributions](./editors.md) for 
details.
 
 ## Examples
 
@@ -157,6 +157,6 @@ menus.registerMenuItem(
 
 ## Next Steps
 
-- **[Contribution Types](../contribution-types)** - Learn about other 
contribution types (commands, menus)
-- **[Development](../development)** - Set up your development environment
-- **[Quick Start](../quick-start)** - Build a complete extension
+- **[Contribution Types](../contribution-types.md)** - Learn about other 
contribution types (commands, menus)
+- **[Development](../development.md)** - Set up your development environment
+- **[Quick Start](../quick-start.md)** - Build a complete extension
diff --git a/docs/developer_docs/extensions/mcp.md 
b/docs/developer_docs/extensions/mcp.md
index 4ba74e3540a..5fa7e6b41a0 100644
--- a/docs/developer_docs/extensions/mcp.md
+++ b/docs/developer_docs/extensions/mcp.md
@@ -455,5 +455,5 @@ async def metrics_guide(ctx: Context) -> str:
 
 ## Next Steps
 
-- **[Development](./development)** - Project structure, APIs, and dev workflow
-- **[Security](./security)** - Security best practices for extensions
+- **[Development](./development.md)** - Project structure, APIs, and dev 
workflow
+- **[Security](./security.md)** - Security best practices for extensions
diff --git a/docs/developer_docs/extensions/overview.md 
b/docs/developer_docs/extensions/overview.md
index c5ef59f428b..faee8c4c487 100644
--- a/docs/developer_docs/extensions/overview.md
+++ b/docs/developer_docs/extensions/overview.md
@@ -47,13 +47,13 @@ Extension developers have access to pre-built UI components 
via `@apache-superse
 
 ## Next Steps
 
-- **[Quick Start](./quick-start)** - Build your first extension with a 
complete walkthrough
-- **[Architecture](./architecture)** - Design principles and system overview
-- **[Dependencies](./dependencies)** - Managing dependencies and understanding 
API stability
-- **[Contribution Types](./contribution-types)** - Available extension points
-- **[Development](./development)** - Project structure, APIs, and development 
workflow
-- **[Deployment](./deployment)** - Packaging and deploying extensions
-- **[MCP Integration](./mcp)** - Adding AI agent capabilities using extensions
-- **[Security](./security)** - Security considerations and best practices
-- **[Tasks](./tasks)** - Framework for creating and managing long running tasks
-- **[Community Extensions](./registry)** - Browse extensions shared by the 
community
+- **[Quick Start](./quick-start.md)** - Build your first extension with a 
complete walkthrough
+- **[Architecture](./architecture.md)** - Design principles and system overview
+- **[Dependencies](./dependencies.md)** - Managing dependencies and 
understanding API stability
+- **[Contribution Types](./contribution-types.md)** - Available extension 
points
+- **[Development](./development.md)** - Project structure, APIs, and 
development workflow
+- **[Deployment](./deployment.md)** - Packaging and deploying extensions
+- **[MCP Integration](./mcp.md)** - Adding AI agent capabilities using 
extensions
+- **[Security](./security.md)** - Security considerations and best practices
+- **[Tasks](./tasks.md)** - Framework for creating and managing long running 
tasks
+- **[Community Extensions](./registry.md)** - Browse extensions shared by the 
community
diff --git a/docs/developer_docs/extensions/quick-start.md 
b/docs/developer_docs/extensions/quick-start.md
index f2c4388b8a5..1ef35833397 100644
--- a/docs/developer_docs/extensions/quick-start.md
+++ b/docs/developer_docs/extensions/quick-start.md
@@ -168,7 +168,7 @@ class HelloWorldAPI(RestApi):
 
 **Key points:**
 
-- Uses [`@api`](superset-core/src/superset_core/rest_api/decorators.py) 
decorator with automatic context detection
+- Uses 
[`@api`](https://github.com/apache/superset/blob/master/superset-core/src/superset_core/rest_api/decorators.py)
 decorator with automatic context detection
 - Extends `RestApi` from `superset_core.rest_api.api`
 - Uses Flask-AppBuilder decorators (`@expose`, `@protect`, `@safe`)
 - Returns responses using `self.response(status_code, result=data)`
@@ -184,7 +184,7 @@ Replace the generated print statement with API import to 
trigger registration:
 from .api import HelloWorldAPI  # noqa: F401
 ```
 
-The [`@api`](superset-core/src/superset_core/rest_api/decorators.py) decorator 
automatically detects extension context and registers your API with proper 
namespacing.
+The 
[`@api`](https://github.com/apache/superset/blob/master/superset-core/src/superset_core/rest_api/decorators.py)
 decorator automatically detects extension context and registers your API with 
proper namespacing.
 
 ## Step 5: Create Frontend Component
 
@@ -225,7 +225,7 @@ The `@apache-superset/core` package must be listed in both 
`peerDependencies` (t
 
 The webpack configuration requires specific settings for Module Federation. 
Key settings include `externalsType: "window"` and `externals` to map 
`@apache-superset/core` to `window.superset` at runtime, `import: false` for 
shared modules to use the host's React instead of bundling a separate copy, and 
`remoteEntry.[contenthash].js` for cache busting.
 
-**Convention**: Superset always loads extensions by requesting the `./index` 
module from the Module Federation container. The `exposes` entry must be 
exactly `'./index': './src/index.tsx'` — do not rename or add additional 
entries. All API registrations must be reachable from that file. See 
[Architecture](./architecture#module-federation) for a full explanation.
+**Convention**: Superset always loads extensions by requesting the `./index` 
module from the Module Federation container. The `exposes` entry must be 
exactly `'./index': './src/index.tsx'` — do not rename or add additional 
entries. All API registrations must be reachable from that file. See 
[Architecture](./architecture.md#module-federation) for a full explanation.
 
 ```javascript
 const path = require('path');
@@ -496,7 +496,7 @@ Superset will extract and validate the extension metadata, 
load the assets, regi
 Here's what happens when your extension loads:
 
 1. **Superset starts**: Reads `manifest.json` from the `.supx` bundle and 
loads the backend entrypoint
-2. **Backend registration**: `entrypoint.py` imports your API class, 
triggering the [`@api`](superset-core/src/superset_core/rest_api/decorators.py) 
decorator to register it automatically
+2. **Backend registration**: `entrypoint.py` imports your API class, 
triggering the 
[`@api`](https://github.com/apache/superset/blob/master/superset-core/src/superset_core/rest_api/decorators.py)
 decorator to register it automatically
 3. **Frontend loads**: When SQL Lab opens, Superset fetches the remote entry 
file
 4. **Module Federation**: Webpack loads your extension module and resolves 
`@apache-superset/core` to `window.superset`
 5. **Registration**: The module executes at load time, calling 
`views.registerView` to register your panel
@@ -509,9 +509,9 @@ Here's what happens when your extension loads:
 
 Now that you have a working extension, explore:
 
-- **[Development](./development)** - Project structure, APIs, and development 
workflow
-- **[Contribution Types](./contribution-types)** - Other contribution points 
beyond panels
-- **[Deployment](./deployment)** - Packaging and deploying your extension
-- **[Security](./security)** - Security best practices for extensions
+- **[Development](./development.md)** - Project structure, APIs, and 
development workflow
+- **[Contribution Types](./contribution-types.md)** - Other contribution 
points beyond panels
+- **[Deployment](./deployment.md)** - Packaging and deploying your extension
+- **[Security](./security.md)** - Security best practices for extensions
 
 For a complete real-world example, examine the query insights extension in the 
Superset codebase.
diff --git a/docs/developer_docs/extensions/security.md 
b/docs/developer_docs/extensions/security.md
index 102ad0c2855..8c905326939 100644
--- a/docs/developer_docs/extensions/security.md
+++ b/docs/developer_docs/extensions/security.md
@@ -28,7 +28,7 @@ By default, extensions are disabled and must be explicitly 
enabled by setting th
 
 For external extensions, administrators are responsible for evaluating and 
verifying the security of any extensions they choose to install, just as they 
would when installing third-party NPM or PyPI packages. At this stage, all 
extensions run in the same context as the host application, without additional 
sandboxing. This means that external extensions can impact the security and 
performance of a Superset environment in the same way as any other installed 
dependency.
 
-We plan to introduce an optional sandboxed execution model for extensions in 
the future (as part of an additional SIP). Until then, administrators should 
exercise caution and follow best practices when selecting and deploying 
third-party extensions. A directory of community extensions is available in the 
[Community Extensions](./registry) page. Note that these extensions are not 
vetted by the Apache Superset project—administrators must evaluate each 
extension before installation.
+We plan to introduce an optional sandboxed execution model for extensions in 
the future (as part of an additional SIP). Until then, administrators should 
exercise caution and follow best practices when selecting and deploying 
third-party extensions. A directory of community extensions is available in the 
[Community Extensions](./registry.md) page. Note that these extensions are not 
vetted by the Apache Superset project—administrators must evaluate each 
extension before installation.
 
 **Any performance or security vulnerabilities introduced by external 
extensions should be reported directly to the extension author, not as Superset 
vulnerabilities.**
 
diff --git a/docs/developer_docs/guidelines/backend-style-guidelines.md 
b/docs/developer_docs/guidelines/backend-style-guidelines.md
index d938298d8a6..ae33641dd3a 100644
--- a/docs/developer_docs/guidelines/backend-style-guidelines.md
+++ b/docs/developer_docs/guidelines/backend-style-guidelines.md
@@ -114,7 +114,7 @@ class CreateDashboardCommand(BaseCommand):
 
 ### Data Access Objects (DAOs)
 
-See: [DAO Style Guidelines and Best Practices](./backend/dao-style-guidelines)
+See: [DAO Style Guidelines and Best 
Practices](./backend/dao-style-guidelines.md)
 
 ## Testing
 
diff --git a/docs/developer_docs/guidelines/frontend-style-guidelines.md 
b/docs/developer_docs/guidelines/frontend-style-guidelines.md
index 7a4292d492f..fa4b43146e9 100644
--- a/docs/developer_docs/guidelines/frontend-style-guidelines.md
+++ b/docs/developer_docs/guidelines/frontend-style-guidelines.md
@@ -29,16 +29,16 @@ This is a list of statements that describe how we do 
frontend development in Sup
 - We develop using TypeScript.
   - See: [SIP-36](https://github.com/apache/superset/issues/9101)
 - We use React for building components, and Redux to manage app/global state.
-  - See: [Component Style Guidelines and Best 
Practices](./frontend/component-style-guidelines)
+  - See: [Component Style Guidelines and Best 
Practices](./frontend/component-style-guidelines.md)
 - We prefer functional components to class components and use hooks for local 
component state.
 - We use [Ant Design](https://ant.design/) components from our component 
library whenever possible, only building our own custom components when it's 
required.
   - See: [SIP-48](https://github.com/apache/superset/issues/11283)
 - We use [@emotion](https://emotion.sh/docs/introduction) to provide styling 
for our components, co-locating styling within component files.
   - See: [SIP-37](https://github.com/apache/superset/issues/9145)
-  - See: [Emotion Styling Guidelines and Best 
Practices](./frontend/emotion-styling-guidelines)
+  - See: [Emotion Styling Guidelines and Best 
Practices](./frontend/emotion-styling-guidelines.md)
 - We use Jest for unit tests, React Testing Library for component tests, and 
Cypress for end-to-end tests.
   - See: [SIP-56](https://github.com/apache/superset/issues/11830)
-  - See: [Testing Guidelines and Best Practices](../testing/testing-guidelines)
+  - See: [Testing Guidelines and Best 
Practices](../testing/testing-guidelines.md)
 - We add tests for every new component or file added to the frontend.
 - We organize our repo so similar files live near each other, and tests are 
co-located with the files they test.
   - See: [SIP-61](https://github.com/apache/superset/issues/12098)
@@ -46,6 +46,6 @@ This is a list of statements that describe how we do frontend 
development in Sup
 - We use OXC (oxlint) and Prettier to automatically fix lint errors and format 
the code.
   - We do not debate code formatting style in PRs, instead relying on 
automated tooling to enforce it.
   - If there's not a linting rule, we don't have a rule!
-  - See: [Linting How-Tos](../contributing/howtos#typescript--javascript)
+  - See: [Linting How-Tos](../contributing/howtos.md#typescript--javascript)
 - We use [React Storybook](https://storybook.js.org/) to help preview/test and 
stabilize our components
   - A public Storybook with components from the `master` branch is available 
[here](https://apache-superset.github.io/superset-ui/?path=/story/*)
diff --git 
a/docs/developer_docs/guidelines/frontend/component-style-guidelines.md 
b/docs/developer_docs/guidelines/frontend/component-style-guidelines.md
index faf1b179e75..59b422a0496 100644
--- a/docs/developer_docs/guidelines/frontend/component-style-guidelines.md
+++ b/docs/developer_docs/guidelines/frontend/component-style-guidelines.md
@@ -31,7 +31,7 @@ This guide is intended primarily for reusable components. 
Whenever possible, all
 ## General Guidelines
 
 - We use [Ant Design](https://ant.design/) as our component library. Do not 
build a new component if Ant Design provides one but rather instead extend or 
customize what the library provides
-- Always style your component using Emotion and always prefer the theme 
variables whenever applicable. See: [Emotion Styling Guidelines and Best 
Practices](./emotion-styling-guidelines)
+- Always style your component using Emotion and always prefer the theme 
variables whenever applicable. See: [Emotion Styling Guidelines and Best 
Practices](./emotion-styling-guidelines.md)
 - All components should be made to be reusable whenever possible
 - All components should follow the structure and best practices as detailed 
below
 
@@ -53,7 +53,7 @@ superset-frontend/src/components
 
 **Storybook:** Components should come with a storybook file whenever 
applicable, with the following naming convention 
`\{ComponentName\}.stories.tsx`. More details about Storybook below
 
-**Unit and end-to-end tests:** All components should come with unit tests 
using Jest and React Testing Library. The file name should follow this naming 
convention `\{ComponentName\}.test.tsx`. Read the [Testing Guidelines and Best 
Practices](../../testing/testing-guidelines) for more details
+**Unit and end-to-end tests:** All components should come with unit tests 
using Jest and React Testing Library. The file name should follow this naming 
convention `\{ComponentName\}.test.tsx`. Read the [Testing Guidelines and Best 
Practices](../../testing/testing-guidelines.md) for more details
 
 **Reference naming:** Use `PascalCase` for React components and `camelCase` 
for component instances
 
diff --git a/docs/developer_docs/testing/overview.md 
b/docs/developer_docs/testing/overview.md
index 856b3990ae9..0fc04399958 100644
--- a/docs/developer_docs/testing/overview.md
+++ b/docs/developer_docs/testing/overview.md
@@ -37,16 +37,16 @@ Superset embraces a testing pyramid approach:
 ## Testing Documentation
 
 ### Frontend Testing
-- **[Frontend Testing](./frontend-testing)** - Jest, React Testing Library, 
and component testing strategies
+- **[Frontend Testing](./frontend-testing.md)** - Jest, React Testing Library, 
and component testing strategies
 
 ### Backend Testing  
-- **[Backend Testing](./backend-testing)** - pytest, database testing, and API 
testing patterns
+- **[Backend Testing](./backend-testing.md)** - pytest, database testing, and 
API testing patterns
 
 ### End-to-End Testing
-- **[E2E Testing](./e2e-testing)** - Playwright testing for complete user 
workflows
+- **[E2E Testing](./e2e-testing.md)** - Playwright testing for complete user 
workflows
 
 ### CI/CD Integration
-- **[CI/CD](./ci-cd)** - Continuous integration, automated testing, and 
deployment pipelines
+- **[CI/CD](./ci-cd.md)** - Continuous integration, automated testing, and 
deployment pipelines
 
 ## Testing Tools & Frameworks
 
diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts
index babacfe43d8..5a6c5b023c7 100644
--- a/docs/docusaurus.config.ts
+++ b/docs/docusaurus.config.ts
@@ -254,7 +254,7 @@ const config: Config = {
     'Apache Superset is a modern data exploration and visualization platform',
   url: 'https://superset.apache.org',
   baseUrl: '/',
-  onBrokenLinks: 'warn',
+  onBrokenLinks: 'throw',
   markdown: {
     mermaid: true,
     hooks: {
diff --git a/docs/package.json b/docs/package.json
index af522416ebe..250ba939580 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -30,6 +30,7 @@
     "lint:db-metadata:report": "python3 
../superset/db_engine_specs/lint_metadata.py --markdown -o 
../superset/db_engine_specs/METADATA_STATUS.md",
     "update:readme-db-logos": "node scripts/generate-database-docs.mjs 
--update-readme",
     "eslint": "eslint .",
+    "lint:docs-links": "node scripts/lint-docs-links.mjs",
     "version:add": "node scripts/manage-versions.mjs add",
     "version:remove": "node scripts/manage-versions.mjs remove",
     "version:add:docs": "node scripts/manage-versions.mjs add docs",
diff --git a/docs/scripts/generate-superset-components.mjs 
b/docs/scripts/generate-superset-components.mjs
index 2244631d7ca..48e55855b5c 100644
--- a/docs/scripts/generate-superset-components.mjs
+++ b/docs/scripts/generate-superset-components.mjs
@@ -1260,7 +1260,15 @@ function generateCategoryIndex(category, components) {
   };
   const componentList = components
     .sort((a, b) => a.componentName.localeCompare(b.componentName))
-    .map(c => `- [${c.componentName}](./${c.componentName.toLowerCase()})`)
+    // `.mdx` suffix matches the actual component page files emitted
+    // by this generator (see the MDX wrappers below). The extension
+    // is required: Docusaurus only validates and rewrites *file-based*
+    // references (.md/.mdx). Bare relative paths bypass the file
+    // resolver and get emitted as raw HTML hrefs that the browser
+    // resolves against the current URL — which gives the wrong
+    // directory for trailing-slash routes and breaks SPA navigation.
+    // See docs/scripts/lint-docs-links.mjs.
+    .map(c => `- [${c.componentName}](./${c.componentName.toLowerCase()}.mdx)`)
     .join('\n');
 
   return `---
@@ -1366,7 +1374,7 @@ This documentation is auto-generated from Storybook 
stories. To add or update co
 4. Run \`yarn generate:superset-components\` in the \`docs/\` directory
 
 :::info Work in Progress
-This component library is actively being documented. See the [Components 
TODO](./TODO) page for a list of components awaiting documentation.
+This component library is actively being documented. See the [Components 
TODO](./TODO.md) page for a list of components awaiting documentation.
 :::
 
 ---
diff --git a/docs/scripts/lint-docs-links.mjs b/docs/scripts/lint-docs-links.mjs
new file mode 100644
index 00000000000..7d29ba59e2d
--- /dev/null
+++ b/docs/scripts/lint-docs-links.mjs
@@ -0,0 +1,230 @@
+#!/usr/bin/env node
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * lint-docs-links — source-level checks for internal markdown links.
+ *
+ * Catches three failure modes that combine to break SPA navigation in
+ * a Docusaurus build:
+ *
+ *   1. BARE             — `[X](../foo)` with no extension. Skips
+ *                         Docusaurus's file resolver entirely. Emitted
+ *                         as a raw href and resolved by the browser
+ *                         against the current page URL — usually the
+ *                         wrong directory for trailing-slash routes.
+ *                         `onBrokenLinks: 'throw'` cannot catch this.
+ *
+ *   2. MISSING_TARGET   — `[X](./gone.md)` with an extension, but no
+ *                         file at that path. The Docusaurus build
+ *                         catches this too (via
+ *                         `onBrokenMarkdownLinks: 'throw'`) but only
+ *                         after a multi-minute build. This script
+ *                         flags it in ~1s.
+ *
+ *   3. WRONG_EXTENSION  — `[X](./foo.md)` where the file is actually
+ *                         `foo.mdx` (or vice versa). Same end result
+ *                         as MISSING_TARGET, but the fix is one
+ *                         character — so we report it as its own
+ *                         category with the actual extension on disk.
+ *
+ * Skips: fenced code blocks, asset-style targets (.png/.json/etc.),
+ * external URLs, in-page anchors, and the `versioned_docs/`
+ * snapshots (those are frozen historical content).
+ *
+ * Run from `docs/`:
+ *   node scripts/lint-docs-links.mjs
+ *
+ * Exits 0 on clean, 1 on any finding.
+ */
+
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const docsRoot = path.join(__dirname, '..');
+
+const ROOTS = ['docs', 'admin_docs', 'developer_docs', 'components'];
+
+const NON_DOC_EXTENSIONS = new Set([
+  '.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.ico',
+  '.json', '.yaml', '.yml', '.txt', '.csv',
+  '.zip', '.tar', '.gz',
+  '.pdf',
+  '.mp4', '.webm', '.mov',
+]);
+
+const LINK_RE = /\[[^\]\n]+?\]\((?<url>\.{1,2}\/[^)\s]+?)\)/g;
+
+/**
+ * Classify a single markdown link from a source file.
+ * Returns one of: ok / bare / asset / missing-target / wrong-extension.
+ */
+function classifyLink(sourceFile, url) {
+  const stripped = url.split('#', 1)[0].split('?', 1)[0];
+  const ext = path.extname(stripped).toLowerCase();
+
+  // Non-doc assets — legit bare extensions, leave alone.
+  if (ext && NON_DOC_EXTENSIONS.has(ext)) {
+    return { kind: 'asset' };
+  }
+
+  // Anything that doesn't end in .md/.mdx is a bare relative URL.
+  if (ext !== '.md' && ext !== '.mdx') {
+    return { kind: 'bare' };
+  }
+
+  // Has a .md/.mdx extension — make sure the target exists.
+  const target = path.normalize(path.join(path.dirname(sourceFile), stripped));
+  if (fs.existsSync(target)) {
+    return { kind: 'ok' };
+  }
+
+  // Target doesn't exist — check if the OTHER extension does.
+  const otherExt = ext === '.md' ? '.mdx' : '.md';
+  const otherTarget = target.slice(0, -ext.length) + otherExt;
+  if (fs.existsSync(otherTarget)) {
+    return { kind: 'wrong-extension', actualExt: otherExt };
+  }
+
+  return { kind: 'missing-target' };
+}
+
+function* walk(dir) {
+  const entries = fs.readdirSync(dir, { withFileTypes: true });
+  for (const entry of entries) {
+    const full = path.join(dir, entry.name);
+    if (entry.isDirectory()) {
+      if (
+        entry.name.startsWith('.') ||
+        entry.name === 'node_modules' ||
+        entry.name.endsWith('_versioned_docs') ||
+        entry.name === 'versioned_docs'
+      ) {
+        continue;
+      }
+      yield* walk(full);
+    } else if (entry.isFile()) {
+      if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) {
+        yield full;
+      }
+    }
+  }
+}
+
+function lintFile(file) {
+  const src = fs.readFileSync(file, 'utf8');
+  const findings = [];
+  let inFence = false;
+  const lines = src.split('\n');
+  for (let i = 0; i < lines.length; i++) {
+    const line = lines[i];
+    if (line.trimStart().startsWith('```')) {
+      inFence = !inFence;
+      continue;
+    }
+    if (inFence) continue;
+    for (const m of line.matchAll(LINK_RE)) {
+      const url = m.groups.url;
+      const result = classifyLink(file, url);
+      if (result.kind !== 'ok' && result.kind !== 'asset') {
+        findings.push({ line: i + 1, url, ...result });
+      }
+    }
+  }
+  return findings;
+}
+
+const findings = [];
+for (const root of ROOTS) {
+  const abs = path.join(docsRoot, root);
+  if (!fs.existsSync(abs)) continue;
+  for (const file of walk(abs)) {
+    for (const f of lintFile(file)) {
+      findings.push({ file: path.relative(docsRoot, file), ...f });
+    }
+  }
+}
+
+if (findings.length === 0) {
+  console.log('âś“ lint-docs-links: no broken internal links found');
+  process.exit(0);
+}
+
+// Group by kind for readable output.
+const groups = {
+  bare: [],
+  'wrong-extension': [],
+  'missing-target': [],
+};
+for (const f of findings) {
+  groups[f.kind].push(f);
+}
+
+console.error(
+  `âś— lint-docs-links: found ${findings.length} broken internal link(s)`
+);
+console.error('');
+
+if (groups.bare.length) {
+  console.error(
+    `  ${groups.bare.length} bare relative link(s) (no .md/.mdx extension)`
+  );
+  console.error(
+    "  Docusaurus's file resolver skips these; the browser resolves them"
+  );
+  console.error(
+    '  against the current page URL — wrong directory for trailing-slash 
routes.'
+  );
+  console.error('  Add the extension so the file resolver picks them up.');
+  console.error('');
+  for (const f of groups.bare) {
+    console.error(`    ${f.file}:${f.line}  ${f.url}`);
+  }
+  console.error('');
+}
+
+if (groups['wrong-extension'].length) {
+  console.error(
+    `  ${groups['wrong-extension'].length} wrong-extension link(s) (.md vs 
.mdx mismatch)`
+  );
+  console.error('  The target file exists with the other extension on disk.');
+  console.error('');
+  for (const f of groups['wrong-extension']) {
+    console.error(
+      `    ${f.file}:${f.line}  ${f.url}  →  use ${f.actualExt}`
+    );
+  }
+  console.error('');
+}
+
+if (groups['missing-target'].length) {
+  console.error(
+    `  ${groups['missing-target'].length} missing-target link(s) (file doesn't 
exist)`
+  );
+  console.error('');
+  for (const f of groups['missing-target']) {
+    console.error(`    ${f.file}:${f.line}  ${f.url}`);
+  }
+  console.error('');
+}
+
+process.exit(1);
diff --git a/docs/versioned_docs/version-6.0.0/configuration/alerts-reports.mdx 
b/docs/versioned_docs/version-6.0.0/configuration/alerts-reports.mdx
index a989bc63b8d..3bd6e334903 100644
--- a/docs/versioned_docs/version-6.0.0/configuration/alerts-reports.mdx
+++ b/docs/versioned_docs/version-6.0.0/configuration/alerts-reports.mdx
@@ -20,12 +20,12 @@ Alerts and reports are disabled by default. To turn them 
on, you need to do some
 
 #### In your `superset_config.py` or `superset_config_docker.py`
 
-- `"ALERT_REPORTS"` [feature 
flag](/docs/6.0.0/configuration/configuring-superset#feature-flags) must be 
turned to True.
+- `"ALERT_REPORTS"` [feature 
flag](/user-docs/6.0.0/configuration/configuring-superset#feature-flags) must 
be turned to True.
 - `beat_schedule` in CeleryConfig must contain schedule for 
`reports.scheduler`.
 - At least one of those must be configured, depending on what you want to use:
   - emails: `SMTP_*` settings
   - Slack messages: `SLACK_API_TOKEN`
-- Users can customize the email subject by including date code placeholders, 
which will automatically be replaced with the corresponding UTC date when the 
email is sent. To enable this functionality, activate the 
`"DATE_FORMAT_IN_EMAIL_SUBJECT"` [feature 
flag](/docs/6.0.0/configuration/configuring-superset#feature-flags). This 
enables date formatting in email subjects, preventing all reporting emails from 
being grouped into the same thread (optional for the reporting feature).
+- Users can customize the email subject by including date code placeholders, 
which will automatically be replaced with the corresponding UTC date when the 
email is sent. To enable this functionality, activate the 
`"DATE_FORMAT_IN_EMAIL_SUBJECT"` [feature 
flag](/user-docs/6.0.0/configuration/configuring-superset#feature-flags). This 
enables date formatting in email subjects, preventing all reporting emails from 
being grouped into the same thread (optional for the reporting feature).
     - Use date codes from [strftime.org](https://strftime.org/) to create the 
email subject.
     - If no date code is provided, the original string will be used as the 
email subject.
 
@@ -38,7 +38,7 @@ Screenshots will be taken but no messages actually sent as 
long as `ALERT_REPORT
 - You must install a headless browser, for taking screenshots of the charts 
and dashboards. Only Firefox and Chrome are currently supported.
   > If you choose Chrome, you must also change the value of `WEBDRIVER_TYPE` 
to `"chrome"` in your `superset_config.py`.
 
-Note: All the components required (Firefox headless browser, Redis, Postgres 
db, celery worker and celery beat) are present in the *dev* docker image if you 
are following [Installing Superset 
Locally](/docs/6.0.0/installation/docker-compose/).
+Note: All the components required (Firefox headless browser, Redis, Postgres 
db, celery worker and celery beat) are present in the *dev* docker image if you 
are following [Installing Superset 
Locally](/user-docs/6.0.0/installation/docker-compose/).
 All you need to do is add the required config variables described in this 
guide (See `Detailed Config`).
 
 If you are running a non-dev docker image, e.g., a stable release like 
`apache/superset:3.1.0`, that image does not include a headless browser.  Only 
the `superset_worker` container needs this headless browser to browse to the 
target chart or dashboard.
@@ -70,7 +70,7 @@ Note: when you configure an alert or a report, the Slack 
channel list takes chan
 ### 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.
-- You can see the dedicated docs about [Kubernetes 
installation](/docs/6.0.0/installation/kubernetes) for more details.
+- You can see the dedicated docs about [Kubernetes 
installation](/user-docs/6.0.0/installation/kubernetes) for more details.
 
 ### Docker Compose specific
 
diff --git a/docs/versioned_docs/version-6.0.0/configuration/cache.mdx 
b/docs/versioned_docs/version-6.0.0/configuration/cache.mdx
index 2f60785c5ed..eb778377bb8 100644
--- a/docs/versioned_docs/version-6.0.0/configuration/cache.mdx
+++ b/docs/versioned_docs/version-6.0.0/configuration/cache.mdx
@@ -78,11 +78,11 @@ Caching for SQL Lab query results is used when async 
queries are enabled and is
 Note that this configuration does not use a flask-caching dictionary for its 
configuration, but
 instead requires a cachelib object.
 
-See [Async Queries via Celery](/docs/6.0.0/configuration/async-queries-celery) 
for details.
+See [Async Queries via 
Celery](/user-docs/6.0.0/configuration/async-queries-celery) for details.
 
 ## Caching Thumbnails
 
-This is an optional feature that can be turned on by activating its [feature 
flag](/docs/6.0.0/configuration/configuring-superset#feature-flags) on config:
+This is an optional feature that can be turned on by activating its [feature 
flag](/user-docs/6.0.0/configuration/configuring-superset#feature-flags) on 
config:
 
 ```
 FEATURE_FLAGS = {
diff --git 
a/docs/versioned_docs/version-6.0.0/configuration/configuring-superset.mdx 
b/docs/versioned_docs/version-6.0.0/configuration/configuring-superset.mdx
index a61d05ecfe4..0919ed24c1a 100644
--- a/docs/versioned_docs/version-6.0.0/configuration/configuring-superset.mdx
+++ b/docs/versioned_docs/version-6.0.0/configuration/configuring-superset.mdx
@@ -37,7 +37,7 @@ ENV SUPERSET_CONFIG_PATH /app/superset_config.py
 ```
 
 Docker compose deployments handle application configuration differently using 
specific conventions.
-Refer to the [docker compose tips & 
configuration](/docs/6.0.0/installation/docker-compose#docker-compose-tips--configuration)
+Refer to the [docker compose tips & 
configuration](/user-docs/6.0.0/installation/docker-compose#docker-compose-tips--configuration)
 for details.
 
 The following is an example of just a few of the parameters you can set in 
your `superset_config.py` file:
@@ -254,7 +254,7 @@ flask --app 
"superset.app:create_app(superset_app_root='/analytics')"
 
 ### Docker builds
 
-The [docker 
compose](/docs/6.0.0/installation/docker-compose#configuring-further) developer
+The [docker 
compose](/user-docs/6.0.0/installation/docker-compose#configuring-further) 
developer
 configuration includes an additional environmental variable,
 
[`SUPERSET_APP_ROOT`](https://github.com/apache/superset/blob/master/docker/.env),
 to simplify the process of setting up a non-default root path across the 
services.
@@ -449,4 +449,4 @@ FEATURE_FLAGS = {
 }
 ```
 
-A current list of feature flags can be found in the [Feature 
Flags](/docs/6.0.0/configuration/feature-flags) documentation.
+A current list of feature flags can be found in the [Feature 
Flags](/user-docs/6.0.0/configuration/configuring-superset#feature-flags) 
documentation.
diff --git a/docs/versioned_docs/version-6.0.0/configuration/databases.mdx 
b/docs/versioned_docs/version-6.0.0/configuration/databases.mdx
index 5c344c70223..928856b2fed 100644
--- a/docs/versioned_docs/version-6.0.0/configuration/databases.mdx
+++ b/docs/versioned_docs/version-6.0.0/configuration/databases.mdx
@@ -14,7 +14,7 @@ in your environment.
 You’ll need to install the required packages for the database you want to use 
as your metadata database
 as well as the packages needed to connect to the databases you want to access 
through Superset.
 For information about setting up Superset's metadata database, please refer to
-installation documentations ([Docker 
Compose](/docs/6.0.0/installation/docker-compose), 
[Kubernetes](/docs/6.0.0/installation/kubernetes))
+installation documentations ([Docker 
Compose](/user-docs/6.0.0/installation/docker-compose), 
[Kubernetes](/user-docs/6.0.0/installation/kubernetes))
 :::
 
 This documentation tries to keep pointer to the different drivers for commonly 
used database
@@ -26,7 +26,7 @@ Superset requires a Python [DB-API database 
driver](https://peps.python.org/pep-
 and a [SQLAlchemy dialect](https://docs.sqlalchemy.org/en/20/dialects/) to be 
installed for
 each database engine you want to connect to.
 
-You can read more 
[here](/docs/6.0.0/configuration/databases#installing-drivers-in-docker-images) 
about how to
+You can read more 
[here](/user-docs/6.0.0/configuration/databases#installing-drivers-in-docker-images)
 about how to
 install new database drivers into your Superset configuration.
 
 ### Supported Databases and Dependencies
@@ -37,53 +37,53 @@ are compatible with Superset.
 
 | <div style={{width: '150px'}}>Database</div>                   | PyPI 
package                                                                       | 
Connection String                                                               
                                                                       |
 | --------------------------------------------------------- | 
----------------------------------------------------------------------------------
 | 
------------------------------------------------------------------------------------------------------------------------------------------------------
 |
-| [AWS Athena](/docs/6.0.0/configuration/databases#aws-athena)                 
  | `pip install pyathena[pandas]` , `pip install PyAthenaJDBC`                 
       | 
`awsathena+rest://{access_key_id}:{access_key}@athena.{region}.amazonaws.com/{schema}?s3_staging_dir={s3_staging_dir}&...`
   |
-| [AWS DynamoDB](/docs/6.0.0/configuration/databases#aws-dynamodb)             
  | `pip install pydynamodb`                                                    
       | 
`dynamodb://{access_key_id}:{secret_access_key}@dynamodb.{region_name}.amazonaws.com?connector=superset`
                                               |
-| [AWS Redshift](/docs/6.0.0/configuration/databases#aws-redshift)             
  | `pip install sqlalchemy-redshift`                                           
       | `redshift+psycopg2://<userName>:<DBPassword>@<AWS End 
Point>:5439/<Database Name>`                                                    
                |
-| [Apache Doris](/docs/6.0.0/configuration/databases#apache-doris)             
        | `pip install pydoris`                                                 
             | `doris://<User>:<Password>@<Host>:<Port>/<Catalog>.<Database>`   
                                         |
-| [Apache Drill](/docs/6.0.0/configuration/databases#apache-drill)             
        | `pip install sqlalchemy-drill`                                        
             | 
`drill+sadrill://<username>:<password>@<host>:<port>/<storage_plugin>`, often 
useful: `?use_ssl=True/False`                                                   
                                                           |
-| [Apache Druid](/docs/6.0.0/configuration/databases#apache-druid)             
        | `pip install pydruid`                                                 
             | 
`druid://<User>:<password>@<Host>:<Port-default-9088>/druid/v2/sql`             
                                                                       |
-| [Apache Hive](/docs/6.0.0/configuration/databases#hive)                      
 | `pip install pyhive`                                                         
      | `hive://hive@{hostname}:{port}/{database}`                              
                                                                               |
-| [Apache Impala](/docs/6.0.0/configuration/databases#apache-impala)           
        | `pip install impyla`                                                  
             | `impala://{hostname}:{port}/{database}`                          
                                                                                
      |
-| [Apache Kylin](/docs/6.0.0/configuration/databases#apache-kylin)             
        | `pip install kylinpy`                                                 
             | 
`kylin://<username>:<password>@<hostname>:<port>/<project>?<param1>=<value1>&<param2>=<value2>`
                                                        |
-| [Apache Pinot](/docs/6.0.0/configuration/databases#apache-pinot)             
        | `pip install pinotdb`                                                 
             | `pinot://BROKER:5436/query?server=http://CONTROLLER:5983/`       
                                                                                
      |
-| [Apache Solr](/docs/6.0.0/configuration/databases#apache-solr)               
        | `pip install sqlalchemy-solr`                                         
             | 
`solr://{username}:{password}@{hostname}:{port}/{server_path}/{collection}`     
                                                                       |
-| [Apache Spark SQL](/docs/6.0.0/configuration/databases#apache-spark-sql)     
        | `pip install pyhive`                                                  
             | `hive://hive@{hostname}:{port}/{database}`                       
                                                                                
      |
-| [Ascend.io](/docs/6.0.0/configuration/databases#ascendio)                    
   | `pip install impyla`                                                       
        | 
`ascend://{username}:{password}@{hostname}:{port}/{database}?auth_mechanism=PLAIN;use_ssl=true`
                                                        |
-| [Azure MS SQL](/docs/6.0.0/configuration/databases#sql-server)               
 | `pip install pymssql`                                                        
      | 
`mssql+pymssql://UserName@presetSQL:[email protected]:1433/TestSchema`
                                                       |
-| [ClickHouse](/docs/6.0.0/configuration/databases#clickhouse)                 
 | `pip install clickhouse-connect`                                             
      | `clickhousedb://{username}:{password}@{hostname}:{port}/{database}`     
                                                                               |
-| [CockroachDB](/docs/6.0.0/configuration/databases#cockroachdb)               
 | `pip install cockroachdb`                                                    
      | `cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable`       
                                                                               |
-| [Couchbase](/docs/6.0.0/configuration/databases#couchbase)                | 
`pip install couchbase-sqlalchemy`                                              
            | 
`couchbase://{username}:{password}@{hostname}:{port}?truststorepath={ssl 
certificate path}`                                                              
                        |
-| [CrateDB](/docs/6.0.0/configuration/databases#cratedb)                       
 | `pip install sqlalchemy-cratedb`                                             
      | `crate://{username}:{password}@{hostname}:{port}`, often useful: 
`?ssl=true/false` or `?schema=testdrive`.                                       
      |
-| [Denodo](/docs/6.0.0/configuration/databases#denodo)                         
 | `pip install denodo-sqlalchemy`                                              
      | `denodo://{username}:{password}@{hostname}:{port}/{database}`           
                                                                               |
-| [Dremio](/docs/6.0.0/configuration/databases#dremio)                         
 | `pip install sqlalchemy_dremio`                                              
      |`dremio+flight://{username}:{password}@{host}:32010`, often useful: 
`?UseEncryption=true/false`. For Legacy ODBC: 
`dremio+pyodbc://{username}:{password}@{host}:31010`                            
                                                                                
               |
-| [Elasticsearch](/docs/6.0.0/configuration/databases#elasticsearch)           
 | `pip install elasticsearch-dbapi`                                            
      | `elasticsearch+http://{user}:{password}@{host}:9200/`                   
                                                                               |
-| [Exasol](/docs/6.0.0/configuration/databases#exasol)                         
 | `pip install sqlalchemy-exasol`                                              
      | 
`exa+pyodbc://{username}:{password}@{hostname}:{port}/my_schema?CONNECTIONLCALL=en_US.UTF-8&driver=EXAODBC`
                                            |
-| [Google BigQuery](/docs/6.0.0/configuration/databases#google-bigquery)       
              | `pip install sqlalchemy-bigquery`                               
                   | `bigquery://{project_id}`                                  
                                                                                
            |
-| [Google Sheets](/docs/6.0.0/configuration/databases#google-sheets)           
 | `pip install shillelagh[gsheetsapi]`                                         
      | `gsheets://`                                                            
                                                                               |
-| [Firebolt](/docs/6.0.0/configuration/databases#firebolt)                     
 | `pip install firebolt-sqlalchemy`                                            
      | 
`firebolt://{client_id}:{client_secret}@{database}/{engine_name}?account_name={name}`
                                                                  |
-| [Hologres](/docs/6.0.0/configuration/databases#hologres)                     
 | `pip install psycopg2`                                                       
      | `postgresql+psycopg2://<UserName>:<DBPassword>@<Database 
Host>/<Database Name>`                                                          
              |
-| [IBM Db2](/docs/6.0.0/configuration/databases#ibm-db2)                       
 | `pip install ibm_db_sa`                                                      
      | `db2+ibm_db://`                                                         
                                                                               |
-| [IBM Netezza Performance 
Server](/docs/6.0.0/configuration/databases#ibm-netezza-performance-server) | 
`pip install nzalchemy`                                                         
   | `netezza+nzpy://<UserName>:<DBPassword>@<Database Host>/<Database Name>`   
                                                                            |
-| [MySQL](/docs/6.0.0/configuration/databases#mysql)                           
 | `pip install mysqlclient`                                                    
      | `mysql://<UserName>:<DBPassword>@<Database Host>/<Database Name>`       
                                                                               |
-| [OceanBase](/docs/6.0.0/configuration/databases#oceanbase)                   
 | `pip install oceanbase_py`                                                   
      | `oceanbase://<UserName>:<DBPassword>@<Database Host>/<Database Name>`   
                                                                                
   |
-| [Oracle](/docs/6.0.0/configuration/databases#oracle)                         
 | `pip install cx_Oracle`                                                      
      | `oracle://<username>:<password>@<hostname>:<port>`                      
                                                                                
                                      |
-| [Parseable](/docs/6.0.0/configuration/databases#parseable)                   
 | `pip install sqlalchemy-parseable`                                           
      | `parseable://<UserName>:<DBPassword>@<Database Host>/<Stream Name>`     
                                                                               |
-| [PostgreSQL](/docs/6.0.0/configuration/databases#postgres)                   
 | `pip install psycopg2`                                                       
      | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>`  
                                                                               |
-| [Presto](/docs/6.0.0/configuration/databases#presto)                         
 | `pip install pyhive`                                                         
      | `presto://{username}:{password}@{hostname}:{port}/{database}`           
                                                                                
                                                 |
-| [SAP Hana](/docs/6.0.0/configuration/databases#hana) | `pip install hdbcli 
sqlalchemy-hana` or `pip install apache_superset[hana]` | 
`hana://{username}:{password}@{host}:{port}` |
-| [SingleStore](/docs/6.0.0/configuration/databases#singlestore)               
 | `pip install sqlalchemy-singlestoredb`                                       
        | `singlestoredb://{username}:{password}@{host}:{port}/{database}`      
                                                                               |
-| [StarRocks](/docs/6.0.0/configuration/databases#starrocks)                   
 | `pip install starrocks`                                                      
      | `starrocks://<User>:<Password>@<Host>:<Port>/<Catalog>.<Database>`      
                                                                               |
-| [Snowflake](/docs/6.0.0/configuration/databases#snowflake)                   
 | `pip install snowflake-sqlalchemy`                                           
      | 
`snowflake://{user}:{password}@{account}.{region}/{database}?role={role}&warehouse={warehouse}`
                                                        |
+| [AWS Athena](/user-docs/6.0.0/configuration/databases#aws-athena)            
       | `pip install pyathena[pandas]` , `pip install PyAthenaJDBC`            
            | 
`awsathena+rest://{access_key_id}:{access_key}@athena.{region}.amazonaws.com/{schema}?s3_staging_dir={s3_staging_dir}&...`
   |
+| [AWS DynamoDB](/user-docs/6.0.0/configuration/databases#aws-dynamodb)        
       | `pip install pydynamodb`                                               
            | 
`dynamodb://{access_key_id}:{secret_access_key}@dynamodb.{region_name}.amazonaws.com?connector=superset`
                                               |
+| [AWS Redshift](/user-docs/6.0.0/configuration/databases#aws-redshift)        
       | `pip install sqlalchemy-redshift`                                      
            | `redshift+psycopg2://<userName>:<DBPassword>@<AWS End 
Point>:5439/<Database Name>`                                                    
                |
+| [Apache Doris](/user-docs/6.0.0/configuration/databases#apache-doris)        
             | `pip install pydoris`                                            
                  | 
`doris://<User>:<Password>@<Host>:<Port>/<Catalog>.<Database>`                  
                          |
+| [Apache Drill](/user-docs/6.0.0/configuration/databases#apache-drill)        
             | `pip install sqlalchemy-drill`                                   
                  | 
`drill+sadrill://<username>:<password>@<host>:<port>/<storage_plugin>`, often 
useful: `?use_ssl=True/False`                                                   
                                                           |
+| [Apache Druid](/user-docs/6.0.0/configuration/databases#apache-druid)        
             | `pip install pydruid`                                            
                  | 
`druid://<User>:<password>@<Host>:<Port-default-9088>/druid/v2/sql`             
                                                                       |
+| [Apache Hive](/user-docs/6.0.0/configuration/databases#hive)                 
      | `pip install pyhive`                                                    
           | `hive://hive@{hostname}:{port}/{database}`                         
                                                                                
    |
+| [Apache Impala](/user-docs/6.0.0/configuration/databases#apache-impala)      
             | `pip install impyla`                                             
                  | `impala://{hostname}:{port}/{database}`                     
                                                                                
           |
+| [Apache Kylin](/user-docs/6.0.0/configuration/databases#apache-kylin)        
             | `pip install kylinpy`                                            
                  | 
`kylin://<username>:<password>@<hostname>:<port>/<project>?<param1>=<value1>&<param2>=<value2>`
                                                        |
+| [Apache Pinot](/user-docs/6.0.0/configuration/databases#apache-pinot)        
             | `pip install pinotdb`                                            
                  | `pinot://BROKER:5436/query?server=http://CONTROLLER:5983/`  
                                                                                
           |
+| [Apache Solr](/user-docs/6.0.0/configuration/databases#apache-solr)          
             | `pip install sqlalchemy-solr`                                    
                  | 
`solr://{username}:{password}@{hostname}:{port}/{server_path}/{collection}`     
                                                                       |
+| [Apache Spark 
SQL](/user-docs/6.0.0/configuration/databases#apache-spark-sql)             | 
`pip install pyhive`                                                            
   | `hive://hive@{hostname}:{port}/{database}`                                 
                                                                            |
+| [Ascend.io](/user-docs/6.0.0/configuration/databases#ascendio)               
        | `pip install impyla`                                                  
             | 
`ascend://{username}:{password}@{hostname}:{port}/{database}?auth_mechanism=PLAIN;use_ssl=true`
                                                        |
+| [Azure MS SQL](/user-docs/6.0.0/configuration/databases#sql-server)          
      | `pip install pymssql`                                                   
           | 
`mssql+pymssql://UserName@presetSQL:[email protected]:1433/TestSchema`
                                                       |
+| [ClickHouse](/user-docs/6.0.0/configuration/databases#clickhouse)            
      | `pip install clickhouse-connect`                                        
           | 
`clickhousedb://{username}:{password}@{hostname}:{port}/{database}`             
                                                                       |
+| [CockroachDB](/user-docs/6.0.0/configuration/databases#cockroachdb)          
      | `pip install cockroachdb`                                               
           | `cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable`  
                                                                                
    |
+| [Couchbase](/user-docs/6.0.0/configuration/databases#couchbase)              
  | `pip install couchbase-sqlalchemy`                                          
                | 
`couchbase://{username}:{password}@{hostname}:{port}?truststorepath={ssl 
certificate path}`                                                              
                        |
+| [CrateDB](/user-docs/6.0.0/configuration/databases#cratedb)                  
      | `pip install sqlalchemy-cratedb`                                        
           | `crate://{username}:{password}@{hostname}:{port}`, often useful: 
`?ssl=true/false` or `?schema=testdrive`.                                       
      |
+| [Denodo](/user-docs/6.0.0/configuration/databases#denodo)                    
      | `pip install denodo-sqlalchemy`                                         
           | `denodo://{username}:{password}@{hostname}:{port}/{database}`      
                                                                                
    |
+| [Dremio](/user-docs/6.0.0/configuration/databases#dremio)                    
      | `pip install sqlalchemy_dremio`                                         
           |`dremio+flight://{username}:{password}@{host}:32010`, often useful: 
`?UseEncryption=true/false`. For Legacy ODBC: 
`dremio+pyodbc://{username}:{password}@{host}:31010`                            
                                                                                
               |
+| [Elasticsearch](/user-docs/6.0.0/configuration/databases#elasticsearch)      
      | `pip install elasticsearch-dbapi`                                       
           | `elasticsearch+http://{user}:{password}@{host}:9200/`              
                                                                                
    |
+| [Exasol](/user-docs/6.0.0/configuration/databases#exasol)                    
      | `pip install sqlalchemy-exasol`                                         
           | 
`exa+pyodbc://{username}:{password}@{hostname}:{port}/my_schema?CONNECTIONLCALL=en_US.UTF-8&driver=EXAODBC`
                                            |
+| [Google BigQuery](/user-docs/6.0.0/configuration/databases#google-bigquery)  
                   | `pip install sqlalchemy-bigquery`                          
                        | `bigquery://{project_id}`                             
                                                                                
                 |
+| [Google Sheets](/user-docs/6.0.0/configuration/databases#google-sheets)      
      | `pip install shillelagh[gsheetsapi]`                                    
           | `gsheets://`                                                       
                                                                                
    |
+| [Firebolt](/user-docs/6.0.0/configuration/databases#firebolt)                
      | `pip install firebolt-sqlalchemy`                                       
           | 
`firebolt://{client_id}:{client_secret}@{database}/{engine_name}?account_name={name}`
                                                                  |
+| [Hologres](/user-docs/6.0.0/configuration/databases#hologres)                
      | `pip install psycopg2`                                                  
           | `postgresql+psycopg2://<UserName>:<DBPassword>@<Database 
Host>/<Database Name>`                                                          
              |
+| [IBM Db2](/user-docs/6.0.0/configuration/databases#ibm-db2)                  
      | `pip install ibm_db_sa`                                                 
           | `db2+ibm_db://`                                                    
                                                                                
    |
+| [IBM Netezza Performance 
Server](/user-docs/6.0.0/configuration/databases#ibm-netezza-performance-server)
 | `pip install nzalchemy`                                                      
      | `netezza+nzpy://<UserName>:<DBPassword>@<Database Host>/<Database 
Name>`                                                                          
     |
+| [MySQL](/user-docs/6.0.0/configuration/databases#mysql)                      
      | `pip install mysqlclient`                                               
           | `mysql://<UserName>:<DBPassword>@<Database Host>/<Database Name>`  
                                                                                
    |
+| [OceanBase](/user-docs/6.0.0/configuration/databases#oceanbase)              
      | `pip install oceanbase_py`                                              
           | `oceanbase://<UserName>:<DBPassword>@<Database Host>/<Database 
Name>`                                                                          
            |
+| [Oracle](/user-docs/6.0.0/configuration/databases#oracle)                    
      | `pip install cx_Oracle`                                                 
           | `oracle://<username>:<password>@<hostname>:<port>`                 
                                                                                
                                           |
+| [Parseable](/user-docs/6.0.0/configuration/databases#parseable)              
      | `pip install sqlalchemy-parseable`                                      
           | `parseable://<UserName>:<DBPassword>@<Database Host>/<Stream 
Name>`                                                                          
          |
+| [PostgreSQL](/user-docs/6.0.0/configuration/databases#postgres)              
      | `pip install psycopg2`                                                  
           | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database 
Name>`                                                                          
       |
+| [Presto](/user-docs/6.0.0/configuration/databases#presto)                    
      | `pip install pyhive`                                                    
           | `presto://{username}:{password}@{hostname}:{port}/{database}`      
                                                                                
                                                      |
+| [SAP Hana](/user-docs/6.0.0/configuration/databases#hana) | `pip install 
hdbcli sqlalchemy-hana` or `pip install apache_superset[hana]` | 
`hana://{username}:{password}@{host}:{port}` |
+| [SingleStore](/user-docs/6.0.0/configuration/databases#singlestore)          
      | `pip install sqlalchemy-singlestoredb`                                  
             | `singlestoredb://{username}:{password}@{host}:{port}/{database}` 
                                                                                
    |
+| [StarRocks](/user-docs/6.0.0/configuration/databases#starrocks)              
      | `pip install starrocks`                                                 
           | `starrocks://<User>:<Password>@<Host>:<Port>/<Catalog>.<Database>` 
                                                                                
    |
+| [Snowflake](/user-docs/6.0.0/configuration/databases#snowflake)              
      | `pip install snowflake-sqlalchemy`                                      
           | 
`snowflake://{user}:{password}@{account}.{region}/{database}?role={role}&warehouse={warehouse}`
                                                        |
 | SQLite                                                    | No additional 
library needed                                                       | 
`sqlite://path/to/file.db?check_same_thread=false`                              
                                                                       |
-| [SQL Server](/docs/6.0.0/configuration/databases#sql-server)                 
 | `pip install pymssql`                                                        
      | 
`mssql+pymssql://<Username>:<Password>@<Host>:<Port-default:1433>/<Database 
Name>`                                                                          
                                                           |
-| [TDengine](/docs/6.0.0/configuration/databases#tdengine)                     
 | `pip install taospy`  `pip install taos-ws-py`                               
      | `taosws://<user>:<password>@<host>:<port>`                              
                                                                               |
-| [Teradata](/docs/6.0.0/configuration/databases#teradata)                     
 | `pip install teradatasqlalchemy`                                             
      | `teradatasql://{user}:{password}@{host}`                                
                                                                               |
-| [TimescaleDB](/docs/6.0.0/configuration/databases#timescaledb)               
 | `pip install psycopg2`                                                       
      | `postgresql://<UserName>:<DBPassword>@<Database Host>:<Port>/<Database 
Name>`                                                                          
|
-| [Trino](/docs/6.0.0/configuration/databases#trino)                           
 | `pip install trino`                                                          
      | `trino://{username}:{password}@{hostname}:{port}/{catalog}`             
                                                                               |
-| [Vertica](/docs/6.0.0/configuration/databases#vertica)                       
 | `pip install sqlalchemy-vertica-python`                                      
      | `vertica+vertica_python://<UserName>:<DBPassword>@<Database 
Host>/<Database Name>`                                                          
           |
-| [YDB](/docs/6.0.0/configuration/databases#ydb)                               
 | `pip install ydb-sqlalchemy`                                                 
      | `ydb://{host}:{port}/{database_name}`                                   
                                                                               |
-| [YugabyteDB](/docs/6.0.0/configuration/databases#yugabytedb)                 
 | `pip install psycopg2`                                                       
      | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>`  
                                                                               |
+| [SQL Server](/user-docs/6.0.0/configuration/databases#sql-server)            
      | `pip install pymssql`                                                   
           | 
`mssql+pymssql://<Username>:<Password>@<Host>:<Port-default:1433>/<Database 
Name>`                                                                          
                                                           |
+| [TDengine](/user-docs/6.0.0/configuration/databases#tdengine)                
      | `pip install taospy`  `pip install taos-ws-py`                          
           | `taosws://<user>:<password>@<host>:<port>`                         
                                                                                
    |
+| [Teradata](/user-docs/6.0.0/configuration/databases#teradata)                
      | `pip install teradatasqlalchemy`                                        
           | `teradatasql://{user}:{password}@{host}`                           
                                                                                
    |
+| [TimescaleDB](/user-docs/6.0.0/configuration/databases#timescaledb)          
      | `pip install psycopg2`                                                  
           | `postgresql://<UserName>:<DBPassword>@<Database 
Host>:<Port>/<Database Name>`                                                   
                       |
+| [Trino](/user-docs/6.0.0/configuration/databases#trino)                      
      | `pip install trino`                                                     
           | `trino://{username}:{password}@{hostname}:{port}/{catalog}`        
                                                                                
    |
+| [Vertica](/user-docs/6.0.0/configuration/databases#vertica)                  
      | `pip install sqlalchemy-vertica-python`                                 
           | `vertica+vertica_python://<UserName>:<DBPassword>@<Database 
Host>/<Database Name>`                                                          
           |
+| [YDB](/user-docs/6.0.0/configuration/databases#ydb)                          
      | `pip install ydb-sqlalchemy`                                            
           | `ydb://{host}:{port}/{database_name}`                              
                                                                                
    |
+| [YugabyteDB](/user-docs/6.0.0/configuration/databases#yugabytedb)            
      | `pip install psycopg2`                                                  
           | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database 
Name>`                                                                          
       |
 
 ---
 
@@ -109,7 +109,7 @@ The connector library installation process is the same for 
all additional librar
 
 #### 1. Determine the driver you need
 
-Consult the [list of database drivers](/docs/6.0.0/configuration/databases)
+Consult the [list of database 
drivers](/user-docs/6.0.0/configuration/databases)
 and find the PyPI package needed to connect to your database. In this example, 
we're connecting
 to a MySQL database, so we'll need the `mysqlclient` connector library.
 
@@ -165,11 +165,11 @@ to your database via the Superset web UI.
 
 As an admin user, go to Settings -> Data: Database Connections and click the 
+DATABASE button.
 From there, follow the steps on the
-[Using Database Connection UI 
page](/docs/6.0.0/configuration/databases#connecting-through-the-ui).
+[Using Database Connection UI 
page](/user-docs/6.0.0/configuration/databases#connecting-through-the-ui).
 
 Consult the page for your specific database type in the Superset documentation 
to determine
 the connection string and any other parameters you need to input.  For 
instance,
-on the [MySQL page](/docs/6.0.0/configuration/databases#mysql), we see that 
the connection string
+on the [MySQL page](/user-docs/6.0.0/configuration/databases#mysql), we see 
that the connection string
 to a local MySQL database differs depending on whether the setup is running on 
Linux or Mac.
 
 Click the “Test Connection” button, which should result in a popup message 
saying,
@@ -407,7 +407,7 @@ this:
 crate://<username>:<password>@<clustername>.cratedb.net:4200/?ssl=true
 ```
 
-Follow the steps 
[here](/docs/6.0.0/configuration/databases#installing-database-drivers)
+Follow the steps 
[here](/user-docs/6.0.0/configuration/databases#installing-database-drivers)
 to install the CrateDB connector package when setting up Superset locally using
 Docker Compose.
 
@@ -782,7 +782,7 @@ The recommended connector library for BigQuery is
 
 ##### Install BigQuery Driver
 
-Follow the steps 
[here](/docs/6.0.0/configuration/databases#installing-drivers-in-docker-images) 
about how to
+Follow the steps 
[here](/user-docs/6.0.0/configuration/databases#installing-drivers-in-docker-images)
 about how to
 install new database drivers when setting up Superset locally via docker 
compose.
 
 ```bash
@@ -1177,7 +1177,7 @@ 
risingwave://root@{hostname}:{port}/{database}?sslmode=disable
 
 ##### Install Snowflake Driver
 
-Follow the steps 
[here](/docs/6.0.0/configuration/databases#installing-database-drivers) about 
how to
+Follow the steps 
[here](/user-docs/6.0.0/configuration/databases#installing-database-drivers) 
about how to
 install new database drivers when setting up Superset locally via docker 
compose.
 
 ```bash
diff --git 
a/docs/versioned_docs/version-6.0.0/configuration/networking-settings.mdx 
b/docs/versioned_docs/version-6.0.0/configuration/networking-settings.mdx
index d26d87382a3..abdea435e0d 100644
--- a/docs/versioned_docs/version-6.0.0/configuration/networking-settings.mdx
+++ b/docs/versioned_docs/version-6.0.0/configuration/networking-settings.mdx
@@ -51,7 +51,7 @@ Restart Superset for this configuration change to take effect.
 
 #### Making a Dashboard Public
 
-1. Add the `'DASHBOARD_RBAC': True` [Feature 
Flag](/docs/6.0.0/configuration/feature-flags) to `superset_config.py`
+1. Add the `'DASHBOARD_RBAC': True` [Feature 
Flag](/user-docs/6.0.0/configuration/configuring-superset#feature-flags) to 
`superset_config.py`
 2. Add the `Public` role to your dashboard as described 
[here](https://superset.apache.org/docs/using-superset/creating-your-first-dashboard/#manage-access-to-dashboards)
 
 #### Embedding a Public Dashboard
diff --git a/docs/versioned_docs/version-6.0.0/configuration/sql-templating.mdx 
b/docs/versioned_docs/version-6.0.0/configuration/sql-templating.mdx
index 9af4f61dbbe..500bad6fb3d 100644
--- a/docs/versioned_docs/version-6.0.0/configuration/sql-templating.mdx
+++ b/docs/versioned_docs/version-6.0.0/configuration/sql-templating.mdx
@@ -10,7 +10,7 @@ version: 1
 ## Jinja Templates
 
 SQL Lab and Explore supports [Jinja 
templating](https://jinja.palletsprojects.com/en/2.11.x/) in queries.
-To enable templating, the `ENABLE_TEMPLATE_PROCESSING` [feature 
flag](/docs/6.0.0/configuration/configuring-superset#feature-flags) needs to be 
enabled in
+To enable templating, the `ENABLE_TEMPLATE_PROCESSING` [feature 
flag](/user-docs/6.0.0/configuration/configuring-superset#feature-flags) needs 
to be enabled in
 `superset_config.py`. When templating is enabled, python code can be embedded 
in virtual datasets and
 in Custom SQL in the filter and metric controls in Explore. By default, the 
following variables are
 made available in the Jinja context:
diff --git a/docs/versioned_docs/version-6.0.0/configuration/timezones.mdx 
b/docs/versioned_docs/version-6.0.0/configuration/timezones.mdx
index d27901970dd..920e0a00e94 100644
--- a/docs/versioned_docs/version-6.0.0/configuration/timezones.mdx
+++ b/docs/versioned_docs/version-6.0.0/configuration/timezones.mdx
@@ -20,7 +20,7 @@ To help make the problem somewhat tractable—given that Apache 
Superset has no
 
 To strive for data consistency (regardless of the timezone of the client) the 
Apache Superset backend tries to ensure that any timestamp sent to the client 
has an explicit (or semi-explicit as in the case with [Epoch 
time](https://en.wikipedia.org/wiki/Unix_time) which is always in reference to 
UTC) timezone encoded within.
 
-The challenge however lies with the slew of [database 
engines](/docs/6.0.0/configuration/databases#installing-drivers-in-docker-images)
 which Apache Superset supports and various inconsistencies between their 
[Python Database API (DB-API)](https://www.python.org/dev/peps/pep-0249/) 
implementations combined with the fact that we use 
[Pandas](https://pandas.pydata.org/) to read SQL into a DataFrame prior to 
serializing to JSON. Regrettably Pandas ignores the DB-API 
[type_code](https://www. [...]
+The challenge however lies with the slew of [database 
engines](/user-docs/6.0.0/configuration/databases#installing-drivers-in-docker-images)
 which Apache Superset supports and various inconsistencies between their 
[Python Database API (DB-API)](https://www.python.org/dev/peps/pep-0249/) 
implementations combined with the fact that we use 
[Pandas](https://pandas.pydata.org/) to read SQL into a DataFrame prior to 
serializing to JSON. Regrettably Pandas ignores the DB-API [type_code](https:/ 
[...]
 
 For example the following is a comparison of MySQL and Presto,
 
diff --git a/docs/versioned_docs/version-6.0.0/contributing/contributing.mdx 
b/docs/versioned_docs/version-6.0.0/contributing/contributing.mdx
index c151eb28b7c..607fed1b24d 100644
--- a/docs/versioned_docs/version-6.0.0/contributing/contributing.mdx
+++ b/docs/versioned_docs/version-6.0.0/contributing/contributing.mdx
@@ -77,7 +77,7 @@ Look through the GitHub issues. Issues tagged with
 Superset could always use better documentation,
 whether as part of the official Superset docs,
 in docstrings, `docs/*.rst` or even on the web as blog posts or
-articles. See 
[Documentation](/docs/6.0.0/contributing/howtos#contributing-to-documentation) 
for more details.
+articles. See 
[Documentation](/user-docs/6.0.0/contributing/howtos#contributing-to-documentation)
 for more details.
 
 ### Add Translations
 
diff --git a/docs/versioned_docs/version-6.0.0/contributing/development.mdx 
b/docs/versioned_docs/version-6.0.0/contributing/development.mdx
index afe11139957..3c12088d8ae 100644
--- a/docs/versioned_docs/version-6.0.0/contributing/development.mdx
+++ b/docs/versioned_docs/version-6.0.0/contributing/development.mdx
@@ -599,7 +599,7 @@ export enum FeatureFlag {
 those specified under FEATURE_FLAGS in `superset_config.py`. For example, 
`DEFAULT_FEATURE_FLAGS = { 'FOO': True, 'BAR': False }` in `superset/config.py` 
and `FEATURE_FLAGS = { 'BAR': True, 'BAZ': True }` in `superset_config.py` will 
result
 in combined feature flags of `{ 'FOO': True, 'BAR': True, 'BAZ': True }`.
 
-The current status of the usability of each flag (stable vs testing, etc) can 
be found in the [Feature Flags](/docs/6.0.0/configuration/feature-flags) 
documentation.
+The current status of the usability of each flag (stable vs testing, etc) can 
be found in the [Feature 
Flags](/user-docs/6.0.0/configuration/configuring-superset#feature-flags) 
documentation.
 
 ## Git Hooks
 
@@ -614,7 +614,7 @@ A series of checks will now run when you make a git commit.
 
 ## Linting
 
-See [how tos](/docs/6.0.0/contributing/howtos#linting)
+See [how tos](/user-docs/6.0.0/contributing/howtos#linting)
 
 ## GitHub Actions and `act`
 
diff --git a/docs/versioned_docs/version-6.0.0/contributing/guidelines.mdx 
b/docs/versioned_docs/version-6.0.0/contributing/guidelines.mdx
index 26861553469..a6d609744d6 100644
--- a/docs/versioned_docs/version-6.0.0/contributing/guidelines.mdx
+++ b/docs/versioned_docs/version-6.0.0/contributing/guidelines.mdx
@@ -57,7 +57,7 @@ Finally, never submit a PR that will put master branch in 
broken state. If the P
     in `requirements.txt` pinned to a specific version which ensures that the 
application
     build is deterministic.
   - For TypeScript/JavaScript, include new libraries in `package.json`
-- **Tests:** The pull request should include tests, either as doctests, unit 
tests, or both. Make sure to resolve all errors and test failures. See 
[Testing](/docs/6.0.0/contributing/howtos#testing) for how to run tests.
+- **Tests:** The pull request should include tests, either as doctests, unit 
tests, or both. Make sure to resolve all errors and test failures. See 
[Testing](/user-docs/6.0.0/contributing/howtos#testing) for how to run tests.
 - **Documentation:** If the pull request adds functionality, the docs should 
be updated as part of the same PR.
 - **CI:** Reviewers will not review the code until all CI tests are passed. 
Sometimes there can be flaky tests. You can close and open PR to re-run CI 
test. Please report if the issue persists. After the CI fix has been deployed 
to `master`, please rebase your PR.
 - **Code coverage:** Please ensure that code coverage does not decrease.
diff --git a/docs/versioned_docs/version-6.0.0/faq.mdx 
b/docs/versioned_docs/version-6.0.0/faq.mdx
index 3a3b57f82b8..cbd4da1edca 100644
--- a/docs/versioned_docs/version-6.0.0/faq.mdx
+++ b/docs/versioned_docs/version-6.0.0/faq.mdx
@@ -51,11 +51,11 @@ multiple tables as long as your database account has access 
to the tables.
 ## How do I create my own visualization?
 
 We recommend reading the instructions in
-[Creating Visualization 
Plugins](/docs/6.0.0/contributing/howtos#creating-visualization-plugins).
+[Creating Visualization 
Plugins](/user-docs/6.0.0/contributing/howtos#creating-visualization-plugins).
 
 ## Can I upload and visualize CSV data?
 
-Absolutely! Read the instructions [here](/docs/using-superset/exploring-data) 
to learn
+Absolutely! Read the instructions 
[here](/user-docs/using-superset/exploring-data) to learn
 how to enable and use CSV upload.
 
 ## Why are my queries timing out?
@@ -142,7 +142,7 @@ SQLALCHEMY_DATABASE_URI = 
'sqlite:////new/location/superset.db?check_same_thread
 ```
 
 You can read more about customizing Superset using the configuration file
-[here](/docs/6.0.0/configuration/configuring-superset).
+[here](/user-docs/6.0.0/configuration/configuring-superset).
 
 ## What if the table schema changed?
 
@@ -157,7 +157,7 @@ table afterwards to configure the Columns tab, check the 
appropriate boxes and s
 
 To clarify, the database backend is an OLTP database used by Superset to store 
its internal
 information like your list of users and dashboard definitions. While Superset 
supports a
-[variety of databases as data 
_sources_](/docs/6.0.0/configuration/databases#installing-database-drivers),
+[variety of databases as data 
_sources_](/user-docs/6.0.0/configuration/databases#installing-database-drivers),
 only a few database engines are supported for use as the OLTP backend / 
metadata store.
 
 Superset is tested using MySQL, PostgreSQL, and SQLite backends. It’s 
recommended you install
@@ -190,7 +190,7 @@ second etc). Example:
 
 ## Does Superset work with [insert database engine here]?
 
-The [Connecting to Databases section](/docs/6.0.0/configuration/databases) 
provides the best
+The [Connecting to Databases 
section](/user-docs/6.0.0/configuration/databases) provides the best
 overview for supported databases. Database engines not listed on that page may 
work too. We rely on
 the community to contribute to this knowledge base.
 
@@ -226,7 +226,7 @@ are typical in basic SQL:
 ## Does Superset offer a public API?
 
 Yes, a public REST API, and the surface of that API formal is expanding 
steadily. You can read more about this API and
-interact with it using Swagger [here](/docs/api).
+interact with it using Swagger [here](/developer-docs/api).
 
 Some of the
 original vision for the collection of endpoints under **/api/v1** was 
originally specified in
@@ -266,7 +266,7 @@ Superset uses [Scarf](https://about.scarf.sh/) by default 
to collect basic telem
 We use the [Scarf Gateway](https://docs.scarf.sh/gateway/) to sit in front of 
container registries, the [scarf-js](https://about.scarf.sh/package-sdks) 
package to track `npm` installations, and a Scarf pixel to gather anonymous 
analytics on Superset page views.
 Scarf purges PII and provides aggregated statistics. Superset users can easily 
opt out of analytics in various ways documented 
[here](https://docs.scarf.sh/gateway/#do-not-track) and 
[here](https://docs.scarf.sh/package-analytics/#as-a-user-of-a-package-using-scarf-js-how-can-i-opt-out-of-analytics).
 Superset maintainers can also opt out of telemetry data collection by setting 
the `SCARF_ANALYTICS` environment variable to `false` in the Superset container 
(or anywhere Superset/webpack are run).
-Additional opt-out instructions for Docker users are available on the [Docker 
Installation](/docs/6.0.0/installation/docker-compose) page.
+Additional opt-out instructions for Docker users are available on the [Docker 
Installation](/user-docs/6.0.0/installation/docker-compose) page.
 
 ## Does Superset have an archive panel or trash bin from which a user can 
recover deleted assets?
 
diff --git a/docs/versioned_docs/version-6.0.0/installation/architecture.mdx 
b/docs/versioned_docs/version-6.0.0/installation/architecture.mdx
index 427fc0a4e5b..92011884783 100644
--- a/docs/versioned_docs/version-6.0.0/installation/architecture.mdx
+++ b/docs/versioned_docs/version-6.0.0/installation/architecture.mdx
@@ -24,10 +24,10 @@ A Superset installation is made up of these components:
 
 The optional components above are necessary to enable these features:
 
-- [Alerts and Reports](/docs/6.0.0/configuration/alerts-reports)
-- [Caching](/docs/6.0.0/configuration/cache)
-- [Async Queries](/docs/6.0.0/configuration/async-queries-celery/)
-- [Dashboard Thumbnails](/docs/6.0.0/configuration/cache/#caching-thumbnails)
+- [Alerts and Reports](/user-docs/6.0.0/configuration/alerts-reports)
+- [Caching](/user-docs/6.0.0/configuration/cache)
+- [Async Queries](/user-docs/6.0.0/configuration/async-queries-celery/)
+- [Dashboard 
Thumbnails](/user-docs/6.0.0/configuration/cache/#caching-thumbnails)
 
 If you install with Kubernetes or Docker Compose, all of these components will 
be created.
 
@@ -59,7 +59,7 @@ The caching layer serves two main functions:
 - Store the results of queries to your data warehouse so that when a chart is 
loaded twice, it pulls from the cache the second time, speeding up the 
application and reducing load on your data warehouse.
 - Act as a message broker for the worker, enabling the Alerts & Reports, async 
queries, and thumbnail caching features.
 
-Most people use Redis for their cache, but Superset supports other options 
too. See the [cache docs](/docs/6.0.0/configuration/cache/) for more.
+Most people use Redis for their cache, but Superset supports other options 
too. See the [cache docs](/user-docs/6.0.0/configuration/cache/) for more.
 
 ### Worker and Beat
 
@@ -67,6 +67,6 @@ This is one or more workers who execute tasks like run async 
queries or take sna
 
 ## Other components
 
-Other components can be incorporated into Superset. The best place to learn 
about additional configurations is the [Configuration 
page](/docs/6.0.0/configuration/configuring-superset). For instance, you could 
set up a load balancer or reverse proxy to implement HTTPS in front of your 
Superset application, or specify a Mapbox URL to enable geospatial charts, etc.
+Other components can be incorporated into Superset. The best place to learn 
about additional configurations is the [Configuration 
page](/user-docs/6.0.0/configuration/configuring-superset). For instance, you 
could set up a load balancer or reverse proxy to implement HTTPS in front of 
your Superset application, or specify a Mapbox URL to enable geospatial charts, 
etc.
 
 Superset won't even start without certain configuration settings established, 
so it's essential to review that page.
diff --git a/docs/versioned_docs/version-6.0.0/installation/docker-compose.mdx 
b/docs/versioned_docs/version-6.0.0/installation/docker-compose.mdx
index 9727b97eaeb..030fc6ff168 100644
--- a/docs/versioned_docs/version-6.0.0/installation/docker-compose.mdx
+++ b/docs/versioned_docs/version-6.0.0/installation/docker-compose.mdx
@@ -21,7 +21,7 @@ with our [installing on 
k8s](https://superset.apache.org/docs/installation/runni
 documentation.
 :::
 
-As mentioned in our [quickstart guide](/docs/quickstart), the fastest way to 
try
+As mentioned in our [quickstart guide](/user-docs/quickstart), the fastest way 
to try
 Superset locally is using Docker Compose on a Linux or Mac OSX
 computer. Superset does not have official support for Windows. It's also the 
easiest
 way to launch a fully functioning **development environment** quickly.
diff --git 
a/docs/versioned_docs/version-6.0.0/installation/installation-methods.mdx 
b/docs/versioned_docs/version-6.0.0/installation/installation-methods.mdx
index 17f7c4f35f9..03db4c38bbb 100644
--- a/docs/versioned_docs/version-6.0.0/installation/installation-methods.mdx
+++ b/docs/versioned_docs/version-6.0.0/installation/installation-methods.mdx
@@ -9,11 +9,11 @@ import useBaseUrl from "@docusaurus/useBaseUrl";
 
 # Installation Methods
 
-How should you install Superset? Here's a comparison of the different options. 
It will help if you've first read the 
[Architecture](/docs/6.0.0/installation/architecture page to understand 
Superset's different components.
+How should you install Superset? Here's a comparison of the different options. 
It will help if you've first read the 
[Architecture](/user-docs/6.0.0/installation/architecture) page to understand 
Superset's different components.
 
 The fundamental trade-off is between you needing to do more of the detail work 
yourself vs. using a more complex deployment route that handles those details.
 
-## [Docker Compose](/docs/6.0.0/installation/docker-compose
+## [Docker Compose](/user-docs/6.0.0/installation/docker-compose)
 
 **Summary:** This takes advantage of containerization while remaining simpler 
than Kubernetes. This is the best way to try out Superset; it's also useful for 
developing & contributing back to Superset.
 
@@ -27,9 +27,9 @@ You will need to back up your metadata DB. That could mean 
backing up the servic
 
 You will also need to extend the Superset docker image. The default `lean` 
images do not contain drivers needed to access your metadata database (Postgres 
or MySQL), nor to access your data warehouse, nor the headless browser needed 
for Alerts & Reports. You could run a `-dev` image while demoing Superset, 
which has some of this, but you'll still need to install the driver for your 
data warehouse. The `-dev` images run as root, which is not recommended for 
production.
 
-Ideally you will build your own image of Superset that extends `lean`, adding 
what your deployment needs. See [Building your own production Docker 
image](/docs/6.0.0/installation/docker-builds/#building-your-own-production-docker-image).
+Ideally you will build your own image of Superset that extends `lean`, adding 
what your deployment needs. See [Building your own production Docker 
image](/user-docs/6.0.0/installation/docker-builds/#building-your-own-production-docker-image).
 
-## [Kubernetes (K8s)](/docs/6.0.0/installation/kubernetes
+## [Kubernetes (K8s)](/user-docs/6.0.0/installation/kubernetes)
 
 **Summary:** This is the best-practice way to deploy a production instance of 
Superset, but has the steepest skill requirement - someone who knows Kubernetes.
 
@@ -41,7 +41,7 @@ A K8s deployment can scale up and down based on usage and 
deploy rolling updates
 
 You will need to build your own Docker image, and back up your metadata DB, 
both as described in Docker Compose above. You'll also need to customize your 
Helm chart values and deploy and maintain your Kubernetes cluster.
 
-## [PyPI (Python)](/docs/6.0.0/installation/pypi
+## [PyPI (Python)](/user-docs/6.0.0/installation/pypi)
 
 **Summary:** This is the only method that requires no knowledge of containers. 
It requires the most hands-on work to deploy, connect, and maintain each 
component.
 
diff --git a/docs/versioned_docs/version-6.0.0/installation/kubernetes.mdx 
b/docs/versioned_docs/version-6.0.0/installation/kubernetes.mdx
index cdb0cccddd7..14e833600c3 100644
--- a/docs/versioned_docs/version-6.0.0/installation/kubernetes.mdx
+++ b/docs/versioned_docs/version-6.0.0/installation/kubernetes.mdx
@@ -149,7 +149,7 @@ For production clusters it's recommended to build own image 
with this step done
 Superset requires a Python DB-API database driver and a SQLAlchemy
 dialect to be installed for each datastore you want to connect to.
 
-See [Install Database Drivers](/docs/6.0.0/configuration/databases) for more 
information.
+See [Install Database Drivers](/user-docs/6.0.0/configuration/databases) for 
more information.
 It is recommended that you refer to versions listed in
 [pyproject.toml](https://github.com/apache/superset/blob/master/pyproject.toml)
 instead of hard-coding them in your bootstrap script, as seen below.
@@ -310,7 +310,7 @@ configOverrides:
 
 ### Enable Alerts and Reports
 
-For this, as per the [Alerts and Reports 
doc](/docs/6.0.0/configuration/alerts-reports), you will need to:
+For this, as per the [Alerts and Reports 
doc](/user-docs/6.0.0/configuration/alerts-reports), you will need to:
 
 #### Install a supported webdriver in the Celery worker
 
diff --git a/docs/versioned_docs/version-6.0.0/intro.md 
b/docs/versioned_docs/version-6.0.0/intro.md
index 841ee0f7e55..31bd74aeb49 100644
--- a/docs/versioned_docs/version-6.0.0/intro.md
+++ b/docs/versioned_docs/version-6.0.0/intro.md
@@ -172,7 +172,7 @@ how to set up a development environment.
 ## Resources
 
 - [Superset "In the 
Wild"](https://github.com/apache/superset/blob/master/RESOURCES/INTHEWILD.md) - 
open a PR to add your org to the list!
-- [Feature Flags](/docs/6.0.0/configuration/feature-flags) - the status of 
Superset's Feature Flags.
+- [Feature 
Flags](/user-docs/6.0.0/configuration/configuring-superset#feature-flags) - the 
status of Superset's Feature Flags.
 - [Standard 
Roles](https://github.com/apache/superset/blob/master/RESOURCES/STANDARD_ROLES.md)
 - How RBAC permissions map to roles.
 - [Superset Wiki](https://github.com/apache/superset/wiki) - Tons of 
additional community resources: best practices, community content and other 
information.
 - [Superset SIPs](https://github.com/orgs/apache/projects/170) - The status of 
Superset's SIPs (Superset Improvement Proposals) for both consensus and 
implementation status.
diff --git a/docs/versioned_docs/version-6.0.0/quickstart.mdx 
b/docs/versioned_docs/version-6.0.0/quickstart.mdx
index 640ebe5794b..36f1969d30c 100644
--- a/docs/versioned_docs/version-6.0.0/quickstart.mdx
+++ b/docs/versioned_docs/version-6.0.0/quickstart.mdx
@@ -15,7 +15,7 @@ Although we recommend using `Docker Compose` for a quick 
start in a sandbox-type
 environment and for other development-type use cases, **we
 do not recommend this setup for production**. For this purpose please
 refer to our
-[Installing on Kubernetes](/docs/6.0.0/installation/kubernetes/)
+[Installing on Kubernetes](/user-docs/6.0.0/installation/kubernetes/)
 page.
 :::
 
@@ -73,10 +73,10 @@ processes by running Docker Compose `stop` command. By 
doing so, you can avoid d
 
 From this point on, you can head on to:
 
-- [Create your first 
Dashboard](/docs/6.0.0/using-superset/creating-your-first-dashboard)
-- [Connect to a Database](/docs/6.0.0/configuration/databases)
-- [Using Docker Compose](/docs/6.0.0/installation/docker-compose)
-- [Configure Superset](/docs/6.0.0/configuration/configuring-superset/)
-- [Installing on Kubernetes](/docs/6.0.0/installation/kubernetes/)
+- [Create your first 
Dashboard](/user-docs/6.0.0/using-superset/creating-your-first-dashboard)
+- [Connect to a Database](/user-docs/6.0.0/configuration/databases)
+- [Using Docker Compose](/user-docs/6.0.0/installation/docker-compose)
+- [Configure Superset](/user-docs/6.0.0/configuration/configuring-superset/)
+- [Installing on Kubernetes](/user-docs/6.0.0/installation/kubernetes/)
 
 Or just explore our [Documentation](https://superset.apache.org/docs/intro)!
diff --git 
a/docs/versioned_docs/version-6.0.0/using-superset/creating-your-first-dashboard.mdx
 
b/docs/versioned_docs/version-6.0.0/using-superset/creating-your-first-dashboard.mdx
index 0ad727b9181..f15797e5b6c 100644
--- 
a/docs/versioned_docs/version-6.0.0/using-superset/creating-your-first-dashboard.mdx
+++ 
b/docs/versioned_docs/version-6.0.0/using-superset/creating-your-first-dashboard.mdx
@@ -31,7 +31,7 @@ your existing SQL-speaking database or data store.
 
 First things first, we need to add the connection credentials to your database 
to be able
 to query and visualize data from it. If you're using Superset locally via
-[Docker compose](/docs/6.0.0/installation/docker-compose), you can
+[Docker compose](/user-docs/6.0.0/installation/docker-compose), you can
 skip this step because a Postgres database, named **examples**, is included and
 pre-configured in Superset for you.
 
@@ -188,7 +188,7 @@ Access to dashboards is managed via owners (users that have 
edit permissions to
 Non-owner users access can be managed in two different ways. The dashboard 
needs to be published to be visible to other users.
 
 1. Dataset permissions - if you add to the relevant role permissions to 
datasets it automatically grants implicit access to all dashboards that uses 
those permitted datasets.
-2. Dashboard roles - if you enable [**DASHBOARD_RBAC** feature 
flag](/docs/6.0.0/configuration/configuring-superset#feature-flags) then you 
will be able to manage which roles can access the dashboard
+2. Dashboard roles - if you enable [**DASHBOARD_RBAC** feature 
flag](/user-docs/6.0.0/configuration/configuring-superset#feature-flags) then 
you will be able to manage which roles can access the dashboard
    - Granting a role access to a dashboard will bypass dataset level checks. 
Having dashboard access implicitly grants read access to all the featured 
charts in the dashboard, and thereby also all the associated datasets.
    - If no roles are specified for a dashboard, regular **Dataset 
permissions** will apply.
 

Reply via email to