docs: align master with current docs branch#2178
docs: align master with current docs branch#2178devin-ai-integration[bot] wants to merge 931 commits intomasterfrom
Conversation
* snowflake docs: change to include key-pair configuration * small fix * small fix * also refer to private key in CLI docs
Add an MCP section to the docs homepage
* change docs to match dbt fusion * fix broken links * change comment * add a mintlify hook that works * dbt-fusion: initial page * dbt-fusion page in docs side tree * troubleshooting fixes * dbt fusion guide - add more details about upgrading from dbt-core * dbt-fusion: docs fixes
- Convert all <Snippet file="..."> usage to ES6 import statements - Update 124 files across the documentation - Use PascalCase component names derived from filenames - Maintain absolute paths starting with /snippets/ - Preserve all existing content and functionality This migration aligns with Mintlify's recommended snippet syntax for better developer experience and standard React/JSX conventions.
- Update all import statements to use correct _snippets directory - Fix 123 files with incorrect import paths - Ensure local documentation can find snippet files correctly
- Rename _snippets directory to snippets to match Mintlify expectations - Revert import paths back to /snippets/ format - Fix 124 files with corrected import paths - Ensure local documentation can properly load snippet content
Update snippet syntax
- Update dbt package version from 0.19.1 to 0.20.0 in quickstart-package-install.mdx - Update Docker example to use v0.20.0 Version references now align with actual Elementary versions: - dbt package: 0.20.0 - CLI: 0.20.0
- Create /snippets/integrations/dbt-fusion.mdx with shared content - Update OSS dbt-fusion.mdx to use the snippet - Create cloud dbt-fusion.mdx to use the snippet - Add dbt Fusion card to transformation-and-orchestration-cards.mdx - Add dbt Fusion to docs.json navigation under Transformation & Orchestration - Both OSS and cloud pages now reference the same content for maintainability This branch is created fresh from the docs branch to ensure proper base.
Add dbt Fusion integration to cloud section with shared snippet
* catalog -> governance * add glue docs * BI small docs fixes * small fix to privatelink docs * small fixes * add glue and atlan icons + fix ask us link * doc fix
…o prevent visibility confusion Add explanation of the default fallback behavior for resource filters, a Warning callout, an example update, and a new FAQ entry — based on a recurring support pattern where customers set filters but left the default on Read-only, causing all unfiltered assets to remain visible. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ort to OSS documentation (#2136)
…ks (#2169) * docs: add OAuth M2M authentication as recommended option for Databricks Co-Authored-By: Itamar Hartstein <haritamar@gmail.com> * databricks docs - oauth m2m screenshots + fixes --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Itamar Hartstein <haritamar@gmail.com>
…el/column/test levels
Documents the six new elementary generic tests that return context columns alongside failing rows: not_null_with_context, accepted_range_with_context, expect_column_values_to_not_be_null_with_context, expect_column_values_to_be_unique_with_context, expect_column_values_to_match_regex_with_context, relationships_with_context. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
DBX Storage Access docs
…-docs-improvement Emphasise Delta log access scope
Rename floating button to Ask AI, update email gate and placeholder copy, and fix modal title via data-modal-title (not Docs AI suffix). Made-with: Cursor
- Await HubSpot form submit before storing email and opening Kapa; surface API errors - Treat HubSpot 2xx bodies with errors array as failure - Block common personal email domains client-side (API often still returns 200) - Show work-email message only after submit, not when clearing stale localStorage Made-with: Cursor
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
|
👋 @devin-ai-integration[bot] |
📝 WalkthroughWalkthroughA comprehensive documentation restructuring and migration project that transitions from a legacy documentation configuration to a new Mintlify-based site structure. Updates include infrastructure changes (Node.js version, pre-commit hooks, .gitignore), creation of a new homepage with React components and home page configuration, migration of snippet-based documentation to MDX component imports, addition of extensive cloud features documentation, Python SDK guides, and reorganization of dbt package documentation with updated configuration patterns for anomaly detection and data tests. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes The review requires careful assessment of a very large and heterogeneous change set spanning infrastructure, configuration, extensive new documentation content, component architecture refactoring (snippet migration), YAML schema changes across dozens of files, and reorganization of information hierarchy. While many changes are documentation-only (lower cognitive load per file), the sheer volume, variety of patterns (configuration, React components, MDX markup, YAML examples), and structural reorganization demand systematic verification that no content was lost, links remain valid, examples follow new patterns consistently, and the new site structure supports intended navigation and discoverability. Possibly related PRs
✨ Finishing Touches🧪 Generate unit tests (beta)
⚔️ Resolve merge conflicts
|
…oes-elementary-work to .mdx Co-Authored-By: Yosef Arbiv <yosef.arbiv@gmail.com>
|
Superseded by #2179 which contains only |
There was a problem hiding this comment.
Actionable comments posted: 2
Note
Due to the large number of review comments, Critical severity comments were prioritized as inline comments.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
docs/cloud/integrations/dwh/bigquery.mdx (1)
2-3:⚠️ Potential issue | 🟡 MinorFix product-name capitalization in page metadata.
On Line 2 and Line 3, use BigQuery (capital Q) for consistent vendor branding.
Suggested fix
-title: "Connect to Bigquery" -sidebarTitle: "Bigquery" +title: "Connect to BigQuery" +sidebarTitle: "BigQuery"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/integrations/dwh/bigquery.mdx` around lines 2 - 3, Update the page metadata keys in this file by changing the values of title and sidebarTitle from "Bigquery" to the correctly capitalized vendor name "BigQuery"; specifically edit the title and sidebarTitle entries in the front-matter block so both read "BigQuery" to ensure consistent product-name capitalization.docs/cloud/manage-team.mdx (1)
22-22:⚠️ Potential issue | 🟡 MinorAdd alt text to the image for accessibility.
Line 22 has no
altattribute.Proposed fix
- <img src="https://res.cloudinary.com/diuctyblm/image/upload/v1704363455/add_users_xdicwh.png" /> + <img src="https://res.cloudinary.com/diuctyblm/image/upload/v1704363455/add_users_xdicwh.png" alt="Invite users screen in Elementary Cloud Team settings" />🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/manage-team.mdx` at line 22, The <img> tag in docs/cloud/manage-team.mdx is missing an alt attribute; update the <img src="https://res.cloudinary.com/diuctyblm/image/upload/v1704363455/add_users_xdicwh.png" /> element to include a descriptive alt text (e.g., alt="Add users to team screen" or similar) so the image is accessible to screen readers and meets accessibility requirements.docs/data-tests/anomaly-detection-configuration/detection-period.mdx (1)
18-18:⚠️ Potential issue | 🟡 MinorGrammar error: "are" should be "is".
"detection_period" is singular, so the verb should be "is set" not "are set".
Proposed fix
-If the detection_period are set to 2 days, only data points in the last 2 days will be included in the detection period and could be flagged anomalous. +If the detection_period is set to 2 days, only data points in the last 2 days will be included in the detection period and could be flagged anomalous.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/data-tests/anomaly-detection-configuration/detection-period.mdx` at line 18, Fix the grammar in the sentence containing "detection_period": replace "are set to 2 days" with "is set to 2 days" so the verb agrees with the singular noun "detection_period" (i.e., change the phrase to "If the detection_period is set to 2 days, only data points in the last 2 days will be included...").
🟠 Major comments (27)
docs/cloud/integrations/governance/atlan.mdx-21-26 (1)
21-26:⚠️ Potential issue | 🟠 MajorThe “Atlan API Key” steps are incomplete for actually generating a key.
This section currently describes creating a Persona and permissions, but it doesn’t include the actual API key creation step/path in Atlan. Please add the explicit final step(s) to generate and copy the API key so users can complete setup without guessing.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/integrations/governance/atlan.mdx` around lines 21 - 26, Update the "### Atlan API Key" section in atlan.mdx to include the missing final steps for creating and copying the API key: after creating the Persona and assigning permissions, instruct users to open the Atlan web UI, navigate to Admin > Personas (or the Persona settings), select the newly created Persona, go to the "API Keys" (or "Credentials") tab, click "Create API Key", copy the displayed secret immediately (it will only be shown once), and store it securely; reference the "### Atlan API Key" heading and ensure the new steps are added as numbered steps after the permission list so users can complete key generation without guessing..pre-commit-config.yaml-51-51 (1)
51-51:⚠️ Potential issue | 🟠 MajorMake
mintlify-validaterely on deterministic exit codes, not output text.Line 51 depends on an exact output string (
no broken links found), which is fragile and unmaintainable. Themintlify broken-linkscommand uses exit codes to signal status: exit 0 means no broken links, non-zero means broken links found. Usebash -eto enforce immediate failure on non-zero exit codes rather than parsing output text.Proposed hardening
- entry: bash -c "cd docs && mintlify broken-links | tee /dev/stderr | grep -q 'no broken links found'" + entry: bash -e -c "cd docs && mintlify broken-links"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.pre-commit-config.yaml at line 51, Replace the fragile output-based check in the pre-commit hook entry with an exit-code based invocation: update the "entry" that runs "mintlify broken-links" so it runs under a shell that fails immediately on non-zero exit (e.g., use bash -e or set -o errexit) after changing to the docs directory; remove the tee/grep pipeline that looks for "no broken links found" so the hook relies solely on mintlify's exit code to indicate success or failure.docs/cloud/best-practices/governance-for-observability.mdx-20-27 (1)
20-27:⚠️ Potential issue | 🟠 MajorFix invalid YAML in examples (extra colon and indentation).
These snippets won’t parse as valid YAML (
owner: :"..."and tab-indented YAML blocks), which can break onboarding flows.Proposed fix
models: - analytics: + analytics: marketing: - +tags: marketing - public: - +tags: marketing-public + +tags: marketing + public: + +tags: marketing-public @@ meta: - owner: :"@analytics.engineer" + owner: "@analytics.engineer" subscribers: - "@marketing.data.analyst" - "@another.marketing.data.analyst" @@ meta: - owner: :"@data.engineer" + owner: "@data.engineer" subscribers: "@analytics.engineer"Also applies to: 43-55, 109-119
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/best-practices/governance-for-observability.mdx` around lines 20 - 27, The YAML examples in the docs contain invalid syntax and tab indentation; update the snippet under the models/analytics/marketing example so keys/values use proper YAML (no stray extra colon after owner, use owner: "value" format), replace tab characters with two-space or two-space-per-indent, and normalize nesting so mappings like models -> analytics -> marketing -> tags/public are valid (use a tags sequence or quoted string values, e.g., tags: ["marketing"] or tags: - marketing). Apply the same fixes to the other affected snippets referenced (lines 43-55 and 109-119).docs/data-tests/data-freshness-sla.mdx-37-48 (1)
37-48:⚠️ Potential issue | 🟠 MajorCorrect invalid YAML list marker in the configuration snippet.
-- elementary.data_freshness_sla:is invalid YAML; it should be a single list marker.Proposed fix
data_tests: - -- elementary.data_freshness_sla: + - elementary.data_freshness_sla: arguments:🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/data-tests/data-freshness-sla.mdx` around lines 37 - 48, The YAML snippet uses an invalid list marker ("-- elementary.data_freshness_sla:"); change it to a single dash list item ("- elementary.data_freshness_sla:") and ensure the following block (arguments and keys like timestamp_column, sla_time, timezone, day_of_week, day_of_month, where_expression) remains correctly indented under that list item so the example becomes valid YAML.docs/oss/quickstart/stay-updated.mdx-86-140 (1)
86-140:⚠️ Potential issue | 🟠 MajorAdd explicit consent/privacy notice for email capture.
This form sends user email to HubSpot, but there is no nearby privacy disclosure/consent text. That’s a privacy/compliance gap.
Proposed fix
<form onSubmit={handleSubmit} style={{ display: 'flex', gap: '10px', flexWrap: 'wrap' }}> @@ {status === 'error' && ( <p style={{ width: '100%', color: '#dc2626', fontSize: '13px', margin: '4px 0 0' }}> Something went wrong — try again or <a href="https://elementary-data.com/community" style={{ color: '#dc2626', textDecoration: 'underline' }}>join Slack</a> instead. </p> )} + <p style={{ width: '100%', fontSize: '12px', margin: '4px 0 0', opacity: 0.8 }}> + By subscribing, you agree to receive product updates. See our{" "} + <a href="/privacy-policy" style={{ textDecoration: 'underline' }}>Privacy Policy</a>. + </p> </form>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/oss/quickstart/stay-updated.mdx` around lines 86 - 140, Add an explicit privacy/consent disclosure near the newsletter form (the <form onSubmit={handleSubmit}> block) that informs users their email will be sent to HubSpot and links to the privacy policy; include a required checkbox (e.g., consentCheckbox state updated via setConsent) or a visible statement that the user agrees by submitting, ensure the submit button (uses status to disable/loading) remains disabled until consent is given, and add accessible semantics (aria-describedby on the <input> email field pointing to the disclosure) so the consent is programmatically associated with the email capture.docs/data-tests/execution-sla.mdx-38-47 (1)
38-47:⚠️ Potential issue | 🟠 MajorFix invalid YAML list marker in the config example.
-- elementary.execution_sla:is invalid YAML and should be- elementary.execution_sla:.Proposed fix
data_tests: - -- elementary.execution_sla: + - elementary.execution_sla: arguments:🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/data-tests/execution-sla.mdx` around lines 38 - 47, The YAML example under the data_tests block uses an invalid list marker "-- elementary.execution_sla"; update the code sample to use a valid YAML list item marker by replacing "-- elementary.execution_sla:" with "- elementary.execution_sla:" so the example correctly shows a list entry for the elementary.execution_sla test and its arguments (sla_time, timezone, day_of_week, day_of_month).docs/oss/quickstart/stay-updated.mdx-21-35 (1)
21-35:⚠️ Potential issue | 🟠 MajorAdd a request timeout to avoid indefinite loading state.
If the HubSpot request hangs, the UI can stay in
loadingforever. AddAbortController+ timeout.Proposed fix
const handleSubmit = async (e) => { e.preventDefault(); if (!email) return; setStatus('loading'); + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 10000); try { const res = await fetch( `https://api.hsforms.com/submissions/v3/integration/submit/${HUBSPOT_PORTAL_ID}/${HUBSPOT_FORM_ID}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, + signal: controller.signal, body: JSON.stringify({ fields: [{ name: 'email', value: email }], context: { pageUri: typeof window !== 'undefined' ? window.location.href : '', pageName: 'Elementary Docs - Stay Updated', }, }), } ); if (res.ok) { setStatus('success'); setEmail(''); } else { setStatus('error'); } } catch { setStatus('error'); + } finally { + clearTimeout(timeoutId); } };🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/oss/quickstart/stay-updated.mdx` around lines 21 - 35, The fetch call that submits to HubSpot using HUBSPOT_PORTAL_ID/HUBSPOT_FORM_ID should use an AbortController with a timeout so the UI doesn't remain stuck in loading; create an AbortController, pass controller.signal to fetch, start a setTimeout that calls controller.abort() after a chosen timeout (e.g., 5–10s), and clearTimeout when the request completes or errors; also handle the abort case (AbortError) in the surrounding try/catch so loading state is cleared and user feedback is given.docs/cloud/features/performance-monitoring/performance-monitoring.mdx-21-29 (1)
21-29:⚠️ Potential issue | 🟠 MajorUse camelCase JSX props and
titlefor iframe accessibility.React JSX requires camelCased DOM attributes:
frameborder→frameBorderallowfullscreen→allowFullScreenaltis not valid for iframes; usetitleinstead for the accessible nameProposed fix
<iframe width="700" height="400" src="https://res.cloudinary.com/diuctyblm/video/upload/v1719746949/9_-_Performance_-_white_wurwra.mp4" -frameborder="0" +frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" -allowfullscreen -alt="Elementary Models Duration tab" +allowFullScreen +title="Elementary Models Duration tab" > </iframe>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/features/performance-monitoring/performance-monitoring.mdx` around lines 21 - 29, Update the iframe JSX attributes to use camelCase and an accessible name: change frameborder to frameBorder, allowfullscreen to allowFullScreen, remove the invalid alt attribute and replace it with a title that describes the iframe (e.g., "Elementary Models Duration tab"), and keep other attributes (width, height, src, allow) unchanged so the iframe renders and is accessible in React.docs/kapa-widget.js-49-60 (1)
49-60:⚠️ Potential issue | 🟠 MajorDon't retain email addresses indefinitely in
localStorage.This stores PII with no expiry or opt-out path, so the email persists across sessions and on shared machines. Prefer
sessionStorage, or store a short-lived token/TTL and clear it after inactivity.Also applies to: 249-250
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/kapa-widget.js` around lines 49 - 60, getStoredEmail and storeEmail currently persist raw email in localStorage indefinitely; change them to avoid retaining PII by either switching to sessionStorage (use sessionStorage.getItem / setItem) or implement a short-lived token/TTL: when storing, save an object with {value: emailOrToken, expiresAt: timestamp} and on get, return null if expiresAt < Date.now(); also ensure any catch blocks clear expired/invalid entries and provide a clear/remove function (e.g., removeStoredEmail) to support opt-out/inactivity clearing.docs/kapa-widget.js-181-186 (1)
181-186:⚠️ Potential issue | 🟠 MajorAdd a programmatic label for the email field.
The placeholder is not a reliable accessible name. Add a
<label>or at leastaria-label="Work email"so screen-reader users can understand the field.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/kapa-widget.js` around lines 181 - 186, The email input element (variable input) lacks an accessible name; modify the code around where input is created to provide one by either creating a <label> element with text "Work email", set input.id and associate the label via label.htmlFor = input.id and insert the label before appending input to form, or at minimum set input.setAttribute('aria-label', 'Work email'); ensure the chosen approach updates the same input variable and that form.appendChild uses the labeled input.docs/cloud/features/data-tests/custom-sql-tests.mdx-25-31 (1)
25-31:⚠️ Potential issue | 🟠 MajorAdd alt text to the workflow screenshots.
These images show required UI steps, so leaving
altoff makes the flow much harder to follow with a screen reader.Also applies to: 46-52
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/features/data-tests/custom-sql-tests.mdx` around lines 25 - 31, The screenshots inside the Frame component lack alt text; update the <img> elements (the ones nested under Frame and the surrounding div) to include descriptive alt attributes that summarize the UI step shown (e.g., "Custom SQL test step: create test query" or similar), and apply the same fix to the other occurrence mentioned; ensure alt text is concise, screen-reader friendly, and reflects the specific UI action or screen in each image.docs/home.mdx-821-900 (1)
821-900:⚠️ Potential issue | 🟠 MajorDon't default clickable cards to
#.
FeatureCardalways renders an anchor whencomingSoonis false, even if no real link was passed. TheData health scorescard at Line 301 already hits this path, so it looks interactive but just jumps to the top of the page. Only render<a>whenlinkis truthy, or mark the card as coming soon until the target doc exists.🔧 Suggested fix
export const FeatureCard = ({ heading = "Your Title", description = "Your description here", icon = "flag", - link = "#", + link, showCloudFeature = true, comingSoon = false, }) => { @@ -if (comingSoon) { +if (comingSoon || !link) { return ( <div className={`home__feature-card ${comingSoon ? "home__feature-card--coming-soon" : ""}`}> <CardContent /> </div> ); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/home.mdx` around lines 821 - 900, FeatureCard currently always renders an <a> when comingSoon is false, causing cards with the default link "#" to appear clickable but do nothing; change the logic so the component only renders an anchor when the link prop is truthy and otherwise renders a non-interactive wrapper (or mark as comingSoon). Specifically: update the default prop for link (e.g. link = "" or undefined) and modify the final render in FeatureCard/ CardContent so if (comingSoon) render the existing non-clickable div with class "home__feature-card--coming-soon", else if (link) render <a href={link} ...> otherwise render a plain <div className="home__feature-card"> (no target or href) to avoid defaulting to "#". Ensure class names and CardContent usage remain the same.docs/cloud/best-practices/triage-and-response.mdx-40-49 (1)
40-49:⚠️ Potential issue | 🟠 MajorFix the YAML example before publishing.
This snippet is not copy-pastable as written: the indentation uses tabs instead of spaces, and the
tagsvalue is not valid YAML syntax. Readers who paste this into a schema file will encounter a parse error.🔧 Suggested fix
data_tests: - unique: - config: - error_if: ">10" - meta: + config: + error_if: ">10" + meta: description: "More than 10 duplicate records arriving from the source, as this is a staging table" owner: "@data.provider" - tags: "critical", "mongo-db", "raw-production-replica" + tags: ["critical", "mongo-db", "raw-production-replica"]🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/best-practices/triage-and-response.mdx` around lines 40 - 49, The YAML example under the data_tests -> unique entry uses tabs and an invalid tags value; fix it by converting all indentation to spaces (use consistent 2 or 4 spaces) and change meta.tags to a proper YAML sequence (e.g., tags: ["critical", "mongo-db", "raw-production-replica"] or a dash-prefixed list) while keeping config.error_if under config (config.error_if) and meta.description/meta.owner correctly indented.docs/kapa-widget.js-63-75 (1)
63-75:⚠️ Potential issue | 🟠 MajorWait for Kapa script to load before calling
open.The
loadKapaScript()function appends the third-party widget asynchronously without tracking when it finishes loading. WhenopenKapa()is called (after form submission or button click with stored email), it just checks ifwindow.Kapaexists and callsopen()immediately—but if the script hasn't finished loading, the call does nothing. Keep a shared load promise soopenKapa()waits for the script to fully initialize before attempting to open the widget.🔧 Suggested direction
+ var kapaReady = null; + function openKapa(email) { - window.kapaSettings = { - user: { - email: email, - uniqueClientId: email, - }, - }; - if (window.Kapa && typeof window.Kapa.open === 'function') { - window.Kapa.open(); - } else if (typeof window.Kapa === 'function') { - window.Kapa('open'); - } + return loadKapaScript().then(function () { + window.kapaSettings = { + user: { + email: email, + uniqueClientId: email, + }, + }; + if (window.Kapa && typeof window.Kapa.open === 'function') { + window.Kapa.open(); + } else if (typeof window.Kapa === 'function') { + window.Kapa('open'); + } + }); } @@ function loadKapaScript() { - var script = document.createElement('script'); - script.src = 'https://widget.kapa.ai/kapa-widget.bundle.js'; - script.async = true; - script.setAttribute('data-website-id', 'e558d15b-d976-4a89-b2f0-e33ee6dab58b'); - script.setAttribute('data-project-name', 'Ask Elementary AI'); - script.setAttribute('data-modal-title', 'Ask Elementary AI'); - script.setAttribute('data-modal-title-ask-ai', 'Ask Elementary AI'); - script.setAttribute('data-modal-title-search', 'Ask Elementary AI'); - script.setAttribute('data-modal-ask-ai-input-placeholder', 'Ask any question about Elementary...'); - script.setAttribute('data-project-color', '#FF20B8'); - script.setAttribute('data-project-logo', 'https://res.cloudinary.com/do5hrgokq/image/upload/v1771424391/Elementary_2025_Pink_Mark_Black_Frame_rbexli.png'); - script.setAttribute('data-button-hide', 'true'); - document.head.appendChild(script); + if (kapaReady) return kapaReady; + kapaReady = new Promise(function (resolve, reject) { + var script = document.createElement('script'); + script.src = 'https://widget.kapa.ai/kapa-widget.bundle.js'; + script.async = true; + script.onload = resolve; + script.onerror = reject; + script.setAttribute('data-website-id', 'e558d15b-d976-4a89-b2f0-e33ee6dab58b'); + script.setAttribute('data-project-name', 'Ask Elementary AI'); + script.setAttribute('data-modal-title', 'Ask Elementary AI'); + script.setAttribute('data-modal-title-ask-ai', 'Ask Elementary AI'); + script.setAttribute('data-modal-title-search', 'Ask Elementary AI'); + script.setAttribute('data-modal-ask-ai-input-placeholder', 'Ask any question about Elementary...'); + script.setAttribute('data-project-color', '#FF20B8'); + script.setAttribute('data-project-logo', 'https://res.cloudinary.com/do5hrgokq/image/upload/v1771424391/Elementary_2025_Pink_Mark_Black_Frame_rbexli.png'); + script.setAttribute('data-button-hide', 'true'); + document.head.appendChild(script); + }); + return kapaReady; } @@ function init() { - loadKapaScript(); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', injectButtonAndPopover); } else { injectButtonAndPopover(); }Also applies to: 299-317
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/kapa-widget.js` around lines 63 - 75, openKapa currently calls window.Kapa immediately and can run before the third-party script finishes loading; change loadKapaScript to set and return a shared promise (e.g., window.kapaLoadPromise) that resolves when the external script's onload runs and the widget is initialized, then update openKapa to await that promise before invoking window.Kapa (handle both the object with open method and function-call form) so the open() call always executes after the script has fully loaded.docs/data-tests/schema-tests/schema-changes-from-baseline.mdx-105-108 (1)
105-108:⚠️ Potential issue | 🟠 MajorFix invalid YAML structure in the Sources example.
At Line 106,
elementary.schema_changes_from_baselineis missing a trailing:before nestedconfig, so the snippet is not valid YAML.Suggested fix
data_tests: - - elementary.schema_changes_from_baseline + - elementary.schema_changes_from_baseline: config: tags: ["elementary"]🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/data-tests/schema-tests/schema-changes-from-baseline.mdx` around lines 105 - 108, The YAML snippet under data_tests is invalid because the test name elementary.schema_changes_from_baseline is missing a trailing colon before its nested config; update that entry so the test key is followed by a colon (i.e., elementary.schema_changes_from_baseline:) and ensure the nested block (config: and tags) is properly indented under that key to produce valid YAML.docs/data-tests/anomaly-detection-configuration/update_timestamp_column.mdx-30-34 (1)
30-34:⚠️ Potential issue | 🟠 MajorFix the test identifier in the YAML example to match the documented test.
Line 31 incorrectly uses
elementary.event_timestamp_column, which is not a valid test identifier. The page itself states this is "Configuration for the testevent_freshness_anomalies" (line 13), and the canonical test documentation useselementary.event_freshness_anomaliesin all working examples. Change the test identifier toelementary.event_freshness_anomaliesso users can run the example as-is.Suggested fix
data_tests: - - elementary.event_timestamp_column: + - elementary.event_freshness_anomalies: arguments: event_timestamp_column: "event_timestamp" update_timestamp_column: "created_at"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/data-tests/anomaly-detection-configuration/update_timestamp_column.mdx` around lines 30 - 34, Update the YAML example under the data_tests block to use the correct test identifier: replace the invalid test name elementary.event_timestamp_column with elementary.event_freshness_anomalies so the example matches the documented test; locate the YAML snippet that defines data_tests and change the test key from elementary.event_timestamp_column to elementary.event_freshness_anomalies while keeping the arguments (event_timestamp_column, update_timestamp_column) unchanged.docs/data-tests/anomaly-detection-tests/column-anomalies.mdx-111-114 (1)
111-114:⚠️ Potential issue | 🟠 MajorFix invalid YAML in the
data_testsexample.The snippet at lines 111–114 is malformed.
elementary.volume_anomaliesis missing the list item marker (-) and colon (:), making it invalid YAML that users cannot copy/paste as-is.Proposed fix
- name: users ## if no timestamp is configured, elementary will monitor without time filtering data_tests: - elementary.volume_anomalies - config: - tags: ['elementary'] + - elementary.volume_anomalies: + config: + tags: ['elementary']🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/data-tests/anomaly-detection-tests/column-anomalies.mdx` around lines 111 - 114, The YAML under the data_tests example is malformed: the entry for elementary.volume_anomalies must be a list item with a mapping. Edit the block so data_tests contains a list entry (use a leading "-" for the test) and include a colon to make it a mapping key (i.e., convert the malformed line referencing elementary.volume_anomalies into a proper list item mapping with config as its nested mapping), updating the symbols shown (data_tests and elementary.volume_anomalies and config) accordingly.docs/cloud/integrations/alerts/servicenow.mdx-9-12 (1)
9-12:⚠️ Potential issue | 🟠 MajorAdd
alttext to screenshots.These images are instructional and currently missing
alt, which hurts accessibility for screen-reader users.Example fix pattern
<img src="https://res.cloudinary.com/do5hrgokq/image/upload/v1751788473/servicenow_create_ticket_ztpeaw.png" width="500" + alt="ServiceNow create ticket button in Elementary incident page" />Also applies to: 21-24, 31-34, 44-47, 60-63, 71-73, 84-87, 99-102, 109-111, 122-124, 133-135, 143-145, 164-166
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/integrations/alerts/servicenow.mdx` around lines 9 - 12, Add descriptive alt attributes to each <img> tag (e.g., the one with src "servicenow_create_ticket_ztpeaw.png") so screenshots are accessible to screen readers; update every image instance listed (lines groups 9-12, 21-24, 31-34, 44-47, 60-63, 71-73, 84-87, 99-102, 109-111, 122-124, 133-135, 143-145, 164-166) with concise alt text that describes the screenshot content and purpose (for example "ServiceNow create ticket form showing fields X, Y, Z").docs/cloud/guides/start-using-elementary-checklist.md-11-14 (1)
11-14:⚠️ Potential issue | 🟠 MajorAdd list marker to all checklist items to enable proper task-list rendering.
All checklist items in this file use
[ ]without the required list marker. Convert each to- [ ]so the checklists render correctly in Markdown renderers.✅ Proposed fix pattern
-[ ] In the [Catalog](/cloud/features/collaboration-and-communication/catalog), identify and mark three [critical assets](/cloud/features/data-governance/critical_assets) +- [ ] In the [Catalog](/cloud/features/collaboration-and-communication/catalog), identify and mark three [critical assets](/cloud/features/data-governance/critical_assets)Apply the same
-prefix to all 27 checklist rows throughout this file.Affected lines: 11–14, 20–24, 29–32, 37–40, 45–47, 52–54, 59–62, 69–72, 77–79.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/guides/start-using-elementary-checklist.md` around lines 11 - 14, The checklist items use bare "[ ]" markers so they don't render as task lists; update every checklist row in this document (e.g., the lines containing "In the [Catalog]...", "Add or update [descriptions, tags, and owners]...", "Leverage the [Governance AI agent]...", "View [end-to-end, column-level lineage]...") to use the Markdown task-list format by prefixing each with "- " (i.e., change "[ ]" to "- [ ]") for all 27 checklist lines throughout the file so they render correctly.docs/cloud/integrations/security-and-connectivity/okta.mdx-35-35 (1)
35-35:⚠️ Potential issue | 🟠 MajorRole names are inconsistent across the page.
Line 35 lists predefined roles as Admin / Can Write / Can Read, but Lines 132-143 use Can Edit. Please standardize terminology to avoid incorrect Okta group-to-role mapping.
Also applies to: 132-143
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/integrations/security-and-connectivity/okta.mdx` at line 35, The doc uses inconsistent role names: update all occurrences so the predefined roles are consistently "Admin", "Can Write", and "Can Read" (replace any "Can Edit" instances). Specifically, change the text fragment that currently lists "Admin / Can Write / Can Read" and the later section that mentions "Can Edit" (lines showing Okta group-to-role mappings) so they all use "Can Write"; also review and update any Okta group-to-role mapping examples to reflect the same standardized role names.docs/cloud/guides/set-up-elementary.mdx-61-62 (1)
61-62:⚠️ Potential issue | 🟠 MajorClarify the AI features enablement step.
The instruction “Elementary to open AI Features” is unclear/incomplete and may block users from completing setup. Replace with a clear action (e.g., “Contact Elementary support to enable AI features for your account”).
Proposed fix
-- Elementary to open AI Features +- Contact Elementary support to enable AI features for your account🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/guides/set-up-elementary.mdx` around lines 61 - 62, Replace the ambiguous line "Elementary to open AI Features" with a clear, actionable instruction; specifically update the text to something like "Contact Elementary support to enable AI features for your account" (or similar wording) so users know to reach out to Elementary support to have AI features turned on; locate and update the exact string "Elementary to open AI Features" in the document and ensure surrounding context flows grammatically with the new sentence.docs/cloud/features/data-tests/test-coverage-screen.mdx-65-67 (1)
65-67:⚠️ Potential issue | 🟠 MajorAdd
alttext to the screenshot image.Line 66 image is missing an
altattribute, which hurts accessibility and screen-reader usability.Proposed fix
<img src="https://res.cloudinary.com/do5hrgokq/image/upload/v1751200138/coverage-weight_xyz9gf.png" + alt="Coverage score weighting configuration" />🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/features/data-tests/test-coverage-screen.mdx` around lines 65 - 67, The <img> element showing the coverage screenshot (src "https://res.cloudinary.com/do5hrgokq/image/upload/v1751200138/coverage-weight_xyz9gf.png") is missing an alt attribute; add a concise, descriptive alt text (for example: alt="Test coverage screen showing coverage percentage and weight graph") to the <img> tag in test-coverage-screen.mdx to improve accessibility and screen-reader usability.docs/oss/general/troubleshooting.mdx-179-191 (1)
179-191:⚠️ Potential issue | 🟠 MajorFix the indentation of code fence delimiters in this accordion.
Lines 184 and 187 have code fence delimiters indented with 10 spaces, which exceeds Markdown's 0-3 space limit. This causes MDX to misinterpret them as content rather than delimiters, breaking the rendering. Remove the excessive indentation from the closing fence on line 184 and opening fence on line 187.
🛠️ Suggested formatting
If you use Snowflake: ``` {% materialization test, adapter='snowflake' %} {{ return(elementary.materialization_test_snowflake()) }} {% endmaterialization %} ``` If you use any other DWH: ``` {% materialization test, default %} {{ return(elementary.materialization_test_default()) }} {% endmaterialization %} ```🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/oss/general/troubleshooting.mdx` around lines 179 - 191, The closing and opening triple-backtick code-fence delimiters inside the accordion for the two examples ("If you use Snowflake:" and "If you use any other DWH:") are over-indented and treated as content; remove the extra leading spaces so each fence starts at column 0 (i.e., align the closing fence after the Snowflake example and the opening fence before the second example to the left margin), ensuring both ``` delimiters are not indented beyond 0-3 spaces and the fenced blocks render correctly.docs/data-tests/anomaly-detection-tests/Anomaly-troubleshooting-guide.mdx-15-20 (1)
15-20:⚠️ Potential issue | 🟠 MajorAdd whitespace before inline YAML comments to fix broken configurations.
In YAML,
#only starts a comment when preceded by whitespace. As written,created_at#becomes the literal value oftimestamp_column, making these snippets unusable. This affects the configuration examples at lines 20 and 146.Suggested fix
- timestamp_column: created_at# If this is configured, you have a timestamp-based test + timestamp_column: created_at # If this is configured, you have a timestamp-based test- timestamp_column: created_at# Check if specified correctly + timestamp_column: created_at # Check if specified correctly🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/data-tests/anomaly-detection-tests/Anomaly-troubleshooting-guide.mdx` around lines 15 - 20, The YAML examples for the data_tests block (the elementary.volume_anomalies entry) have inline comments attached directly to values (e.g., timestamp_column: created_at#...) so the comment is parsed as part of the value; update these examples to insert a space before the hash so the comment is recognized (e.g., timestamp_column: created_at # ...). Locate the snippet containing the data_tests list and the elementary.volume_anomalies example and fix all similar occurrences (including the other example noted for timestamp_column) by adding a space before each '#' used as an inline comment.docs/cloud/integrations/security-and-connectivity/aws-privatelink-integration.mdx-56-59 (1)
56-59:⚠️ Potential issue | 🟠 MajorReplace wildcard subnet notation with valid CIDR blocks throughout.
10.0.1.x,10.0.2.x, and10.0.3.xare not valid CIDR notation for AWS security groups, which require proper format like10.0.1.0/24or10.0.1.0/32. Users will fail validation when attempting to configure these ranges. Replace all instances with the correct CIDR blocks:
- Lines 56-59 (Snowflake section)
- Lines 126-129 (Databricks section)
- Lines 196-199 (GitHub Enterprise Server section)
Use consistent formatting across all three locations.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/integrations/security-and-connectivity/aws-privatelink-integration.mdx` around lines 56 - 59, The docs use invalid subnet notation like "10.0.1.x" in the Snowflake "Add the Elementary IP to allowlist" section (and the corresponding Databricks and GitHub Enterprise Server sections), which will fail AWS CIDR validation; replace each instance with proper CIDR blocks (e.g., 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24 or /32 if single-IP intent) and ensure the same CIDR formatting and punctuation is applied consistently in the Snowflake, Databricks, and GitHub Enterprise Server sections.docs/cloud/features/ci.mdx-55-61 (1)
55-61:⚠️ Potential issue | 🟠 MajorUpdate the optional customization section to clarify that
pull_request.pathsmust also be updated.If a user follows the optional
models-path: "dbt/models/"example without updating thepull_request.pathsfilter, the workflow will never trigger—the path filter still watchesmodels/**while the actual models are indbt/models/. Add a note in the "customize the action" section warning that users changingmodels-pathmust also update thepull_request.pathsfilter in the workflow trigger, or provide the updated paths as part of the example configuration.The suggested diff in the original comment would break the default setup where models are at the repository root. The base example at lines 55–61 is correct for the standard layout; the issue is that the optional customization at lines 98–110 doesn't adequately document this dependency.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/cloud/features/ci.mdx` around lines 55 - 61, Update the "customize the action" section to warn that changing the models-path requires updating the workflow trigger's pull_request.paths filter (reference the `models-path` option and the `pull_request.paths` filter), and either add a short note stating this dependency or include an alternate example showing `pull_request.paths` adjusted for `dbt/models/**` and `dbt/**/*.yml` alongside `dbt_project.yml`; do not change the default base example that assumes models at the repo root.docs/data-tests/dbt/package-models.mdx-49-52 (1)
49-52:⚠️ Potential issue | 🟠 MajorCorrect the environment variable naming in lines 49-52 and throughout this section.
The section states that metadata can be set via
DBT_<COLUMN_NAME>environment variables and usesDBT_JOB_NAMEas an example. However, the field list below (lines 69-81) documents the actual env var names without theDBT_prefix:JOB_ID,JOB_NAME,JOB_URL, andACCOUNT_ID. This contradicts the stated rule. Additionally, thecollect-job-data.mdxdocumentation confirms the correct generic format isJOB_NAME,JOB_ID,JOB_URL(withoutDBT_prefix), with orchestrator-specific variations likeDBT_CLOUD_JOB_ID. Update lines 49-52 to document the correct naming convention so readers know which environment variable names actually populate these columns.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/data-tests/dbt/package-models.mdx` around lines 49 - 52, Update the wording that claims env vars use the DBT_ prefix: change the rule to say the generic environment variable names are the bare column names (e.g., JOB_NAME, JOB_ID, JOB_URL, ACCOUNT_ID) and use JOB_NAME/JOB_ID as the example, and note that orchestrator-specific variants may exist (e.g., DBT_CLOUD_JOB_ID) as exceptions; make the same correction everywhere in this section so the example and the field list (JOB_ID, JOB_NAME, JOB_URL, ACCOUNT_ID) and collect-job-data.mdx are consistent.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: df92761c-2ded-48fa-9acc-5220e95a4815
⛔ Files ignored due to path filters (1)
docs/elementary_orange_favicon.pngis excluded by!**/*.png
📒 Files selected for processing (299)
.gitignore.pre-commit-config.yamldev-requirements.txtdocs/Dockerfiledocs/_snippets/cloud/integrations/athena.mdxdocs/_snippets/cloud/integrations/cards-groups/bi-cards.mdxdocs/_snippets/cloud/integrations/cards-groups/cloud-integrations-cards.mdxdocs/_snippets/cloud/integrations/cards-groups/connect-dwh-cards.mdxdocs/_snippets/cloud/integrations/databricks.mdxdocs/_snippets/dwh/bigquery/cli_service_account.mdxdocs/_snippets/dwh/bigquery/cloud_service_account.mdxdocs/_snippets/dwh/databricks/create_service_principal.mdxdocs/_snippets/faq/question-schema.mdxdocs/_snippets/faq/question-test-results-sample.mdxdocs/_snippets/oss/oss-introduction-opening.mdxdocs/_snippets/oss/oss-introduction.mdxdocs/_snippets/products-cards.mdxdocs/_snippets/profiles/all-profiles.mdxdocs/changelog.mdxdocs/cloud/ai-agents/catalog-agent.mdxdocs/cloud/ai-agents/governance-agent.mdxdocs/cloud/ai-agents/overview.mdxdocs/cloud/ai-agents/performance-cost-agent.mdxdocs/cloud/ai-agents/test-recommendation-agent.mdxdocs/cloud/ai-agents/triage-resolution-agent.mdxdocs/cloud/best-practices/detection-and-coverage.mdxdocs/cloud/best-practices/governance-for-observability.mdxdocs/cloud/best-practices/introduction.mdxdocs/cloud/best-practices/triage-and-response.mdxdocs/cloud/cloud-vs-oss.mdxdocs/cloud/features.mdxdocs/cloud/features/alerts-and-incidents/alert-configuration.mdxdocs/cloud/features/alerts-and-incidents/alert-destinations.mdxdocs/cloud/features/alerts-and-incidents/alert-rules.mdxdocs/cloud/features/alerts-and-incidents/alerts-and-incidents-overview.mdxdocs/cloud/features/alerts-and-incidents/incident-digest.mdxdocs/cloud/features/alerts-and-incidents/incident-management.mdxdocs/cloud/features/alerts-and-incidents/incidents.mdxdocs/cloud/features/alerts-and-incidents/owners-and-subscribers.mdxdocs/cloud/features/anomaly-detection/automated-freshness.mdxdocs/cloud/features/anomaly-detection/automated-monitors.mdxdocs/cloud/features/anomaly-detection/automated-volume.mdxdocs/cloud/features/anomaly-detection/metrics.mdxdocs/cloud/features/anomaly-detection/monitor-dwh-assets.mdxdocs/cloud/features/anomaly-detection/monitors-configuration.mdxdocs/cloud/features/anomaly-detection/monitors-feedback.mdxdocs/cloud/features/anomaly-detection/monitors-overview.mdxdocs/cloud/features/ci.mdxdocs/cloud/features/collaboration-and-communication/audit_logs/overview.mdxdocs/cloud/features/collaboration-and-communication/audit_logs/system-logs.mdxdocs/cloud/features/collaboration-and-communication/audit_logs/user-activity-logs.mdxdocs/cloud/features/collaboration-and-communication/catalog.mdxdocs/cloud/features/collaboration-and-communication/data-health.mdxdocs/cloud/features/collaboration-and-communication/data-observability-dashboard.mdxdocs/cloud/features/collaboration-and-communication/data-quality-dimensions.mdxdocs/cloud/features/collaboration-and-communication/saved-views.mdxdocs/cloud/features/config-as-code.mdxdocs/cloud/features/data-governance/ai-descriptions.mdxdocs/cloud/features/data-governance/critical_assets.mdxdocs/cloud/features/data-governance/manage-metadata.mdxdocs/cloud/features/data-lineage/column-level-lineage.mdxdocs/cloud/features/data-lineage/exposures-lineage.mdxdocs/cloud/features/data-lineage/lineage.mdxdocs/cloud/features/data-tests/custom-sql-tests.mdxdocs/cloud/features/data-tests/data-tests-overview.mdxdocs/cloud/features/data-tests/dbt-tests.mdxdocs/cloud/features/data-tests/schema-validation-test.mdxdocs/cloud/features/data-tests/test-coverage-screen.mdxdocs/cloud/features/elementary-alerts.mdxdocs/cloud/features/gpg-signed-commits.mdxdocs/cloud/features/integrations.mdxdocs/cloud/features/multi-env.mdxdocs/cloud/features/performance-monitoring/performance-alerts.mdxdocs/cloud/features/performance-monitoring/performance-monitoring.mdxdocs/cloud/features/roles-and-permissions.mdxdocs/cloud/general/ai-privacy-policy.mdxdocs/cloud/general/security-and-privacy.mdxdocs/cloud/guides/alert-rules.mdxdocs/cloud/guides/alerts-configuration.mdxdocs/cloud/guides/collect-job-data.mdxdocs/cloud/guides/collect-source-freshness.mdxdocs/cloud/guides/dev-prod-configuration.mdxdocs/cloud/guides/enable-slack-alerts.mdxdocs/cloud/guides/reduce-on-run-end-time.mdxdocs/cloud/guides/set-up-elementary-checklist.mddocs/cloud/guides/set-up-elementary.mdxdocs/cloud/guides/start-using-elementary-checklist.mddocs/cloud/guides/start-using-elementary.mdxdocs/cloud/guides/sync-scheduling.mdxdocs/cloud/guides/troubleshoot.mdxdocs/cloud/integrations/alerts/email.mdxdocs/cloud/integrations/alerts/jira.mdxdocs/cloud/integrations/alerts/linear.mdxdocs/cloud/integrations/alerts/ms-teams.mdxdocs/cloud/integrations/alerts/opsgenie.mdxdocs/cloud/integrations/alerts/pagerduty.mdxdocs/cloud/integrations/alerts/servicenow.mdxdocs/cloud/integrations/alerts/slack.mdxdocs/cloud/integrations/bi/connect-bi-tool.mdxdocs/cloud/integrations/bi/explo.mdxdocs/cloud/integrations/bi/hex.mdxdocs/cloud/integrations/bi/lightdash.mdxdocs/cloud/integrations/bi/looker.mdxdocs/cloud/integrations/bi/mode.mdxdocs/cloud/integrations/bi/power-bi.mdxdocs/cloud/integrations/bi/sigma.mdxdocs/cloud/integrations/bi/tableau.mdxdocs/cloud/integrations/bi/thoughtspot.mdxdocs/cloud/integrations/code-repo/azure-devops.mdxdocs/cloud/integrations/code-repo/bitbucket.mdxdocs/cloud/integrations/code-repo/connect-code-repo.mdxdocs/cloud/integrations/code-repo/github.mdxdocs/cloud/integrations/code-repo/gitlab.mdxdocs/cloud/integrations/dwh/athena.mdxdocs/cloud/integrations/dwh/bigquery.mdxdocs/cloud/integrations/dwh/clickhouse.mdxdocs/cloud/integrations/dwh/databricks.mdxdocs/cloud/integrations/dwh/dremio.mdxdocs/cloud/integrations/dwh/duckdb.mdxdocs/cloud/integrations/dwh/fabric.mdxdocs/cloud/integrations/dwh/postgres.mdxdocs/cloud/integrations/dwh/redshift.mdxdocs/cloud/integrations/dwh/snowflake.mdxdocs/cloud/integrations/dwh/spark.mdxdocs/cloud/integrations/dwh/sqlserver.mdxdocs/cloud/integrations/dwh/trino.mdxdocs/cloud/integrations/dwh/vertica.mdxdocs/cloud/integrations/elementary-integrations.mdxdocs/cloud/integrations/governance/atlan.mdxdocs/cloud/integrations/log-streaming/datadog.mdxdocs/cloud/integrations/log-streaming/gcs.mdxdocs/cloud/integrations/log-streaming/splunk.mdxdocs/cloud/integrations/metadata-layer/glue.mdxdocs/cloud/integrations/security-and-connectivity/aws-privatelink-integration.mdxdocs/cloud/integrations/security-and-connectivity/ms-entra.mdxdocs/cloud/integrations/security-and-connectivity/okta.mdxdocs/cloud/integrations/transformation-and-orchestration/dbt-fusion.mdxdocs/cloud/introduction.mdxdocs/cloud/main_introduction.mdxdocs/cloud/manage-team.mdxdocs/cloud/mcp/intro.mdxdocs/cloud/mcp/mcp-tools.mdxdocs/cloud/mcp/overview.mdxdocs/cloud/mcp/recommended-rules.mdxdocs/cloud/mcp/setup-guide.mdxdocs/cloud/onboarding/connect-data-warehouse.mdxdocs/cloud/onboarding/quickstart-dbt-package.mdxdocs/cloud/onboarding/signup.mdxdocs/cloud/python-sdk/overview.mdxdocs/cloud/python-sdk/setup-guide.mdxdocs/cloud/python-sdk/usage-examples.mdxdocs/cloud/quickstart.mdxdocs/cloud/resources/ai-agents.mdxdocs/cloud/resources/business-case-data-observability-platform.mdxdocs/cloud/resources/community.mdxdocs/cloud/resources/how-does-elementary-work.mdxdocs/cloud/resources/pricing.mdxdocs/cloud/what-is-elementary.mdxdocs/culture.mdxdocs/data-tests/add-elementary-tests.mdxdocs/data-tests/ai-data-tests/ai_data_validations.mdxdocs/data-tests/ai-data-tests/supported-platforms/bigquery.mdxdocs/data-tests/ai-data-tests/supported-platforms/data-lakes.mdxdocs/data-tests/ai-data-tests/supported-platforms/databricks.mdxdocs/data-tests/ai-data-tests/supported-platforms/redshift.mdxdocs/data-tests/ai-data-tests/supported-platforms/snowflake.mdxdocs/data-tests/ai-data-tests/unstructured_data_validations.mdxdocs/data-tests/anomaly-detection-configuration/anomaly-direction.mdxdocs/data-tests/anomaly-detection-configuration/anomaly-exclude-metrics.mdxdocs/data-tests/anomaly-detection-configuration/anomaly-params.mdxdocs/data-tests/anomaly-detection-configuration/anomaly-sensitivity.mdxdocs/data-tests/anomaly-detection-configuration/column-anomalies.mdxdocs/data-tests/anomaly-detection-configuration/detection-delay.mdxdocs/data-tests/anomaly-detection-configuration/detection-period.mdxdocs/data-tests/anomaly-detection-configuration/dimensions.mdxdocs/data-tests/anomaly-detection-configuration/event_timestamp_column.mdxdocs/data-tests/anomaly-detection-configuration/exclude-final-results.mdxdocs/data-tests/anomaly-detection-configuration/exclude_detection_period_from_training.mdxdocs/data-tests/anomaly-detection-configuration/exclude_prefix.mdxdocs/data-tests/anomaly-detection-configuration/exclude_regexp.mdxdocs/data-tests/anomaly-detection-configuration/fail_on_zero.mdxdocs/data-tests/anomaly-detection-configuration/ignore_small_changes.mdxdocs/data-tests/anomaly-detection-configuration/seasonality.mdxdocs/data-tests/anomaly-detection-configuration/time-bucket.mdxdocs/data-tests/anomaly-detection-configuration/timestamp-column.mdxdocs/data-tests/anomaly-detection-configuration/training-period.mdxdocs/data-tests/anomaly-detection-configuration/update_timestamp_column.mdxdocs/data-tests/anomaly-detection-configuration/where-expression.mdxdocs/data-tests/anomaly-detection-tests-oss-vs-cloud.mdxdocs/data-tests/anomaly-detection-tests/Anomaly-troubleshooting-guide.mdxdocs/data-tests/anomaly-detection-tests/all-columns-anomalies.mdxdocs/data-tests/anomaly-detection-tests/column-anomalies.mdxdocs/data-tests/anomaly-detection-tests/dimension-anomalies.mdxdocs/data-tests/anomaly-detection-tests/event-freshness-anomalies.mdxdocs/data-tests/anomaly-detection-tests/freshness-anomalies.mdxdocs/data-tests/anomaly-detection-tests/volume-anomalies.mdxdocs/data-tests/data-freshness-sla.mdxdocs/data-tests/dbt/dbt-artifacts.mdxdocs/data-tests/dbt/dbt-package.mdxdocs/data-tests/dbt/on-run-end_hooks.mdxdocs/data-tests/dbt/package-models.mdxdocs/data-tests/dbt/quickstart-package.mdxdocs/data-tests/dbt/reduce-on-run-end-time.mdxdocs/data-tests/dbt/release-notes/releases/0.18.1.mdxdocs/data-tests/dbt/release-notes/releases/0.18.2.mdxdocs/data-tests/dbt/release-notes/releases/0.18.3.mdxdocs/data-tests/dbt/release-notes/releases/0.19.0.mdxdocs/data-tests/dbt/release-notes/releases/0.19.1.mdxdocs/data-tests/dbt/release-notes/releases/0.19.2.mdxdocs/data-tests/dbt/release-notes/releases/0.19.3.mdxdocs/data-tests/dbt/release-notes/releases/0.19.4.mdxdocs/data-tests/dbt/release-notes/releases/0.20.0.mdxdocs/data-tests/dbt/release-notes/releases/0.20.1.mdxdocs/data-tests/dbt/singular-tests.mdxdocs/data-tests/dbt/upgrade-package.mdxdocs/data-tests/execution-sla.mdxdocs/data-tests/how-anomaly-detection-works.mdxdocs/data-tests/introduction.mdxdocs/data-tests/python-tests.mdxdocs/data-tests/schema-tests/exposure-tests.mdxdocs/data-tests/schema-tests/json-schema.mdxdocs/data-tests/schema-tests/schema-changes-from-baseline.mdxdocs/data-tests/schema-tests/schema-changes.mdxdocs/data-tests/test-result-samples.mdxdocs/data-tests/volume-threshold.mdxdocs/data-tests/with-context-tests.mdxdocs/dbt/dbt-artifacts.mdxdocs/dbt/package-models.mdxdocs/docs.jsondocs/features/automated-monitors.mdxdocs/features/catalog.mdxdocs/features/ci.mdxdocs/features/column-level-lineage.mdxdocs/features/config-as-code.mdxdocs/features/data-tests.mdxdocs/features/elementary-alerts.mdxdocs/features/integrations.mdxdocs/features/lineage.mdxdocs/features/multi-env.mdxdocs/guides/modules-overview/dbt-package.mdxdocs/home.mdxdocs/kapa-widget.jsdocs/key-features.mdxdocs/mint.jsondocs/oss/cli-commands.mdxdocs/oss/cli-install.mdxdocs/oss/deployment-and-configuration/docker.mdxdocs/oss/deployment-and-configuration/elementary-in-production.mdxdocs/oss/deployment-and-configuration/slack.mdxdocs/oss/deployment-and-configuration/teams.mdxdocs/oss/general/community-and-support.mdxdocs/oss/general/faq.mdxdocs/oss/general/troubleshooting.mdxdocs/oss/guides/alerts/alerts-configuration.mdxdocs/oss/guides/alerts/elementary-alerts.mdxdocs/oss/guides/alerts/send-slack-alerts.mdxdocs/oss/guides/alerts/send-teams-alerts.mdxdocs/oss/guides/collect-dbt-source-freshness.mdxdocs/oss/guides/collect-job-data.mdxdocs/oss/guides/generate-report-ui.mdxdocs/oss/guides/performance-alerts.mdxdocs/oss/guides/reduce-on-run-end-time.mdxdocs/oss/integrations/athena.mdxdocs/oss/integrations/bigquery.mdxdocs/oss/integrations/clickhouse.mdxdocs/oss/integrations/databricks.mdxdocs/oss/integrations/dbt-fusion.mdxdocs/oss/integrations/dbt.mdxdocs/oss/integrations/dremio.mdxdocs/oss/integrations/duckdb.mdxdocs/oss/integrations/fabric.mdxdocs/oss/integrations/postgres.mdxdocs/oss/integrations/redshift.mdxdocs/oss/integrations/snowflake.mdxdocs/oss/integrations/spark.mdxdocs/oss/integrations/sqlserver.mdxdocs/oss/integrations/trino.mdxdocs/oss/integrations/vertica.mdxdocs/oss/oss-introduction.mdxdocs/oss/quickstart/quickstart-alerts.mdxdocs/oss/quickstart/quickstart-cli-package.mdxdocs/oss/quickstart/quickstart-cli.mdxdocs/oss/quickstart/quickstart-prod.mdxdocs/oss/quickstart/quickstart-report.mdxdocs/oss/quickstart/quickstart-support.mdxdocs/oss/quickstart/quickstart-tests.mdxdocs/oss/quickstart/stay-updated.mdxdocs/oss/release-notes/releases/0.16.0.mdxdocs/oss/release-notes/releases/0.16.1.mdxdocs/oss/release-notes/releases/0.16.2.mdxdocs/oss/release-notes/releases/0.17.0.mdxdocs/oss/release-notes/releases/0.18.0.mdxdocs/oss/release-notes/releases/0.18.1.mdxdocs/oss/release-notes/releases/0.18.2.mdxdocs/oss/release-notes/releases/0.18.3.mdxdocs/oss/release-notes/releases/0.19.0.mdxdocs/oss/release-notes/releases/0.19.1.mdxdocs/oss/release-notes/releases/0.19.2.mdxdocs/oss/release-notes/releases/0.19.3.mdx
💤 Files with no reviewable changes (30)
- dev-requirements.txt
- docs/_snippets/cloud/integrations/athena.mdx
- docs/_snippets/dwh/databricks/create_service_principal.mdx
- docs/_snippets/oss/oss-introduction.mdx
- docs/_snippets/products-cards.mdx
- docs/_snippets/cloud/integrations/cards-groups/bi-cards.mdx
- docs/_snippets/cloud/integrations/cards-groups/connect-dwh-cards.mdx
- docs/_snippets/dwh/bigquery/cli_service_account.mdx
- docs/_snippets/dwh/bigquery/cloud_service_account.mdx
- docs/_snippets/cloud/integrations/databricks.mdx
- docs/_snippets/faq/question-schema.mdx
- docs/_snippets/faq/question-test-results-sample.mdx
- docs/cloud/guides/alert-rules.mdx
- docs/features/catalog.mdx
- docs/features/ci.mdx
- docs/features/multi-env.mdx
- docs/features/automated-monitors.mdx
- docs/dbt/dbt-artifacts.mdx
- docs/features/data-tests.mdx
- docs/guides/modules-overview/dbt-package.mdx
- docs/features/config-as-code.mdx
- docs/features/lineage.mdx
- docs/features/elementary-alerts.mdx
- docs/features/integrations.mdx
- docs/_snippets/oss/oss-introduction-opening.mdx
- docs/mint.json
- docs/dbt/package-models.mdx
- docs/_snippets/profiles/all-profiles.mdx
- docs/features/column-level-lineage.mdx
- docs/_snippets/cloud/integrations/cards-groups/cloud-integrations-cards.mdx
| data_tests: | ||
| elementary.volume_anomalies | ||
| tags: ['elementary'] | ||
| config: | ||
| tags: ['elementary'] |
There was a problem hiding this comment.
Fix YAML syntax error - missing list marker and colon.
The YAML structure is malformed. The test name is missing the list marker (-) and the colon (:) required for a mapping entry.
🐛 Proposed fix
data_tests:
- elementary.volume_anomalies
- config:
- tags: ['elementary']
+ - elementary.volume_anomalies:
+ config:
+ tags: ['elementary']🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/data-tests/add-elementary-tests.mdx` around lines 164 - 167, YAML under
the data_tests key is malformed: add the missing list marker and mapping colon
so the test name becomes a proper list entry and mapping (e.g., make
"elementary.volume_anomalies" a list item under data_tests and ensure it has a
colon before its nested config), updating the block that contains data_tests,
elementary.volume_anomalies, config, and tags accordingly.
| **3. Validate that the CLI has a working connection profile in the [right path and format](https://docs.elementary-data.com/oss/cli-install#how-to-create-profiles-yml)** | ||
|
|
||
| - **Check that the connection profile exists in the right path and format** | ||
| - **Check that the connection profile points to the elementary package schema** | ||
| - Default path: `HOME_DIR/.dbt/profiles.yml` . If saved elsewhere, make sure to run dbt run and dbt test with `—profiles-dir <profiles.yml path>` |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat -n docs/oss/general/troubleshooting.mdx | sed -n '35,45p'Repository: elementary-data/elementary
Length of output: 873
🌐 Web query:
dbt --profiles-dir flag directory vs file path specification
💡 Result:
dbt --profiles-dir expects a directory path, not a path to the profiles.yml file itself.
- dbt will look for a file literally named
profiles.ymlinside the directory you pass via--profiles-dir. The CLI help text is explicit: “Directory containing profiles.yml”. [1] - Same convention is documented by other dbt-integrating tools (e.g., SQLFluff’s dbt templater):
profiles_diris “the directory that contains the profiles.yml file”. [2]
Examples
- If your file is at
/etc/dbt/profiles.yml, use:dbt build --profiles-dir /etc/dbt
- Default location (when you don’t set it) is typically
~/.dbt/(so the file is~/.dbt/profiles.yml). [2]
If you pass a file path (e.g., --profiles-dir /etc/dbt/profiles.yml), dbt will treat it as a directory and then effectively look for /etc/dbt/profiles.yml/profiles.yml, which usually fails.
Sources: [1] [2]
Fix the --profiles-dir flag syntax and semantics on line 41.
The flag requires a directory path (the directory containing profiles.yml), not the file path itself. Users copying this example will encounter failures because dbt will attempt to look for profiles.yml/profiles.yml.
Additionally, fix the non-standard HOME_DIR placeholder to use ~ and correct the em dash to a regular hyphen.
🛠️ Suggested update
- Default path: `HOME_DIR/.dbt/profiles.yml` . If saved elsewhere, make sure to run dbt run and dbt test with `—profiles-dir <profiles.yml path>`
+ Default path: `~/.dbt/profiles.yml`. If saved elsewhere, make sure to run `dbt run --profiles-dir ~/.dbt` and `dbt test --profiles-dir ~/.dbt`📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| **3. Validate that the CLI has a working connection profile in the [right path and format](https://docs.elementary-data.com/oss/cli-install#how-to-create-profiles-yml)** | |
| - **Check that the connection profile exists in the right path and format** | |
| - **Check that the connection profile points to the elementary package schema** | |
| - Default path: `HOME_DIR/.dbt/profiles.yml` . If saved elsewhere, make sure to run dbt run and dbt test with `—profiles-dir <profiles.yml path>` | |
| **3. Validate that the CLI has a working connection profile in the [right path and format](https://docs.elementary-data.com/oss/cli-install#how-to-create-profiles-yml)** | |
| - Default path: `~/.dbt/profiles.yml`. If saved elsewhere, make sure to run `dbt run --profiles-dir ~/.dbt` and `dbt test --profiles-dir ~/.dbt` |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/oss/general/troubleshooting.mdx` around lines 39 - 41, Update the CLI
docs line that currently shows `HOME_DIR/.dbt/profiles.yml` and `—profiles-dir
<profiles.yml path>`: change the placeholder to use `~/.dbt/profiles.yml` and
correct the flag usage to `--profiles-dir <profiles directory>` (i.e., pass the
directory containing profiles.yml, not the file itself) and replace the em dash
with a regular hyphen in `--profiles-dir`; mention that the directory should be
the parent folder of `profiles.yml` so dbt can find `profiles.yml` correctly.
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/docs.json`:
- Around line 662-664: The PostHog project key is hardcoded in the docs.json
("posthog" -> "apiKey") which risks abuse; remove the hardcoded value and change
configuration to read the PostHog write key from an environment-specific secret
(e.g., POSTHOG_API_KEY) or secrets manager, ensure you document/validate that
domain/origin restrictions are enabled on the PostHog project and that separate
projects/keys are used per environment (dev/staging/prod), and add a note or
script to support rotation/revocation if abuse is detected.
In `@docs/home.mdx`:
- Around line 846-879: The cloud badge div (rendered when showCloudFeature is
true) is non-interactive but set as tabbable via tabIndex={0}; remove the
tabIndex attribute from the element with className
"home__feature-card__cloud-feature-tag" (the cloud badge rendered in the
showCloudFeature block) so it is no longer focusable by keyboard, and if the
element is purely decorative also ensure it has no interactive handlers or add
aria-hidden="true" if needed.
- Around line 796-799: The footer entry with label "Cloud vs OSS" currently uses
the stale href "/overview/cloud-vs-oss"; update that href value to the correct
path "/cloud/cloud-vs-oss" so the link matches other docs references and
resolves correctly (identify the object with label "Cloud vs OSS" and change its
href string).
- Around line 833-908: Summary: Cards defaulting link="#" produce dead anchor
CTAs; render a non-anchor when there is no real URL. Fix: change the render
logic that currently always returns <a href={link}...> to check the prop link
(and the comingSoon branch) and only render an anchor when link is a real URL
(e.g., truthy and not "#" or "javascript:void(0)"). For CardContent rendering,
use the existing CardContent component and return a semantic non-interactive
wrapper (e.g., <div className="home__feature-card">) or a <button/role="link">
fallback when link is missing; ensure you keep the comingSoon branch that
returns the coming-soon wrapper and preserve class names/home__feature-card
modifiers so styles and a11y (tabIndex on cloud tag) remain intact.
- Around line 7-10: Replace all HTML `class` attributes with React `className`
in this MDX file so JSX uses the correct prop: update occurrences like `<div
class="home__page">`, `<div class="home__container">`, and `<div
class="home__hero-layout">` to use `className` instead (note `section` already
has `className`). Search the file for any remaining `class="..."` and change
them to `className="..."`, keeping the existing class token values unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 9f6ae413-f266-437a-9510-a1a757e5a810
📒 Files selected for processing (3)
docs/cloud/integrations/pipeline/fivetran.mdxdocs/docs.jsondocs/home.mdx
✅ Files skipped from review due to trivial changes (1)
- docs/cloud/integrations/pipeline/fivetran.mdx
| "posthog": { | ||
| "apiKey": "phc_56XBEzZmh02mGkadqLiYW51eECyYKWPyecVwkGdGUfg" | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
Is a PostHog key with prefix phc_ a public project API key intended for client-side usage, and what are the security best practices (domain restrictions, rotation, and what must never be exposed)?
💡 Result:
Yes. A key with prefix phc_ is a PostHog Project API key (write-only, used for event ingestion) and is intended to be used in client-side SDKs/snippets (it’s the credential for PostHog’s “public POST-only endpoints”).[1][2][3]
Security best practices
1) Understand what “public” means (and the real risk)
- A
phc_...key can’t read your data or call admin/private endpoints; it’s for sending events.[1][2] - But if someone copies it, they can spam/poison your analytics (send fake events). So treat it as “public but abuseable,” not as a secret.
2) Domain restrictions / origin controls
- Don’t rely on the key itself for strong domain-locking. In general, browsers can spoof/omit
Origin/Refererin non-browser clients, so domain “restrictions” are at best an abuse-reduction measure. - Practical mitigations:
- Use separate PostHog projects per environment (dev/staging/prod) so test/spam doesn’t pollute production.
- Consider a reverse proxy (your domain → PostHog ingest) to (a) reduce ad-blocker breakage and (b) add your own rate limiting/WAF rules in front of ingestion.
3) Rotation
- Rotate the
phc_key if it leaks, if you suspect event spam, or on a regular schedule. - Use a two-key transition where possible (deploy new key everywhere, then deprecate the old one) to avoid data gaps.
4) What must never be exposed client-side
- Personal API keys (often shown as
phx_...) — these are for private endpoints and can grant broad access.[1][4] - Anything that can read data, manage projects, configure feature flags, access recordings, or otherwise hit PostHog’s private API surface (i.e., credentials used with
https://us.posthog.com/https://eu.posthog.comprivate endpoints, not the ingest hosts).[1]
Sources: n8n’s PostHog credential docs (public POST-only endpoints use Project API key; private endpoints require Personal API key), and PostHog’s official GitHub Action README calling the Project API Key “write-only.”[1][2]
Confirm hardcoding of PostHog project key aligns with security policy and implement domain/environment controls.
Line 663 contains phc_56XBEzZmh02mGkadqLiYW51eECyYKWPyecVwkGdGUfg, which is a PostHog Project API key (write-only, public, intended for client-side usage). While this key cannot read data or access admin functions, it is still abusable—others can send false events to poison analytics. Confirm with your team that:
- Hardcoding it in the repo is allowed by security policy
- PostHog project has domain restrictions or origin controls enabled
- You use separate projects per environment (dev/staging/prod) to contain test/spam events
- A rotation schedule is in place if abuse is suspected
🧰 Tools
🪛 Betterleaks (1.1.1)
[high] 663-663: Detected a PostHog Project API Key, which may expose product analytics data and event tracking to unauthorized access.
(posthog-project-api-key)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/docs.json` around lines 662 - 664, The PostHog project key is hardcoded
in the docs.json ("posthog" -> "apiKey") which risks abuse; remove the hardcoded
value and change configuration to read the PostHog write key from an
environment-specific secret (e.g., POSTHOG_API_KEY) or secrets manager, ensure
you document/validate that domain/origin restrictions are enabled on the PostHog
project and that separate projects/keys are used per environment
(dev/staging/prod), and add a note or script to support rotation/revocation if
abuse is detected.
| <div class="home__page"> | ||
| <section className="home__hero-section"> | ||
| <div class="home__container"> | ||
| <div class="home__hero-layout"> |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
🧩 Analysis chain
🌐 Web query:
Does Mintlify v4 / MDX custom page JSX require classNameinstead ofclasson HTML tags? Ifclassis used in.mdx, does it produce React invalid DOM property warnings or validation issues?
💡 Result:
Yes—when authoring JSX inside Mintlify v4 MDX pages, you should use className, not class.
- Mintlify’s own MDX “custom layout” and React-component examples use
classNameon normal HTML tags like<div>(because that markup is treated as React/JSX). [1], [2] - MDX’s documentation also shows that those “HTML-looking” tags in
.mdxare JSX, and specifically notes that React expectsclassName. [3] - React’s JSX rules state that because
classis reserved, you writeclassNameinstead, and if you get it wrong React will print a console warning. [4]
So if you write <div class="..."> in a Mintlify .mdx page, you should expect React “Invalid DOM property class. Did you mean className?”-style warnings (and it can also trip React/JSX linting/validation rules). [4]
Sources: [1] [2] [3] [4]
Replace all class attributes with className in JSX tags throughout this file.
Mintlify v4 MDX pages treat HTML tags as React JSX, which requires className instead of class. Using class will trigger React console warnings ("Invalid DOM property class. Did you mean className?") and may fail validation. This file mixes both attributes and needs standardization before merge.
Example fix
-<div class="home__page">
+<div className="home__page">📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <div class="home__page"> | |
| <section className="home__hero-section"> | |
| <div class="home__container"> | |
| <div class="home__hero-layout"> | |
| <div className="home__page"> | |
| <section className="home__hero-section"> | |
| <div class="home__container"> | |
| <div class="home__hero-layout"> |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/home.mdx` around lines 7 - 10, Replace all HTML `class` attributes with
React `className` in this MDX file so JSX uses the correct prop: update
occurrences like `<div class="home__page">`, `<div class="home__container">`,
and `<div class="home__hero-layout">` to use `className` instead (note `section`
already has `className`). Search the file for any remaining `class="..."` and
change them to `className="..."`, keeping the existing class token values
unchanged.
| { label: "Governance", href: "https://www.elementary-data.com/governance-and-discovery" }, | ||
| { label: "Enabling business users", href: "https://www.elementary-data.com/business-users" }, | ||
| { label: "Integrations", href: "https://www.elementary-data.com/integrations" }, | ||
| { label: "Cloud vs OSS", href: "/overview/cloud-vs-oss" }, |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
fd -i 'cloud-vs-oss*' docs
rg -n 'cloud-vs-oss' docsRepository: elementary-data/elementary
Length of output: 1011
Fix the stale footer link to Cloud vs OSS comparison page.
Line 799 references /overview/cloud-vs-oss, but the actual page is located at /cloud/cloud-vs-oss (as used on line 251 and across all other documentation references). This will result in a broken link in the footer.
Fix
- { label: "Cloud vs OSS", href: "/overview/cloud-vs-oss" },
+ { label: "Cloud vs OSS", href: "/cloud/cloud-vs-oss" },📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| { label: "Governance", href: "https://www.elementary-data.com/governance-and-discovery" }, | |
| { label: "Enabling business users", href: "https://www.elementary-data.com/business-users" }, | |
| { label: "Integrations", href: "https://www.elementary-data.com/integrations" }, | |
| { label: "Cloud vs OSS", href: "/overview/cloud-vs-oss" }, | |
| { label: "Governance", href: "https://www.elementary-data.com/governance-and-discovery" }, | |
| { label: "Enabling business users", href: "https://www.elementary-data.com/business-users" }, | |
| { label: "Integrations", href: "https://www.elementary-data.com/integrations" }, | |
| { label: "Cloud vs OSS", href: "/cloud/cloud-vs-oss" }, |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/home.mdx` around lines 796 - 799, The footer entry with label "Cloud vs
OSS" currently uses the stale href "/overview/cloud-vs-oss"; update that href
value to the correct path "/cloud/cloud-vs-oss" so the link matches other docs
references and resolves correctly (identify the object with label "Cloud vs OSS"
and change its href string).
| link = "#", | ||
| showCloudFeature = true, | ||
| comingSoon = false, | ||
| }) => { | ||
| const CardContent = () => ( | ||
| <div className="home__feature-card__container"> | ||
| <div className="home__feature-card__header" style={{ position: "relative", paddingRight: showCloudFeature ? 60 : 0 }}> | ||
| <div className="home__feature-card__header-content"> | ||
| <div className="home__feature-card__icon"> | ||
| <Icon icon={icon} size={24} color="#7e7e7e" /> | ||
| </div> | ||
| <h3 className="home__feature-card__heading">{heading}</h3> | ||
| </div> | ||
| {showCloudFeature && ( | ||
| <div className="home__feature-card__cloud-feature-tag" tabIndex={0} style={{ position: "absolute", top: 0, right: 0, transform: "none" }}> | ||
| <span className="cloud-feature-icon"> | ||
| <svg | ||
| width="18" | ||
| height="12" | ||
| viewBox="0 0 18 12" | ||
| fill="none" | ||
| xmlns="http://www.w3.org/2000/svg" | ||
| > | ||
| <g> | ||
| <path | ||
| d="M14.5125 4.53C14.2606 3.25329 13.5732 2.10364 12.5678 1.27743C11.5624 0.451225 10.3013 -0.000294182 9 1.43803e-07C6.8325 1.43803e-07 4.95 1.23 4.0125 3.03C2.91018 3.14912 1.89075 3.67141 1.15012 4.49649C0.409478 5.32158 -0.000128776 6.39126 3.03696e-08 7.5C3.03696e-08 9.9825 2.0175 12 4.5 12H14.25C16.32 12 18 10.32 18 8.25C18 6.27 16.4625 4.665 14.5125 4.53Z" | ||
| fill="#FF20B8" | ||
| /> | ||
| <g> | ||
| <path | ||
| d="M8.62497 6.0357H5.23658C4.82978 6.0357 4.5 6.3555 4.5 6.74999C4.5 7.14448 4.82978 7.46428 5.23658 7.46428H8.62497C9.03177 7.46428 9.36155 7.14448 9.36155 6.74999C9.36155 6.3555 9.03177 6.0357 8.62497 6.0357Z" | ||
| fill="white" | ||
| /> | ||
| <path | ||
| d="M11.2634 3.75H7.87503C7.46823 3.75 7.13845 4.0698 7.13845 4.46429C7.13845 4.85878 7.46823 5.17857 7.87503 5.17857H11.2634C11.6702 5.17857 12 4.85878 12 4.46429C12 4.0698 11.6702 3.75 11.2634 3.75Z" | ||
| fill="white" | ||
| /> | ||
| <path | ||
| d="M10.3947 8.32143H7.00627C6.59947 8.32143 6.26969 8.64122 6.26969 9.03571C6.26969 9.4302 6.59947 9.75 7.00627 9.75H10.3947C10.8015 9.75 11.1312 9.4302 11.1312 9.03571C11.1312 8.64122 10.8015 8.32143 10.3947 8.32143Z" | ||
| fill="white" | ||
| /> | ||
| </g> | ||
| </g> | ||
| </svg> | ||
| </span> | ||
| <span className="cloud-feature-text">Cloud Feature</span> | ||
| </div> | ||
| )} | ||
| </div> | ||
| <div className="home__feature-card__description-block"> | ||
| <p className="home__feature-card__description">{description}</p> | ||
| </div> | ||
| {comingSoon && ( | ||
| <div className="home__feature-card__coming-soon-overlay"> | ||
| <div className="home__feature-card__coming-soon-message"> | ||
| Coming Soon | ||
| </div> | ||
| </div> | ||
| )} | ||
| </div> | ||
| ); | ||
|
|
||
| if (comingSoon) { | ||
| return ( | ||
|
|
||
| <div className={`home__feature-card ${comingSoon ? "home__feature-card--coming-soon" : ""}`}> | ||
| <CardContent /> | ||
| </div> | ||
| ); } | ||
|
|
||
| return ( | ||
|
|
||
| <a href={link} className="home__feature-card" target="_self"> | ||
| <CardContent /> | ||
| </a> | ||
| ); }; |
There was a problem hiding this comment.
Don’t fall back to href="#" for cards without a real destination.
Line 833 defaults link to "#" and Line 905 always renders an anchor, so cards without a real URL become dead CTAs. The current “Data health scores” card already hits this path.
Safer fallback
export const FeatureCard = ({
heading = "Your Title",
description = "Your description here",
icon = "flag",
- link = "#",
+ link,
showCloudFeature = true,
comingSoon = false,
}) => {
@@
-if (comingSoon) {
-return (
-
-<div className={`home__feature-card ${comingSoon ? "home__feature-card--coming-soon" : ""}`}>
- <CardContent />
-</div>
-); }
+if (comingSoon) {
+ return (
+ <div className={`home__feature-card ${comingSoon ? "home__feature-card--coming-soon" : ""}`}>
+ <CardContent />
+ </div>
+ );
+}
+
+if (!link) {
+ return (
+ <div className="home__feature-card">
+ <CardContent />
+ </div>
+ );
+}
return (
-
<a href={link} className="home__feature-card" target="_self">
<CardContent />
</a>
); };🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/home.mdx` around lines 833 - 908, Summary: Cards defaulting link="#"
produce dead anchor CTAs; render a non-anchor when there is no real URL. Fix:
change the render logic that currently always returns <a href={link}...> to
check the prop link (and the comingSoon branch) and only render an anchor when
link is a real URL (e.g., truthy and not "#" or "javascript:void(0)"). For
CardContent rendering, use the existing CardContent component and return a
semantic non-interactive wrapper (e.g., <div className="home__feature-card">) or
a <button/role="link"> fallback when link is missing; ensure you keep the
comingSoon branch that returns the coming-soon wrapper and preserve class
names/home__feature-card modifiers so styles and a11y (tabIndex on cloud tag)
remain intact.
| {showCloudFeature && ( | ||
| <div className="home__feature-card__cloud-feature-tag" tabIndex={0} style={{ position: "absolute", top: 0, right: 0, transform: "none" }}> | ||
| <span className="cloud-feature-icon"> | ||
| <svg | ||
| width="18" | ||
| height="12" | ||
| viewBox="0 0 18 12" | ||
| fill="none" | ||
| xmlns="http://www.w3.org/2000/svg" | ||
| > | ||
| <g> | ||
| <path | ||
| d="M14.5125 4.53C14.2606 3.25329 13.5732 2.10364 12.5678 1.27743C11.5624 0.451225 10.3013 -0.000294182 9 1.43803e-07C6.8325 1.43803e-07 4.95 1.23 4.0125 3.03C2.91018 3.14912 1.89075 3.67141 1.15012 4.49649C0.409478 5.32158 -0.000128776 6.39126 3.03696e-08 7.5C3.03696e-08 9.9825 2.0175 12 4.5 12H14.25C16.32 12 18 10.32 18 8.25C18 6.27 16.4625 4.665 14.5125 4.53Z" | ||
| fill="#FF20B8" | ||
| /> | ||
| <g> | ||
| <path | ||
| d="M8.62497 6.0357H5.23658C4.82978 6.0357 4.5 6.3555 4.5 6.74999C4.5 7.14448 4.82978 7.46428 5.23658 7.46428H8.62497C9.03177 7.46428 9.36155 7.14448 9.36155 6.74999C9.36155 6.3555 9.03177 6.0357 8.62497 6.0357Z" | ||
| fill="white" | ||
| /> | ||
| <path | ||
| d="M11.2634 3.75H7.87503C7.46823 3.75 7.13845 4.0698 7.13845 4.46429C7.13845 4.85878 7.46823 5.17857 7.87503 5.17857H11.2634C11.6702 5.17857 12 4.85878 12 4.46429C12 4.0698 11.6702 3.75 11.2634 3.75Z" | ||
| fill="white" | ||
| /> | ||
| <path | ||
| d="M10.3947 8.32143H7.00627C6.59947 8.32143 6.26969 8.64122 6.26969 9.03571C6.26969 9.4302 6.59947 9.75 7.00627 9.75H10.3947C10.8015 9.75 11.1312 9.4302 11.1312 9.03571C11.1312 8.64122 10.8015 8.32143 10.3947 8.32143Z" | ||
| fill="white" | ||
| /> | ||
| </g> | ||
| </g> | ||
| </svg> | ||
| </span> | ||
| <span className="cloud-feature-text">Cloud Feature</span> | ||
| </div> |
There was a problem hiding this comment.
Remove the stray keyboard focus stop from the cloud badge.
Line 847 makes a non-interactive label tabbable. That adds noise for keyboard users, but there’s nothing to activate once focus lands on it.
Minimal fix
- <div className="home__feature-card__cloud-feature-tag" tabIndex={0} style={{ position: "absolute", top: 0, right: 0, transform: "none" }}>
+ <div className="home__feature-card__cloud-feature-tag" style={{ position: "absolute", top: 0, right: 0, transform: "none" }}>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| {showCloudFeature && ( | |
| <div className="home__feature-card__cloud-feature-tag" tabIndex={0} style={{ position: "absolute", top: 0, right: 0, transform: "none" }}> | |
| <span className="cloud-feature-icon"> | |
| <svg | |
| width="18" | |
| height="12" | |
| viewBox="0 0 18 12" | |
| fill="none" | |
| xmlns="http://www.w3.org/2000/svg" | |
| > | |
| <g> | |
| <path | |
| d="M14.5125 4.53C14.2606 3.25329 13.5732 2.10364 12.5678 1.27743C11.5624 0.451225 10.3013 -0.000294182 9 1.43803e-07C6.8325 1.43803e-07 4.95 1.23 4.0125 3.03C2.91018 3.14912 1.89075 3.67141 1.15012 4.49649C0.409478 5.32158 -0.000128776 6.39126 3.03696e-08 7.5C3.03696e-08 9.9825 2.0175 12 4.5 12H14.25C16.32 12 18 10.32 18 8.25C18 6.27 16.4625 4.665 14.5125 4.53Z" | |
| fill="#FF20B8" | |
| /> | |
| <g> | |
| <path | |
| d="M8.62497 6.0357H5.23658C4.82978 6.0357 4.5 6.3555 4.5 6.74999C4.5 7.14448 4.82978 7.46428 5.23658 7.46428H8.62497C9.03177 7.46428 9.36155 7.14448 9.36155 6.74999C9.36155 6.3555 9.03177 6.0357 8.62497 6.0357Z" | |
| fill="white" | |
| /> | |
| <path | |
| d="M11.2634 3.75H7.87503C7.46823 3.75 7.13845 4.0698 7.13845 4.46429C7.13845 4.85878 7.46823 5.17857 7.87503 5.17857H11.2634C11.6702 5.17857 12 4.85878 12 4.46429C12 4.0698 11.6702 3.75 11.2634 3.75Z" | |
| fill="white" | |
| /> | |
| <path | |
| d="M10.3947 8.32143H7.00627C6.59947 8.32143 6.26969 8.64122 6.26969 9.03571C6.26969 9.4302 6.59947 9.75 7.00627 9.75H10.3947C10.8015 9.75 11.1312 9.4302 11.1312 9.03571C11.1312 8.64122 10.8015 8.32143 10.3947 8.32143Z" | |
| fill="white" | |
| /> | |
| </g> | |
| </g> | |
| </svg> | |
| </span> | |
| <span className="cloud-feature-text">Cloud Feature</span> | |
| </div> | |
| {showCloudFeature && ( | |
| <div className="home__feature-card__cloud-feature-tag" style={{ position: "absolute", top: 0, right: 0, transform: "none" }}> | |
| <span className="cloud-feature-icon"> | |
| <svg | |
| width="18" | |
| height="12" | |
| viewBox="0 0 18 12" | |
| fill="none" | |
| xmlns="http://www.w3.org/2000/svg" | |
| > | |
| <g> | |
| <path | |
| d="M14.5125 4.53C14.2606 3.25329 13.5732 2.10364 12.5678 1.27743C11.5624 0.451225 10.3013 -0.000294182 9 1.43803e-07C6.8325 1.43803e-07 4.95 1.23 4.0125 3.03C2.91018 3.14912 1.89075 3.67141 1.15012 4.49649C0.409478 5.32158 -0.000128776 6.39126 3.03696e-08 7.5C3.03696e-08 9.9825 2.0175 12 4.5 12H14.25C16.32 12 18 10.32 18 8.25C18 6.27 16.4625 4.665 14.5125 4.53Z" | |
| fill="#FF20B8" | |
| /> | |
| <g> | |
| <path | |
| d="M8.62497 6.0357H5.23658C4.82978 6.0357 4.5 6.3555 4.5 6.74999C4.5 7.14448 4.82978 7.46428 5.23658 7.46428H8.62497C9.03177 7.46428 9.36155 7.14448 9.36155 6.74999C9.36155 6.3555 9.03177 6.0357 8.62497 6.0357Z" | |
| fill="white" | |
| /> | |
| <path | |
| d="M11.2634 3.75H7.87503C7.46823 3.75 7.13845 4.0698 7.13845 4.46429C7.13845 4.85878 7.46823 5.17857 7.87503 5.17857H11.2634C11.6702 5.17857 12 4.85878 12 4.46429C12 4.0698 11.6702 3.75 11.2634 3.75Z" | |
| fill="white" | |
| /> | |
| <path | |
| d="M10.3947 8.32143H7.00627C6.59947 8.32143 6.26969 8.64122 6.26969 9.03571C6.26969 9.4302 6.59947 9.75 7.00627 9.75H10.3947C10.8015 9.75 11.1312 9.4302 11.1312 9.03571C11.1312 8.64122 10.8015 8.32143 10.3947 8.32143Z" | |
| fill="white" | |
| /> | |
| </g> | |
| </g> | |
| </svg> | |
| </span> | |
| <span className="cloud-feature-text">Cloud Feature</span> | |
| </div> |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/home.mdx` around lines 846 - 879, The cloud badge div (rendered when
showCloudFeature is true) is non-interactive but set as tabbable via
tabIndex={0}; remove the tabIndex attribute from the element with className
"home__feature-card__cloud-feature-tag" (the cloud badge rendered in the
showCloudFeature block) so it is no longer focusable by keyboard, and if the
element is purely decorative also ensure it has no interactive handlers or add
aria-hidden="true" if needed.
Summary
Merges the
docsbranch intomasterto synchronize all accumulated documentation changes. This includes:<Snippet file="..." />to ESM import-based<ComponentName />, and snippet directory renamed from_snippets/tosnippets/docs.jsonrestructured with new sections; BI integration cards updatedNon-docs changes also included in the docs branch:
pyproject.tomlandpackages.yml: version bump0.15.1 → 0.18.3.pre-commit-config.yaml: addedmintlify-validatehook.gitignore: addeddbt_packages/dev-requirements.txt: removedtypes-pkg-resourcesdocs/Dockerfile: updated to Node 20.3.0, removedmintlify installstepReview & Testing Checklist for Human
pyproject.tomlandelementary/monitor/dbt_project/packages.yml— verify these are intended for master and won't conflict with the current release statemintlify-validatepre-commit hook — this will fail for any contributor withoutmintlifyCLI installed. Confirm this is acceptable or should be gated_snippets/directory — all old-style snippet files were removed as part of Mintlify v4 migration. Verify no remaining code on master references the old_snippets/pathsNotes
dbt_packages/gitignore entry andtypes-pkg-resourcesremoval are minor housekeeping but should be confirmed as compatible with master's current state.Link to Devin session: https://app.devin.ai/sessions/e56abb358db34b84956c5b78d163f348
Requested by: @arbiv
Summary by CodeRabbit
New Features
Documentation
Refactor