Files
superset2/docs
Evan Rusackas 10f71bdcd5 fix(docs): finish bare-relative link conversion + add lint guardrail
Copilot flagged two stragglers on editors.md where the previous
file-by-file conversion stopped halfway. Sweeping for the same
pattern across the active content tree found 76 bare relative
internal links total — 14 in this PR's already-modified files
(Copilot's two plus twelve more) and 62 in unchanged files.

Why the build doesn't catch this
─────────────────────────────────
`onBrokenLinks: 'throw'` (set in this PR) only validates *file-based*
markdown references — links whose URL ends in `.md` / `.mdx`. Those
go through Docusaurus's file resolver, which can prove the target
exists. Bare relative URL paths like `[Foo](../foo)` skip that
resolver entirely; Docusaurus emits them as raw hrefs. The browser
then resolves them against the *current* page URL, and for
trailing-slash routes that almost always lands in the wrong
directory. Page navigates client-side and 404s. The linkinator job
in CI *can* catch these, but it's `continue-on-error: true` so
findings are advisory.

What this commit does
──────────────────────
1. Fix all 76 bare relative internal links across the active docs
   tree by appending `.md` to each one (preserving anchors / query
   strings). All 76 targets resolved to real files; no link
   targets changed, only the form of the reference.

2. Fix the component-page generator. 54 of the 76 bare links lived
   in two auto-generated index files (`components/ui/index.mdx`
   and `components/design-system/index.mdx`). The next regeneration
   would have undone the manual fixes without this. The two
   emission sites in `generate-superset-components.mjs` now emit
   `.md`-suffixed links; comment at the call site explains why.

3. Add `docs/scripts/lint-docs-links.mjs` — fast source-level
   linter that scans `.md`/`.mdx` files under the active content
   trees (skipping `versioned_docs/` snapshots) and fails if it
   finds any markdown link whose URL starts with `./` or `../` and
   does not end in `.md`/`.mdx`. Excludes asset paths (.png,
   .json, etc.) and ignores fenced code blocks. Wired up as
   `yarn lint:docs-links`.

4. Add a `Lint docs links` step to `superset-docs-verify.yml`,
   running before the build step so PRs that introduce the pattern
   fail in seconds rather than at build-time / not at all. Blocking,
   not advisory — exactly the gap linkinator's `continue-on-error`
   leaves open.

Verified
────────
- `yarn lint:docs-links` exits 0 on the cleaned tree
- Re-introducing one bare link makes the linter report the exact
  file:line with the offending URL, exit code 1
- All 76 originally-flagged targets resolved to real `.md` / `.mdx`
  files; only the form of the reference changed
2026-05-13 20:17:46 -07:00
..

This is the public documentation site for Superset, built using Docusaurus 3. See the Developer Docs for documentation on contributing to documentation.

Version Management

The Superset documentation site uses Docusaurus versioning with four independent sections:

  • User Documentation (/user-docs/) - End-user guides and tutorials
  • Admin Documentation (/admin-docs/) - Installation, configuration, and security
  • Developer Docs (/developer-docs/) - Developer guides, contributing, and extensions
  • Component Playground (/components/) - Interactive component examples (currently disabled)

Each section maintains its own version history and can be versioned independently.

Creating a New Version

To create a new version for any section, use the Docusaurus version command with the appropriate plugin ID or use our automated scripts:

Before You Cut

The cut snapshots whatever's on disk into a frozen historical version, including auto-generated content (database pages from superset/db_engine_specs/, API reference from static/resources/openapi.json, component pages from Storybook stories). The cut script refreshes these via generate:smart before snapshotting, but the databases.json diagnostics file needs special care to capture full detail:

  1. Canonical release cut: download the database-diagnostics artifact from a green Python-Integration run on master, place it at docs/src/data/databases.json, then run the cut script with --skip-generate to preserve it. This is what the production deploy uses and includes full Flask-context diagnostics (driver versions, feature support matrix, etc.).
  2. Local dev cut: just run the script normally. generate:smart will regenerate databases.json using your local Flask environment — accurate to whatever drivers/extras you have installed, but typically less complete than the CI artifact.
  3. No Flask available: also fine — the database generator falls back to AST parsing of engine spec files. The MDX pages are still correct; only the diagnostics JSON is leaner.

Also: confirm master CI is green, and that your local checkout matches the SHA you intend to cut from.

Using Automated Scripts (Required)

⚠️ Important: Always use these custom commands instead of the native Docusaurus commands. These scripts ensure that both the Docusaurus versioning system AND the versions-config.json file are updated correctly, AND that auto-generated content is refreshed before snapshotting.

# Main Documentation
yarn version:add:docs 1.2.0

# Admin Docs
yarn version:add:admin_docs 1.2.0

# Developer Docs
yarn version:add:developer_docs 1.2.0

# Component Playground
yarn version:add:components 1.2.0

What the script does:

  1. Refreshes auto-generated content via generate:smart (database pages, API reference, component pages).
  2. Calls yarn docusaurus docs:version (or the per-section equivalent) to snapshot the section.
  3. Freezes any data-file imports (@site/static/*.json, ../../data/*.json) into a snapshot-local _versioned_data/ dir so the historical version doesn't silently mutate when the source files change.
  4. Adjusts relative import paths (../../src/...../../../src/...) for files now one directory deeper.
  5. Updates versions-config.json and <section>_versions.json.

Do NOT use the native Docusaurus commands directly (yarn docusaurus docs:version), as they will:

  • Create version files but NOT update versions-config.json
  • Skip auto-gen refresh, freezing whatever was on disk
  • Skip data-import freezing, leaving the snapshot pointed at live data
  • Cause versions to not appear in dropdown menus
  • Require manual fixes to synchronize the configuration

Managing Versions

With Automated Scripts

The automated scripts handle all configuration updates automatically. No manual editing required!

Manual Configuration

If creating versions manually, you'll need to:

  1. Update versions-config.json (or docusaurus.config.ts if not using dynamic config):

    • Add version to onlyIncludeVersions array
    • Add version metadata to versions object
    • Update lastVersion if needed
  2. Files Created by Versioning: When a new version is created, Docusaurus generates:

    • Versioned docs folder: [section]_versioned_docs/version-X.X.X/
    • Versioned sidebars: [section]_versioned_sidebars/version-X.X.X-sidebars.json
    • Versions list: [section]_versions.json

    Note: For main docs, the prefix is omitted (e.g., versioned_docs/ instead of docs_versioned_docs/)

  3. Important: After adding a version, restart the development server to see changes:

    yarn stop
    yarn start
    

Removing a Version

# Main Documentation
yarn version:remove:docs 1.0.0

# Admin Docs
yarn version:remove:admin_docs 1.0.0

# Developer Docs
yarn version:remove:developer_docs 1.0.0

# Component Playground
yarn version:remove:components 1.0.0

Manual Removal

To manually remove a version:

  1. Delete the version folder from the appropriate location:

    • Main docs: versioned_docs/version-X.X.X/ (no prefix for main)
    • Admin Docs: admin_docs_versioned_docs/version-X.X.X/
    • Developer Docs: developer_docs_versioned_docs/version-X.X.X/
    • Components: components_versioned_docs/version-X.X.X/
  2. Delete the version metadata file:

    • Main docs: versioned_sidebars/version-X.X.X-sidebars.json (no prefix)
    • Admin Docs: admin_docs_versioned_sidebars/version-X.X.X-sidebars.json
    • Developer Docs: developer_docs_versioned_sidebars/version-X.X.X-sidebars.json
    • Components: components_versioned_sidebars/version-X.X.X-sidebars.json
  3. Update the versions list file:

    • Main docs: versions.json
    • Admin Docs: admin_docs_versions.json
    • Developer Docs: developer_docs_versions.json
    • Components: components_versions.json
  4. Update configuration:

    • If using dynamic config: Update versions-config.json
    • If using static config: Update docusaurus.config.ts
  5. Restart the server to see changes

Version Configuration Examples

Main Documentation (default plugin)

docs: {
  includeCurrentVersion: true,
  lastVersion: 'current',  // Makes /docs/ show Next version
  onlyIncludeVersions: ['current', '1.1.0', '1.0.0'],
  versions: {
    current: {
      label: 'Next',
      path: '',  // Empty path for default routing
      banner: 'unreleased',
    },
    '1.1.0': {
      label: '1.1.0',
      path: '1.1.0',
      banner: 'none',
    },
  },
}

Developer Docs & Components (custom plugins)

{
  id: 'developer_docs',
  path: 'developer_docs',
  routeBasePath: 'developer-docs',
  includeCurrentVersion: true,
  lastVersion: '1.1.0',  // Default version
  onlyIncludeVersions: ['current', '1.1.0', '1.0.0'],
  versions: {
    current: {
      label: 'Next',
      path: 'next',
      banner: 'unreleased',
    },
    '1.1.0': {
      label: '1.1.0',
      path: '1.1.0',
      banner: 'none',
    },
  },
}

Best Practices

  1. Version naming: Use semantic versioning (e.g., 1.0.0, 1.1.0, 2.0.0)
  2. Version banners: Use 'unreleased' for development versions, 'none' for stable releases
  3. Limit displayed versions: Use onlyIncludeVersions to show only relevant versions
  4. Test locally: Always test version changes locally before deploying
  5. Independent versioning: Each section can have different version numbers and release cycles

Troubleshooting

Version Not Showing After Creation

If you accidentally used yarn docusaurus docs:version instead of yarn version:add:

  1. Problem: The version files were created but versions-config.json wasn't updated
  2. Solution: Either:
    • Revert the changes: git restore versions.json && rm -rf versioned_docs/ versioned_sidebars/
    • Then use the correct command: yarn version:add:docs <version>

For other issues:

  • Restart the server: Changes to version configuration require a server restart
  • Check config file: Ensure versions-config.json includes the new version
  • Verify files exist: Check that versioned docs folder was created

When creating a new version, links in the documentation are preserved as-is. Common issues:

  • Cross-section links: Links between sections (e.g., from developer_docs to docs) need to be version-aware
  • Absolute vs relative paths: Use relative paths within the same section
  • Version-specific URLs: Update hardcoded URLs to use version variables

To fix broken links:

  1. Use type: 'doc' with docId for version-aware navigation in navbar
  2. Use relative paths within the same documentation section
  3. Test all versions after creation to identify broken links