Skip to content

Conversation

amotl
Copy link
Member

@amotl amotl commented Aug 10, 2025

About

After concluding the last mile of the higher-level shape/structure refactoring per GH-238 and GH-239, this patch drills down to the per-page level, touching a few bits of design/layout details across the board of the integrate backbone section. It provides better visual guidance by using more prominent card design elements over bare HTML link anchors.

A rabbit hopped through docs so wide,
Tidying grids and cards with pride.

The patch also tunes down product card creep by tucking away verbose content using collapsibles.

Logos right, cards in a row,
Dropdowns hide what you may know.

Details

  • Improve layout on each page in docs/integrate
  • Use cards instead of regular HTML anchors for more prominent guidance
  • Custom css file instead of included html
  • Naming things

Preview

Look at all leaf-node index pages within the backbone section integrate:
https://cratedb-guide--241.org.readthedocs.build/integrate/

References

@amotl amotl added sanding-1200 Fine sanding. cross linking Linking to different locations of the documentation. guidance Matters of layout, shape, and structure. labels Aug 10, 2025
Copy link

coderabbitai bot commented Aug 10, 2025

Walkthrough

Removed many embedded HTML style includes and moved styling into a standalone CSS file (added to Sphinx config). Standardized header/logo and grid/card layouts across numerous integration pages, updated several link references and texts, and added a Marquez tutorial plus an Airflow DAG example for lineage/data ingestion.

Changes

Cohort / File(s) Change Summary
Embedded style includes removed
docs/connect/index.md, docs/feature/blob/index.md, docs/feature/ccr/index.md, docs/feature/cloud/index.md, docs/feature/cluster/index.md, docs/feature/document/index.md, docs/feature/fdw/index.md, docs/feature/index.md, docs/feature/index/index.md, docs/feature/relational/index.md, docs/feature/search/fts/index.md, docs/feature/search/geo/index.md, docs/feature/search/hybrid/index.md, docs/feature/search/index.md, docs/feature/search/vector/index.md, docs/feature/snapshot/index.md, docs/feature/sql/index.md, docs/feature/storage/index.md, docs/feature/udf/index.md, docs/ingest/etl/index.md, docs/ingest/index.md, docs/topic/index.md, docs/topic/ml/index.md, docs/topic/timeseries/index.md, docs/use/index.md
Removed {include} directives that embedded an HTML styles fragment from many markdown files.
Custom CSS & Sphinx config
docs/_static/css/custom.css, docs/conf.py
Converted inline/HTML-wrapped CSS into a standalone custom.css, added utility classes (.float-right, .clearfix, .text-right), adjusted title/logo rules, and ensured css/custom.css is appended to html_css_files in Sphinx config.
Integration docs: layout & visual refactor
docs/integrate/*.md (many files: e.g., apache-airflow/index.md, apache-flink/index.md, apache-hop/index.md, apache-iceberg/index.md, apache-kafka/index.md, apache-nifi/index.md, apache-superset/index.md, aws-dms/index.md, aws-dynamodb/index.md, aws-kinesis/index.md, aws-lambda/index.md, azure-functions/index.md, cluvio/index.md, datagrip/index.md, dbeaver/index.md, dbt/index.md, debezium/index.md, django/index.md, estuary/index.md, explo/index.md, gradio/index.md, grafana/index.md, influxdb/index.md, kestra/index.md, langchain/index.md, llamaindex/index.md, marquez/index.md, meltano/index.md, metabase/index.md, mongodb/index.md, mysql/index.md, n8n/index.md, node-red/index.md, plotly/index.md, powerbi/*, prometheus/index.md, pyviz/index.md, rill/index.md, risingwave/index.md, sql-server/index.md, streamlit/index.md, streamsets/index.md, tableau/index.md, telegraf/index.md)
Standardized header/logo handling (float-right + clearfix), introduced grid/grid-item-card layouts for Learn/Tutorial content, added Details dropdowns, updated media to lazy loading and fixed heights, reorganized sections and revised wording across many integration pages.
Content & include updates
docs/_include/card/timeseries-datashader.md, docs/_include/links.md, docs/ingest/cdc/index.md, docs/integrate/index.md, docs/use/telemetry/index.md
Replaced a {todo} block with an inline note, added/removed link references in links.md (deduplicated and added DynamoDB/DMS links), adjusted wording and layouts in ingest/telemetry pages, and pruned detailed telemetry content in favor of a concise reference.
Marquez tutorial & Airflow DAG
docs/integrate/marquez/learn.md, docs/integrate/marquez/data_ingestion.py
Added a new Marquez tutorial document and a new Airflow DAG Python example (lineage-reporting-cratedb) that populates sample tables and includes lineage metadata via SQLExecuteQueryOperator tasks.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant DocsPage
    participant Sphinx
    participant CustomCSS

    User->>DocsPage: Request page
    DocsPage->>Sphinx: Load static assets
    Sphinx->>CustomCSS: Serve css/custom.css
    DocsPage->>CustomCSS: Apply layout and utility classes
    User->>DocsPage: Interact with grids, cards, dropdowns
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20–25 minutes

Possibly related PRs

Suggested labels

maintenance

Suggested reviewers

  • hammerhead
  • karynzv
  • surister
  • bmunkholm

Poem

"I hopped through CSS and tidy rows,
logos right where sunlight glows.
Cards and grids in neat array,
dropdowns tucked the text away.
Tutorials sprung, an Airflow song —
a rabbit cheers: docs fixed and strong!" 🐇✨

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch etl-cdc-balancing

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 29

🔭 Outside diff range comments (3)
docs/integrate/node-red/index.md (1)

24-53: Update FlowFuse Cloud and Introduction URLs

docs/integrate/estuary/index.md (1)

45-49: Normalize reference label case to match definition

The reference is defined as [Estuary Managed] (capital M). Use the same case to avoid link-resolution edge cases.

-Estuary offers its solution as a [managed product][Estuary managed], available
+Estuary offers its solution as a [managed product][Estuary Managed], available
docs/integrate/dbt/index.md (1)

35-38: Fix cross-page links: use Sphinx/MyST refs instead of in-page #anchors.

The anchors (#debezium, #apache-airflow, #bi-tools) don’t exist on this page and won’t resolve. Use :ref: to the integration anchors defined in their index.md files.

-The idea is that data engineers make source data available to an environment where
-dbt projects run, for example with [Debezium](#debezium) or with [Airflow](#apache-airflow).
-Afterwards, data analysts can run their dbt projects against this data to produce models
-(tables and views) that can be used with a number of [BI tools](#bi-tools).
+The idea is that data engineers make source data available to an environment where
+dbt projects run, for example with {ref}`Debezium <debezium>` or with {ref}`Apache Airflow <apache-airflow>`.
+Afterwards, data analysts can run their dbt projects against this data to produce models
+(tables and views) that can be used with a number of {ref}`BI tools <bi-tools>`.

If the target labels differ, adjust the ref targets to match the actual anchor IDs.

🧹 Nitpick comments (93)
docs/integrate/mysql/import-csv.rst (1)

5-9: Anchor naming: consider hierarchical prefix for consistency

Consider aligning the new anchor with existing integrate anchors (e.g., integrate-mysql-import-csv). This keeps labels discoverable and predictable.

Apply this diff:

-.. _mysql-import-csv:
+.. _integrate-mysql-import-csv:
docs/conf.py (1)

101-103: Guard Against Duplicate CSS Entries & Verify Static Path

To prevent accidentally appending the same stylesheet twice and ensure Sphinx can locate your custom CSS, update docs/conf.py as follows:

-html_css_files += [
-    'css/custom.css',
-]
+if 'css/custom.css' not in html_css_files:
+    html_css_files.append('css/custom.css')

Additionally, we didn’t find any explicit html_static_path configuration in docs/conf.py (or elsewhere in the repo). Either rely on Sphinx’s default html_static_path = ['_static'] or add this line near the top of docs/conf.py to guarantee that ‘css/custom.css’ resolves under _static:

html_static_path = ['_static']

Please verify that your static path is correctly set so the CSS file is served.

docs/_static/css/custom.css (1)

54-57: Refine h1+logo alignment for robustness

inline-block works, but inline-flex provides better vertical centering when an image/logo is adjacent to the title and handles wrapping more predictably.

Apply this diff:

-#main-content h1 {
-    display: inline-block;
-}
+#main-content h1 {
+    display: inline-flex;
+    align-items: center;
+    gap: 0.5rem; /* space between logo and title */
+}
+/* Optional: ensure logos inside h1 scale and align nicely */
+#main-content h1 img {
+    vertical-align: middle;
+    max-height: 2rem; /* adjust as needed per design */
+}
docs/integrate/streamsets/index.md (2)

4-10: Avoid inline styles and external hotlinked logo; prefer reusable CSS + local asset

Replace the float/clear inline styles with a CSS class and serve the logo from docs/_static to prevent third‑party hotlinking and improve reliability.

Proposed change in this file:

-```{div}
-:style: "float: right"
-[![StreamSets logo](https://agile.co.uk/wp-content/uploads/2022/01/streamsets-logo.png){h=60px}][StreamSets Data Collector]
-```
-```{div}
-:style: "clear: both"
-```
+```{div}
+:class: integrate-logo-right
+[![StreamSets logo](/_static/img/integrations/streamsets.png){h=60px}][StreamSets Data Collector]
+```
+```{div}
+:class: clear-both
+```

Add (outside this file) to docs/_static/css/custom.css:

.integrate-logo-right { float: right; margin-left: .5rem; }
.clear-both { clear: both; }

28-33: Typo: “StreamSet” → “StreamSets”

Use the correct product name with trailing “s”.

-:::{grid-item-card} Use StreamSet with CrateDB
+:::{grid-item-card} Use StreamSets with CrateDB
docs/integrate/index.md (1)

53-53: Consistency of display labels

Only Power BI uses display text (“Power BI <powerbi/index>”). If intentional, fine; otherwise consider aligning display text across entries for uniformity.

docs/integrate/dbeaver/index.md (1)

9-10: Add alt text for logo for accessibility

Current image has empty alt; provide meaningful alt text.

-[![](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){w=120px}][DBeaver]
+[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){w=120px}][DBeaver]
docs/integrate/azure-functions/index.md (2)

7-13: Avoid inline styles and external hotlinked logo; prefer reusable CSS + local asset

Replace inline float/clear with CSS classes and serve the logo from docs/_static.

-```{div}
-:style: "float: right;"
-[![Azure Functions logo](https://www.vectorlogo.zone/logos/azurefunctions/azurefunctions-ar21.svg){h=60px}][Azure Functions]
-```
-```{div}
-:style: "clear: both"
-```
+```{div}
+:class: integrate-logo-right
+[![Azure Functions logo](/_static/img/integrations/azure-functions.svg){h=60px}][Azure Functions]
+```
+```{div}
+:class: clear-both
+```

CSS addition (outside this file) as noted in the StreamSets comment.


31-39: Minor wording tightening in card body

Small phrasing tweak for concision.

-A common pattern is to use an Azure Function to enrich and ingest data
-to a CrateDB instance by connecting that Azure Function to an IoT Hub's
-new messages trigger.
+A common pattern uses an Azure Function to enrich and ingest data
+into a CrateDB instance by connecting the function to an IoT Hub
+new‑messages trigger.
docs/integrate/n8n/index.md (2)

4-10: Replace inline styles with CSS classes; add lazy-loading for logo.

Inline styles make reuse and maintenance harder. Prefer classes and move styling into custom.css. Also add loading=lazy for the external logo.

Proposed change in this file:

-```{div}
-:style: "float: right; text-align: right"
-[![n8n logo](https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/N8n-logo-new.svg/330px-N8n-logo-new.svg.png){h=60px}][n8n]
-```
+```{div}
+:class: integration-logo align-right
+[![n8n logo](https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/N8n-logo-new.svg/330px-N8n-logo-new.svg.png){h=60px loading=lazy}][n8n]
+```
-```{div}
-:style: "clear: both"
-```
+```{div}
+:class: clearfix
+```

Add to docs/_static/css/custom.css:

.integration-logo { float: right; text-align: right; }
.align-right { text-align: right; }
.clearfix { clear: both; }

33-35: Resolve MD053 (unused reference) by inlining the link in seealso or ensure it’s recognized.

markdownlint flags the “CrateDB and n8n” reference as unused. Either inline the link in the seealso block and remove the definition, or keep the reference but ensure the linter recognizes it.

Option A (inline, simplest):

-```{seealso}
-[CrateDB and n8n]
-```
+```{seealso}
+CrateDB and n8n: https://cratedb.com/integrations/cratedb-and-n8n
+```

Then remove the now-unused definition:

-[CrateDB and n8n]: https://cratedb.com/integrations/cratedb-and-n8n

Option B (keep reference): keep current seealso usage and add a short inline usage elsewhere on the page to satisfy the linter, or adjust lint config to allow references inside directives.

Also applies to: 37-39

docs/integrate/apache-iceberg/index.md (1)

4-10: Prefer CSS classes over inline styles; add lazy-loading to logo.

Align with the “custom CSS” direction by moving float/clear into classes and add loading=lazy.

-```{div}
-:style: "float: right"
-[![Apache Iceberg logo](https://iceberg.apache.org/assets/images/Iceberg-logo.svg){h=60px}][Apache Iceberg]
-```
+```{div}
+:class: integration-logo
+[![Apache Iceberg logo](https://iceberg.apache.org/assets/images/Iceberg-logo.svg){h=60px loading=lazy}][Apache Iceberg]
+```
-```{div}
-:style: "clear: both"
-```
+```{div}
+:class: clearfix
+```

CSS (docs/_static/css/custom.css):

.integration-logo { float: right; }
.clearfix { clear: both; }
docs/integrate/llamaindex/index.md (1)

96-97: Minor wording/formatting nit.

Consider removing “i.e.” for brevity and joining lines to avoid awkward wrap in lists.

-- Text-to-SQL / Talk to your data:
-  Query the database in human language, i.e. query CrateDB in plain English.
+- Text-to-SQL / Talk to your data: Query the database in human language; query CrateDB in plain English.
docs/integrate/aws-lambda/index.md (2)

7-13: Use CSS classes and lazy-loading for the logo.

Keep styling centralized and improve perf with lazy-loading.

-```{div}
-:style: "float: right;"
-[![AWS Lambda logo](https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Amazon_Lambda_architecture_logo.svg/281px-Amazon_Lambda_architecture_logo.svg.png){h=60px}][AWS Lambda]
-```
+```{div}
+:class: integration-logo
+[![AWS Lambda logo](https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Amazon_Lambda_architecture_logo.svg/281px-Amazon_Lambda_architecture_logo.svg.png){h=60px loading=lazy}][AWS Lambda]
+```
-```{div}
-:style: "clear: both"
-```
+```{div}
+:class: clearfix
+```

27-30: Tiny grammar improvement (optional).

Use “a Kinesis stream” for readability.

-It is common practice to forward DynamoDB table change stream events to a
-Kinesis Stream, and consume that from an adapter to write into an analytical
-or long-term storage consolidation database like CrateDB.
+It is common practice to forward DynamoDB table change stream events to a
+Kinesis stream, and to consume that from an adapter to write into an analytical
+or long-term storage consolidation database like CrateDB.
docs/integrate/sql-server/index.md (2)

6-12: Inline styles and HTML entity spacing; prefer CSS classes for consistency

Replace inline style and &nbsp; spacing with semantic classes and CSS gaps for consistency (and easier global tuning). Also consider setting a small left margin on the second logo via CSS rather than &nbsp;.

Example diff (content-side):

-```{div}
-:style: "float: right; margin-left: 1em"
+```{div} .float-right .logos
 [![Microsoft logo](https://github.com/crate/crate-clients-tools/assets/453543/a93a0fdb-1a1e-451e-abcb-8f705e2b03f4){h=60px}](https://www.microsoft.com/)
-&nbsp;&nbsp;
 [![MSSQL logo](https://github.com/crate/crate-clients-tools/assets/453543/6317965a-0b69-4d8e-bc77-e12dfc8ed338){h=60px}](https://learn.microsoft.com/en-us/sql/)

-{div} -:style: "clear: both" +{div} .clear-both

Suggested CSS (docs/_static/css/custom.css):

.float-right { float: right; margin-left: 1em; }
.clear-both { clear: both; }
.logos img + img { margin-left: .5rem; }

38-46: Grid/card usage for “Learn” is clear and consistent

Card content and link config look correct for sphinx-design. Consider adding a short, benefit-focused subtitle to the title (optional).

Also applies to: 48-48

docs/integrate/influxdb/index.md (2)

9-15: Add alt text to HTML badge image for accessibility

The shield image lacks alt text. Add alt to improve accessibility and SEO.

-    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-toolkit/influxdb.yml?branch=main&label=CTK%2BInfluxDB" loading="lazy"></a>
+    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-toolkit/influxdb.yml?branch=main&label=CTK%2BInfluxDB" loading="lazy" alt="Build status: CTK + InfluxDB"></a>

31-38: Synopsis snippet is helpful; consider labeling credentials placeholders

Minor: consider marking credentials clearly as placeholders to avoid copy/paste confusion by readers.

-  "influxdb2://example:[email protected]:8086/testdrive/demo" \
-  --cratedb-sqlalchemy-url="crate://user:[email protected]:4200/testdrive/demo"
+  "influxdb2://{org}:{token}@influxdb.example.org:8086/{bucket}/{measurement}" \
+  --cratedb-sqlalchemy-url="crate://{user}:{password}@cratedb.example.org:4200/{schema}/{table}"
docs/integrate/cluvio/index.md (4)

5-10: Prefer CSS classes over inline styles; logo alt text OK

Consider switching to CSS classes for floats/clears for maintainability and consistency with custom.css usage.

Example (content):

-```{div}
-:style: "float: right;"
+```{div} .float-right
 [![Cluvio logo](https://www.cluvio.com/images/logos/cluvio/cluvio-logo-full_color-on_light-3744dd33.svg){h=60px}][Cluvio]

-{div} -:style: "clear: both" +{div} .clear-both


19-28: Add descriptive alt text/captions to images inside dropdown

The inline images use filenames as alt surrogates. Add concise alt text or convert to figure directives with captions for better accessibility.

Example:

-![custom-filters.png](...){h=200px}
+![Cluvio dashboard with custom filters](...){h=200px}
-![report-creator.png](...){h=200px}
+![Cluvio report creator screen](...){h=200px}

33-43: Fix markdownlint MD034 “bare URL” in 🔗 value

The linter flags the bare URL. Wrapping the URL in angle brackets usually satisfies MD034 without changing semantics.

-:link: https://community.cratedb.com/t/data-analysis-with-cluvio-and-cratedb/1571
+:link: <https://community.cratedb.com/t/data-analysis-with-cluvio-and-cratedb/1571>

45-47: Resolve markdownlint MD053 “unused reference” for [CrateDB and Cluvio]

Some linters ignore links inside directives like seealso. To appease MD053, add a visible usage outside directives or disable the rule for this file.

Option A (add visible usage):

 ```{seealso}
 **Product:** [CrateDB and Cluvio]

+See also [CrateDB and Cluvio].


Option B (disable rule at top of file):
```md
<!-- markdownlint-disable MD053 -->

Also applies to: 51-52

docs/integrate/datagrip/index.md (2)

9-10: Good structure; consider CSS classes over inline styles

Logo float and wrapped description are clean. Prefer CSS classes for float/spacing to keep styling centralized.

Also applies to: 11-19


33-35: Add descriptive alt text for screenshots

Several images have generic “Image” alt text. Replace with meaningful alt text to improve accessibility and searchability.

Examples:

-![Image](...a8c1ada6...){h=180px}
+![DataGrip: add custom JAR for JDBC driver](...a8c1ada6...){h=180px}

-![Image](...1f925848...){h=180px}
+![DataGrip: select JDBC JARs](...1f925848...){h=180px}

-![Image](...50ccb304...){w=400px}
+![DataGrip: set driver class io.crate.client.jdbc.CrateDriver](...50ccb304...){w=400px}

-![Image](...147a3e8e...){w=480px}
+![DataGrip: add CrateDB data source](...147a3e8e...){w=480px}

-![Image](...3350a955...){h=240px}
+![DataGrip: data tree view](...3350a955...){h=240px}
-![Image](...d0a2a09d...){h=240px}
+![DataGrip: query console running SQL](...d0a2a09d...){h=240px}

Also applies to: 42-42, 56-56, 75-77, 85-96

docs/integrate/node-red/index.md (1)

6-10: Optional: Prefer CSS classes over inline styles for logo and clearfix

To align with “switching to a custom CSS file,” consider using reusable classes instead of inline :style: attributes for float and clear.

Example:

-```{div}
-:style: "float: right; margin-left: 1em"
+```{div}
+:class: "logo-right"
 [![Node-RED logo](https://upload.wikimedia.org/wikipedia/commons/2/2b/Node-red-icon.png){h=60px}](https://nodered.org/)

-{div} -:style: "clear: both" +{div}
+:class: "clearfix"

docs/integrate/powerbi/index.md (1)

4-10: Optional: Move inline styles to CSS classes

Adopt shared classes (e.g., logo-right, clearfix) rather than inline :style: to align with the global CSS approach.

-```{div}
-:style: "float: right"
+```{div}
+:class: "logo-right"
 ...
-```{div}
-:style: "clear: both"
+```{div}
+:class: "clearfix"

</blockquote></details>
<details>
<summary>docs/integrate/kestra/index.md (1)</summary><blockquote>

`4-10`: **Optional: Replace inline styles with CSS classes**

Use shared CSS classes for the floated logo and clear block to reduce inline styles.

```diff
-```{div}
-:style: "float: right"
+```{div}
+:class: "logo-right"
 ...
-```{div}
-:style: "clear: both"
+```{div}
+:class: "clearfix"

</blockquote></details>
<details>
<summary>docs/integrate/apache-kafka/index.md (1)</summary><blockquote>

`4-13`: **Optional: Use CSS classes instead of inline styles**

Prefer shared classes (e.g., `logo-right text-right`, `clearfix`) over inline `:style:`.

```diff
-```{div}
-:style: "float: right; text-align: right"
+```{div}
+:class: "logo-right text-right"
 ...
-```{div}
-:style: "clear: both"
+```{div}
+:class: "clearfix"

</blockquote></details>
<details>
<summary>docs/integrate/meltano/index.md (2)</summary><blockquote>

`4-12`: **Optional: Standardize logo sizing and spacing; prefer CSS classes**

- Consider using a consistent height (`h=60px`) like other integrations instead of width-based sizing for both logos.
- Replace `&nbsp;&nbsp;` spacing with CSS (gap/margin) and switch inline styles to shared classes.

```diff
-```{div}
-:style: "float: right"
-[![Singer logo](https://www.singer.io/img/singer_logo_full_black.svg){w=180px}][Singer]
-&nbsp;&nbsp;
-[![Meltano logo](https://github.com/crate/crate-clients-tools/assets/453543/0c01e995-d7c2-4a4d-8e90-c6697fe2a85d){w=180px}][Meltano]
+```{div}
+:class: "logo-right logo-pair"
+[![Singer logo](https://www.singer.io/img/singer_logo_full_black.svg){h=60px}][Singer]
+[![Meltano logo](https://github.com/crate/crate-clients-tools/assets/453543/0c01e995-d7c2-4a4d-8e90-c6697fe2a85d){h=60px}][Meltano]

-{div} -:style: "clear: both" +{div}
+:class: "clearfix"


51-53: Nit: minor wording tweak for clarity

“contributions and interests are welcome” → “contributions and interest are welcome.”

-🚧 These adapters are a work in progress, contributions and interests are welcome. 🚧
+🚧 These adapters are a work in progress; contributions and interest are welcome. 🚧
docs/integrate/telegraf/index.md (3)

5-7: Replace inline float style with CSS class for consistency

Aligns with PR goal to prefer custom CSS over inline styles. Define a reusable class (e.g., .logo-float-right) and apply it here.

-```{div}
-:style: "float: right"
-[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){h=60px}][Telegraf]
+```{div}
+:class: logo-float-right
+[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){h=60px}][Telegraf]

8-10: Replace inline clearfix with CSS utility

Prefer a CSS class like .clearfix to reduce inline styles and ease future changes.

-```{div}
-:style: "clear: both"
+```{div}
+:class: clearfix

39-39: Add descriptive alt text to image for accessibility

Current image has no alt text, which is suboptimal for screen readers.

-![](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png){h=200px}
+![Telegraf architecture diagram](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png){h=200px}
docs/integrate/estuary/index.md (2)

6-8: Use CSS class instead of inline float style

Keep styling centralized per PR objectives.

-```{div}
-:style: "float: right"
-[![Estuary logo](https://estuary.dev/static/estuary-430cce9313e0df82d11e40d8285f38b4.png){h=60px}][Estuary]
+```{div}
+:class: logo-float-right
+[![Estuary logo](https://estuary.dev/static/estuary-430cce9313e0df82d11e40d8285f38b4.png){h=60px}][Estuary]

9-11: Use CSS clearfix utility instead of inline style

Consistent with moving styling to CSS.

-```{div}
-:style: "clear: both"
+```{div}
+:class: clearfix
docs/integrate/mysql/index.md (2)

5-12: Consolidate inline styles into CSS classes

Prefer reusable classes for the logo block and clearfix.

-```{div}
-:style: "float: right;"
+```{div}
+:class: logo-float-right
 [![mysql-logo](https://www.mysql.com/common/logos/powered-by-mysql-167x86.png){h=60px}](https://www.mysql.com/)
 [![mariadb-logo](https://mariadb.com/wp-content/themes/mariadb-2025/public/images/logo-dark.4482a1.svg){h=60px}](https://www.mariadb.com/)
-:style: "clear: both"
+:class: clearfix

34-38: Synopsis looks clear; consider adding copy button later

Optional enhancement: Sphinx-copybutton can improve UX for shell blocks.

docs/integrate/apache-nifi/index.md (3)

5-7: Prefer CSS class over inline float for the logo

Keeps styling consistent and maintainable.

-```{div}
-:style: "float: right"
+```{div}
+:class: logo-float-right
 [![Apache NiFi logo](https://nifi.apache.org/images/apache-nifi-drop-logo.svg){h=60px}][Apache NiFi]

8-10: Replace inline clear with CSS utility

Aligns with PR styling direction.

-```{div}
-:style: "clear: both"
+```{div}
+:class: clearfix

32-35: Add alt text to images for accessibility

Current images have empty alt; add short descriptions.

-![](https://github.com/crate/crate-clients-tools/assets/453543/ba6973dd-2eec-4f1f-a436-96aac7eb9892){h=120px}
-![](https://github.com/crate/crate-clients-tools/assets/453543/7fd4d2e7-98bc-44ee-b441-e1835016ab4d){h=120px}
-![](https://github.com/crate/crate-clients-tools/assets/453543/ccfa4ac7-0d60-432f-b952-2b50789cd325){h=120px}
+![NiFi flow canvas screenshot 1](https://github.com/crate/crate-clients-tools/assets/453543/ba6973dd-2eec-4f1f-a436-96aac7eb9892){h=120px}
+![NiFi flow canvas screenshot 2](https://github.com/crate/crate-clients-tools/assets/453543/7fd4d2e7-98bc-44ee-b441-e1835016ab4d){h=120px}
+![NiFi processors screenshot](https://github.com/crate/crate-clients-tools/assets/453543/ccfa4ac7-0d60-432f-b952-2b50789cd325){h=120px}
docs/integrate/gradio/index.md (3)

5-7: Replace inline style with CSS class

Keep consistent with using custom CSS.

-```{div}
-:style: "float: right; text-align: right"
+```{div}
+:class: logo-float-right text-right
 [![Gradio logo](https://github.com/raw/gradio-app/gradio/main/readme_files/gradio.svg){h=60px}][Gradio]

11-13: Use CSS clearfix instead of inline

Consistent styling approach.

-```{div}
-:style: "clear: both"
+```{div}
+:class: clearfix

32-32: Consider lazy-loading the embedded video

Improve page performance by deferring iframe load.

-<iframe width="480" height="320" src="https://www.youtube-nocookie.com/embed/44vi31hehw4?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="480" height="320" loading="lazy" src="https://www.youtube-nocookie.com/embed/44vi31hehw4?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
docs/integrate/explo/index.md (2)

24-25: Add alt text and lazy loading to heavy screenshots

These external images are large; add alt text and loading=lazy to reduce layout shift and bandwidth.

-![](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.17.45.png?width=2948&height=2312&name=Screenshot%202023-07-21%20at%2013.17.45.png){h=200px}
-![](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.24.01.png?width=2932&height=1716&name=Screenshot%202023-07-21%20at%2013.24.01.png){h=200px}
+![Explo Explore dashboard](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.17.45.png?width=2948&height=2312&name=Screenshot%202023-07-21%20at%2013.17.45.png){height=200px loading=lazy}
+![Explo Explore query view](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.24.01.png?width=2932&height=1716&name=Screenshot%202023-07-21%20at%2013.24.01.png){height=200px loading=lazy}

8-10: Optional: move inline styles to CSS classes

Given the shift to custom CSS, consider replacing inline style with semantic classes (e.g., class: logo-right, class: clear-both) for consistency and maintainability.

docs/integrate/aws-dms/index.md (1)

12-14: Optional: prefer CSS classes over inline styles

Consider replacing inline style with a reusable class for float/clear to match the move to custom CSS.

docs/integrate/django/index.md (2)

41-45: Fix markdownlint MD034: wrap bare URL

Wrap the bare URL in angle brackets to satisfy MD034.

-:link: https://github.com/crate/cratedb-django
+:link: <https://github.com/crate/cratedb-django>

11-13: Optional: prefer CSS classes over inline styles

For consistency with the custom CSS approach, consider moving float/clear to classes rather than inline style.

docs/integrate/rill/index.md (3)

59-61: Fix markdownlint MD034: wrap bare URL

Wrap the bare URL in angle brackets to comply with MD034.

-:link: https://community.cratedb.com/t/introducing-rill-and-bi-as-code-with-cratedb-cloud/1718
+:link: <https://community.cratedb.com/t/introducing-rill-and-bi-as-code-with-cratedb-cloud/1718>

48-49: Add lazy loading to heavy media

Apply loading=lazy to reduce initial load time.

-![](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){h=200px}
-![](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){h=200px}
+![](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){height=200px loading=lazy}
+![](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){height=200px loading=lazy}

8-10: Optional: migrate inline styles to CSS classes

If custom CSS provides utilities, prefer classes (e.g., logo-right, clear-both) over inline styles.

docs/integrate/aws-kinesis/index.md (1)

61-66: markdownlint MD034 “bare URL” on card links

Sphinx-design’s :link: metadata commonly includes raw URLs and can trigger MD034. Either:

  • Accept/ignore MD034 for these blocks, or
  • Move URLs to reference definitions at the bottom and reference them indirectly (if your linter doesn’t flag definitions).
docs/integrate/apache-flink/index.md (2)

12-14: Harden external link and improve accessibility for the badge

Add rel="noopener noreferrer" to the target-blank anchor and an alt attribute to the badge image.

-<a href="https://github.com/crate/cratedb-examples/actions/workflows/framework-flink-kafka-java.yml" target="_blank">
-    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-examples/framework-flink-kafka-java.yml?branch=main&label=Apache%20Kafka,%20Apache%20Flink" loading="lazy"></a>
+<a href="https://github.com/crate/cratedb-examples/actions/workflows/framework-flink-kafka-java.yml"
+   target="_blank" rel="noopener noreferrer">
+  <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-examples/framework-flink-kafka-java.yml?branch=main&label=Apache%20Kafka,%20Apache%20Flink"
+       loading="lazy" alt="GitHub Actions: Apache Kafka, Apache Flink status">
+</a>

36-36: Remove excessive whitespace

There’s an extremely long run of spaces on this line. Clean it to avoid diff noise and potential formatting issues.

- A few companies are specializing in offering managed                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            Flink services.
+ A few companies are specializing in offering managed Flink services.
docs/integrate/tableau/index.md (2)

18-18: Add alt text to the illustrative image

For accessibility, provide descriptive alt text for the image.

-![](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}
+![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}

44-51: markdownlint MD034 “bare URL” on card links

If MD034 is enforced, consider moving URLs to reference definitions at the bottom and pointing the card :link: to a reference (if supported), otherwise accept MD034 for sphinx-design metadata.

docs/integrate/streamlit/index.md (2)

15-16: Hyphenate “open-source” as a compound adjective

Minor style fix.

-[Streamlit] is an open source application programming framework for quickly sketching
+[Streamlit] is an open-source application programming framework for quickly sketching

34-35: markdownlint MD034 “bare URL” on card link

Same note as other pages: either accept MD034 for card metadata or move link to a reference definition if that quiets the linter in your setup.

docs/integrate/debezium/index.md (3)

4-7: Add alt text to the logo

Improve accessibility by adding alt text.

-[![](https://debezium.io/assets/images/color_black_debezium_type_600px.svg){h=60px}][Debezium]
+[![Debezium logo](https://debezium.io/assets/images/color_black_debezium_type_600px.svg){h=60px}][Debezium]

19-22: Tighten phrasing for readability

Minor grammar improvements.

-It allows
-to capture changes on a source database system, mostly OLTP, and replicate them
-to another system, for example to run OLAP workloads on the data.
+It allows capturing changes on a source database system (typically OLTP) and
+replicating them to another system, for example to run OLAP workloads on the data.

38-41: markdownlint MD034 “bare URL” on card link

As elsewhere: consider moving URLs to reference definitions if that satisfies your linter, or accept MD034 for sphinx-design metadata.

docs/integrate/apache-superset/index.md (3)

9-13: Optional: replace inline styles with a reusable CSS class.

Keeps styling centralized per this PR’s objective to use custom CSS.

Example:

  • Define .float-right-tight in custom.css for float/text-align/right spacing.
  • Replace :style: "float: right; text-align: right" with :class: float-right-tight.

23-24: Add informative alt text to screenshots.

Improves accessibility; use concise, descriptive alts or mark as decorative if non-informative.

-![](https://superset.apache.org/img/hero-screenshot.jpg){h=200px}
-![](https://github.com/crate/crate-clients-tools/assets/453543/0f8f7bd8-2e30-4aca-bcf3-61fbc81da855){h=200px}
+![Apache Superset dashboard hero screenshot](https://superset.apache.org/img/hero-screenshot.jpg){h=200px}
+![CrateDB + Superset example dashboard](https://github.com/crate/crate-clients-tools/assets/453543/0f8f7bd8-2e30-4aca-bcf3-61fbc81da855){h=200px}

81-92: Hyphenate compound adjectives in titles and copy.

Aligns with LanguageTool hint and standard style (“open‑source”, “time‑series”).

-:::{grid-item-card} Blog: Open Source Data Warehousing and Visualization
+:::{grid-item-card} Blog: Open‑source data warehousing and visualization
...
-Use CrateDB and Apache Superset for Open Source Data Warehousing and Visualization.
+Use CrateDB and Apache Superset for open‑source data warehousing and visualization.
...
-:::{grid-item-card} Blog: Time Series Visualization
+:::{grid-item-card} Blog: Time‑series visualization
-Introduction to time series Visualization in CrateDB and Apache Superset.
+Introduction to time‑series visualization in CrateDB and Apache Superset.
docs/integrate/powerbi/service.rst (6)

61-62: Fix product name spacing.

Use “Power BI Desktop”.

-:ref:`CrateDB and PowerBI Desktop <powerbi-desktop>` integration
+:ref:`CrateDB and Power BI Desktop <powerbi-desktop>` integration

73-76: Capitalize “Desktop”.

-With your report created on Power BI desktop, you can now publish it to the
+With your report created on Power BI Desktop, you can now publish it to the

89-92: Grammar fix.

Remove stray “is” in “as it grows”.

-Data may change over time as it is grows, is enriched
+Data may change over time as it grows, is enriched

95-98: Hyphenate compound adjective “up‑to‑date”.

-allowing the Power BI service to retrieve up to date datasets from CrateDB.
+allowing the Power BI service to retrieve up‑to‑date datasets from CrateDB.

115-118: Use “data source” (two words).

-name your datasource, select the **ODBC** type, and enter the connection
+name your data source, select the **ODBC** type, and enter the connection

134-136: Consistency: “Power BI service”.

-Now, navigate back to the Power BI Service and click on the extra options
+Now, navigate back to the Power BI service and click on the extra options
docs/integrate/metabase/index.md (3)

27-29: Add descriptive alt text to screenshots.

Improves accessibility.

-![image](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-question.png){h=140px}
-![image](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-dashboard.png){h=140px}
+![Metabase question example](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-question.png){h=140px}
+![Metabase dashboard example](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-dashboard.png){h=140px}

36-42: Tighten grammar in bullets.

-**Save the time** needed for setup and maintenance of the platform, focusing only on the insights we can get from our data.
+**Save time** on setup and maintenance; focus on the insights from your data.
...
-**SMTP server:** Even your alerts and dashboard subscriptions covered with a preconfigured and managed SMTP server.
+**SMTP server:** Alerts and dashboard subscriptions are covered via a preconfigured and managed SMTP server.

63-67: Minor title tweak for consistency.

Avoid quotes in card titles.

-:::{grid-item-card} Demo "metabase-cratedb"
+:::{grid-item-card} Demo: metabase-cratedb
docs/integrate/apache-hop/index.md (2)

4-10: Optional: replace inline styles with a CSS class.

Keeps styles centralized alongside the new custom CSS approach.

Example:

  • Add .float-right-logo to custom.css.
  • Use :class: float-right-logo instead of :style: "float: right".

31-33: Add alt text to images.

-![](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px}
-![](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px}
-![](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px}
+![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px}
+![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px}
+![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px}
docs/integrate/dbt/index.md (3)

22-25: Minor wording polish.

-It is an SQL-first transformation workflow platform that lets teams quickly and
-collaboratively deploy analytics code following software engineering best practices
-like modularity, portability, CI/CD, and documentation.
+It is an SQL‑first transformation workflow platform that lets teams quickly and
+collaboratively deploy analytics code following software engineering best practices
+such as modularity, portability, CI/CD, and documentation.

66-71: Add alt text to the managed dbt image.

-[![](https://www.getdbt.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fwl0ndo6t%2Fmain%2Fc24fbc41bfc3ddb7fcc64932be56f0836fd355c8-1771x780.png%3Ffit%3Dmax%26auto%3Dformat&w=640&q=75){w=180px}](https://www.getdbt.com/product/dbt-cloud/)
+[![dbt Cloud logo](https://www.getdbt.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fwl0ndo6t%2Fmain%2Fc24fbc41bfc3ddb7fcc64932be56f0836fd355c8-1771x780.png%3Ffit%3Dmax%26auto%3Dformat&w=640&q=75){w=180px}](https://www.getdbt.com/product/dbt-cloud/)

7-16: Optional: move inline styles to CSS class.

Keeps styling consistent with the new custom CSS approach.

docs/integrate/marquez/learn.md (4)

9-9: Fix missing link target for “the Docker documentation on this topic”.

The bracket link has no URL/definition and will render/break oddly.

Apply:

-We will need Docker Compose v2, to install it, make it available to all users in the system, check the installed version, or upgrade from v1, please refer to [the Docker documentation on this topic].
+We will need Docker Compose v2. To install it, make it available to all users, check the installed version, or upgrade from v1, refer to [the Docker documentation](https://docs.docker.com/compose/migrate/).

47-52: Clarify headless/browser guidance.

This setting is only needed when running headless or if the port isn’t exposed by default. Consider adding a one-liner note so readers know when to use it.

Apply:

-We will use the Airflow web interface, if you are running this on a headless system where you do not have access to a web browser you can run:
+We will use the Airflow web interface. If you are running headless (no local browser), enable port exposure:

56-58: Reconsider sudo for “astro dev start”.

Running Astro as root can create permission issues in the project directory; prefer running as the current user.

Apply:

-astro config set postgres.port 5435
-sudo astro dev start
+astro config set postgres.port 5435
+astro dev start

If sudo is truly required (e.g., corporate environment), add a note explaining implications.


236-243: Address bare URL and wording per linter hints.

  • Wrap the bare URL to satisfy MD034.
  • Tweak “with success status” phrasing.

Apply:

-When the execution of the DAG completes, "Recent Tasks" should show 7 tasks with success status.
+When the execution completes, “Recent Tasks” should show 7 successful tasks.
-
-Let's now navigate to the Marquez web interface at http://localhost:3000/ (replace localhost with the appropriate hostname if this is not running locally).
+Now navigate to the Marquez web interface at <http://localhost:3000/> (replace localhost if this is not running locally).
docs/integrate/risingwave/index.md (2)

40-41: Minor grammar tweak.

Add article “a” before “materialized view”.

Apply:

-  Load an Apache Iceberg table, and serve it as materialized view.
+  Load an Apache Iceberg table, and serve it as a materialized view.

63-65: Improve phrasing for clarity.

“Converge it into” reads awkwardly.

Apply:

-  Converge it into a CrateDB table for long-term persistence and efficient querying,
-  even on large amounts of data.
+  Ingest it into a CrateDB table for long-term persistence and efficient querying,
+  even at large scale.
docs/integrate/grafana/index.md (1)

49-52: Consider serving images from local docs assets instead of a pinned GitHub raw URL.

External raw links can be brittle or slower. Prefer local static assets or a canonical CDN if available.

Follow-up: If the same images exist under docs/_assets, switch to relative paths, e.g.:

  • /_assets/img/integrations/grafana/grafana-connection.png
  • /_assets/img/integrations/grafana/grafana-panel1.png
docs/integrate/apache-airflow/index.md (2)

23-24: Minor style: replace “in order to” with “to”

Concise phrasing reads better here.

-[Astronomer] offers managed Airflow services on the cloud of your choice, in
-order to run Airflow with less overhead.
+[Astronomer] offers managed Airflow services on the cloud of your choice, to
+run Airflow with less overhead.

114-123: Resolve bare URL warnings in seealso (MD034)

Angle-bracket the bare URL to satisfy markdownlint.

-**Repository:** https://github.com/crate/cratedb-airflow-tutorial
+**Repository:** <https://github.com/crate/cratedb-airflow-tutorial>
docs/integrate/prometheus/index.md (3)

36-36: Add alt text to image (MD045)

Provide a meaningful alt for accessibility.

-![](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}
+![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}

48-55: Consistency: hyphenate “long-term”

Standardize to “long-term” per common style.

-... intended for long term
+... intended for long-term
-Set up CrateDB as a long term metrics store
+Set up CrateDB as a long-term metrics store

Also applies to: 70-71


111-121: Fix unused link reference warning (MD053) by inlining link

Inline the link in seealso and drop the unused definition.

```{seealso}
-[CrateDB and Prometheus]
+<https://cratedb.com/integrations/cratedb-and-prometheus>

@@
-[CrateDB and Prometheus]: https://cratedb.com/integrations/cratedb-and-prometheus


</blockquote></details>
<details>
<summary>docs/integrate/pyviz/index.md (2)</summary><blockquote>

`40-44`: **Tighten phrasing (“very large data”)**

Minor style polish for a more formal tone.


```diff
-visualize and interactively explore very large data, and with [GeoViews], you can
+visualize and interactively explore large-scale datasets, and with [GeoViews], you can

50-56: Add alt text to image links for accessibility

Provide brief, descriptive alt text for both images.

-[![][ds1]][ds1]
+[![Datashader map aggregation example][ds1]][ds1]
 
-[![][ds2]][ds2]
+[![Datashader scatter/heat example][ds2]][ds2]

@amotl amotl changed the title ETL/CDC: Balancing, Layout ETL/CDC: Balancing, Layout / Visual and structural overhaul for all "Integration" docs Aug 10, 2025
@amotl amotl added the refactoring Changing shape or layout, or moving content around. label Aug 10, 2025
@amotl amotl force-pushed the etl-cdc-grouping branch from fd7285e to e880a64 Compare August 10, 2025 18:28
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

♻️ Duplicate comments (8)
docs/integrate/apache-kafka/index.md (1)

8-9: Alt text and rel=noopener added correctly — good

The external badge link now includes rel="noopener noreferrer" and the image has a descriptive alt.

docs/integrate/explo/index.md (1)

24-25: Add alt text, lazy loading, and standardize sizing on screenshots

Both images lack alt text and use non-standard h. Add alt and loading=lazy, and use height.

-![](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.17.45.png?width=2948&height=2312&name=Screenshot%202023-07-21%20at%2013.17.45.png){h=200px}
-![](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.24.01.png?width=2932&height=1716&name=Screenshot%202023-07-21%20at%2013.24.01.png){h=200px}
+![Explo Explore dashboard screenshot](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.17.45.png?width=2948&height=2312&name=Screenshot%202023-07-21%20at%2013.17.45.png){height=200px loading=lazy}
+![Explo Explore visualization screenshot](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.24.01.png?width=2932&height=1716&name=Screenshot%202023-07-21%20at%2013.24.01.png){height=200px loading=lazy}
docs/integrate/rill/index.md (1)

6-6: Logo sizing and lazy loading fixed — nice

Replaces h with height and adds loading=lazy as previously suggested.

docs/integrate/django/index.md (1)

6-10: Security and accessibility improvements applied — looks good

  • Logo uses height + lazy.
  • External anchor hardened with rel and badge has a clear alt.
docs/integrate/marquez/learn.md (1)

76-85: Avoid “sudo pip --user” and prefer user installs or pipx

“sudo pip3 … --user” is contradictory and risky. Also, pipx installs should typically be run without sudo.

-sudo apt install -y python3-pip
-sudo pip3 install --user crash
+sudo apt install -y python3-pip
+pip3 install --user crash
-sudo apt install -y pipx
-sudo pipx install crash
+sudo apt install -y pipx
+pipx install crash
docs/integrate/apache-superset/index.md (1)

8-13: Nit: URL-encode Shields label for consistency

Good job adding rel="noopener noreferrer" and descriptive alt. Please encode the label query param to avoid spaces in the URL.

-<a href="https://github.com/crate/cratedb-examples/actions/workflows/application-apache-superset.yml" target="_blank" rel="noopener noreferrer">
-    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-examples/application-apache-superset.yml?branch=main&label=Apache Superset" loading="lazy" alt="CI status: Apache Superset"></a>
+<a href="https://github.com/crate/cratedb-examples/actions/workflows/application-apache-superset.yml" target="_blank" rel="noopener noreferrer">
+    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-examples/application-apache-superset.yml?branch=main&label=Apache%20Superset" loading="lazy" alt="CI status: Apache Superset"></a>
docs/integrate/marquez/index.md (1)

7-10: Switch to a lightweight logo asset (SVG) to cut page weight

You already added height+lazy; recommend replacing the heavy social-card JPG with the official small logo.

-:style: "float: right"
-[![Marquez logo](https://marquezproject.ai/img/marquez-social-card.jpg){height=60px loading=lazy}][Marquez]
+:style: "float: right"
+[![Marquez logo](https://marquezproject.ai/img/logo.svg){height=60px loading=lazy}][Marquez]
docs/integrate/metabase/index.md (1)

5-10: Resolved: badge hardened and accessible

rel="noopener noreferrer" and descriptive alt are in place. Good consistency with other pages.

🧹 Nitpick comments (14)
docs/integrate/apache-kafka/index.md (1)

6-6: Standardize image attributes and add lazy loading

Use height instead of non-standard h and add loading=lazy for consistency and perf.

-[![Apache Kafka logo](https://kafka.apache.org/logos/kafka_logo--simple.png){h=60px}][Apache Kafka]
+[![Apache Kafka logo](https://kafka.apache.org/logos/kafka_logo--simple.png){height=60px loading=lazy}][Apache Kafka]
docs/integrate/marquez/learn.md (7)

21-22: Optional: reduce risk when piping to shell

Consider downloading the installer first for inspection instead of piping curl to bash.

-curl -sSL https://install.astronomer.io | sudo bash -s
+curl -sSL https://install.astronomer.io -o install-astronomer.sh
+sudo bash install-astronomer.sh

92-118: Replace hard tabs with spaces in SQL block (markdownlint MD010)

Tabs trigger MD010; switch to spaces for consistent rendering.

-CREATE TABLE public.Customers (
-	CustomerID TEXT PRIMARY KEY NOT NULL DEFAULT gen_random_text_uuid()
-	,CustomerName TEXT NOT NULL
-	,Country TEXT
-	);
+CREATE TABLE public.Customers (
+  CustomerID TEXT PRIMARY KEY NOT NULL DEFAULT gen_random_text_uuid(),
+  CustomerName TEXT NOT NULL,
+  Country TEXT
+);
 
-CREATE TABLE public.Invoices (
-	InvoiceID TEXT PRIMARY KEY NOT NULL DEFAULT gen_random_text_uuid()
-	,date TIMESTAMP DEFAULT now()
-	,CustomerID TEXT
-	);
+CREATE TABLE public.Invoices (
+  InvoiceID TEXT PRIMARY KEY NOT NULL DEFAULT gen_random_text_uuid(),
+  date TIMESTAMP DEFAULT now(),
+  CustomerID TEXT
+);
 
-CREATE TABLE public.Products (
-	ProductID TEXT PRIMARY KEY NOT NULL DEFAULT gen_random_text_uuid()
-	,Description TEXT
-	,applicable_tax_percentage REAL
-	);
+CREATE TABLE public.Products (
+  ProductID TEXT PRIMARY KEY NOT NULL DEFAULT gen_random_text_uuid(),
+  Description TEXT,
+  applicable_tax_percentage REAL
+);
 
-CREATE TABLE public.Invoice_items (
-	InvoiceID TEXT
-	,ProductID TEXT
-	,quantity SMALLINT
-	,unit_price REAL
-	,PRIMARY KEY (InvoiceID,ProductID)
-	);
+CREATE TABLE public.Invoice_items (
+  InvoiceID TEXT,
+  ProductID TEXT,
+  quantity SMALLINT,
+  unit_price REAL,
+  PRIMARY KEY (InvoiceID,ProductID)
+);

132-138: Specify a language on fenced block (markdownlint MD040)

Use text to satisfy the linter.

-```
+```text
 Connection Id: cratedb_default
 Connection Type: Postgres
 Host: 172.17.0.1
 Login: crate
 Port: 5436

---

`135-136`: **Add host note for macOS/Windows**

172.17.0.1 won’t work on Docker Desktop. Add an alternative host hint below the block.



```diff

Connection Id: cratedb_default
Connection Type: Postgres
Host: 172.17.0.1
Login: crate
Port: 5436

+
+On macOS/Windows (Docker Desktop), use:
+
+Host: host.docker.internal

156-156: Avoid bare URL (markdownlint MD034)

Wrap the URL in angle brackets or make it a link.

-Let's now navigate to the Marquez web interface at http://localhost:3000/ (replace localhost with the appropriate hostname if this is not running locally).
+Let's now navigate to the Marquez web interface at <http://localhost:3000/> (replace localhost with the appropriate hostname if this is not running locally).

154-154: Tighten phrasing

“with success status” is wordy.

-When the execution of the DAG completes, "Recent Tasks" should show 7 tasks with success status.
+When the DAG completes, "Recent Tasks" should show 7 successful tasks.

162-163: Improve image alt text and standardize attributes

Use a descriptive alt, standard height, and lazy loading.

-![Image](/_assets/img/integrations/marquez/marquez-lineage.png){h=180px}
+![Marquez lineage graph for example namespace](/_assets/img/integrations/marquez/marquez-lineage.png){height=180px loading=lazy}
docs/integrate/apache-superset/index.md (1)

79-93: Optional: hyphenate compound adjective in body copy (keep official titles unchanged)

To satisfy LanguageTool without altering the blog title, hyphenate the descriptive sentence.

-Use CrateDB and Apache Superset for Open Source Data Warehousing and Visualization.
+Use CrateDB and Apache Superset for open-source data warehousing and visualization.
docs/integrate/metabase/index.md (1)

22-29: Use height= and add lazy-loading; improve alt text for screenshots

For consistency with the rest of the PR and better a11y, prefer height= over the short h=, add loading=lazy, and use descriptive alt text.

-![image](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-question.png){h=140px}
-![image](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-dashboard.png){h=140px}
+![Metabase question UI screenshot](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-question.png){height=140px loading=lazy}
+![Metabase dashboard UI screenshot](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-dashboard.png){height=140px loading=lazy}
docs/integrate/marquez/data_ingestion.py (4)

1-5: Add a brief module docstring

A short docstring improves discoverability in code search and rendered docs.

+"""
+Airflow example DAG for reporting lineage to Marquez/OpenLineage while ingesting sample data into CrateDB.
+"""
 from datetime import datetime, timedelta

6-13: Optional: add DAG tags for UI discoverability

Tags help users filter DAGs in the Airflow UI.

 with DAG(
     "lineage-reporting-cratedb",
     start_date=datetime(2024, 6, 28),
     max_active_runs=1,
     schedule="@daily",
     default_args={"retries": 1, "retry_delay": timedelta(minutes=1)},
     catchup=False,
+    tags=["cratedb", "lineage", "marquez", "example"],
 ):

42-53: Consistency: schema and tabs

Apply the same schema and spacing adjustments as above; replace tabs with spaces for inlets/outlets.

-           INSERT INTO public.Products(Description,applicable_tax_percentage)
+           INSERT INTO doc.Products(Description, applicable_tax_percentage)
             SELECT CONCAT('Product ',a.b)
                     ,(floor(random()*10)+15)/100.0
             FROM GENERATE_SERIES(1,10) a(b);
-        """,
-		inlets=[{'namespace': 'example', 'name': 'more_sample_data'}],
-		outlets=[{'namespace': 'example', 'name': 'products_table'}]
+        """,
+        inlets=[{"namespace": "example", "name": "more_sample_data"}],
+        outlets=[{"namespace": "example", "name": "products_table"}],

55-68: Realistic join predicate (optional) and spacing

The random join is fine for synthetic data, but a key-based join (or CROSS JOIN with a WHERE random()>0.5) is more explicit. Also convert tabs to spaces.

-           INSERT INTO public.Invoice_items (InvoiceID,ProductID,quantity,unit_price)
+           INSERT INTO doc.Invoice_items (InvoiceID, ProductID, quantity, unit_price)
             SELECT InvoiceID,ProductID
                     ,1+ceil(random()*4)
                     ,random()*1000
-            FROM public.Invoices
-            INNER JOIN public.Products ON random()>0.5;
+            FROM doc.Invoices
+            CROSS JOIN doc.Products
+            WHERE random() > 0.5;
-        """,
-		inlets=[{'namespace': 'example', 'name': 'invoices_table'},{'namespace': 'example', 'name': 'products_table'}],
-		outlets=[{'namespace': 'example', 'name': 'invoice_items_table'}]
+        """,
+        inlets=[{"namespace": "example", "name": "invoices_table"}, {"namespace": "example", "name": "products_table"}],
+        outlets=[{"namespace": "example", "name": "invoice_items_table"}],
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e079d3 and 8f848b3.

📒 Files selected for processing (21)
  • docs/_include/links.md (2 hunks)
  • docs/_static/css/custom.css (2 hunks)
  • docs/integrate/apache-kafka/index.md (2 hunks)
  • docs/integrate/apache-superset/index.md (4 hunks)
  • docs/integrate/aws-dms/index.md (2 hunks)
  • docs/integrate/azure-functions/index.md (2 hunks)
  • docs/integrate/dbt/index.md (3 hunks)
  • docs/integrate/django/index.md (2 hunks)
  • docs/integrate/explo/index.md (1 hunks)
  • docs/integrate/gradio/index.md (2 hunks)
  • docs/integrate/llamaindex/index.md (2 hunks)
  • docs/integrate/marquez/data_ingestion.py (1 hunks)
  • docs/integrate/marquez/index.md (2 hunks)
  • docs/integrate/marquez/learn.md (1 hunks)
  • docs/integrate/metabase/index.md (2 hunks)
  • docs/integrate/n8n/index.md (1 hunks)
  • docs/integrate/plotly/index.md (2 hunks)
  • docs/integrate/powerbi/index.md (2 hunks)
  • docs/integrate/powerbi/service.rst (7 hunks)
  • docs/integrate/rill/index.md (2 hunks)
  • docs/integrate/streamsets/index.md (2 hunks)
✅ Files skipped from review due to trivial changes (2)
  • docs/_static/css/custom.css
  • docs/integrate/powerbi/service.rst
🚧 Files skipped from review as they are similar to previous changes (10)
  • docs/integrate/streamsets/index.md
  • docs/integrate/n8n/index.md
  • docs/integrate/powerbi/index.md
  • docs/integrate/azure-functions/index.md
  • docs/integrate/llamaindex/index.md
  • docs/integrate/aws-dms/index.md
  • docs/_include/links.md
  • docs/integrate/gradio/index.md
  • docs/integrate/dbt/index.md
  • docs/integrate/plotly/index.md
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-08-09T16:19:43.947Z
Learnt from: amotl
PR: crate/cratedb-guide#238
File: docs/integrate/azure-functions/learn.rst:1-1
Timestamp: 2025-08-09T16:19:43.947Z
Learning: In the CrateDB Guide documentation, main integration anchors (e.g., `azure-functions`) are intentionally placed in the `index.md` files of their respective integration folders, while detailed tutorials use the `-learn` suffix (e.g., `azure-functions-learn`) in their `learn.rst` or `learn.md` files. This is a deliberate architectural pattern for the documentation restructuring.

Applied to files:

  • docs/integrate/apache-kafka/index.md
  • docs/integrate/marquez/index.md
  • docs/integrate/marquez/learn.md
  • docs/integrate/metabase/index.md
🪛 markdownlint-cli2 (0.17.2)
docs/integrate/apache-kafka/index.md

51-51: Bare URL used

(MD034, no-bare-urls)


57-57: Bare URL used

(MD034, no-bare-urls)

docs/integrate/apache-superset/index.md

82-82: Bare URL used

(MD034, no-bare-urls)


88-88: Bare URL used

(MD034, no-bare-urls)


162-162: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and apache superset"

(MD053, link-image-reference-definitions)

docs/integrate/django/index.md

42-42: Bare URL used

(MD034, no-bare-urls)

docs/integrate/explo/index.md

24-24: Images should have alternate text (alt text)

(MD045, no-alt-text)


25-25: Images should have alternate text (alt text)

(MD045, no-alt-text)


34-34: Bare URL used

(MD034, no-bare-urls)

docs/integrate/marquez/index.md

35-35: Link fragments should be valid

(MD051, link-fragments)


35-35: Link fragments should be valid

(MD051, link-fragments)


37-37: Link fragments should be valid

(MD051, link-fragments)


39-39: Images should have alternate text (alt text)

(MD045, no-alt-text)


40-40: Images should have alternate text (alt text)

(MD045, no-alt-text)


41-41: Images should have alternate text (alt text)

(MD045, no-alt-text)

docs/integrate/marquez/learn.md

94-94: Hard tabs
Column: 1

(MD010, no-hard-tabs)


95-95: Hard tabs
Column: 1

(MD010, no-hard-tabs)


96-96: Hard tabs
Column: 1

(MD010, no-hard-tabs)


97-97: Hard tabs
Column: 1

(MD010, no-hard-tabs)


100-100: Hard tabs
Column: 1

(MD010, no-hard-tabs)


101-101: Hard tabs
Column: 1

(MD010, no-hard-tabs)


102-102: Hard tabs
Column: 1

(MD010, no-hard-tabs)


103-103: Hard tabs
Column: 1

(MD010, no-hard-tabs)


106-106: Hard tabs
Column: 1

(MD010, no-hard-tabs)


107-107: Hard tabs
Column: 1

(MD010, no-hard-tabs)


108-108: Hard tabs
Column: 1

(MD010, no-hard-tabs)


109-109: Hard tabs
Column: 1

(MD010, no-hard-tabs)


112-112: Hard tabs
Column: 1

(MD010, no-hard-tabs)


113-113: Hard tabs
Column: 1

(MD010, no-hard-tabs)


114-114: Hard tabs
Column: 1

(MD010, no-hard-tabs)


115-115: Hard tabs
Column: 1

(MD010, no-hard-tabs)


116-116: Hard tabs
Column: 1

(MD010, no-hard-tabs)


117-117: Hard tabs
Column: 1

(MD010, no-hard-tabs)


132-132: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


156-156: Bare URL used

(MD034, no-bare-urls)

docs/integrate/metabase/index.md

25-25: Bare URL used

(MD034, no-bare-urls)

docs/integrate/rill/index.md

59-59: Bare URL used

(MD034, no-bare-urls)

🪛 LanguageTool
docs/integrate/apache-superset/index.md

[uncategorized] ~81-~81: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... ::::{grid} :::{grid-item-card} Blog: Open Source Data Warehousing and Visualization :lin...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~84-~84: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...url Use CrateDB and Apache Superset for Open Source Data Warehousing and Visualization. :::...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

docs/integrate/marquez/learn.md

[style] ~154-~154: ‘with success’ might be wordy. Consider a shorter alternative.
Context: ...tes, "Recent Tasks" should show 7 tasks with success status. Let's now navigate to the Marq...

(EN_WORDINESS_PREMIUM_WITH_SUCCESS)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build docs
🔇 Additional comments (14)
docs/integrate/explo/index.md (1)

6-6: Logo attributes look good

Switched to height and added lazy loading. Consistent with the pattern across integrations.

docs/integrate/marquez/learn.md (2)

41-47: Cross-platform Marquez URL — good

Linux and macOS/Windows variants are documented.


66-67: Docker run with sudo (optional note)

If the user is in the docker group, sudo isn’t needed. Otherwise, keep sudo. Consider adding a short note.

docs/integrate/apache-superset/index.md (5)

14-15: LGTM: clearfix

Using a dedicated clear: both block is clean and predictable.


29-30: LGTM: small, lazy-loaded Preset logo

Height+lazy attributes are consistent with the pattern used across pages.


148-153: LGTM: Development links separation

Moving these under a dedicated rubric improves scannability.


157-158: LGTM: seealso target naming

“CrateDB and Apache Superset” wording is consistent across the page.


162-162: Ignore MD053 warning for CrateDB and Apache Superset link
The [CrateDB and Apache Superset] reference is used at lines 157 and 162 in docs/integrate/apache-superset/index.md, so the definition on line 162 is valid.

docs/integrate/marquez/index.md (3)

31-41: Verify cross-reference target marquez-learn exists; otherwise this link will break

The grid card uses :link-type: ref with :link: marquez-learn. Ensure the tutorial page defines an explicit label.

Two safe options:

  • Preferred: Add a label to docs/integrate/marquez/learn.md (top of file):
(marquez-learn)=
# Use Marquez with CrateDB
  • Or switch to doc path linking here:
-:::{grid-item-card} Tutorial: Use Marquez with CrateDB
-:link: marquez-learn
-:link-type: ref
+:::{grid-item-card} Tutorial: Use Marquez with CrateDB
+:link: /integrate/marquez/learn
+:link-type: doc

45-48: LGTM: hidden toctree for tutorial

Clean separation of overview vs. tutorial content.


51-51: LGTM: canonical Marquez URL

Using the official site improves trust and stability.

docs/integrate/metabase/index.md (1)

49-69: LGTM: Learn grid

Clear, concise cards covering tutorial, blog, and demo. Nice.

docs/integrate/marquez/data_ingestion.py (2)

70-86: LGTM: explicit REFRESH TABLE steps

Explicit refreshes are appropriate before downstream reads in CrateDB.


88-90: LGTM: task dependencies

Order ensures refreshed visibility before dependent reads. Clear and minimal.

@amotl amotl force-pushed the etl-cdc-balancing branch from 8f848b3 to 5829fe6 Compare August 10, 2025 19:37
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

♻️ Duplicate comments (10)
docs/integrate/n8n/index.md (1)

23-25: markdownlint MD034/MD053 are false positives here

  • Line 23 (MD034): In a MyST grid-item-card with :link-type: url, :link: expects a bare URL. This is correct; keep as-is. [duplicate of prior discussion]
  • Line 35 (MD053): The reference definition [CrateDB and n8n]: ... is used in the preceding seealso block; the “unused” hint is spurious.

Also applies to: 35-35

docs/integrate/mysql/index.md (1)

43-47: markdownlint MD034 on Sphinx 🔗 is a false positive (repo-level fix recommended)

As discussed earlier, MD034 flags :link: lines incorrectly. Prefer suppressing MD034 for Sphinx :link: fields in lint config rather than altering content.

Update markdownlint config (example):

{
  "MD034": {
    "ignore_patterns": ["^\\s*:link:"]
  }
}
docs/integrate/datagrip/index.md (1)

84-92: Use of grid card for the blog link is good; address MD034 via config

Content is correct. If lint flags a “bare URL” on any :link: line, prefer the repo-level MD034 ignore pattern for Sphinx :link: fields.

docs/integrate/telegraf/index.md (1)

46-53: MD034 on Sphinx 🔗 is a known false positive; handle via lint config

Keep content as-is. Prefer adjusting markdownlint to ignore :link: lines.

docs/integrate/streamlit/index.md (1)

30-38: MD034 on card :link is a lint false positive; adjust config instead

Content is fine; please rely on the repo-level MD034 ignore pattern for Sphinx :link: fields.

docs/integrate/marquez/index.md (1)

7-9: Use smaller official logo asset and keep lazy loading

Switch from the heavy social-card JPG to the SVG logo to reduce page weight; keep height and lazy loading.

-```{div} .float-right
-[![Marquez logo](https://marquezproject.ai/img/marquez-social-card.jpg){height=60px loading=lazy}][Marquez]
-```
+```{div} .float-right
+[![Marquez logo](https://marquezproject.ai/img/logo.svg){height=60px loading=lazy}][Marquez]
+```
docs/integrate/aws-kinesis/index.md (1)

48-52: Do not embed AWS credentials or real ARNs in examples

Remove inline credentials and replace real-looking ARN parts with placeholders; advise using the default AWS credential chain.

 ```shell
-uvx 'cratedb-toolkit[io-ingestr]' load table \
-  "kinesis://?aws_access_key_id=${AWS_ACCESS_KEY_ID}&aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}&region_name=eu-central-1&table=arn:aws:kinesis:eu-central-1:831394476016:stream/testdrive" \
-  --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"
+uvx 'cratedb-toolkit[io-ingestr]' load table \
+  "kinesis://?region_name=<region>&table=arn:aws:kinesis:<region>:<account_id>:stream/<stream_name>" \
+  --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"
+# Notes:
+# - Rely on AWS default credential chain (env, ~/.aws/{config,credentials}, or IAM role).
+# - Replace <...> placeholders with your values.

</blockquote></details>
<details>
<summary>docs/integrate/meltano/index.md (1)</summary><blockquote>

`28-33`: **Stabilize the Examples link (avoid ephemeral branches)**

Linking to amo/meltano risks 404s later. Pin to main, a tag, or a commit SHA.



```shell
#!/bin/bash
# Show status for branch URL and possible main fallback
set -e
BRANCH_URL="https://github.com/crate/cratedb-examples/tree/amo/meltano/framework/singer-meltano"
MAIN_URL="https://github.com/crate/cratedb-examples/tree/main/framework/singer-meltano"
for u in "$BRANCH_URL" "$MAIN_URL"; do
  code=$(curl -s -o /dev/null -w "%{http_code}" "$u"); echo "$code $u";
done
echo "If MAIN 404s, consider pinning to a tag or commit SHA."
docs/integrate/metabase/index.md (1)

7-9: External badge hardened correctly

rel="noopener noreferrer" and descriptive alt are in place. Thanks for addressing the earlier feedback.

docs/integrate/apache-nifi/index.md (1)

39-47: Suppress MD034 for Sphinx Design 🔗 directive to silence false positive.

markdownlint flags the 🔗 URL as a bare URL; this is intended syntax.

Apply:

 :::{grid-item-card} Tutorial: Connect Apache NiFi and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/connecting-to-cratedb-from-apache-nifi/647
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 How to connect from Apache NiFi to CrateDB and ingest data from NiFi into CrateDB.
 :::
🧹 Nitpick comments (21)
docs/_static/css/custom.css (1)

47-50: Nit: stray double semicolon

There’s a trailing extra semicolon on Line 49.

-  margin-bottom: 0 !important;;
+  margin-bottom: 0 !important;
docs/integrate/n8n/index.md (1)

20-21: Optional: add gutter for visual balance in grids

Small spacing improvement for consistency with similar pages.

-::::{grid} 2
+::::{grid} 2
+:gutter: 2
docs/integrate/gradio/index.md (1)

6-7: Avoid layout <br>; prefer CSS spacing

Minor readability/semantics nit: replace the <br> with margin via CSS or block-level spacing.

Example:

-<br>

Add a small bottom margin to the logo wrapper or badge via CSS (e.g., .float-right .badge { margin-top: .25rem; }) instead of using a <br>.

docs/integrate/node-red/index.md (1)

57-71: Nit: add columns and align punctuation in card descriptions

  • Consider declaring 2 columns to match other pages and improve layout density.
  • Make card descriptions consistent by ending both with periods.
-::::{grid}
+::::{grid} 2
@@
-Automating recurrent CrateDB queries using Node-RED
+Automating recurrent CrateDB queries using Node-RED.
docs/integrate/datagrip/index.md (2)

7-10: Avoid inline styles; use a CSS utility class instead

To keep styles centralized (goal of this PR), replace :style: with a utility class and add it to custom.css.

-```{div} .float-right
-:style: "margin-left: 0.5em"
+```{div} .float-right .ml-0_5
 [![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){w=120px}][DataGrip]

Add to docs/_static/css/custom.css:
```css
.ml-0_5 { margin-left: 0.5em; }

Also applies to: 11-21


32-34: Add lazy-loading to images to improve page performance

Large images benefit from loading=lazy to reduce initial payload.

-![DataGrip: add custom JAR for JDBC driver](https://github.com/user-attachments/assets/a8c1ada6-fd97-43f4-a1ba-91aba1520bdb){h=180px}
+![DataGrip: add custom JAR for JDBC driver](https://github.com/user-attachments/assets/a8c1ada6-fd97-43f4-a1ba-91aba1520bdb){h=180px loading=lazy}
-![DataGrip: select JDBC JARs](https://github.com/user-attachments/assets/1f925848-fac3-4265-8bd3-96f91daf03c9){h=180px}
+![DataGrip: select JDBC JARs](https://github.com/user-attachments/assets/1f925848-fac3-4265-8bd3-96f91daf03c9){h=180px loading=lazy}
-![DataGrip: set driver class io.crate.client.jdbc.CrateDriver](https://github.com/user-attachments/assets/50ccb304-5aaf-4f0b-8ae7-55445f06930c){w=400px}
+![DataGrip: set driver class io.crate.client.jdbc.CrateDriver](https://github.com/user-attachments/assets/50ccb304-5aaf-4f0b-8ae7-55445f06930c){w=400px loading=lazy}
-![DataGrip: add CrateDB data source](https://github.com/user-attachments/assets/147a3e8e-f1d7-413d-9e0c-1ced11333646){w=480px}
+![DataGrip: add CrateDB data source](https://github.com/user-attachments/assets/147a3e8e-f1d7-413d-9e0c-1ced11333646){w=480px loading=lazy}
-![DataGrip: data tree view](https://github.com/user-attachments/assets/3350a955-0a53-41d7-905b-a71cc4a767e9){h=240px}
+![DataGrip: data tree view](https://github.com/user-attachments/assets/3350a955-0a53-41d7-905b-a71cc4a767e9){h=240px loading=lazy}
-![DataGrip: query console running SQL](https://github.com/user-attachments/assets/d0a2a09d-a59f-4eda-a488-09d5ce15c08d){h=240px}
+![DataGrip: query console running SQL](https://github.com/user-attachments/assets/d0a2a09d-a59f-4eda-a488-09d5ce15c08d){h=240px loading=lazy}

Also applies to: 41-41, 55-56, 65-65, 74-75

docs/integrate/telegraf/index.md (1)

38-39: Add lazy-loading to the architecture diagram

Improves performance without changing layout.

-![Telegraf architecture diagram](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png){h=200px}
+![Telegraf architecture diagram](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png){h=200px loading=lazy}
docs/integrate/streamlit/index.md (1)

59-60: Add lazy loading to the embedded YouTube iframe

Reduces initial load cost; safe on modern browsers.

-<iframe width="240" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
docs/integrate/marquez/index.md (1)

49-52: Remove unused link reference

“The Docker documentation on this topic” link reference appears unused on this page.

 [Marquez]: https://marquezproject.ai/
 [OpenLineage]: https://openlineage.io/
-[the Docker documentation on this topic]: https://docs.docker.com/compose/install/linux/
docs/integrate/aws-kinesis/index.md (1)

7-9: Standardize image attributes and add lazy loading

Use height instead of h and add loading=lazy for consistency across pages.

-```{div} .float-right
-[![Kinesis logo](https://icon.icepanel.io/AWS/svg/Analytics/Kinesis-Data-Streams.svg){h=60px}][Amazon Kinesis Data Streams]
-```
+```{div} .float-right
+[![Kinesis logo](https://icon.icepanel.io/AWS/svg/Analytics/Kinesis-Data-Streams.svg){height=60px loading=lazy}][Amazon Kinesis Data Streams]
+```
docs/integrate/debezium/index.md (1)

4-8: Align image attributes with site-wide convention

Use height and add lazy loading for consistency and performance.

-```{div} .float-right
-[![Debezium logo](https://debezium.io/assets/images/color_black_debezium_type_600px.svg){h=60px}][Debezium]
-```
+```{div} .float-right
+[![Debezium logo](https://debezium.io/assets/images/color_black_debezium_type_600px.svg){height=60px loading=lazy}][Debezium]
+```
docs/integrate/meltano/index.md (1)

4-10: Fix image sizing attributes and add lazy loading

Use width instead of w and add loading=lazy; consider smaller official assets to reduce weight.

-```{div} .float-right
-[![Singer logo](https://www.singer.io/img/singer_logo_full_black.svg){w=180px}][Singer]
+```{div} .float-right
+[![Singer logo](https://www.singer.io/img/singer_logo_full_black.svg){width=180px loading=lazy}][Singer]
  &nbsp;&nbsp;
-[![Meltano logo](https://github.com/crate/crate-clients-tools/assets/453543/0c01e995-d7c2-4a4d-8e90-c6697fe2a85d){w=180px}][Meltano]
+[![Meltano logo](https://github.com/crate/crate-clients-tools/assets/453543/0c01e995-d7c2-4a4d-8e90-c6697fe2a85d){width=180px loading=lazy}][Meltano]

</blockquote></details>
<details>
<summary>docs/integrate/apache-hop/index.md (1)</summary><blockquote>

`29-31`: **Lazy-load screenshots to improve page performance**

Add loading="lazy" to the three images inside the dropdown.


```diff
-![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px}
-![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px}
-![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px}
+![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px loading=lazy}
+![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px loading=lazy}
+![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px loading=lazy}
docs/integrate/tableau/index.md (3)

17-17: Lazy-load the large dashboard image

Add loading="lazy" to reduce initial page weight.

-![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}
+![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px loading=lazy}

65-71: Remove unused link reference definitions flagged by MD053

These two appear unused; keep the ones referenced by the page.

-[Connecting to CrateDB from Tableau with JDBC]: https://cratedb.com/blog/connecting-to-cratedb-from-tableau-with-jdbc
 [Connector: Issues]: https://github.com/crate/cratedb-tableau-connector/issues
 [CrateDB and Tableau]: https://cratedb.com/integrations/cratedb-and-tableau
-[CrateDB Tableau Connector]: https://github.com/crate/cratedb-tableau-connector
 [Tableau]: https://www.tableau.com/
 [Tool: Tableau]: https://github.com/crate/crate/labels/tool%3A%20Tableau
 [Using CrateDB with Tableau]: https://community.cratedb.com/t/using-cratedb-with-tableau/1192

Note: MD053 also flagged the "CrateDB and Tableau" definition, but it is used in the seealso block; consider the linter warning a false positive.


26-46: markdownlint MD034 on 🔗 fields is likely a false positive

The URLs are values to 🔗 keys inside grid-item-card directives, not bare URLs in prose. Recommend suppressing MD034 for these lines if it persists.

Also applies to: 36-42, 43-50

docs/integrate/prometheus/index.md (3)

5-5: Lazy-load the logo image

Small optimization for initial render.

-[![Prometheus logo](https://github.com/crate/crate-clients-tools/assets/453543/8ddb109f-b45f-46b0-8103-30ba491f7142){h=60px}][Prometheus]
+[![Prometheus logo](https://github.com/crate/crate-clients-tools/assets/453543/8ddb109f-b45f-46b0-8103-30ba491f7142){h=60px loading=lazy}][Prometheus]

35-36: Lazy-load the architecture diagram

Reduce LCP by deferring image load.

-![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}
+![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px loading=lazy}

96-96: Enable lazy-loading for the embedded YouTube iframe

Improves performance without changing behavior.

-<iframe width="240" src="https://www.youtube-nocookie.com/embed/EfIlRXVyfZM?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/EfIlRXVyfZM?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
docs/integrate/apache-nifi/index.md (2)

18-18: Dropdown usage and media placement: OK; suggest minor copy consistency fixes.

Structure is solid. Consider sentence-case and consistent punctuation within list items for polish.

Apply:

- - **Extensive configuration**: Loss-tolerant and guaranteed delivery, Low latency and
+ - **Extensive configuration**: Loss-tolerant and guaranteed delivery, low latency and
   high throughput, Dynamic prioritization, Runtime modification of flow configuration,
   Back pressure control.
- - **Browser-based user interface**: Seamless experience for design, control, feedback,
-   and monitoring
+ - **Browser-based user interface**: Seamless experience for design, control, feedback,
+   and monitoring.
- - **Secure communication**: HTTPS with configurable authentication strategies,
-   Multi-tenant authorization and policy management, Standard protocols for encrypted
+ - **Secure communication**: HTTPS with configurable authentication strategies,
+   multi-tenant authorization and policy management, standard protocols for encrypted
   communication including TLS and SSH.

Also applies to: 30-32, 34-34


30-32: Prefer local static assets and lazy-loading for screenshots.

Linking to GitHub user-content assets can be brittle. Consider moving the images under docs/_static and using lazy loading to improve perf.

Example tweak for lazy loading:

-![NiFi flow canvas screenshot 1](https://github.com/.../ba6973dd-2eec-4f1f-a436-96aac7eb9892){h=120px}
+![NiFi flow canvas screenshot 1](https://github.com/.../ba6973dd-2eec-4f1f-a436-96aac7eb9892){h=120px loading=lazy}
-![NiFi flow canvas screenshot 2](https://github.com/.../7fd4d2e7-98bc-44ee-b441-e1835016ab4d){h=120px}
+![NiFi flow canvas screenshot 2](https://github.com/.../7fd4d2e7-98bc-44ee-b441-e1835016ab4d){h=120px loading=lazy}
-![NiFi processors screenshot](https://github.com/.../ccfa4ac7-0d60-432f-b952-2b50789cd325){h=120px}
+![NiFi processors screenshot](https://github.com/.../ccfa4ac7-0d60-432f-b952-2b50789cd325){h=120px loading=lazy}

If you’d like, I can provide a follow-up patch that relocates these under docs/_static/img and updates the links.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8f848b3 and 5829fe6.

📒 Files selected for processing (81)
  • docs/_include/card/timeseries-datashader.md (1 hunks)
  • docs/_include/links.md (2 hunks)
  • docs/_static/css/custom.css (2 hunks)
  • docs/conf.py (2 hunks)
  • docs/connect/index.md (0 hunks)
  • docs/feature/blob/index.md (0 hunks)
  • docs/feature/ccr/index.md (0 hunks)
  • docs/feature/cloud/index.md (0 hunks)
  • docs/feature/cluster/index.md (0 hunks)
  • docs/feature/document/index.md (0 hunks)
  • docs/feature/fdw/index.md (0 hunks)
  • docs/feature/index.md (0 hunks)
  • docs/feature/index/index.md (0 hunks)
  • docs/feature/relational/index.md (0 hunks)
  • docs/feature/search/fts/index.md (0 hunks)
  • docs/feature/search/geo/index.md (0 hunks)
  • docs/feature/search/hybrid/index.md (0 hunks)
  • docs/feature/search/index.md (0 hunks)
  • docs/feature/search/vector/index.md (0 hunks)
  • docs/feature/snapshot/index.md (0 hunks)
  • docs/feature/sql/index.md (0 hunks)
  • docs/feature/storage/index.md (0 hunks)
  • docs/feature/udf/index.md (0 hunks)
  • docs/ingest/cdc/index.md (2 hunks)
  • docs/ingest/etl/index.md (0 hunks)
  • docs/ingest/index.md (0 hunks)
  • docs/integrate/apache-airflow/index.md (3 hunks)
  • docs/integrate/apache-flink/index.md (2 hunks)
  • docs/integrate/apache-hop/index.md (2 hunks)
  • docs/integrate/apache-iceberg/index.md (1 hunks)
  • docs/integrate/apache-kafka/index.md (2 hunks)
  • docs/integrate/apache-nifi/index.md (2 hunks)
  • docs/integrate/apache-superset/index.md (4 hunks)
  • docs/integrate/aws-dms/index.md (2 hunks)
  • docs/integrate/aws-dynamodb/index.md (1 hunks)
  • docs/integrate/aws-kinesis/index.md (2 hunks)
  • docs/integrate/aws-lambda/index.md (2 hunks)
  • docs/integrate/azure-functions/index.md (2 hunks)
  • docs/integrate/cluvio/index.md (1 hunks)
  • docs/integrate/datagrip/index.md (6 hunks)
  • docs/integrate/dbeaver/index.md (3 hunks)
  • docs/integrate/dbt/index.md (4 hunks)
  • docs/integrate/debezium/index.md (1 hunks)
  • docs/integrate/django/index.md (2 hunks)
  • docs/integrate/estuary/index.md (4 hunks)
  • docs/integrate/explo/index.md (1 hunks)
  • docs/integrate/gradio/index.md (1 hunks)
  • docs/integrate/grafana/index.md (2 hunks)
  • docs/integrate/index.md (3 hunks)
  • docs/integrate/influxdb/index.md (2 hunks)
  • docs/integrate/kestra/index.md (2 hunks)
  • docs/integrate/langchain/index.md (2 hunks)
  • docs/integrate/llamaindex/index.md (2 hunks)
  • docs/integrate/marquez/data_ingestion.py (1 hunks)
  • docs/integrate/marquez/index.md (2 hunks)
  • docs/integrate/marquez/learn.md (1 hunks)
  • docs/integrate/meltano/index.md (1 hunks)
  • docs/integrate/metabase/index.md (1 hunks)
  • docs/integrate/mongodb/index.md (2 hunks)
  • docs/integrate/mysql/import-csv.rst (1 hunks)
  • docs/integrate/mysql/index.md (1 hunks)
  • docs/integrate/n8n/index.md (1 hunks)
  • docs/integrate/node-red/index.md (3 hunks)
  • docs/integrate/plotly/index.md (2 hunks)
  • docs/integrate/powerbi/desktop.rst (6 hunks)
  • docs/integrate/powerbi/index.md (2 hunks)
  • docs/integrate/powerbi/service.rst (9 hunks)
  • docs/integrate/prometheus/index.md (2 hunks)
  • docs/integrate/pyviz/index.md (2 hunks)
  • docs/integrate/rill/index.md (2 hunks)
  • docs/integrate/risingwave/index.md (1 hunks)
  • docs/integrate/sql-server/index.md (2 hunks)
  • docs/integrate/streamlit/index.md (1 hunks)
  • docs/integrate/streamsets/index.md (2 hunks)
  • docs/integrate/tableau/index.md (1 hunks)
  • docs/integrate/telegraf/index.md (2 hunks)
  • docs/topic/index.md (0 hunks)
  • docs/topic/ml/index.md (0 hunks)
  • docs/topic/timeseries/index.md (0 hunks)
  • docs/use/index.md (0 hunks)
  • docs/use/telemetry/index.md (1 hunks)
💤 Files with no reviewable changes (25)
  • docs/feature/cloud/index.md
  • docs/ingest/index.md
  • docs/connect/index.md
  • docs/feature/cluster/index.md
  • docs/feature/search/index.md
  • docs/feature/relational/index.md
  • docs/feature/storage/index.md
  • docs/feature/blob/index.md
  • docs/topic/timeseries/index.md
  • docs/feature/snapshot/index.md
  • docs/feature/search/geo/index.md
  • docs/ingest/etl/index.md
  • docs/feature/search/vector/index.md
  • docs/feature/fdw/index.md
  • docs/feature/search/hybrid/index.md
  • docs/topic/index.md
  • docs/feature/sql/index.md
  • docs/feature/udf/index.md
  • docs/use/index.md
  • docs/topic/ml/index.md
  • docs/feature/document/index.md
  • docs/feature/index.md
  • docs/feature/search/fts/index.md
  • docs/feature/index/index.md
  • docs/feature/ccr/index.md
✅ Files skipped from review due to trivial changes (4)
  • docs/_include/card/timeseries-datashader.md
  • docs/conf.py
  • docs/integrate/langchain/index.md
  • docs/integrate/dbt/index.md
🚧 Files skipped from review as they are similar to previous changes (31)
  • docs/integrate/streamsets/index.md
  • docs/_include/links.md
  • docs/integrate/dbeaver/index.md
  • docs/integrate/mysql/import-csv.rst
  • docs/integrate/powerbi/desktop.rst
  • docs/integrate/marquez/learn.md
  • docs/integrate/plotly/index.md
  • docs/integrate/index.md
  • docs/integrate/estuary/index.md
  • docs/integrate/apache-superset/index.md
  • docs/integrate/apache-iceberg/index.md
  • docs/ingest/cdc/index.md
  • docs/integrate/marquez/data_ingestion.py
  • docs/integrate/risingwave/index.md
  • docs/integrate/sql-server/index.md
  • docs/use/telemetry/index.md
  • docs/integrate/aws-lambda/index.md
  • docs/integrate/apache-kafka/index.md
  • docs/integrate/azure-functions/index.md
  • docs/integrate/apache-flink/index.md
  • docs/integrate/influxdb/index.md
  • docs/integrate/cluvio/index.md
  • docs/integrate/powerbi/index.md
  • docs/integrate/grafana/index.md
  • docs/integrate/aws-dms/index.md
  • docs/integrate/mongodb/index.md
  • docs/integrate/pyviz/index.md
  • docs/integrate/powerbi/service.rst
  • docs/integrate/apache-airflow/index.md
  • docs/integrate/llamaindex/index.md
  • docs/integrate/rill/index.md
🧰 Additional context used
🧠 Learnings (12)
📚 Learning: 2025-08-09T16:19:43.947Z
Learnt from: amotl
PR: crate/cratedb-guide#238
File: docs/integrate/azure-functions/learn.rst:1-1
Timestamp: 2025-08-09T16:19:43.947Z
Learning: In the CrateDB Guide documentation, main integration anchors (e.g., `azure-functions`) are intentionally placed in the `index.md` files of their respective integration folders, while detailed tutorials use the `-learn` suffix (e.g., `azure-functions-learn`) in their `learn.rst` or `learn.md` files. This is a deliberate architectural pattern for the documentation restructuring.

Applied to files:

  • docs/integrate/marquez/index.md
  • docs/integrate/metabase/index.md
  • docs/integrate/mysql/index.md
  • docs/integrate/prometheus/index.md
  • docs/integrate/tableau/index.md
📚 Learning: 2025-05-18T13:25:11.786Z
Learnt from: amotl
PR: crate/cratedb-guide#204
File: docs/integrate/mcp/community.md:6-8
Timestamp: 2025-05-18T13:25:11.786Z
Learning: In the CrateDB Guide documentation, particularly for MCP-related pages, the author prefers a 1-column grid layout for multiple cards to stack them vertically rather than side by side, as this is an intentional design choice.

Applied to files:

  • docs/_static/css/custom.css
📚 Learning: 2025-08-05T07:14:57.416Z
Learnt from: hammerhead
PR: crate/cratedb-guide#221
File: docs/connect/configure.md:58-66
Timestamp: 2025-08-05T07:14:57.416Z
Learning: In CrateDB connection strings, the user:password@ syntax is valid for HTTP Basic authentication on port 4200, but PostgreSQL JDBC drivers do not support this format and require credentials as query parameters (?user=<user>&password=<password>) instead.

Applied to files:

  • docs/integrate/datagrip/index.md
📚 Learning: 2025-06-05T14:29:15.512Z
Learnt from: amotl
PR: crate/cratedb-guide#207
File: docs/integrate/etl/iceberg-risingwave.md:205-207
Timestamp: 2025-06-05T14:29:15.512Z
Learning: The `records.Database("crate://", echo=True)` connection string for CrateDB works with defaults: localhost as host, "crate" as user, and blank password. This is valid and functional code in the records library.

Applied to files:

  • docs/integrate/datagrip/index.md
📚 Learning: 2025-08-10T18:17:49.350Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/mysql/index.md:51-55
Timestamp: 2025-08-10T18:17:49.350Z
Learning: In the CrateDB Guide documentation, the file `docs/integrate/mysql/import-csv.rst` contains the reStructuredText label `.. _mysql-import-csv:` which can be referenced from MyST Markdown files using `:link: mysql-import-csv` with `:link-type: ref`. This is another example of cross-format referencing between MyST and RST files working correctly in Sphinx.

Applied to files:

  • docs/integrate/mysql/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-08T16:50:14.965Z
Learnt from: amotl
PR: crate/cratedb-guide#234
File: docs/home/index.md:47-50
Timestamp: 2025-08-08T16:50:14.965Z
Learning: In the CrateDB Guide docs (MyST), the correct intersphinx target for the CrateDB Cloud documentation homepage is `cloud:index` (not `cloud:docs-index` or `cloud-docs-index`). Use `:link: cloud:index` on cards/links. The `cloud` mapping is inherited via crate-docs-theme.

Applied to files:

  • docs/integrate/mysql/index.md
📚 Learning: 2025-08-09T21:40:46.125Z
Learnt from: amotl
PR: crate/cratedb-guide#238
File: docs/integrate/streamsets/index.md:18-21
Timestamp: 2025-08-09T21:40:46.125Z
Learning: In the CrateDB Guide documentation, reStructuredText files (`.rst`) use the RST label syntax `.. _label:` while MyST Markdown files (`.md`) use the syntax `(label)=`. Both formats are used throughout the repository and labels can be cross-referenced between them.

Applied to files:

  • docs/integrate/mysql/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-10T17:09:32.583Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/azure-functions/index.md:31-36
Timestamp: 2025-08-10T17:09:32.583Z
Learning: In the CrateDB Guide documentation, RST files (`.rst`) use reStructuredText anchor syntax `.. _anchor-name:` while Markdown files (`.md`) use MyST syntax `(anchor-name)=`. Cross-references between MyST Markdown and reStructuredText files work correctly - a MyST `:link:` directive can reference an RST anchor and vice versa.

Applied to files:

  • docs/integrate/mysql/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-09T11:03:33.164Z
Learnt from: amotl
PR: crate/cratedb-guide#236
File: docs/ingest/etl/index.md:22-23
Timestamp: 2025-08-09T11:03:33.164Z
Learning: In the CrateDB Guide documentation, MyST Markdown files can use `{ref}` directives to reference labels defined in reStructuredText files using the RST syntax `.. _label:`. This cross-format referencing between MyST and RST is supported by Sphinx.

Applied to files:

  • docs/integrate/mysql/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-10T17:59:43.468Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/grafana/index.md:37-46
Timestamp: 2025-08-10T17:59:43.468Z
Learning: In mixed documentation projects using Sphinx, the `:link-type: ref` directive in Markdown files can reference labels defined in reStructuredText files using the `.. _label-name:` syntax, and vice versa.

Applied to files:

  • docs/integrate/mysql/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-06T02:11:46.794Z
Learnt from: amotl
PR: crate/cratedb-guide#222
File: docs/integrate/powerbi/index.md:16-23
Timestamp: 2025-08-06T02:11:46.794Z
Learning: The `project:` role in MyST Markdown syntax like `[](project:#powerbi-desktop)` and `[](project:#powerbi-service)` is valid cross-reference syntax in the CrateDB Guide repository's MyST Markdown setup.

Applied to files:

  • docs/integrate/n8n/index.md
📚 Learning: 2025-06-06T08:46:34.552Z
Learnt from: amotl
PR: crate/cratedb-guide#0
File: :0-0
Timestamp: 2025-06-06T08:46:34.552Z
Learning: In MyST Markdown, the `{rubric}` syntax is correct as employed by MyST for rubric directives.

Applied to files:

  • docs/integrate/n8n/index.md
🪛 markdownlint-cli2 (0.17.2)
docs/integrate/apache-hop/index.md

31-31: Images should have alternate text (alt text)

(MD045, no-alt-text)

docs/integrate/apache-nifi/index.md

42-42: Reference links and images should use a label that is defined
Missing link or image reference definition: "astronomer"

(MD052, reference-links-images)

docs/integrate/aws-kinesis/index.md

60-60: Bare URL used

(MD034, no-bare-urls)

docs/integrate/datagrip/index.md

36-36: Bare URL used

(MD034, no-bare-urls)

docs/integrate/debezium/index.md

40-40: Bare URL used

(MD034, no-bare-urls)

docs/integrate/django/index.md

40-40: Bare URL used

(MD034, no-bare-urls)

docs/integrate/explo/index.md

32-32: Bare URL used

(MD034, no-bare-urls)

docs/integrate/gradio/index.md

41-41: Bare URL used

(MD034, no-bare-urls)

docs/integrate/kestra/index.md

40-40: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


41-41: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


42-42: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


43-43: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)

docs/integrate/meltano/index.md

44-44: Bare URL used

(MD034, no-bare-urls)

docs/integrate/metabase/index.md

44-44: Bare URL used

(MD034, no-bare-urls)

docs/integrate/mysql/index.md

44-44: Bare URL used

(MD034, no-bare-urls)

docs/integrate/n8n/index.md

23-23: Bare URL used

(MD034, no-bare-urls)


35-35: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and n8n"

(MD053, link-image-reference-definitions)

docs/integrate/node-red/index.md

62-62: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and power bi"

(MD053, link-image-reference-definitions)

docs/integrate/prometheus/index.md

39-39: Bare URL used

(MD034, no-bare-urls)

docs/integrate/streamlit/index.md

33-33: Bare URL used

(MD034, no-bare-urls)

docs/integrate/tableau/index.md

27-27: Bare URL used

(MD034, no-bare-urls)


37-37: Bare URL used

(MD034, no-bare-urls)


44-44: Bare URL used

(MD034, no-bare-urls)


65-65: Link and image reference definitions should be needed
Unused link or image reference definition: "connecting to cratedb from tableau with jdbc"

(MD053, link-image-reference-definitions)


67-67: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and tableau"

(MD053, link-image-reference-definitions)


68-68: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb tableau connector"

(MD053, link-image-reference-definitions)

docs/integrate/telegraf/index.md

49-49: Bare URL used

(MD034, no-bare-urls)

🪛 LanguageTool
docs/integrate/datagrip/index.md

[style] ~74-~74: Using many exclamation marks might seem excessive (in this case: 6 exclamation marks for a text that’s 2661 characters long)
Context: ...5-0a53-41d7-905b-a71cc4a767e9){h=240px} ![DataGrip: query console running SQL](ht...

(EN_EXCESSIVE_EXCLAMATION)

🔇 Additional comments (27)
docs/_static/css/custom.css (1)

8-16: Utility classes look good

The .float-right, .clearfix, and .text-right utilities match the new layout usage across docs and improve consistency.

docs/integrate/kestra/index.md (1)

40-43: Ignore MD007 indentation warnings (false positive)

These lines belong to directive options/content, not a markdown list.

docs/integrate/gradio/index.md (2)

7-8: Good hardening on external link

Adding rel="noopener noreferrer" with target="_blank" and alt text on the badge is correct.


41-43: markdownlint MD034 is a false positive here

Within grid-item-card with :link-type: url, the :link: value must be a URL. Keep as-is.

docs/integrate/explo/index.md (1)

32-34: markdownlint MD034 is a false positive here

Inside grid-item-card with :link-type: url, :link: must be a URL. No change needed.

docs/integrate/node-red/index.md (2)

4-8: Logo float/clear structure looks correct

Use of .float-right followed by .clearfix is consistent with the PR’s styling approach. No issues.


22-26: Use of reference-style link and alt text for FlowFuse logo: LGTM

The logo is properly alt-tagged and linked via the [FlowFuse] reference. Good accessibility and maintainability.

docs/integrate/mysql/index.md (4)

21-27: Encapsulating historical note in “Details” dropdown is a good UX improvement

Keeps the “About” concise while preserving context.


32-36: Synopsis example looks copy-paste safe

Quoting package extras avoids shell globbing; placeholders prevent PII leakage. No change needed.


49-53: Cross-format reference is correct

:link: mysql-import-csv with :link-type: ref correctly targets the RST label .. _mysql-import-csv: per project conventions.


58-62: Hidden toctree entry for import-csv: LGTM

Matches the page’s surface structure while keeping the doc navigable.

docs/integrate/telegraf/index.md (1)

18-41: Verify placement of “Overview” inside the Details dropdown

Currently, “Overview” (plus bullets and the diagram) sits inside the “Details” dropdown. If you intended “Overview” to be visible by default, move the rubric and following content outside the dropdown.

Would you like a quick patch moving “Overview” and below outside the dropdown?

docs/integrate/streamlit/index.md (1)

4-8: Logo float/clear pattern is consistent and correct

Matches the global visual overhaul. No changes needed.

docs/integrate/marquez/index.md (1)

29-46: Ref target verified — no changes needed

The label (marquez-learn)= is present in docs/integrate/marquez/learn.md, so the Learn card and toctree reference are correct.

docs/integrate/debezium/index.md (1)

13-20: Good content adjustments

Clearer CDC mention and rewording reads well.

docs/integrate/django/index.md (3)

4-11: LGTM: secure external link and improved image attributes

Height + lazy loading applied; rel="noopener noreferrer" present; badge alt provided.


18-32: About section structure reads well

Dropdown usage keeps the page concise.


37-45: Learn card is concise and useful

No issues spotted.

docs/integrate/meltano/index.md (1)

34-44: Connector links look good

Direct links to tap/target repos are appropriate.

docs/integrate/apache-hop/index.md (2)

4-8: Logo float/clearfix pattern looks good

Consistent with the new layout approach. No issues.


31-31: markdownlint MD045 appears to be a false positive

Alt text is present for all images. Safe to ignore or suppress the rule locally if needed.

docs/integrate/tableau/index.md (1)

1-2: Anchor placement aligns with integration-docs architecture

Main anchor defined in index.md as per the restructuring pattern. Good.

docs/integrate/aws-dynamodb/index.md (1)

8-10: LGTM on logo + clearfix pattern

Matches the standardized layout pattern introduced in this PR.

Also applies to: 14-15

docs/integrate/metabase/index.md (1)

4-11: Logo float/clearfix and lazy loading look good

Consistent pattern and performance-friendly attributes. No issues.

docs/integrate/apache-nifi/index.md (3)

49-51: LGTM: seealso block improves discoverability.


55-55: LGTM: external reference label defined and used consistently.


4-8: Custom CSS classes loaded and verified.

  • docs/_static/css/custom.css defines
    • .float-right (line 8)
    • .clearfix (line 11)
  • docs/conf.py adds 'css/custom.css' to html_css_files (lines 101–102)

No further action required.

@amotl amotl force-pushed the etl-cdc-balancing branch from 5829fe6 to ebccc28 Compare August 10, 2025 19:42
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (8)
docs/integrate/dbeaver/index.md (1)

61-70: markdownlint MD034 “bare URL” on 🔗 is a false positive; suppress in config

The URL is within a Sphinx-Design field, not a Markdown bare link. Please suppress MD034 for lines starting with “:link:”.

Example .markdownlint.json:

{
  "MD034": {
    "ignore_patterns": ["^\\s*:link:"]
  }
}
docs/integrate/cluvio/index.md (1)

31-41: markdownlint MD034 on 🔗 is a false positive; suppress in config

The 🔗 field is Sphinx-Design, not a Markdown bare URL. Please apply the repo-wide MD034 ignore for “^\s*🔗”.

docs/integrate/gradio/index.md (1)

38-46: markdownlint MD034 on 🔗 is a false positive; suppress in config

As noted in prior comments, 🔗 lines aren’t Markdown bare URLs. Apply the same MD034 ignore pattern.

docs/integrate/mysql/index.md (1)

41-47: markdownlint MD034 on 🔗 is a false positive; suppress in config

Same as other integration pages; please rely on repo-wide MD034 ignore for Sphinx 🔗 fields.

Also applies to: 49-56

docs/integrate/telegraf/index.md (1)

48-52: markdownlint MD034 on 🔗 is a false positive; suppress in config

Covered previously; please keep the MD034 ignore for Sphinx 🔗 lines.

docs/integrate/aws-kinesis/index.md (1)

48-52: Remove embedded AWS credentials and real-looking ARN; use placeholders and default credential chain

The example exposes AWS keys on the CLI and includes a real-looking account/ARN. Prefer placeholders and the AWS default credential chain (env, shared config, IAM role) to avoid accidental leakage.

Apply this diff:

 ```shell
 uvx 'cratedb-toolkit[io-ingestr]' load table \
-  "kinesis://?aws_access_key_id=${AWS_ACCESS_KEY_ID}&aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}&region_name=eu-central-1&table=arn:aws:kinesis:eu-central-1:831394476016:stream/testdrive" \
-  --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"
+  "kinesis://?region_name=<region>&table=arn:aws:kinesis:<region>:<account_id>:stream/<stream_name>" \
+  --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"
+# Notes:
+# - Rely on AWS default credential chain (env vars, ~/.aws/{config,credentials}, IAM role).
+# - Replace <region>, <account_id>, and <stream_name> with your values.


To catch similar issues across the repo, run:

```shell
#!/bin/bash
# Search for embedded AWS credentials or ARNs in docs
rg -n --glob 'docs/**' -e 'aws_access_key_id=' -e 'aws_secret_access_key=' -e 'arn:aws:kinesis:[a-z0-9-]+:[0-9]{12}:stream/[A-Za-z0-9._-]+'
docs/integrate/meltano/index.md (1)

28-33: Use a stable link target instead of an ephemeral feature branch

The “Examples” card links to .../tree/amo/meltano/..., which is a feature branch and may 404 later. Please switch to a stable reference.

Options:

#!/bin/bash
# Check current link status and main fallback
set -e
URL="https://github.com/crate/cratedb-examples/tree/amo/meltano/framework/singer-meltano"
URL_MAIN="https://github.com/crate/cratedb-examples/tree/main/framework/singer-meltano"
echo "Feature branch URL status: $(curl -s -o /dev/null -w '%{http_code}' "$URL")"
echo "Main branch URL status:    $(curl -s -o /dev/null -w '%{http_code}' "$URL_MAIN")"
docs/integrate/apache-nifi/index.md (1)

41-45: Add MD034 suppression around Sphinx Design :link: line

This is intended syntax; suppress the markdownlint warning locally.

 :::{grid-item-card} Tutorial: Connect Apache NiFi and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/connecting-to-cratedb-from-apache-nifi/647
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 How to connect from Apache NiFi to CrateDB and ingest data from NiFi into CrateDB.
 :::
🧹 Nitpick comments (28)
docs/integrate/dbeaver/index.md (3)

7-10: Unify logo sizing and add lazy loading (replace w= with h=, add loading=lazy)

All other integration pages standardize on h=60px for logos and add lazy loading. Use the same here for consistency and perf.

-```{div} .float-right
-:style: "margin-left: 0.5em"
-[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){w=120px}][DBeaver]
+```{div} .float-right
+:style: "margin-left: 0.5em"
+[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){h=60px loading=lazy}][DBeaver]

7-10: Move inline margin style into CSS utility class

The PR aims to centralize styling in custom CSS. Consider replacing the inline margin-left with a reusable utility (e.g., .ml-2) in docs/_static/css/custom.css and apply it here.


52-53: Improve screenshot alt text and enable lazy loading

“Image” is not descriptive. Provide meaningful alt text or mark decorative with empty alt. Also add loading=lazy.

-![Image](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.05.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.05.png){h=240px}
-![Image](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.13.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.13.png){h=240px}
+![DBeaver: navigate schema and tables](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.05.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.05.png){h=240px loading=lazy}
+![DBeaver: browse table data](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.13.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.13.png){h=240px loading=lazy}
docs/integrate/cluvio/index.md (2)

4-8: Add lazy loading to logo and keep clearfix

Minor perf tweak: add loading=lazy to the logo image.

-```{div} .float-right
-[![Cluvio logo](https://www.cluvio.com/images/logos/cluvio/cluvio-logo-full_color-on_light-3744dd33.svg){h=60px}][Cluvio]
+```{div} .float-right
+[![Cluvio logo](https://www.cluvio.com/images/logos/cluvio/cluvio-logo-full_color-on_light-3744dd33.svg){h=60px loading=lazy}][Cluvio]

24-26: Add lazy loading to images inside Details dropdown

These are below-the-fold; lazy loading helps.

-![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){h=200px}
-![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){h=200px}
+![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){h=200px loading=lazy}
+![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){h=200px loading=lazy}
docs/integrate/gradio/index.md (1)

4-9: Consider removing redundant .text-right if .float-right suffices

If .float-right already handles alignment, .text-right may be redundant. Trim extra classes for consistency.

docs/integrate/mysql/index.md (1)

5-10: Add lazy loading to logos and keep height-based sizing

Align with other pages and improve performance.

-```{div} .float-right
-[![mysql-logo](https://www.mysql.com/common/logos/powered-by-mysql-167x86.png){h=60px}](https://www.mysql.com/)
-[![mariadb-logo](https://mariadb.com/wp-content/themes/mariadb-2025/public/images/logo-dark.4482a1.svg){h=60px}](https://www.mariadb.com/)
+```{div} .float-right
+[![mysql-logo](https://www.mysql.com/common/logos/powered-by-mysql-167x86.png){h=60px loading=lazy}](https://www.mysql.com/)
+[![mariadb-logo](https://mariadb.com/wp-content/themes/mariadb-2025/public/images/logo-dark.4482a1.svg){h=60px loading=lazy}](https://www.mariadb.com/)
docs/integrate/telegraf/index.md (2)

4-8: Add lazy loading to logo image

Consistent with other pages and improves performance.

-```{div} .float-right
-[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){h=60px}][Telegraf]
+```{div} .float-right
+[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){h=60px loading=lazy}][Telegraf]

38-41: Add lazy loading to the architecture diagram

Below-the-fold content should be lazy-loaded.

-![Telegraf architecture diagram](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png){h=200px}
+![Telegraf architecture diagram](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png){h=200px loading=lazy}
docs/integrate/debezium/index.md (1)

27-41: Learn grid/cards look good; MD034 bare-URL hint can be ignored for 🔗 options

The grid/card structure is clear and consistent. The markdownlint MD034 warnings for lines with :link: https://... inside directives are benign in MyST/Sphinx contexts.

If desired, you can suppress MD034 for docs or reconfigure the linter to ignore URLs in directive options.

docs/integrate/streamlit/index.md (1)

44-60: Minor: Improve iframe performance and UX

Consider lazy-loading the YouTube iframe to reduce initial page weight and improve performance.

-<iframe width="240" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" loading="lazy" referrerpolicy="strict-origin-when-cross-origin"
+  src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm"
+  title="Streamlit 101 webinar" frameborder="0"
+  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
+  allowfullscreen></iframe>
docs/integrate/grafana/index.md (2)

4-8: Accessibility: provide descriptive alt text for the logo

The top logo uses an empty alt. Add meaningful alt text for accessibility.

-[![](https://cratedb.com/hs-fs/hubfs/Imported_Blog_Media/grafana-logo-1-520x126.png?width=1040&height=252&name=grafana-logo-1-520x126.png){h=60px}][Grafana OSS]
+[![Grafana logo](https://cratedb.com/hs-fs/hubfs/Imported_Blog_Media/grafana-logo-1-520x126.png?width=1040&height=252&name=grafana-logo-1-520x126.png){h=60px}][Grafana OSS]

46-50: Accessibility: add descriptive alt text to images

Replace the generic “image” alt with meaningful descriptions.

-![image](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/grafana/grafana-connection.png){h=200px}
+![Grafana PostgreSQL data source configuration](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/grafana/grafana-connection.png){h=200px}

-![image](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/grafana/grafana-panel1.png){h=200px}
+![Grafana example panel showing data from CrateDB](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/grafana/grafana-panel1.png){h=200px}
docs/integrate/django/index.md (1)

37-45: markdownlint MD034 false-positive on :link: URLs

The linter may flag bare URLs here, but :link: expects a URL in MyST cards. Consider suppressing MD034 for these directive lines in markdownlint config, rather than changing the content.

docs/integrate/datagrip/index.md (4)

7-9: Unify logo sizing and avoid inline styles

  • Prefer consistent height-based sizing across pages (height=60px) instead of width to match other integrations.
  • Drop the inline margin style and replace it with a utility class from your custom CSS (e.g., .ml-2). If not present, add one.
-```{div} .float-right
-:style: "margin-left: 0.5em"
-[![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){w=120px}][DataGrip]
+```{div} .float-right .ml-2
+[![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){height=60px}][DataGrip]

15-16: Minor grammar fix

“included into” → “included in”.

-It is available as a standalone application and is also included into
+It is available as a standalone application and is also included in

51-66: Add note on credentials handling for JDBC

To preempt confusion (and align with known JDBC behavior), add a sentence that credentials should be provided via DataGrip’s fields (not user:password@ in the URL), as PostgreSQL JDBC doesn’t support that URL form.

Example addition after the URL snippet:

  • “Provide username and password in the dedicated fields. Don’t embed credentials in the URL.”

86-94: markdownlint MD034 false-positive on MyST card :link:

:link: requires a URL; using a reference label isn’t applicable for external links. Consider disabling MD034 for these lines in your lint config.

docs/integrate/apache-hop/index.md (1)

38-61: Card grid reads well; MD034 may misfire

External :link: URLs in grid-item-cards can trigger MD034. Safe to suppress this rule for such directive lines.

docs/integrate/prometheus/index.md (4)

11-16: Use rubric for consistency with other pages

Other integrations use “:::{rubric} About” and “:::{rubric} Learn”. Consider switching “## About” to a rubric for uniformity.

-## About
+:::{rubric} About
+:::

40-41: Use rubric for “Learn” for consistency

Mirror the pattern used in other integration pages.

-## Learn
+:::{rubric} Learn
+:::

82-91: Hyphenate ‘Long-term’ in titles and references

As an adjective, “Long-term” should be hyphenated.

-{material-outlined}`manage_history;2em` &nbsp; **CrateDB as Prometheus Long Term Storage**
+{material-outlined}`manage_history;2em` &nbsp; **CrateDB as Prometheus Long-term Storage**

-[Prometheus with CrateDB: Long Term Metrics Storage]
+[Prometheus with CrateDB: Long-term Metrics Storage]

96-96: Harden and optimize the YouTube iframe embed

  • Add loading="lazy".
  • Consider adding height for clearer layout or a responsive wrapper.
  • Optionally add referrerpolicy and sandbox for stricter embedding.
-<iframe width="240" src="https://www.youtube-nocookie.com/embed/EfIlRXVyfZM?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" height="135" loading="lazy"
+  src="https://www.youtube-nocookie.com/embed/EfIlRXVyfZM?si=J0w5yG56Ld4fIXfm"
+  title="Prometheus with CrateDB: Long-term Metrics Storage (YouTube)"
+  frameborder="0"
+  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
+  referrerpolicy="strict-origin-when-cross-origin"
+  sandbox="allow-same-origin allow-scripts allow-popups allow-presentation"
+  allowfullscreen></iframe>
docs/integrate/apache-airflow/index.md (4)

37-41: Use .float-right class instead of inline :style: for consistency

Replace the inline float style with the shared .float-right class used elsewhere on this page.

-```{div}
-:style: "float: right"
-[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
-```
+```{div} .float-right
+[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
+```

65-65: Specify grid column counts for predictable layouts

Explicitly set column counts to align with the intended layout (2 for Starter, 3 for Advanced).

-::::{grid}
+::::{grid} 2
-::::{grid}
+::::{grid} 3

Also applies to: 86-86


67-71: Suppress MD034 “bare URL” for Sphinx Design :link: fields

markdownlint flags :link: lines as bare URLs even though this is intended syntax. Suppress MD034 locally around each card.

 :::{grid-item-card} Tutorial: Import Parquet files
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/automating-the-import-of-parquet-files-with-apache-airflow/1247
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Define an Airflow DAG to import a Parquet file from S3 into CrateDB.
 :::
 :::{grid-item-card} Tutorial: Load stock market data
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/updating-stock-market-data-automatically-with-cratedb-and-apache-airflow/1304
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Define an Airflow DAG to download, process, and store stock market data
 into CrateDB.
 :::
 :::{grid-item-card} Tutorial: Export to S3
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/cratedb-and-apache-airflow-automating-data-export-to-s3/901
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Recurrently export data from CrateDB to S3.
 :::
 :::{grid-item-card} Tutorial: Implement a data retention policy
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/implementing-a-data-retention-policy-in-cratedb-using-apache-airflow/913
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 An effective retention policy for time-series data, relating to the practice of
 storing and managing data for a designated period of time.
 :::
 :::{grid-item-card} Tutorial: Implement a hot and cold storage data retention policy
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/cratedb-and-apache-airflow-building-a-hot-cold-storage-data-retention-policy/934
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 A hot/cold storage strategy is often motivated by a tradeoff between performance
 and cost-effectiveness.
 :::

Also applies to: 73-78, 88-93, 94-99, 101-106


30-31: Tighten grammar (“parameterization uses …”)

Minor style fix for readability.

-Pipeline parametrization is using the powerful Jinja templating engine.
+Pipeline parameterization uses the powerful Jinja templating engine.
docs/integrate/apache-nifi/index.md (1)

55-56: MD053 is a false positive here; suppress locally around the reference definition

The link label is used inside the seealso directive, but markdownlint may not detect usage within directives. Suppress MD053 to keep the reference style.

+[//]: # "markdownlint-disable MD053"
 [CrateDB and Apache NiFi]: https://cratedb.com/integrations/cratedb-and-apache-nifi
+[//]: # "markdownlint-enable MD053"
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5829fe6 and ebccc28.

📒 Files selected for processing (51)
  • docs/_include/links.md (2 hunks)
  • docs/_static/css/custom.css (2 hunks)
  • docs/ingest/cdc/index.md (2 hunks)
  • docs/ingest/etl/index.md (3 hunks)
  • docs/integrate/apache-airflow/index.md (3 hunks)
  • docs/integrate/apache-flink/index.md (2 hunks)
  • docs/integrate/apache-hop/index.md (2 hunks)
  • docs/integrate/apache-iceberg/index.md (1 hunks)
  • docs/integrate/apache-kafka/index.md (2 hunks)
  • docs/integrate/apache-nifi/index.md (2 hunks)
  • docs/integrate/apache-superset/index.md (4 hunks)
  • docs/integrate/aws-dms/index.md (2 hunks)
  • docs/integrate/aws-dynamodb/index.md (1 hunks)
  • docs/integrate/aws-kinesis/index.md (2 hunks)
  • docs/integrate/aws-lambda/index.md (2 hunks)
  • docs/integrate/azure-functions/index.md (2 hunks)
  • docs/integrate/cluvio/index.md (1 hunks)
  • docs/integrate/datagrip/index.md (6 hunks)
  • docs/integrate/dbeaver/index.md (3 hunks)
  • docs/integrate/dbt/index.md (4 hunks)
  • docs/integrate/debezium/index.md (1 hunks)
  • docs/integrate/django/index.md (2 hunks)
  • docs/integrate/estuary/index.md (4 hunks)
  • docs/integrate/explo/index.md (1 hunks)
  • docs/integrate/gradio/index.md (1 hunks)
  • docs/integrate/grafana/index.md (2 hunks)
  • docs/integrate/influxdb/index.md (2 hunks)
  • docs/integrate/kestra/index.md (2 hunks)
  • docs/integrate/langchain/index.md (2 hunks)
  • docs/integrate/llamaindex/index.md (2 hunks)
  • docs/integrate/marquez/data_ingestion.py (1 hunks)
  • docs/integrate/marquez/index.md (2 hunks)
  • docs/integrate/marquez/learn.md (1 hunks)
  • docs/integrate/meltano/index.md (1 hunks)
  • docs/integrate/metabase/index.md (1 hunks)
  • docs/integrate/mongodb/index.md (2 hunks)
  • docs/integrate/mysql/index.md (1 hunks)
  • docs/integrate/n8n/index.md (1 hunks)
  • docs/integrate/node-red/index.md (3 hunks)
  • docs/integrate/plotly/index.md (2 hunks)
  • docs/integrate/powerbi/index.md (2 hunks)
  • docs/integrate/powerbi/service.rst (9 hunks)
  • docs/integrate/prometheus/index.md (2 hunks)
  • docs/integrate/pyviz/index.md (2 hunks)
  • docs/integrate/rill/index.md (2 hunks)
  • docs/integrate/risingwave/index.md (1 hunks)
  • docs/integrate/sql-server/index.md (2 hunks)
  • docs/integrate/streamlit/index.md (1 hunks)
  • docs/integrate/streamsets/index.md (2 hunks)
  • docs/integrate/tableau/index.md (1 hunks)
  • docs/integrate/telegraf/index.md (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • docs/integrate/llamaindex/index.md
🚧 Files skipped from review as they are similar to previous changes (33)
  • docs/integrate/aws-lambda/index.md
  • docs/_include/links.md
  • docs/integrate/streamsets/index.md
  • docs/integrate/plotly/index.md
  • docs/integrate/apache-kafka/index.md
  • docs/integrate/n8n/index.md
  • docs/integrate/azure-functions/index.md
  • docs/integrate/apache-iceberg/index.md
  • docs/integrate/langchain/index.md
  • docs/integrate/marquez/index.md
  • docs/integrate/influxdb/index.md
  • docs/integrate/sql-server/index.md
  • docs/integrate/powerbi/index.md
  • docs/integrate/powerbi/service.rst
  • docs/integrate/kestra/index.md
  • docs/integrate/node-red/index.md
  • docs/integrate/apache-flink/index.md
  • docs/integrate/explo/index.md
  • docs/ingest/cdc/index.md
  • docs/integrate/risingwave/index.md
  • docs/ingest/etl/index.md
  • docs/integrate/rill/index.md
  • docs/_static/css/custom.css
  • docs/integrate/pyviz/index.md
  • docs/integrate/mongodb/index.md
  • docs/integrate/tableau/index.md
  • docs/integrate/aws-dynamodb/index.md
  • docs/integrate/aws-dms/index.md
  • docs/integrate/apache-superset/index.md
  • docs/integrate/marquez/learn.md
  • docs/integrate/dbt/index.md
  • docs/integrate/estuary/index.md
  • docs/integrate/marquez/data_ingestion.py
🧰 Additional context used
🧠 Learnings (12)
📚 Learning: 2025-08-05T07:14:57.416Z
Learnt from: hammerhead
PR: crate/cratedb-guide#221
File: docs/connect/configure.md:58-66
Timestamp: 2025-08-05T07:14:57.416Z
Learning: In CrateDB connection strings, the user:password@ syntax is valid for HTTP Basic authentication on port 4200, but PostgreSQL JDBC drivers do not support this format and require credentials as query parameters (?user=<user>&password=<password>) instead.

Applied to files:

  • docs/integrate/datagrip/index.md
📚 Learning: 2025-06-05T14:29:15.512Z
Learnt from: amotl
PR: crate/cratedb-guide#207
File: docs/integrate/etl/iceberg-risingwave.md:205-207
Timestamp: 2025-06-05T14:29:15.512Z
Learning: The `records.Database("crate://", echo=True)` connection string for CrateDB works with defaults: localhost as host, "crate" as user, and blank password. This is valid and functional code in the records library.

Applied to files:

  • docs/integrate/datagrip/index.md
📚 Learning: 2025-08-09T11:03:33.164Z
Learnt from: amotl
PR: crate/cratedb-guide#236
File: docs/ingest/etl/index.md:22-23
Timestamp: 2025-08-09T11:03:33.164Z
Learning: In the CrateDB Guide documentation, MyST Markdown files can use `{ref}` directives to reference labels defined in reStructuredText files using the RST syntax `.. _label:`. This cross-format referencing between MyST and RST is supported by Sphinx.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/mysql/index.md
📚 Learning: 2025-08-10T18:17:49.350Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/mysql/index.md:51-55
Timestamp: 2025-08-10T18:17:49.350Z
Learning: In the CrateDB Guide documentation, the file `docs/integrate/mysql/import-csv.rst` contains the reStructuredText label `.. _mysql-import-csv:` which can be referenced from MyST Markdown files using `:link: mysql-import-csv` with `:link-type: ref`. This is another example of cross-format referencing between MyST and RST files working correctly in Sphinx.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/mysql/index.md
📚 Learning: 2025-08-10T17:09:32.583Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/azure-functions/index.md:31-36
Timestamp: 2025-08-10T17:09:32.583Z
Learning: In the CrateDB Guide documentation, RST files (`.rst`) use reStructuredText anchor syntax `.. _anchor-name:` while Markdown files (`.md`) use MyST syntax `(anchor-name)=`. Cross-references between MyST Markdown and reStructuredText files work correctly - a MyST `:link:` directive can reference an RST anchor and vice versa.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/mysql/index.md
📚 Learning: 2025-08-09T21:40:46.125Z
Learnt from: amotl
PR: crate/cratedb-guide#238
File: docs/integrate/streamsets/index.md:18-21
Timestamp: 2025-08-09T21:40:46.125Z
Learning: In the CrateDB Guide documentation, reStructuredText files (`.rst`) use the RST label syntax `.. _label:` while MyST Markdown files (`.md`) use the syntax `(label)=`. Both formats are used throughout the repository and labels can be cross-referenced between them.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/mysql/index.md
📚 Learning: 2025-08-10T17:59:43.468Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/grafana/index.md:37-46
Timestamp: 2025-08-10T17:59:43.468Z
Learning: When verifying cross-references in Sphinx-based documentation, search for both Markdown references (e.g., `(reference-name)=`) and reStructuredText labels (e.g., `.. _reference-name:`) across both .md and .rst files, as Sphinx supports cross-referencing between different markup formats.

Applied to files:

  • docs/integrate/grafana/index.md
📚 Learning: 2025-08-09T16:19:43.947Z
Learnt from: amotl
PR: crate/cratedb-guide#238
File: docs/integrate/azure-functions/learn.rst:1-1
Timestamp: 2025-08-09T16:19:43.947Z
Learning: In the CrateDB Guide documentation, main integration anchors (e.g., `azure-functions`) are intentionally placed in the `index.md` files of their respective integration folders, while detailed tutorials use the `-learn` suffix (e.g., `azure-functions-learn`) in their `learn.rst` or `learn.md` files. This is a deliberate architectural pattern for the documentation restructuring.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/metabase/index.md
  • docs/integrate/mysql/index.md
  • docs/integrate/prometheus/index.md
📚 Learning: 2025-08-09T11:00:03.537Z
Learnt from: amotl
PR: crate/cratedb-guide#236
File: docs/index.md:312-316
Timestamp: 2025-08-09T11:00:03.537Z
Learning: In the CrateDB Guide documentation, locally stale references (such as `(reference-architectures)=`, `(domain)=`, and similar anchor labels) should be retained even when they appear unused within the repository, as external projects might still reference them. This ensures backward compatibility for external documentation and projects.

Applied to files:

  • docs/integrate/grafana/index.md
📚 Learning: 2025-05-18T12:50:38.681Z
Learnt from: amotl
PR: crate/cratedb-guide#204
File: docs/integrate/mcp/community.md:8-20
Timestamp: 2025-05-18T12:50:38.681Z
Learning: In the CrateDB guide repository, references with the `ctk:` prefix (like `ctk:query/mcp/landscape`) are intersphinx references that link to resources in the cratedb-toolkit repository (https://github.com/crate/cratedb-toolkit/tree/main/doc), which are rendered at https://cratedb-toolkit.readthedocs.io/. These are valid cross-references between separate Sphinx documentation sets, not local file references.

Applied to files:

  • docs/integrate/grafana/index.md
📚 Learning: 2025-08-08T16:50:14.965Z
Learnt from: amotl
PR: crate/cratedb-guide#234
File: docs/home/index.md:47-50
Timestamp: 2025-08-08T16:50:14.965Z
Learning: In the CrateDB Guide docs (MyST), the correct intersphinx target for the CrateDB Cloud documentation homepage is `cloud:index` (not `cloud:docs-index` or `cloud-docs-index`). Use `:link: cloud:index` on cards/links. The `cloud` mapping is inherited via crate-docs-theme.

Applied to files:

  • docs/integrate/mysql/index.md
📚 Learning: 2025-08-10T17:59:43.468Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/grafana/index.md:37-46
Timestamp: 2025-08-10T17:59:43.468Z
Learning: In mixed documentation projects using Sphinx, the `:link-type: ref` directive in Markdown files can reference labels defined in reStructuredText files using the `.. _label-name:` syntax, and vice versa.

Applied to files:

  • docs/integrate/mysql/index.md
🪛 markdownlint-cli2 (0.17.2)
docs/integrate/apache-airflow/index.md

68-68: Bare URL used

(MD034, no-bare-urls)


74-74: Bare URL used

(MD034, no-bare-urls)


89-89: Bare URL used

(MD034, no-bare-urls)


95-95: Bare URL used

(MD034, no-bare-urls)


102-102: Bare URL used

(MD034, no-bare-urls)

docs/integrate/apache-hop/index.md

42-42: Bare URL used

(MD034, no-bare-urls)


49-49: Bare URL used

(MD034, no-bare-urls)


55-55: Bare URL used

(MD034, no-bare-urls)

docs/integrate/apache-nifi/index.md

42-42: Bare URL used

(MD034, no-bare-urls)


55-55: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and apache nifi"

(MD053, link-image-reference-definitions)

docs/integrate/aws-kinesis/index.md

60-60: Bare URL used

(MD034, no-bare-urls)

docs/integrate/cluvio/index.md

34-34: Bare URL used

(MD034, no-bare-urls)


49-49: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and cluvio"

(MD053, link-image-reference-definitions)

docs/integrate/datagrip/index.md

87-87: Bare URL used

(MD034, no-bare-urls)

docs/integrate/dbeaver/index.md

64-64: Bare URL used

(MD034, no-bare-urls)

docs/integrate/debezium/index.md

30-30: Bare URL used

(MD034, no-bare-urls)


36-36: Bare URL used

(MD034, no-bare-urls)

docs/integrate/django/index.md

41-41: Bare URL used

(MD034, no-bare-urls)

docs/integrate/gradio/index.md

41-41: Bare URL used

(MD034, no-bare-urls)

docs/integrate/grafana/index.md

40-40: Bare URL used

(MD034, no-bare-urls)


54-54: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and kestra"

(MD053, link-image-reference-definitions)

docs/integrate/meltano/index.md

29-29: Bare URL used

(MD034, no-bare-urls)


35-35: Bare URL used

(MD034, no-bare-urls)


41-41: Bare URL used

(MD034, no-bare-urls)

docs/integrate/metabase/index.md

29-29: Bare URL used

(MD034, no-bare-urls)


35-35: Bare URL used

(MD034, no-bare-urls)


41-41: Bare URL used

(MD034, no-bare-urls)

docs/integrate/mysql/index.md

60-60: Bare URL used

(MD034, no-bare-urls)

docs/integrate/streamlit/index.md

39-39: Bare URL used

(MD034, no-bare-urls)

docs/integrate/telegraf/index.md

49-49: Bare URL used

(MD034, no-bare-urls)

🪛 LanguageTool
docs/integrate/datagrip/index.md

[style] ~74-~74: Using many exclamation marks might seem excessive (in this case: 6 exclamation marks for a text that’s 2661 characters long)
Context: ...5-0a53-41d7-905b-a71cc4a767e9){h=240px} ![DataGrip: query console running SQL](ht...

(EN_EXCESSIVE_EXCLAMATION)

docs/integrate/prometheus/index.md

[uncategorized] ~82-~82: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ory;2em`   CrateDB as Prometheus Long Term Storage Learn how to start Prometheu...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~90-~90: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...B" tutorial. [Prometheus with CrateDB: Long Term Metrics Storage] ::: :::{grid-item} :c...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

🔇 Additional comments (10)
docs/integrate/cluvio/index.md (1)

43-45: MD053 “unused reference definition” is a false positive in {seealso}

[CrateDB and Cluvio] is used within a {seealso} directive which markdownlint doesn’t parse. Recommend ignoring MD053 for link definitions used inside Sphinx directives.

Example config:

{
  "MD053": {
    "ignore_definitions": ["CrateDB and Cluvio"]
  }
}

Alternatively, suppress MD053 when a nearby line matches "^```\{seealso\}".

Also applies to: 49-50

docs/integrate/gradio/index.md (1)

7-9: Nice hardening on external link (rel=noopener) and accessible badge

LGTM on the security and accessibility adjustments.

docs/integrate/mysql/index.md (1)

49-53: Cross-format reference to RST label is correct

🔗 mysql-import-csv with :link-type: ref properly targets the RST label in import-csv.rst. LGTM.

docs/integrate/debezium/index.md (1)

4-8: Logo/clearfix pattern LGTM

Consistent with the new layout conventions; no issues.

docs/integrate/grafana/index.md (1)

34-44: Cross-reference to tutorial looks correct

:link: visualize-data-with-grafana with :link-type: ref resolves to the RST label and is valid in Sphinx (cross-format). LGTM.

docs/integrate/django/index.md (1)

4-11: Logo + badge block looks solid

Good use of height sizing, lazy-loading, and rel="noopener noreferrer". Alt text is descriptive and consistent.

docs/integrate/apache-hop/index.md (1)

4-8: Header/logo block consistent and clean

Right-floated logo with fixed height and clearfix matches the new pattern. Looks good.

docs/integrate/metabase/index.md (2)

4-11: Security + accessibility on badge are correct

target="_blank" is paired with rel="noopener noreferrer", and the badge has descriptive alt text. Good pattern.


69-77: Anchor pattern aligns with doc architecture

The hidden toctree to a dedicated “learn” page matches the established index/learn split for integrations.

docs/integrate/prometheus/index.md (1)

115-121: Link references look good; keep using privacy-friendly domains

Good choice using youtube-nocookie in the iframe and keeping external references consolidated here.

@amotl amotl force-pushed the etl-cdc-balancing branch from ebccc28 to 3d167c4 Compare August 10, 2025 19:50
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (17)
docs/integrate/kestra/index.md (2)

4-8: Use height and lazy loading on the logo (same as prior suggestion)

Matches the earlier review; standardize sizing attr and add loading=lazy.

-```{div} .float-right
-[![Kestra logo](https://kestra.io/logo.svg){h=60px}][Kestra]
-```
+```{div} .float-right
+[![Kestra logo](https://kestra.io/logo.svg){height=60px loading=lazy}][Kestra]
+```

28-31: Apply height and loading=lazy to feature images (same as prior suggestion)

Consistent with previous feedback; replace h with height and add lazy-loading.

-![](https://kestra.io/landing/features/declarative1.svg){h=120px}
-![](https://kestra.io/landing/features/flowable.svg){h=120px}
-![](https://kestra.io/landing/features/monitor.svg){h=120px}
+![](https://kestra.io/landing/features/declarative1.svg){height=120px loading=lazy}
+![](https://kestra.io/landing/features/flowable.svg){height=120px loading=lazy}
+![](https://kestra.io/landing/features/monitor.svg){height=120px loading=lazy}
docs/integrate/apache-nifi/index.md (1)

4-8: Prefer local logo asset; also standardize attributes

  • Duplicate of prior suggestion: host the logo under docs/_static/ for reproducibility.
  • Replace h with height and add loading=lazy.
-```{div} .float-right
-[![Apache NiFi logo](https://nifi.apache.org/images/apache-nifi-drop-logo.svg){h=60px}][Apache NiFi]
-```
+```{div} .float-right
+[![Apache NiFi logo](/_static/img/integrations/apache-nifi-drop-logo.svg){height=60px loading=lazy}][Apache NiFi]
+```
docs/integrate/mysql/index.md (1)

44-46: Suppress MD034 “bare URL” for Sphinx 🔗 fields (repo-level)

This URL lives in a Sphinx-Design :link: field, not bare Markdown. Prefer a lint ignore pattern over inline overrides.

Example markdownlint config:

{
  "MD034": {
    "ignore_patterns": ["^\\s*:link:"]
  }
}
docs/integrate/apache-flink/index.md (1)

131-160: Suppress MD034 “bare URL” for Sphinx 🔗 fields (repo-level)

The URLs are in Sphinx-Design :link: fields, not bare Markdown links. Handle via lint config ignore pattern.

{
  "MD034": { "ignore_patterns": ["^\\s*:link:"] }
}

Also applies to: 135-145, 147-157, 153-157

docs/integrate/aws-kinesis/index.md (2)

59-63: Suppress MD034 “bare URL” for Sphinx 🔗 fields

URL appears in a :link: field; suppress via lint config rather than altering content.

{ "MD034": { "ignore_patterns": ["^\\s*:link:"] } }

48-52: Remove inline AWS credentials and anonymize ARN placeholders in example

Don’t embed secrets in command examples; rely on AWS default credential chain. Replace region/account/stream with placeholders.

 ```shell
 uvx 'cratedb-toolkit[io-ingestr]' load table \
-  "kinesis://?aws_access_key_id=${AWS_ACCESS_KEY_ID}&aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}&region_name=eu-central-1&table=arn:aws:kinesis:eu-central-1:831394476016:stream/testdrive" \
-  --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"
+  "kinesis://?region_name=<region>&table=arn:aws:kinesis:<region>:<account_id>:stream/<stream_name>" \
+  --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"
+# Notes:
+# - Use AWS default credentials (env vars, ~/.aws/{config,credentials}, or IAM role).
+# - Replace <...> placeholders with your values.

</blockquote></details>
<details>
<summary>docs/integrate/debezium/index.md (1)</summary><blockquote>

`29-38`: **Suppress MD034 “bare URL” for Sphinx :link: fields**

The URLs are values of `:link:` in Sphinx-Design cards, not bare Markdown.




```json
{ "MD034": { "ignore_patterns": ["^\\s*:link:"] } }

Also applies to: 30-33, 36-39

docs/integrate/streamlit/index.md (1)

33-35: Suppress MD034 “bare URL” for Sphinx 🔗 fields

This URL is part of a :link: attribute; exclude such lines from MD034.

{ "MD034": { "ignore_patterns": ["^\\s*:link:"] } }
docs/integrate/telegraf/index.md (1)

49-51: Suppress MD034 “bare URL” for Sphinx 🔗 fields

The blog URL is set via :link: in a card; exclude these from MD034 checks.

{ "MD034": { "ignore_patterns": ["^\\s*:link:"] } }
docs/integrate/marquez/index.md (1)

7-9: Use lightweight SVG logo; keep lazy loading

Swap the heavy social-card JPG for the official SVG to reduce page weight.

-```{div} .float-right
-[![Marquez logo](https://marquezproject.ai/img/marquez-social-card.jpg){height=60px loading=lazy}][Marquez]
+```{div} .float-right
+[![Marquez logo](https://marquezproject.ai/img/logo.svg){height=60px loading=lazy}][Marquez]

</blockquote></details>
<details>
<summary>docs/integrate/datagrip/index.md (1)</summary><blockquote>

`32-34`: **Vendor remote images to avoid hot-linking**

Mirror assets into docs/_static/ and reference locally to improve reliability and build reproducibility.





Also applies to: 41-41, 55-55, 65-65, 74-75

</blockquote></details>
<details>
<summary>docs/integrate/apache-hop/index.md (1)</summary><blockquote>

`5-5`: **Avoid hot-linked images**

Consider vendoring these under docs/_static/ for stability.





Also applies to: 29-31, 41-59

</blockquote></details>
<details>
<summary>docs/integrate/tableau/index.md (1)</summary><blockquote>

`5-5`: **Vendor external images**

Mirror assets locally in docs/_static/ to avoid hot-linking issues.





Also applies to: 17-17, 44-49

</blockquote></details>
<details>
<summary>docs/integrate/apache-superset/index.md (1)</summary><blockquote>

`8-12`: **Vendor remote images**

Mirror the hero, example dashboard, and Preset logo locally to improve reliability.





Also applies to: 21-22, 27-28

</blockquote></details>
<details>
<summary>docs/integrate/prometheus/index.md (1)</summary><blockquote>

`5-5`: **Vendor remote images**

Consider vendoring to docs/_static/ to avoid external dependency flakes.





Also applies to: 35-35

</blockquote></details>
<details>
<summary>docs/integrate/apache-airflow/index.md (1)</summary><blockquote>

`10-11`: **Vendor remote images**

Mirror Airflow and Astronomer logos and embedded assets under docs/_static/ to avoid hot-linking.





Also applies to: 39-40, 112-121

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (39)</summary><blockquote>

<details>
<summary>docs/integrate/aws-lambda/index.md (2)</summary><blockquote>

`7-11`: **Standardize image attrs and enable lazy-loading on the logo**

Use the standard `height` attribute (instead of `h`) and add `loading=lazy` for perf.



```diff
-```{div} .float-right
-[![AWS Lambda logo](https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Amazon_Lambda_architecture_logo.svg/281px-Amazon_Lambda_architecture_logo.svg.png){h=60px}][AWS Lambda]
-```
+```{div} .float-right
+[![AWS Lambda logo](https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Amazon_Lambda_architecture_logo.svg/281px-Amazon_Lambda_architecture_logo.svg.png){height=60px loading=lazy}][AWS Lambda]
+```

31-51: Suppress MD034 lint around Sphinx :link: URLs in grid cards

markdownlint flags :link: https://... as a bare URL, but it’s intentional Sphinx syntax. Add scoped disable/enable comments.

 :::{grid-item-card} DynamoDB Table Loader
-:link: ctk:dynamodb-loader
+:link: ctk:dynamodb-loader
 :link-type: ref
 Load DynamoDB tables into CrateDB (`full-load`).
 :::
 
 :::{grid-item-card} DynamoDB CDC Relay
-:link: ctk:dynamodb-cdc
+:link: ctk:dynamodb-cdc
 :link-type: ref
 Relay table change stream CDC events from a DynamoDB table into CrateDB (`cdc`).
 :::
 
 :::{grid-item-card} DynamoDB CDC Relay using AWS Lambda
+<!-- markdownlint-disable MD034 -->
 :link: ctk:io/dynamodb/cdc-lambda
 :link-type: doc
 Use serverless replication based on AWS Lambda to
 relay CDC events into CrateDB (`cdc`).
+<!-- markdownlint-enable MD034 -->
 :::
docs/integrate/kestra/index.md (1)

39-44: Suppress MD034 for Sphinx :link: in grid card

Prevents false-positive “bare URL” warnings.

 :::{grid-item-card} Tutorial: Data pipeline to CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/setting-up-data-pipelines-with-cratedb-and-kestra-io/1400
 :link-type: url
 In this tutorial, we will show you how CrateDB integrates with Kestra using the
 PostgreSQL plugin to create an efficient and scalable data pipeline.
+<!-- markdownlint-enable MD034 -->
 :::
docs/integrate/cluvio/index.md (4)

4-8: Standardize logo attributes and add lazy-loading

Switch h to height and add loading=lazy.

-```{div} .float-right
-[![Cluvio logo](https://www.cluvio.com/images/logos/cluvio/cluvio-logo-full_color-on_light-3744dd33.svg){h=60px}][Cluvio]
-```
+```{div} .float-right
+[![Cluvio logo](https://www.cluvio.com/images/logos/cluvio/cluvio-logo-full_color-on_light-3744dd33.svg){height=60px loading=lazy}][Cluvio]
+```

24-26: Add height and loading=lazy to screenshots

Minor perf/accessibility touch-up.

-![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){h=200px}
-![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){h=200px}
+![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){height=200px loading=lazy}
+![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){height=200px loading=lazy}

33-39: Suppress MD034 around Sphinx :link: in the card

Avoids false-positive lint error.

 :::{grid-item-card} Data Analysis with Cluvio and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/data-analysis-with-cluvio-and-cratedb/1571
 :link-type: url
 Explore how to leverage the power of Cluvio, a modern data analysis platform
 with CrateDB Cloud as the underlying database.
+<!-- markdownlint-enable MD034 -->
 :::

49-49: Optional: Suppress MD053 false positive for link reference

markdownlint sometimes reports the “Unused link reference” (MD053) for references used within directives. If that happens in CI, add a scoped suppression.

+<!-- markdownlint-disable MD053 -->
 [CrateDB and Cluvio]: https://cratedb.com/integrations/cratedb-and-cluvio
+<!-- markdownlint-enable MD053 -->
docs/integrate/dbeaver/index.md (2)

7-10: Standardize image attributes and add lazy-loading

Use width instead of w and include loading=lazy.

 ```{div} .float-right
 :style: "margin-left: 0.5em"
-[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){w=120px}][DBeaver]
+[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){width=120px loading=lazy}][DBeaver]

---

`63-68`: **Suppress MD034 around Sphinx `:link:` in the card**

Prevents bare URL warning for intended syntax.



```diff
 :::{grid-item-card} Blog: Use CrateDB With DBeaver
+<!-- markdownlint-disable MD034 -->
 :link: https://cratedb.com/blog/cratedb-dbeaver
 :link-type: url
 DBeaver is a multipurpose database tool for developers and database administrators.
 With the help of the CrateDB JDBC Standalone Driver, you can use DBeaver with CrateDB.
+<!-- markdownlint-enable MD034 -->
 :::
docs/integrate/sql-server/index.md (2)

4-10: Standardize logo attributes; consider CSS gap instead of &nbsp; spacing

  • Replace h with height and add loading=lazy.
  • Replace &nbsp;&nbsp; with CSS-based spacing for maintainability.
 ```{div} .float-right
-[![Microsoft logo](https://github.com/crate/crate-clients-tools/assets/453543/a93a0fdb-1a1e-451e-abcb-8f705e2b03f4){h=60px}](https://www.microsoft.com/)
-&nbsp;&nbsp;
-[![MSSQL logo](https://github.com/crate/crate-clients-tools/assets/453543/6317965a-0b69-4d8e-bc77-e12dfc8ed338){h=60px}](https://learn.microsoft.com/en-us/sql/)
+```{div} .float-right
+:style: "display: inline-flex; gap: 8px; align-items: center"
+[![Microsoft logo](https://github.com/crate/crate-clients-tools/assets/453543/a93a0fdb-1a1e-451e-abcb-8f705e2b03f4){height=60px loading=lazy}](https://www.microsoft.com/)
+[![MSSQL logo](https://github.com/crate/crate-clients-tools/assets/453543/6317965a-0b69-4d8e-bc77-e12dfc8ed338){height=60px loading=lazy}](https://learn.microsoft.com/en-us/sql/)

---

`38-44`: **Suppress MD034 around Sphinx `:link:` in the card**

Avoids false-positive bare URL lint warnings.



```diff
 :::{grid-item-card} SSIS and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://github.com/crate/cratedb-examples/tree/main/application/microsoft-ssis
 :link-type: url
 Using SQL Server Integration Services with CrateDB.
 +++
 A demo project which uses SSIS and ODBC to read and write data from CrateDB.
+<!-- markdownlint-enable MD034 -->
 :::
docs/integrate/node-red/index.md (3)

4-8: Standardize logo attributes and add lazy-loading

Switch to height and include loading=lazy.

-```{div} .float-right
-[![Node-RED logo](https://upload.wikimedia.org/wikipedia/commons/2/2b/Node-red-icon.png){h=60px}](https://nodered.org/)
-```
+```{div} .float-right
+[![Node-RED logo](https://upload.wikimedia.org/wikipedia/commons/2/2b/Node-red-icon.png){height=60px loading=lazy}](https://nodered.org/)
+```

22-26: Replace inline float style with CSS utility for consistency

Use .float-right (and margin utility if available) instead of inline :style:.

-:::{dropdown} **Managed Node-RED**
-```{div}
-:style: "float: right; margin: 0.5em"
-[![FlowFuse logo](https://github.com/crate/crate-clients-tools/assets/453543/200d1a92-1e38-453a-89bf-d8b727451fab){w=180px}][FlowFuse]
-```
+:::{dropdown} **Managed Node-RED**
+```{div} .float-right
+[![FlowFuse logo](https://github.com/crate/crate-clients-tools/assets/453543/200d1a92-1e38-453a-89bf-d8b727451fab){width=180px loading=lazy}][FlowFuse]
+```

59-69: Suppress MD034 around Sphinx :link: in the cards

Prevents bare URL warnings for intended Sphinx syntax.

 :::{grid-item-card} Tutorial: Ingest MQTT
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/ingesting-mqtt-messages-into-cratedb-using-node-red/803
 :link-type: url
 Ingesting MQTT messages into CrateDB using Node-RED.
 :::
 
 :::{grid-item-card} Tutorial: Recurrent queries
 :link: https://community.cratedb.com/t/automating-recurrent-cratedb-queries/788
 :link-type: url
 Automating recurrent CrateDB queries using Node-RED
+<!-- markdownlint-enable MD034 -->
 :::
docs/integrate/apache-nifi/index.md (2)

41-45: Suppress MD034 around Sphinx :link: in the card

Avoids false-positive lint error.

 :::{grid-item-card} Tutorial: Connect Apache NiFi and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/connecting-to-cratedb-from-apache-nifi/647
 :link-type: url
 How to connect from Apache NiFi to CrateDB and ingest data from NiFi into CrateDB.
+<!-- markdownlint-enable MD034 -->
 :::

55-56: Optional: Suppress MD053 false positive for link reference

If markdownlint complains the reference is unused (it’s used in seealso), add scoped suppression.

-[CrateDB and Apache NiFi]: https://cratedb.com/integrations/cratedb-and-apache-nifi
+<!-- markdownlint-disable MD053 -->
+[CrateDB and Apache NiFi]: https://cratedb.com/integrations/cratedb-and-apache-nifi
+<!-- markdownlint-enable MD053 -->
docs/integrate/rill/index.md (2)

47-48: Use height and loading=lazy for images

Standardize attribute names and enable lazy-loading.

-![Rill Dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){h=200px}
-![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){h=200px}
+![Rill demo animation](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){height=200px loading=lazy}
+![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){height=200px loading=lazy}

57-61: Suppress MD034 around Sphinx :link: in the card

Prevents bare URL warnings.

 :::{grid-item-card} Rill and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/introducing-rill-and-bi-as-code-with-cratedb-cloud/1718
 :link-type: url
 Introducing Rill and BI as Code with CrateDB Cloud.
+<!-- markdownlint-enable MD034 -->
 :::
docs/integrate/mysql/index.md (1)

5-10: Normalize logo attributes and enable lazy loading

Use height plus loading=lazy for consistency and perf. Replace short h= with height=.

-```{div} .float-right
-[![mysql-logo](https://www.mysql.com/common/logos/powered-by-mysql-167x86.png){h=60px}](https://www.mysql.com/)
-[![mariadb-logo](https://mariadb.com/wp-content/themes/mariadb-2025/public/images/logo-dark.4482a1.svg){h=60px}](https://www.mariadb.com/)
+```{div} .float-right
+[![MySQL logo](https://www.mysql.com/common/logos/powered-by-mysql-167x86.png){height=60px loading=lazy}](https://www.mysql.com/)
+[![MariaDB logo](https://mariadb.com/wp-content/themes/mariadb-2025/public/images/logo-dark.4482a1.svg){height=60px loading=lazy}](https://www.mariadb.com/)

</blockquote></details>
<details>
<summary>docs/integrate/debezium/index.md (1)</summary><blockquote>

`4-8`: **Add lazy loading and normalize image sizing attribute**

Use `height` and `loading=lazy` consistently.



```diff
-```{div} .float-right
-[![Debezium logo](https://debezium.io/assets/images/color_black_debezium_type_600px.svg){h=60px}][Debezium]
+```{div} .float-right
+[![Debezium logo](https://debezium.io/assets/images/color_black_debezium_type_600px.svg){height=60px loading=lazy}][Debezium]

</blockquote></details>
<details>
<summary>docs/integrate/streamlit/index.md (1)</summary><blockquote>

`4-8`: **Enable lazy loading and standardize logo sizing**

Adopt `height=60px` and `loading=lazy` to match other integration pages.



```diff
-```{div} .float-right
-[![Streamlit logo](https://github.com/crate/crate-clients-tools/assets/453543/0fffb2d4-1d17-49c9-96e3-fd6ae42a39c4){h=60px}][Streamlit]
+```{div} .float-right
+[![Streamlit logo](https://github.com/crate/crate-clients-tools/assets/453543/0fffb2d4-1d17-49c9-96e3-fd6ae42a39c4){height=60px loading=lazy}][Streamlit]

</blockquote></details>
<details>
<summary>docs/integrate/telegraf/index.md (1)</summary><blockquote>

`4-8`: **Standardize logo attributes and add lazy loading**

Use `height` attribute and `loading=lazy` for consistency and performance.



```diff
-```{div} .float-right
-[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){h=60px}][Telegraf]
+```{div} .float-right
+[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){height=60px loading=lazy}][Telegraf]

</blockquote></details>
<details>
<summary>docs/integrate/datagrip/index.md (3)</summary><blockquote>

`7-10`: **Unify logo sizing and add lazy loading for performance**

For consistency with other integration pages, prefer height-based sizing and add lazy loading.



```diff
-```{div} .float-right
-:style: "margin-left: 0.5em"
-[![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){w=120px}][DataGrip]
+```{div} .float-right
+:style: "margin-left: 0.5em"
+[![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){h=60px loading=lazy}][DataGrip]

32-34: Add loading=lazy to screenshots to reduce page weight

All screenshots are non-critical and can be lazily loaded.

-![DataGrip: add custom JAR for JDBC driver](https://github.com/user-attachments/assets/a8c1ada6-fd97-43f4-a1ba-91aba1520bdb){h=180px}
-![DataGrip: select JDBC JARs](https://github.com/user-attachments/assets/1f925848-fac3-4265-8bd3-96f91daf03c9){h=180px}
+![DataGrip: add custom JAR for JDBC driver](https://github.com/user-attachments/assets/a8c1ada6-fd97-43f4-a1ba-91aba1520bdb){h=180px loading=lazy}
+![DataGrip: select JDBC JARs](https://github.com/user-attachments/assets/1f925848-fac3-4265-8bd3-96f91daf03c9){h=180px loading=lazy}
-![DataGrip: set driver class io.crate.client.jdbc.CrateDriver](https://github.com/user-attachments/assets/50ccb304-5aaf-4f0b-8ae7-55445f06930c){w=400px}
+![DataGrip: set driver class io.crate.client.jdbc.CrateDriver](https://github.com/user-attachments/assets/50ccb304-5aaf-4f0b-8ae7-55445f06930c){w=400px loading=lazy}
-![DataGrip: add CrateDB data source](https://github.com/user-attachments/assets/147a3e8e-f1d7-413d-9e0c-1ced11333646){w=480px}
+![DataGrip: add CrateDB data source](https://github.com/user-attachments/assets/147a3e8e-f1d7-413d-9e0c-1ced11333646){w=480px loading=lazy}
-![DataGrip: database URL](https://github.com/user-attachments/assets/c929aa64-f032-451c-9f9d-45e6aebb12e5){w=480px}
+![DataGrip: database URL](https://github.com/user-attachments/assets/c929aa64-f032-451c-9f9d-45e6aebb12e5){w=480px loading=lazy}
-![DataGrip: data tree view](https://github.com/user-attachments/assets/3350a955-0a53-41d7-905b-a71cc4a767e9){h=240px}
-![DataGrip: query console running SQL](https://github.com/user-attachments/assets/d0a2a09d-a59f-4eda-a488-09d5ce15c08d){h=240px}
+![DataGrip: data tree view](https://github.com/user-attachments/assets/3350a955-0a53-41d7-905b-a71cc4a767e9){h=240px loading=lazy}
+![DataGrip: query console running SQL](https://github.com/user-attachments/assets/d0a2a09d-a59f-4eda-a488-09d5ce15c08d){h=240px loading=lazy}

Also applies to: 41-41, 55-55, 65-65, 74-75


58-63: Add Cloud SSL example and credential guidance

Include a Cloud variant and clarify credential handling in JDBC UIs.

 For connecting to [CrateDB Self-Managed] or [CrateDB Cloud],
 use a connection URL like:

jdbc:crate://:5432/

+For [CrateDB Cloud], enable TLS:
+```
+jdbc:crate://<clustername>.cratedb.net:5432/?ssl=true
+```
+Note: Provide username/password via the DataGrip UI (preferred) or as JDBC URL query parameters, not in the user:password@ URL segment.

Please confirm the CrateDB JDBC driver’s ?ssl=true flag is the recommended parameter for Cloud in your current version.

docs/integrate/apache-hop/index.md (2)

4-8: Add lazy loading to the logo

Improves LCP and bandwidth.

-```{div} .float-right
-[![Apache Hop logo](https://hop.apache.org/img/hop-logo.svg){h=60px}][Apache Hop]
+```{div} .float-right
+[![Apache Hop logo](https://hop.apache.org/img/hop-logo.svg){h=60px loading=lazy}][Apache Hop]

29-31: Lazy-load screenshots

-![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px}
-![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px}
-![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px}
+![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px loading=lazy}
+![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px loading=lazy}
+![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px loading=lazy}
docs/integrate/tableau/index.md (4)

4-8: Lazy-load the logo

-```{div} .float-right
-[![Tableau logo](https://upload.wikimedia.org/wikipedia/en/thumb/0/06/Tableau_logo.svg/500px-Tableau_logo.svg.png?20200509180027){h=60px}][Tableau]
+```{div} .float-right
+[![Tableau logo](https://upload.wikimedia.org/wikipedia/en/thumb/0/06/Tableau_logo.svg/500px-Tableau_logo.svg.png?20200509180027){h=60px loading=lazy}][Tableau]

17-17: Lazy-load the hero screenshot

-![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}
+![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px loading=lazy}

65-71: Prune unused link reference definitions

These two appear unused after converting to grid-item cards.

-[Connecting to CrateDB from Tableau with JDBC]: https://cratedb.com/blog/connecting-to-cratedb-from-tableau-with-jdbc
-[Connector: Issues]: https://github.com/crate/cratedb-tableau-connector/issues
+[Connector: Issues]: https://github.com/crate/cratedb-tableau-connector/issues
 [CrateDB and Tableau]: https://cratedb.com/integrations/cratedb-and-tableau
-[CrateDB Tableau Connector]: https://github.com/crate/cratedb-tableau-connector
 [Tableau]: https://www.tableau.com/
 [Tool: Tableau]: https://github.com/crate/crate/labels/tool%3A%20Tableau
-[Using CrateDB with Tableau]: https://community.cratedb.com/t/using-cratedb-with-tableau/1192
+[Using CrateDB with Tableau]: https://community.cratedb.com/t/using-cratedb-with-tableau/1192

If you still want to keep them for future reuse, consider suppressing MD053 for this file.


23-51: Credential handling note for PostgreSQL JDBC

Since Tableau uses the PostgreSQL JDBC driver, remind readers to supply credentials via driver fields or URL query parameters (not user:password@), per our guidance.

Add a brief note under “Learn” or in “Notes”:

  • When using the PostgreSQL JDBC driver with CrateDB, provide credentials via Tableau’s connection dialog or as URL query parameters (e.g., ?user=...&password=...). The user:password@ URL syntax is not supported by PostgreSQL JDBC.

Confirm wording aligns with your existing tutorials.

docs/integrate/apache-superset/index.md (2)

25-28: Replace inline float style with utility class for consistency

Use the shared .float-right class instead of inline style.

-:::{dropdown} **Managed Superset**
-```{div}
-:style: "float: right"
-[![Preset Cloud](https://github.com/crate/crate-clients-tools/assets/453543/9d07da87-8aff-4569-bf2a-0a16bf89f4bc){height=60px loading=lazy}][Preset Cloud]
-```
+:::{dropdown} **Managed Superset**
+```{div} .float-right
+[![Preset Cloud](https://github.com/crate/crate-clients-tools/assets/453543/9d07da87-8aff-4569-bf2a-0a16bf89f4bc){h=60px loading=lazy}][Preset Cloud]
+```
 ...
-```{div} .clearfix
-```
+```{div} .clearfix
+```

Also applies to: 42-44


103-105: Grammar tweak in webinar description

“educates about at all” → “covers all”

-From connecting databases to building charts, dashboards, and interactive filters,
-this video educates about at all the basic surfaces and workflows of Apache Superset.
+From connecting databases to building charts, dashboards, and interactive filters,
+this video covers all the basic surfaces and workflows of Apache Superset.
docs/integrate/prometheus/index.md (3)

4-8: Lazy-load the logo

-```{div} .float-right
-[![Prometheus logo](https://github.com/crate/crate-clients-tools/assets/453543/8ddb109f-b45f-46b0-8103-30ba491f7142){h=60px}][Prometheus]
+```{div} .float-right
+[![Prometheus logo](https://github.com/crate/crate-clients-tools/assets/453543/8ddb109f-b45f-46b0-8103-30ba491f7142){h=60px loading=lazy}][Prometheus]

35-36: Lazy-load the architecture image

-![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}
+![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px loading=lazy}

82-82: Hyphenate “Long‑term” when used adjectivally

Improves readability and follows style guidance.

-{material-outlined}`manage_history;2em` &nbsp; **CrateDB as Prometheus Long Term Storage**
+{material-outlined}`manage_history;2em` &nbsp; **CrateDB as Prometheus Long‑term Storage**
-[Prometheus with CrateDB: Long Term Metrics Storage]
+[Prometheus with CrateDB: Long‑term Metrics Storage]

Also applies to: 90-91

docs/integrate/apache-airflow/index.md (3)

9-13: Lazy-load the logo

-```{div} .float-right
-[![Apache Airflow logo](https://19927462.fs1.hubspotusercontent-na1.net/hub/19927462/hubfs/Partner%20Logos/392x140/Apache-Airflow-Logo-392x140.png?width=784&height=280&name=Apache-Airflow-Logo-392x140.png){h=60px}][Apache Airflow]
+```{div} .float-right
+[![Apache Airflow logo](https://19927462.fs1.hubspotusercontent-na1.net/hub/19927462/hubfs/Partner%20Logos/392x140/Apache-Airflow-Logo-392x140.png?width=784&height=280&name=Apache-Airflow-Logo-392x140.png){h=60px loading=lazy}][Apache Airflow]

25-33: Hyphenate “open‑source” (adjective)

Small style tweak.

-[Apache Airflow] is an open source software platform to programmatically author,
+[Apache Airflow] is an open‑source software platform to programmatically author,

37-40: Replace inline float with .float-right for consistency

Align with project-wide utility classes.

-```{div}
-:style: "float: right"
-[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
+```{div} .float-right
+[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){h=60px loading=lazy}](https://www.astronomer.io/)

...



Also applies to: 56-58

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between ebccc2865829cec7a890d05b3b086bb9e1d711ff and 3d167c4582016064d11840f0db2f3844720a6478.

</details>

<details>
<summary>📒 Files selected for processing (52)</summary>

* `docs/_include/links.md` (2 hunks)
* `docs/_static/css/custom.css` (2 hunks)
* `docs/connect/drivers.md` (1 hunks)
* `docs/ingest/cdc/index.md` (2 hunks)
* `docs/ingest/etl/index.md` (3 hunks)
* `docs/integrate/apache-airflow/index.md` (3 hunks)
* `docs/integrate/apache-flink/index.md` (2 hunks)
* `docs/integrate/apache-hop/index.md` (2 hunks)
* `docs/integrate/apache-iceberg/index.md` (1 hunks)
* `docs/integrate/apache-kafka/index.md` (2 hunks)
* `docs/integrate/apache-nifi/index.md` (2 hunks)
* `docs/integrate/apache-superset/index.md` (4 hunks)
* `docs/integrate/aws-dms/index.md` (2 hunks)
* `docs/integrate/aws-dynamodb/index.md` (1 hunks)
* `docs/integrate/aws-kinesis/index.md` (2 hunks)
* `docs/integrate/aws-lambda/index.md` (2 hunks)
* `docs/integrate/azure-functions/index.md` (2 hunks)
* `docs/integrate/cluvio/index.md` (1 hunks)
* `docs/integrate/datagrip/index.md` (6 hunks)
* `docs/integrate/dbeaver/index.md` (3 hunks)
* `docs/integrate/dbt/index.md` (4 hunks)
* `docs/integrate/debezium/index.md` (1 hunks)
* `docs/integrate/django/index.md` (2 hunks)
* `docs/integrate/estuary/index.md` (4 hunks)
* `docs/integrate/explo/index.md` (1 hunks)
* `docs/integrate/gradio/index.md` (1 hunks)
* `docs/integrate/grafana/index.md` (2 hunks)
* `docs/integrate/influxdb/index.md` (2 hunks)
* `docs/integrate/kestra/index.md` (2 hunks)
* `docs/integrate/langchain/index.md` (2 hunks)
* `docs/integrate/llamaindex/index.md` (2 hunks)
* `docs/integrate/marquez/data_ingestion.py` (1 hunks)
* `docs/integrate/marquez/index.md` (2 hunks)
* `docs/integrate/marquez/learn.md` (1 hunks)
* `docs/integrate/meltano/index.md` (1 hunks)
* `docs/integrate/metabase/index.md` (1 hunks)
* `docs/integrate/mongodb/index.md` (2 hunks)
* `docs/integrate/mysql/index.md` (1 hunks)
* `docs/integrate/n8n/index.md` (1 hunks)
* `docs/integrate/node-red/index.md` (3 hunks)
* `docs/integrate/plotly/index.md` (2 hunks)
* `docs/integrate/powerbi/index.md` (2 hunks)
* `docs/integrate/powerbi/service.rst` (9 hunks)
* `docs/integrate/prometheus/index.md` (2 hunks)
* `docs/integrate/pyviz/index.md` (2 hunks)
* `docs/integrate/rill/index.md` (2 hunks)
* `docs/integrate/risingwave/index.md` (1 hunks)
* `docs/integrate/sql-server/index.md` (2 hunks)
* `docs/integrate/streamlit/index.md` (1 hunks)
* `docs/integrate/streamsets/index.md` (2 hunks)
* `docs/integrate/tableau/index.md` (1 hunks)
* `docs/integrate/telegraf/index.md` (2 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (3)</summary>

* docs/connect/drivers.md
* docs/integrate/langchain/index.md
* docs/ingest/cdc/index.md

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (27)</summary>

* docs/integrate/streamsets/index.md
* docs/_include/links.md
* docs/integrate/llamaindex/index.md
* docs/integrate/azure-functions/index.md
* docs/integrate/explo/index.md
* docs/integrate/influxdb/index.md
* docs/integrate/apache-iceberg/index.md
* docs/integrate/n8n/index.md
* docs/integrate/powerbi/index.md
* docs/integrate/apache-kafka/index.md
* docs/ingest/etl/index.md
* docs/_static/css/custom.css
* docs/integrate/grafana/index.md
* docs/integrate/pyviz/index.md
* docs/integrate/risingwave/index.md
* docs/integrate/aws-dms/index.md
* docs/integrate/plotly/index.md
* docs/integrate/aws-dynamodb/index.md
* docs/integrate/dbt/index.md
* docs/integrate/meltano/index.md
* docs/integrate/estuary/index.md
* docs/integrate/marquez/data_ingestion.py
* docs/integrate/powerbi/service.rst
* docs/integrate/gradio/index.md
* docs/integrate/marquez/learn.md
* docs/integrate/mongodb/index.md
* docs/integrate/metabase/index.md

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧠 Learnings (9)</summary>

<details>
<summary>📚 Learning: 2025-08-09T16:19:43.947Z</summary>

Learnt from: amotl
PR: #238
File: docs/integrate/azure-functions/learn.rst:1-1
Timestamp: 2025-08-09T16:19:43.947Z
Learning: In the CrateDB Guide documentation, main integration anchors (e.g., azure-functions) are intentionally placed in the index.md files of their respective integration folders, while detailed tutorials use the -learn suffix (e.g., azure-functions-learn) in their learn.rst or learn.md files. This is a deliberate architectural pattern for the documentation restructuring.


**Applied to files:**
- `docs/integrate/marquez/index.md`
- `docs/integrate/mysql/index.md`
- `docs/integrate/prometheus/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-05T07:14:57.416Z</summary>

Learnt from: hammerhead
PR: #221
File: docs/connect/configure.md:58-66
Timestamp: 2025-08-05T07:14:57.416Z
Learning: In CrateDB connection strings, the user:password@ syntax is valid for HTTP Basic authentication on port 4200, but PostgreSQL JDBC drivers do not support this format and require credentials as query parameters (?user=&password=) instead.


**Applied to files:**
- `docs/integrate/datagrip/index.md`

</details>
<details>
<summary>📚 Learning: 2025-06-05T14:29:15.512Z</summary>

Learnt from: amotl
PR: #207
File: docs/integrate/etl/iceberg-risingwave.md:205-207
Timestamp: 2025-06-05T14:29:15.512Z
Learning: The records.Database("crate://", echo=True) connection string for CrateDB works with defaults: localhost as host, "crate" as user, and blank password. This is valid and functional code in the records library.


**Applied to files:**
- `docs/integrate/datagrip/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-10T18:17:49.350Z</summary>

Learnt from: amotl
PR: #241
File: docs/integrate/mysql/index.md:51-55
Timestamp: 2025-08-10T18:17:49.350Z
Learning: In the CrateDB Guide documentation, the file docs/integrate/mysql/import-csv.rst contains the reStructuredText label .. _mysql-import-csv: which can be referenced from MyST Markdown files using :link: mysql-import-csv with :link-type: ref. This is another example of cross-format referencing between MyST and RST files working correctly in Sphinx.


**Applied to files:**
- `docs/integrate/mysql/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-08T16:50:14.965Z</summary>

Learnt from: amotl
PR: #234
File: docs/home/index.md:47-50
Timestamp: 2025-08-08T16:50:14.965Z
Learning: In the CrateDB Guide docs (MyST), the correct intersphinx target for the CrateDB Cloud documentation homepage is cloud:index (not cloud:docs-index or cloud-docs-index). Use :link: cloud:index on cards/links. The cloud mapping is inherited via crate-docs-theme.


**Applied to files:**
- `docs/integrate/mysql/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-09T21:40:46.125Z</summary>

Learnt from: amotl
PR: #238
File: docs/integrate/streamsets/index.md:18-21
Timestamp: 2025-08-09T21:40:46.125Z
Learning: In the CrateDB Guide documentation, reStructuredText files (.rst) use the RST label syntax .. _label: while MyST Markdown files (.md) use the syntax (label)=. Both formats are used throughout the repository and labels can be cross-referenced between them.


**Applied to files:**
- `docs/integrate/mysql/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-10T17:09:32.583Z</summary>

Learnt from: amotl
PR: #241
File: docs/integrate/azure-functions/index.md:31-36
Timestamp: 2025-08-10T17:09:32.583Z
Learning: In the CrateDB Guide documentation, RST files (.rst) use reStructuredText anchor syntax .. _anchor-name: while Markdown files (.md) use MyST syntax (anchor-name)=. Cross-references between MyST Markdown and reStructuredText files work correctly - a MyST :link: directive can reference an RST anchor and vice versa.


**Applied to files:**
- `docs/integrate/mysql/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-09T11:03:33.164Z</summary>

Learnt from: amotl
PR: #236
File: docs/ingest/etl/index.md:22-23
Timestamp: 2025-08-09T11:03:33.164Z
Learning: In the CrateDB Guide documentation, MyST Markdown files can use {ref} directives to reference labels defined in reStructuredText files using the RST syntax .. _label:. This cross-format referencing between MyST and RST is supported by Sphinx.


**Applied to files:**
- `docs/integrate/mysql/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-10T17:59:43.468Z</summary>

Learnt from: amotl
PR: #241
File: docs/integrate/grafana/index.md:37-46
Timestamp: 2025-08-10T17:59:43.468Z
Learning: In mixed documentation projects using Sphinx, the :link-type: ref directive in Markdown files can reference labels defined in reStructuredText files using the .. _label-name: syntax, and vice versa.


**Applied to files:**
- `docs/integrate/mysql/index.md`

</details>

</details><details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>docs/integrate/apache-airflow/index.md</summary>

[uncategorized] ~19-~19: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ut :::  :::{div} [Apache Airflow] is an open source software platform to programmatically a...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

</details>
<details>
<summary>docs/integrate/datagrip/index.md</summary>

[style] ~74-~74: Using many exclamation marks might seem excessive (in this case: 6 exclamation marks for a text that’s 2661 characters long)
Context: ...5-0a53-41d7-905b-a71cc4a767e9){h=240px} ![DataGrip: query console running SQL](ht...

(EN_EXCESSIVE_EXCLAMATION)

</details>
<details>
<summary>docs/integrate/prometheus/index.md</summary>

[uncategorized] ~82-~82: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ory;2em` &nbsp; **CrateDB as Prometheus Long Term Storage**  Learn how to start Prometheu...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

---

[uncategorized] ~90-~90: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...B" tutorial.  [Prometheus with CrateDB: Long Term Metrics Storage] :::  :::{grid-item} :c...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

</details>

</details>
<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

<details>
<summary>docs/integrate/apache-airflow/index.md</summary>

68-68: Bare URL used

(MD034, no-bare-urls)

---

74-74: Bare URL used

(MD034, no-bare-urls)

---

89-89: Bare URL used

(MD034, no-bare-urls)

---

95-95: Bare URL used

(MD034, no-bare-urls)

---

102-102: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/apache-flink/index.md</summary>

135-135: Bare URL used

(MD034, no-bare-urls)

---

148-148: Bare URL used

(MD034, no-bare-urls)

---

154-154: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/apache-hop/index.md</summary>

42-42: Bare URL used

(MD034, no-bare-urls)

---

49-49: Bare URL used

(MD034, no-bare-urls)

---

55-55: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/apache-nifi/index.md</summary>

42-42: Bare URL used

(MD034, no-bare-urls)

---

55-55: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and apache nifi"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/apache-superset/index.md</summary>

80-80: Bare URL used

(MD034, no-bare-urls)

---

86-86: Bare URL used

(MD034, no-bare-urls)

---

160-160: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and apache superset"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/aws-kinesis/index.md</summary>

60-60: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/cluvio/index.md</summary>

34-34: Bare URL used

(MD034, no-bare-urls)

---

49-49: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and cluvio"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/datagrip/index.md</summary>

87-87: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/dbeaver/index.md</summary>

64-64: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/debezium/index.md</summary>

33-33: Link fragments should be valid

(MD051, link-fragments)

---

33-33: Link fragments should be valid

(MD051, link-fragments)

---

35-35: Link fragments should be valid

(MD051, link-fragments)

---

37-37: Images should have alternate text (alt text)

(MD045, no-alt-text)

---

38-38: Images should have alternate text (alt text)

(MD045, no-alt-text)

---

39-39: Images should have alternate text (alt text)

(MD045, no-alt-text)

</details>
<details>
<summary>docs/integrate/django/index.md</summary>

32-32: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/kestra/index.md</summary>

40-40: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/mysql/index.md</summary>

44-44: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/node-red/index.md</summary>

62-62: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and power bi"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/rill/index.md</summary>

58-58: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/sql-server/index.md</summary>

39-39: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/streamlit/index.md</summary>

33-33: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/tableau/index.md</summary>

27-27: Bare URL used

(MD034, no-bare-urls)

---

37-37: Bare URL used

(MD034, no-bare-urls)

---

44-44: Bare URL used

(MD034, no-bare-urls)

---

65-65: Link and image reference definitions should be needed
Unused link or image reference definition: "connecting to cratedb from tableau with jdbc"

(MD053, link-image-reference-definitions)

---

67-67: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and tableau"

(MD053, link-image-reference-definitions)

---

68-68: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb tableau connector"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/telegraf/index.md</summary>

49-49: Bare URL used

(MD034, no-bare-urls)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)</summary>

* GitHub Check: Build docs

</details>

<details>
<summary>🔇 Additional comments (5)</summary><blockquote>

<details>
<summary>docs/integrate/mysql/index.md (1)</summary>

`49-53`: **Cross-format reference is correct**

`:link: mysql-import-csv` with `:link-type: ref` correctly targets the RST label `.. _mysql-import-csv:`.

</details>
<details>
<summary>docs/integrate/apache-flink/index.md (1)</summary>

`8-15`: **Header/logo and badge block looks solid**

Uses `height`, `loading="lazy"`, and `rel="noopener noreferrer"`. Clearfix included. LGTM.

</details>
<details>
<summary>docs/integrate/django/index.md (1)</summary>

`4-11`: **LGTM: Hardened external link and accessible, lazy-loaded images**

Good use of `height`, `loading="lazy"`, and `rel="noopener noreferrer"`. This aligns with the pattern across other integrations.

</details>
<details>
<summary>docs/integrate/marquez/index.md (1)</summary>

`35-37`: **Link reference “marquez-learn” is valid**  
The label `(marquez-learn)=` is defined in `docs/integrate/marquez/learn.md` on line 1, so the `:link-type: ref` in `index.md` will resolve correctly. No changes needed.

</details>
<details>
<summary>docs/integrate/apache-superset/index.md (1)</summary>

`7-12`: **LGTM: rel/alt added and logo sizing**

The badge anchor includes rel="noopener noreferrer" and the image has alt text. Good a11y/security practice.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

@amotl amotl force-pushed the etl-cdc-grouping branch from e880a64 to 7264bf9 Compare August 10, 2025 20:28
@amotl amotl force-pushed the etl-cdc-balancing branch 2 times, most recently from 23fc020 to a43e52e Compare August 10, 2025 21:11
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (3)
docs/integrate/apache-nifi/index.md (1)

4-6: Optional: Host the logo locally to improve build robustness.

Avoid hot-linking the NiFi logo; store it under docs/_static/img/integrations/ and reference locally for reliability.

-[![Apache NiFi logo](https://nifi.apache.org/images/apache-nifi-drop-logo.svg){height=60px loading=lazy}][Apache NiFi]
+[![Apache NiFi logo](/_static/img/integrations/apache-nifi-drop-logo.svg){height=60px loading=lazy}][Apache NiFi]
docs/integrate/aws-dynamodb/index.md (1)

11-12: Harden external badge link and add alt text (repeat from earlier review)

Add rel="noopener noreferrer" to the anchor and alt text to the image for security and accessibility.

-<a href="https://github.com/crate/cratedb-toolkit/actions/workflows/dynamodb.yml" target="_blank">
-    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-toolkit/dynamodb.yml?branch=main&label=CTK%2BDynamoDB" loading="lazy"></a>
+<a href="https://github.com/crate/cratedb-toolkit/actions/workflows/dynamodb.yml" target="_blank" rel="noopener noreferrer">
+    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-toolkit/dynamodb.yml?branch=main&label=CTK%2BDynamoDB" loading="lazy" alt="CI status: cratedb-toolkit DynamoDB workflow"></a>
docs/integrate/apache-airflow/index.md (1)

9-11: Optional: Vendor remote logo asset locally

Hot-linked logos can break previews and impact reproducibility. Consider vendoring into docs/_static/ and referencing locally.

🧹 Nitpick comments (37)
docs/integrate/n8n/index.md (3)

22-26: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

markdownlint flags the bare URL in :link: though this is valid Sphinx Design syntax. Suppress locally.

 :::{grid-item-card} n8n CrateDB integration
+<!-- markdownlint-disable MD034 -->
 :link: https://n8n.io/integrations/cratedb/
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Create workflows with CrateDB integrations.
 :::

20-21: Optional: Add gutter for consistent spacing between cards.

This aligns with other integration pages using Sphinx Design grids.

-::::{grid} 2
+::::{grid} 2
+:gutter: 2

31-36: MD053 “unused reference” appears to be a false positive.

[CrateDB and n8n] is consumed inside the seealso block. Consider ignoring MD053 for references used in directives.

docs/integrate/cluvio/index.md (3)

24-26: Use standard image attributes and enable lazy loading.

Replace non-standard h= with height= and add loading=lazy.

-![Cluvio dashboard with custom filters](...){h=200px}
-![Cluvio report creator screen](...){h=200px}
+![Cluvio dashboard with custom filters](...){height=200px loading=lazy}
+![Cluvio report creator screen](...){height=200px loading=lazy}

33-38: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

 :::{grid-item-card} Data Analysis with Cluvio and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/data-analysis-with-cluvio-and-cratedb/1571
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Explore how to leverage the power of Cluvio, a modern data analysis platform
 with CrateDB Cloud as the underlying database.
 :::

44-50: MD053 “unused reference” likely noise.

[CrateDB and Cluvio] is used in the seealso directive. If the linter doesn’t parse directives, suppress MD053 for these cases.

docs/integrate/dbeaver/index.md (4)

7-10: Standardize logo sizing/attributes to match other pages.

Other pages use height=60px and lazy-loading. Consider the same here.

-```{div} .float-right
-:style: "margin-left: 0.5em"
-[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){w=120px}][DBeaver]
+```{div} .float-right
+:style: "margin-left: 0.5em"
+[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){height=60px loading=lazy}][DBeaver]

42-43: Improve alt text for accessibility.

Use descriptive alt text instead of a generic “Image”.

-![Image](https://github.com/user-attachments/assets/630fcc7c-21c5-4070-be72-e38041c19d8e){w=480px}
+![DBeaver connection settings screenshot](https://github.com/user-attachments/assets/630fcc7c-21c5-4070-be72-e38041c19d8e){w=480px}

52-53: Improve alt text for accessibility.

-![Image](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.05.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.05.png){h=240px}
-![Image](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.13.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.13.png){h=240px}
+![DBeaver data tab screenshot 1](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.05.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.05.png){h=240px}
+![DBeaver data tab screenshot 2](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.13.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.13.png){h=240px}

63-68: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

 :::{grid-item-card} Blog: Use CrateDB With DBeaver
+<!-- markdownlint-disable MD034 -->
 :link: https://cratedb.com/blog/cratedb-dbeaver
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 DBeaver is a multipurpose database tool for developers and database administrators.
 With the help of the CrateDB JDBC Standalone Driver, you can use DBeaver with CrateDB.
 :::
docs/integrate/sql-server/index.md (2)

37-43: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

 :::{grid-item-card} SSIS and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://github.com/crate/cratedb-examples/tree/main/application/microsoft-ssis
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Using SQL Server Integration Services with CrateDB.
 +++
 A demo project which uses SSIS and ODBC to read and write data from CrateDB.
 :::

48-48: MD053 “unused reference” likely false positive.

[Microsoft SQL documentation] is referenced in the logo link. Consider suppressing MD053 for references used in directives or image links.

docs/integrate/explo/index.md (2)

22-23: Use standard image attributes and enable lazy loading.

Replace h= with height= and add loading=lazy.

-![Explo Explore dashboard](...){h=200px}
-![Explo Explore query view](...){h=200px}
+![Explo Explore dashboard](...){height=200px loading=lazy}
+![Explo Explore query view](...){height=200px loading=lazy}

31-35: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

 :::{grid-item-card} Blog: Introduction to Time Series Visualization
+<!-- markdownlint-disable MD034 -->
 :link: https://cratedb.com/blog/introduction-to-time-series-visualization-in-cratedb-and-explo
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Introduction to Time Series Visualization in CrateDB and Explo.
 :::
docs/integrate/gradio/index.md (2)

38-44: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

 :::{grid-item-card} Example
+<!-- markdownlint-disable MD034 -->
 :link: https://github.com/crate/cratedb-examples/tree/main/framework/gradio
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Example program using Gradio with CrateDB.
 :::

38-39: Optional: Add gutter to grid for visual spacing.

-::::{grid} 2
+::::{grid} 2
+:gutter: 2
docs/integrate/apache-nifi/index.md (2)

30-33: Use standard image attributes and enable lazy loading.

Replace h= with height= and add loading=lazy on screenshots.

-![NiFi flow canvas screenshot 1](...){h=120px}
-![NiFi flow canvas screenshot 2](...){h=120px}
-![NiFi processors screenshot](...){h=120px}
+![NiFi flow canvas screenshot 1](...){height=120px loading=lazy}
+![NiFi flow canvas screenshot 2](...){height=120px loading=lazy}
+![NiFi processors screenshot](...){height=120px loading=lazy}

41-45: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

 :::{grid-item-card} Tutorial: Connect Apache NiFi and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/connecting-to-cratedb-from-apache-nifi/647
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 How to connect from Apache NiFi to CrateDB and ingest data from NiFi into CrateDB.
 :::
docs/integrate/node-red/index.md (4)

23-26: Prefer utility class over inline float for consistency.

Use .float-right instead of inline float: right; and keep margin inline or via a utility.

-```{div}
-:style: "float: right; margin: 0.5em"
-[![FlowFuse logo](https://github.com/crate/crate-clients-tools/assets/453543/200d1a92-1e38-453a-89bf-d8b727451fab){w=180px}][FlowFuse]
+```{div} .float-right
+:style: "margin: 0.5em"
+[![FlowFuse logo](https://github.com/crate/crate-clients-tools/assets/453543/200d1a92-1e38-453a-89bf-d8b727451fab){height=60px loading=lazy}][FlowFuse]

59-64: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

 :::{grid-item-card} Tutorial: Ingest MQTT
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/ingesting-mqtt-messages-into-cratedb-using-node-red/803
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Ingesting MQTT messages into CrateDB using Node-RED.
 :::

65-69: Suppress MD034 around Sphinx 🔗 parameter (linter false positive).

 :::{grid-item-card} Tutorial: Recurrent queries
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/automating-recurrent-cratedb-queries/788
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Automating recurrent CrateDB queries using Node-RED
 :::

57-58: Optional: Add gutter on grid for spacing.

-::::{grid}
+::::{grid}
+:gutter: 2
docs/integrate/mysql/index.md (1)

32-36: Optional: clarify uvx prerequisite

Consider a short note that uvx requires uv (or how to install it), to reduce friction for first-time users.

docs/integrate/apache-flink/index.md (2)

183-189: Improve performance: lazy-load embedded YouTube iframe

Add loading="lazy" to defer iframe loading and speed up initial render.

-<iframe width="240" src="https://www.youtube-nocookie.com/embed/3cg5dABA6mo?list=PLa7VYi0yPIH1UdmQcnUr8lvjbUV8JriK0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/3cg5dABA6mo?list=PLa7VYi0yPIH1UdmQcnUr8lvjbUV8JriK0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

212-217: Also lazy-load this iframe

Same suggestion here for consistency and page performance.

-<iframe width="240" src="https://www.youtube-nocookie.com/embed/R4UxMdrR5os?t=2207" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/R4UxMdrR5os?t=2207" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
docs/integrate/django/index.md (1)

19-31: Minor grammar: hyphenate “open-source” when used adjectivally

Applies to the “It’s free and open source.” sentence.

- It’s free and open source. 
+ It’s free and open-source.
docs/integrate/streamlit/index.md (1)

59-60: Lazy-load the webinar iframe

Add loading="lazy" to defer loading until in view.

-<iframe width="240" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
docs/integrate/marquez/index.md (1)

7-9: Use smaller SVG logo and keep lazy-loading

Switch from the heavy social-card JPEG to the lightweight SVG.

-[![Marquez logo](https://marquezproject.ai/img/marquez-social-card.jpg){height=60px loading=lazy}][Marquez]
+[![Marquez logo](https://marquezproject.ai/img/logo.svg){height=60px loading=lazy}][Marquez]
docs/integrate/datagrip/index.md (1)

7-10: Add lazy-loading to the logo image

Consistent with other pages, add loading=lazy. Optionally standardize on height for visual consistency.

-[![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){w=120px}][DataGrip]
+[![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){w=120px loading=lazy}][DataGrip]
docs/integrate/apache-hop/index.md (1)

13-16: Hyphenate “open-source”

When used as a compound adjective before a noun, “open source” should be hyphenated.

-[Apache Hop] aims to be a modern, open source data integration platform that is
+[Apache Hop] aims to be a modern, open-source data integration platform that is
docs/integrate/tableau/index.md (3)

17-17: Use standard MyST attribute name for image size

Replace non-standard h= with height= to avoid build/render issues across Sphinx/MyST themes.

-![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}
+![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){height=200px}

36-41: Future-proof driver mention

Avoid pinning to a specific JDBC minor version in prose; it goes stale quickly. Suggest generalizing to “42.x or newer”.

-How to install the latest PostgreSQL JDBC driver (e.g.
-`postgresql-42.7.1.jar` or newer) for using Tableau.
+How to install the latest PostgreSQL JDBC driver (e.g. 42.x or newer) for using Tableau.

65-71: Remove unused reference definitions (silence MD053)

These link reference definitions aren’t used on this page. Either switch the grid cards to use them or drop the unused definitions.

-[Connecting to CrateDB from Tableau with JDBC]: https://cratedb.com/blog/connecting-to-cratedb-from-tableau-with-jdbc
 [Connector: Issues]: https://github.com/crate/cratedb-tableau-connector/issues
 [CrateDB and Tableau]: https://cratedb.com/integrations/cratedb-and-tableau
-[CrateDB Tableau Connector]: https://github.com/crate/cratedb-tableau-connector
 [Tableau]: https://www.tableau.com/
 [Tool: Tableau]: https://github.com/crate/crate/labels/tool%3A%20Tableau
-[Using CrateDB with Tableau]: https://community.cratedb.com/t/using-cratedb-with-tableau/1192
docs/integrate/apache-superset/index.md (2)

11-11: Encode spaces in badge label parameter

The shields.io URL should URL-encode spaces in query params to avoid intermittent failures.

-    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-examples/application-apache-superset.yml?branch=main&label=Apache Superset" loading="lazy" alt="CI status: Apache Superset"></a>
+    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-examples/application-apache-superset.yml?branch=main&label=Apache%20Superset" loading="lazy" alt="CI status: Apache Superset"></a>

101-105: Fix grammar in webinar description

“educates about at all the basic surfaces” → “covers all the basic surfaces”.

-From connecting databases to building charts, dashboards, and interactive filters,
-this video educates about at all the basic surfaces and workflows of Apache Superset.
+From connecting databases to building charts, dashboards, and interactive filters,
+this video covers all the basic surfaces and workflows of Apache Superset.
docs/integrate/prometheus/index.md (1)

35-35: Use standard MyST attribute name for image size

Replace h= with height= for compatibility.

-![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}
+![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){height=200px}
docs/integrate/apache-airflow/index.md (1)

37-40: Prefer utility class over inline style and standardize width attribute

Use the shared .float-right class for consistency and change w= to width= for MyST compatibility. Also add lazy loading to the image.

-```{div}
-:style: "float: right"
-[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
+```{div} .float-right
+[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){width=180px loading=lazy}](https://www.astronomer.io/)

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 3d167c4582016064d11840f0db2f3844720a6478 and a43e52e96e977f2ac586993bc0409b8d1d422052.

</details>

<details>
<summary>📒 Files selected for processing (81)</summary>

* `docs/_include/card/timeseries-datashader.md` (1 hunks)
* `docs/_include/links.md` (2 hunks)
* `docs/_static/css/custom.css` (2 hunks)
* `docs/conf.py` (2 hunks)
* `docs/connect/index.md` (0 hunks)
* `docs/feature/blob/index.md` (0 hunks)
* `docs/feature/ccr/index.md` (0 hunks)
* `docs/feature/cloud/index.md` (0 hunks)
* `docs/feature/cluster/index.md` (0 hunks)
* `docs/feature/document/index.md` (0 hunks)
* `docs/feature/fdw/index.md` (0 hunks)
* `docs/feature/index.md` (0 hunks)
* `docs/feature/index/index.md` (0 hunks)
* `docs/feature/relational/index.md` (0 hunks)
* `docs/feature/search/fts/index.md` (0 hunks)
* `docs/feature/search/geo/index.md` (0 hunks)
* `docs/feature/search/hybrid/index.md` (0 hunks)
* `docs/feature/search/index.md` (0 hunks)
* `docs/feature/search/vector/index.md` (0 hunks)
* `docs/feature/snapshot/index.md` (0 hunks)
* `docs/feature/sql/index.md` (0 hunks)
* `docs/feature/storage/index.md` (0 hunks)
* `docs/feature/udf/index.md` (0 hunks)
* `docs/ingest/cdc/index.md` (2 hunks)
* `docs/ingest/etl/index.md` (3 hunks)
* `docs/ingest/index.md` (0 hunks)
* `docs/integrate/apache-airflow/index.md` (2 hunks)
* `docs/integrate/apache-flink/index.md` (2 hunks)
* `docs/integrate/apache-hop/index.md` (2 hunks)
* `docs/integrate/apache-iceberg/index.md` (1 hunks)
* `docs/integrate/apache-kafka/index.md` (2 hunks)
* `docs/integrate/apache-nifi/index.md` (2 hunks)
* `docs/integrate/apache-superset/index.md` (4 hunks)
* `docs/integrate/aws-dms/index.md` (2 hunks)
* `docs/integrate/aws-dynamodb/index.md` (1 hunks)
* `docs/integrate/aws-kinesis/index.md` (2 hunks)
* `docs/integrate/aws-lambda/index.md` (2 hunks)
* `docs/integrate/azure-functions/index.md` (2 hunks)
* `docs/integrate/cluvio/index.md` (1 hunks)
* `docs/integrate/datagrip/index.md` (6 hunks)
* `docs/integrate/dbeaver/index.md` (3 hunks)
* `docs/integrate/dbt/index.md` (4 hunks)
* `docs/integrate/debezium/index.md` (1 hunks)
* `docs/integrate/django/index.md` (2 hunks)
* `docs/integrate/estuary/index.md` (4 hunks)
* `docs/integrate/explo/index.md` (1 hunks)
* `docs/integrate/gradio/index.md` (1 hunks)
* `docs/integrate/grafana/index.md` (2 hunks)
* `docs/integrate/index.md` (3 hunks)
* `docs/integrate/influxdb/index.md` (2 hunks)
* `docs/integrate/kestra/index.md` (2 hunks)
* `docs/integrate/langchain/index.md` (2 hunks)
* `docs/integrate/llamaindex/index.md` (2 hunks)
* `docs/integrate/marquez/data_ingestion.py` (1 hunks)
* `docs/integrate/marquez/index.md` (2 hunks)
* `docs/integrate/marquez/learn.md` (1 hunks)
* `docs/integrate/meltano/index.md` (1 hunks)
* `docs/integrate/metabase/index.md` (1 hunks)
* `docs/integrate/mongodb/index.md` (2 hunks)
* `docs/integrate/mysql/import-csv.rst` (1 hunks)
* `docs/integrate/mysql/index.md` (1 hunks)
* `docs/integrate/n8n/index.md` (1 hunks)
* `docs/integrate/node-red/index.md` (3 hunks)
* `docs/integrate/plotly/index.md` (2 hunks)
* `docs/integrate/powerbi/desktop.rst` (6 hunks)
* `docs/integrate/powerbi/index.md` (2 hunks)
* `docs/integrate/powerbi/service.rst` (9 hunks)
* `docs/integrate/prometheus/index.md` (2 hunks)
* `docs/integrate/pyviz/index.md` (2 hunks)
* `docs/integrate/rill/index.md` (2 hunks)
* `docs/integrate/risingwave/index.md` (1 hunks)
* `docs/integrate/sql-server/index.md` (2 hunks)
* `docs/integrate/streamlit/index.md` (1 hunks)
* `docs/integrate/streamsets/index.md` (2 hunks)
* `docs/integrate/tableau/index.md` (1 hunks)
* `docs/integrate/telegraf/index.md` (1 hunks)
* `docs/topic/index.md` (0 hunks)
* `docs/topic/ml/index.md` (0 hunks)
* `docs/topic/timeseries/index.md` (0 hunks)
* `docs/use/index.md` (0 hunks)
* `docs/use/telemetry/index.md` (1 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (24)</summary>

* docs/feature/search/fts/index.md
* docs/feature/sql/index.md
* docs/topic/index.md
* docs/feature/search/hybrid/index.md
* docs/feature/ccr/index.md
* docs/feature/search/vector/index.md
* docs/ingest/index.md
* docs/feature/index.md
* docs/feature/search/geo/index.md
* docs/feature/blob/index.md
* docs/feature/relational/index.md
* docs/feature/cluster/index.md
* docs/feature/storage/index.md
* docs/feature/cloud/index.md
* docs/feature/search/index.md
* docs/feature/fdw/index.md
* docs/feature/snapshot/index.md
* docs/feature/udf/index.md
* docs/topic/timeseries/index.md
* docs/feature/index/index.md
* docs/use/index.md
* docs/feature/document/index.md
* docs/connect/index.md
* docs/topic/ml/index.md

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (4)</summary>

* docs/_include/card/timeseries-datashader.md
* docs/integrate/telegraf/index.md
* docs/integrate/langchain/index.md
* docs/conf.py

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (32)</summary>

* docs/_include/links.md
* docs/integrate/azure-functions/index.md
* docs/integrate/mysql/import-csv.rst
* docs/integrate/index.md
* docs/integrate/aws-lambda/index.md
* docs/integrate/rill/index.md
* docs/integrate/streamsets/index.md
* docs/integrate/powerbi/index.md
* docs/integrate/llamaindex/index.md
* docs/integrate/powerbi/desktop.rst
* docs/use/telemetry/index.md
* docs/integrate/mongodb/index.md
* docs/integrate/apache-iceberg/index.md
* docs/integrate/metabase/index.md
* docs/integrate/kestra/index.md
* docs/integrate/marquez/data_ingestion.py
* docs/integrate/aws-kinesis/index.md
* docs/ingest/cdc/index.md
* docs/ingest/etl/index.md
* docs/integrate/pyviz/index.md
* docs/integrate/influxdb/index.md
* docs/integrate/apache-kafka/index.md
* docs/integrate/aws-dms/index.md
* docs/integrate/grafana/index.md
* docs/integrate/plotly/index.md
* docs/integrate/marquez/learn.md
* docs/integrate/estuary/index.md
* docs/_static/css/custom.css
* docs/integrate/dbt/index.md
* docs/integrate/meltano/index.md
* docs/integrate/powerbi/service.rst
* docs/integrate/risingwave/index.md

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧠 Learnings (11)</summary>

<details>
<summary>📚 Learning: 2025-08-09T16:19:43.947Z</summary>

Learnt from: amotl
PR: #238
File: docs/integrate/azure-functions/learn.rst:1-1
Timestamp: 2025-08-09T16:19:43.947Z
Learning: In the CrateDB Guide documentation, main integration anchors (e.g., azure-functions) are intentionally placed in the index.md files of their respective integration folders, while detailed tutorials use the -learn suffix (e.g., azure-functions-learn) in their learn.rst or learn.md files. This is a deliberate architectural pattern for the documentation restructuring.


**Applied to files:**
- `docs/integrate/marquez/index.md`
- `docs/integrate/mysql/index.md`
- `docs/integrate/tableau/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-05T07:14:57.416Z</summary>

Learnt from: hammerhead
PR: #221
File: docs/connect/configure.md:58-66
Timestamp: 2025-08-05T07:14:57.416Z
Learning: In CrateDB connection strings, the user:password@ syntax is valid for HTTP Basic authentication on port 4200, but PostgreSQL JDBC drivers do not support this format and require credentials as query parameters (?user=&password=) instead.


**Applied to files:**
- `docs/integrate/datagrip/index.md`

</details>
<details>
<summary>📚 Learning: 2025-06-05T14:29:15.512Z</summary>

Learnt from: amotl
PR: #207
File: docs/integrate/etl/iceberg-risingwave.md:205-207
Timestamp: 2025-06-05T14:29:15.512Z
Learning: The records.Database("crate://", echo=True) connection string for CrateDB works with defaults: localhost as host, "crate" as user, and blank password. This is valid and functional code in the records library.


**Applied to files:**
- `docs/integrate/datagrip/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-10T18:17:49.350Z</summary>

Learnt from: amotl
PR: #241
File: docs/integrate/mysql/index.md:51-55
Timestamp: 2025-08-10T18:17:49.350Z
Learning: In the CrateDB Guide documentation, the file docs/integrate/mysql/import-csv.rst contains the reStructuredText label .. _mysql-import-csv: which can be referenced from MyST Markdown files using :link: mysql-import-csv with :link-type: ref. This is another example of cross-format referencing between MyST and RST files working correctly in Sphinx.


**Applied to files:**
- `docs/integrate/mysql/index.md`
- `docs/integrate/n8n/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-08T16:50:14.965Z</summary>

Learnt from: amotl
PR: #234
File: docs/home/index.md:47-50
Timestamp: 2025-08-08T16:50:14.965Z
Learning: In the CrateDB Guide docs (MyST), the correct intersphinx target for the CrateDB Cloud documentation homepage is cloud:index (not cloud:docs-index or cloud-docs-index). Use :link: cloud:index on cards/links. The cloud mapping is inherited via crate-docs-theme.


**Applied to files:**
- `docs/integrate/mysql/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-09T21:40:46.125Z</summary>

Learnt from: amotl
PR: #238
File: docs/integrate/streamsets/index.md:18-21
Timestamp: 2025-08-09T21:40:46.125Z
Learning: In the CrateDB Guide documentation, reStructuredText files (.rst) use the RST label syntax .. _label: while MyST Markdown files (.md) use the syntax (label)=. Both formats are used throughout the repository and labels can be cross-referenced between them.


**Applied to files:**
- `docs/integrate/mysql/index.md`
- `docs/integrate/n8n/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-10T17:09:32.583Z</summary>

Learnt from: amotl
PR: #241
File: docs/integrate/azure-functions/index.md:31-36
Timestamp: 2025-08-10T17:09:32.583Z
Learning: In the CrateDB Guide documentation, RST files (.rst) use reStructuredText anchor syntax .. _anchor-name: while Markdown files (.md) use MyST syntax (anchor-name)=. Cross-references between MyST Markdown and reStructuredText files work correctly - a MyST :link: directive can reference an RST anchor and vice versa.


**Applied to files:**
- `docs/integrate/mysql/index.md`
- `docs/integrate/n8n/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-09T11:03:33.164Z</summary>

Learnt from: amotl
PR: #236
File: docs/ingest/etl/index.md:22-23
Timestamp: 2025-08-09T11:03:33.164Z
Learning: In the CrateDB Guide documentation, MyST Markdown files can use {ref} directives to reference labels defined in reStructuredText files using the RST syntax .. _label:. This cross-format referencing between MyST and RST is supported by Sphinx.


**Applied to files:**
- `docs/integrate/mysql/index.md`
- `docs/integrate/n8n/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-10T17:59:43.468Z</summary>

Learnt from: amotl
PR: #241
File: docs/integrate/grafana/index.md:37-46
Timestamp: 2025-08-10T17:59:43.468Z
Learning: In mixed documentation projects using Sphinx, the :link-type: ref directive in Markdown files can reference labels defined in reStructuredText files using the .. _label-name: syntax, and vice versa.


**Applied to files:**
- `docs/integrate/mysql/index.md`
- `docs/integrate/n8n/index.md`

</details>
<details>
<summary>📚 Learning: 2025-08-06T02:11:46.794Z</summary>

Learnt from: amotl
PR: #222
File: docs/integrate/powerbi/index.md:16-23
Timestamp: 2025-08-06T02:11:46.794Z
Learning: The project: role in MyST Markdown syntax like [](project:#powerbi-desktop) and [](project:#powerbi-service) is valid cross-reference syntax in the CrateDB Guide repository's MyST Markdown setup.


**Applied to files:**
- `docs/integrate/n8n/index.md`

</details>
<details>
<summary>📚 Learning: 2025-06-06T08:46:34.552Z</summary>

Learnt from: amotl
PR: crate/cratedb-guide#0
File: :0-0
Timestamp: 2025-06-06T08:46:34.552Z
Learning: In MyST Markdown, the {rubric} syntax is correct as employed by MyST for rubric directives.


**Applied to files:**
- `docs/integrate/n8n/index.md`

</details>

</details><details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

<details>
<summary>docs/integrate/apache-airflow/index.md</summary>

68-68: Bare URL used

(MD034, no-bare-urls)

---

74-74: Bare URL used

(MD034, no-bare-urls)

---

89-89: Bare URL used

(MD034, no-bare-urls)

---

95-95: Bare URL used

(MD034, no-bare-urls)

---

102-102: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/apache-flink/index.md</summary>

160-160: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and apache superset"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/apache-nifi/index.md</summary>

42-42: Reference links and images should use a label that is defined
Missing link or image reference definition: "astronomer"

(MD052, reference-links-images)

</details>
<details>
<summary>docs/integrate/apache-superset/index.md</summary>

80-80: Bare URL used

(MD034, no-bare-urls)

---

86-86: Bare URL used

(MD034, no-bare-urls)

---

160-160: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and apache superset"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/cluvio/index.md</summary>

34-34: Bare URL used

(MD034, no-bare-urls)

---

49-49: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and cluvio"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/dbeaver/index.md</summary>

64-64: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/debezium/index.md</summary>

30-30: Bare URL used

(MD034, no-bare-urls)

---

36-36: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/django/index.md</summary>

40-40: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/explo/index.md</summary>

32-32: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/gradio/index.md</summary>

32-32: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/mysql/index.md</summary>

44-44: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/n8n/index.md</summary>

23-23: Bare URL used

(MD034, no-bare-urls)

---

35-35: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and n8n"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/node-red/index.md</summary>

62-62: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and power bi"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/prometheus/index.md</summary>

58-58: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/sql-server/index.md</summary>

38-38: Bare URL used

(MD034, no-bare-urls)

---

48-48: Link and image reference definitions should be needed
Unused link or image reference definition: "microsoft sql documentation"

(MD053, link-image-reference-definitions)

</details>
<details>
<summary>docs/integrate/streamlit/index.md</summary>

33-33: Bare URL used

(MD034, no-bare-urls)

</details>
<details>
<summary>docs/integrate/tableau/index.md</summary>

27-27: Bare URL used

(MD034, no-bare-urls)

---

37-37: Bare URL used

(MD034, no-bare-urls)

---

44-44: Bare URL used

(MD034, no-bare-urls)

---

65-65: Link and image reference definitions should be needed
Unused link or image reference definition: "connecting to cratedb from tableau with jdbc"

(MD053, link-image-reference-definitions)

---

67-67: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and tableau"

(MD053, link-image-reference-definitions)

---

68-68: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb tableau connector"

(MD053, link-image-reference-definitions)

</details>

</details>
<details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>docs/integrate/apache-hop/index.md</summary>

[uncategorized] ~13-~13: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... :::  [Apache Hop] aims to be a modern, open source data integration platform that is easy ...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

</details>
<details>
<summary>docs/integrate/datagrip/index.md</summary>

[style] ~74-~74: Using many exclamation marks might seem excessive (in this case: 6 exclamation marks for a text that’s 2659 characters long)
Context: ...5-0a53-41d7-905b-a71cc4a767e9){h=240px} ![DataGrip: query console running SQL](ht...

(EN_EXCESSIVE_EXCLAMATION)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)</summary>

* GitHub Check: Build docs

</details>

<details>
<summary>🔇 Additional comments (9)</summary><blockquote>

<details>
<summary>docs/integrate/mysql/index.md (1)</summary>

`21-27`: **Content restructuring reads well; cross-ref to RST label is correct**

The dropdown usage and the `:link-type: ref` to `mysql-import-csv` correctly target the RST label `.. _mysql-import-csv:`. No changes needed.

</details>
<details>
<summary>docs/integrate/debezium/index.md (2)</summary>

`4-8`: **LGTM on layout changes**

Right-floated logo, clearfix, and About section read cleanly.

---

`27-41`: **Cards-based Learn section looks good**

Card titles, links, and descriptions are clear and consistent with the new pattern.

</details>
<details>
<summary>docs/integrate/django/index.md (1)</summary>

`4-11`: **Good security and accessibility on external badge**

Use of `rel="noopener noreferrer"`, `loading="lazy"`, and descriptive `alt` is spot on.

</details>
<details>
<summary>docs/integrate/marquez/index.md (1)</summary>

`35-39`: **Verified link target: `marquez-learn`**

A `(marquez-learn)=` label is defined in `docs/integrate/marquez/learn.md:1`, so the existing  
```rst
:link: marquez-learn
:link-type: ref

in docs/integrate/marquez/index.md is correct. No changes required.

docs/integrate/datagrip/index.md (1)

58-66: Connection URL guidance is correct for JDBC

The jdbc:crate://<host>:5432/ form aligns with the CrateDB JDBC driver. No user:pass in the URL (JDBC expects separate credentials), which is correct.

docs/integrate/apache-hop/index.md (1)

29-31: Nice: descriptive alts and constrained heights on screenshots

Good accessibility and layout control.

docs/integrate/apache-superset/index.md (1)

7-12: External badge hardened; looks good

Anchor uses rel="noopener noreferrer", image has alt and lazy loading. LGTM.

docs/integrate/apache-airflow/index.md (1)

56-57: Clearfix present; keep after floated block

The clearfix right after the floated content is correct. No changes needed.

@amotl amotl force-pushed the etl-cdc-balancing branch from a43e52e to b8b144e Compare August 10, 2025 21:46
@amotl amotl marked this pull request as ready for review August 10, 2025 22:05
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🔭 Outside diff range comments (1)
docs/integrate/datagrip/index.md (1)

51-63: Clarify JDBC credential usage in DataGrip docs

Append the following note below the jdbc:crate://<host>:5432/ example in docs/integrate/datagrip/index.md (around line 63):

Provide Username/Password via DataGrip’s connection fields.
If you need to include credentials in the URL, pass them as JDBC properties, for example:

jdbc:crate://<host>:5432/?user=<user>&password=<password>  

The user:password@ pattern is not supported by JDBC drivers.

♻️ Duplicate comments (4)
docs/integrate/apache-nifi/index.md (1)

42-44: Suppress markdownlint MD034 for Sphinx :link: parameter

This mirrors earlier feedback on this file; wrap the :link: with MD034 disable/enable comments to quiet the false positive.

 :::{grid-item-card} Tutorial: Connect Apache NiFi and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/connecting-to-cratedb-from-apache-nifi/647
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 How to connect from Apache NiFi to CrateDB and ingest data from NiFi into CrateDB.
docs/integrate/meltano/index.md (1)

28-32: Ephemeral branch in “Examples” link — pin to main/tag/SHA
The link targets a feature branch (amo/meltano) and will 404 when the branch disappears. Prefer main, a release tag, or a specific commit SHA.

Suggested options:

docs/integrate/estuary/index.md (1)

81-95: markdownlint MD034 on 🔗 metadata — locally suppress
Same benign “bare URL” on 🔗. Disable MD034 around the card.

-:::{grid-item-card}
+<!-- markdownlint-disable MD034 -->
+:::{grid-item-card}
 ...
-:::
+:::
+<!-- markdownlint-enable MD034 -->
docs/integrate/apache-airflow/index.md (1)

9-11: Note on hot-linked images (acknowledged decision)

External images are still hot-linked. Per prior discussion, this is acceptable for now; no action requested.

Also applies to: 39-40

🧹 Nitpick comments (23)
docs/integrate/n8n/index.md (1)

22-25: Suppress markdownlint MD034 for Sphinx :link: parameter

The :link: field is intentional MyST/Sphinx syntax and not a bare URL. Suppress MD034 locally to keep lint clean.

 :::{grid-item-card} n8n CrateDB integration
+<!-- markdownlint-disable MD034 -->
 :link: https://n8n.io/integrations/cratedb/
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Create workflows with CrateDB integrations.
 :::
docs/integrate/cluvio/index.md (1)

34-36: Suppress markdownlint MD034 for Sphinx :link: parameter

The :link: value is valid MyST/Sphinx usage; silence the linter for this block.

 :::{grid-item-card} Data Analysis with Cluvio and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/data-analysis-with-cluvio-and-cratedb/1571
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Explore how to leverage the power of Cluvio, a modern data analysis platform
docs/integrate/kestra/index.md (1)

40-42: Suppress markdownlint MD034 for Sphinx :link: parameter

Silence MD034 around the :link: line; this is valid MyST usage.

 :::{grid-item-card} Tutorial: Data pipeline to CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/setting-up-data-pipelines-with-cratedb-and-kestra-io/1400
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 In this tutorial, we will show you how CrateDB integrates with Kestra using the
docs/integrate/apache-kafka/index.md (1)

49-51: Suppress markdownlint MD034 for Sphinx :link: parameters

Both external cards use valid MyST :link: values. Suppress MD034 locally.

 :::{grid-item-card} Tutorial: Connect Debezium, Kafka, and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/replicating-data-to-cratedb-with-debezium-and-kafka/1388
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Replicating data to CrateDB with Debezium and Kafka.
 :::
 :::{grid-item-card} Source: Executable Stack (Java)
+<!-- markdownlint-disable MD034 -->
 :link: https://github.com/crate/cratedb-examples/tree/main/framework/flink/kafka-jdbcsink-java
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 An executable stack with Apache Kafka, Apache Flink, and CrateDB. Uses Java.
 :::

Also applies to: 55-57

docs/integrate/gradio/index.md (1)

41-43: Suppress markdownlint MD034 for Sphinx :link: parameter

Valid MyST syntax; silence MD034 for this card.

 :::{grid-item-card} Example
+<!-- markdownlint-disable MD034 -->
 :link: https://github.com/crate/cratedb-examples/tree/main/framework/gradio
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Example program using Gradio with CrateDB.
docs/integrate/node-red/index.md (2)

23-26: Replace inline style and non-standard width attr; use utility class and lazy loading

Prefer repo-wide .float-right utility over inline style; also switch {w=} to {width=} and add lazy-loading.

-```{div}
-:style: "float: right; margin: 0.5em"
-[![FlowFuse logo](https://github.com/crate/crate-clients-tools/assets/453543/200d1a92-1e38-453a-89bf-d8b727451fab){w=180px}][FlowFuse]
-```
+```{div} .float-right
+[![FlowFuse logo](https://github.com/crate/crate-clients-tools/assets/453543/200d1a92-1e38-453a-89bf-d8b727451fab){width=180px loading=lazy}][FlowFuse]
+```

60-62: Suppress markdownlint MD034 for Sphinx :link: parameters

The :link: lines are valid MyST usage. Silence MD034 around them.

 :::{grid-item-card} Tutorial: Ingest MQTT
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/ingesting-mqtt-messages-into-cratedb-using-node-red/803
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Ingesting MQTT messages into CrateDB using Node-RED.
 :::{grid-item-card} Tutorial: Recurrent queries
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/automating-recurrent-cratedb-queries/788
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Automating recurrent CrateDB queries using Node-RED.

Also applies to: 66-68

docs/integrate/rill/index.md (1)

58-60: Suppress markdownlint MD034 for Sphinx :link: parameter

Silence the MD034 false positive around the external :link:.

 :::{grid-item-card} Rill and CrateDB
+<!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/introducing-rill-and-bi-as-code-with-cratedb-cloud/1718
 :link-type: url
+<!-- markdownlint-enable MD034 -->
 Introducing Rill and BI as Code with CrateDB Cloud.
docs/integrate/meltano/index.md (2)

4-8: Logos: add lazy-loading and use consistent sizing (height)
Use height-based sizing and lazy-loading to match the new convention across the docs and improve LCP.

-```{div} .float-right
-[![Singer logo](https://www.singer.io/img/singer_logo_full_black.svg){w=180px}][Singer]
-
-[![Meltano logo](https://github.com/crate/crate-clients-tools/assets/453543/0c01e995-d7c2-4a4d-8e90-c6697fe2a85d){w=180px}][Meltano]
+```{div} .float-right
+[![Singer logo](https://www.singer.io/img/singer_logo_full_black.svg){height=60px loading=lazy}][Singer]
+
+[![Meltano logo](https://github.com/crate/crate-clients-tools/assets/453543/0c01e995-d7c2-4a4d-8e90-c6697fe2a85d){height=60px loading=lazy}][Meltano]

---

`26-47`: **markdownlint MD034 on :link: metadata — locally suppress**
The “bare URL” warnings on :link: fields are benign; suppress around the grid to keep lints clean.


```diff
-::::{grid}
+<!-- markdownlint-disable MD034 -->
+::::{grid}
 ...
-::::
+::::
+<!-- markdownlint-enable MD034 -->
docs/integrate/estuary/index.md (2)

35-35: Image attributes: prefer height and enable lazy-loading
Unify with the rest of the PR and improve perf.

-![Estuary connectors](https://estuary.dev/static/f6d26b4e4c7ed825e241372f4c3d8804/9b7d3/real-time-graphic.webp){h=200px}
+![Estuary connectors](https://estuary.dev/static/f6d26b4e4c7ed825e241372f4c3d8804/9b7d3/real-time-graphic.webp){height=200px loading=lazy}

42-47: Minor: normalize reference label casing
The inline reference uses [Estuary managed] while the definition is [Estuary Managed]. Align casing to avoid confusion (even if case-insensitive).

-Estuary offers its solution as a [managed product][Estuary managed], available
+Estuary offers its solution as a [managed product][Estuary Managed], available
docs/integrate/grafana/index.md (1)

47-50: Images: add lazy-loading and use height attribute for consistency
Pin images already point to a commit SHA (good). Add lazy-loading and use height consistently.

-![Grafana PostgreSQL data source configuration](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/grafana/grafana-connection.png){h=200px}
-
-![Grafana example panel showing data from CrateDB](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/grafana/grafana-panel1.png){h=200px}
+![Grafana PostgreSQL data source configuration](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/grafana/grafana-connection.png){height=200px loading=lazy}
+
+![Grafana example panel showing data from CrateDB](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/grafana/grafana-panel1.png){height=200px loading=lazy}
docs/integrate/django/index.md (1)

39-43: Add :link-alt and optionally suppress MD034 around card
Improves accessibility; suppresses benign linter noise on 🔗 metadata.

-:::{grid-item-card} CrateDB Django connector
-:link: https://github.com/crate/cratedb-django
+:::{grid-item-card} CrateDB Django connector
+:link: https://github.com/crate/cratedb-django
+:link-alt: "CrateDB Django connector repository"
 :link-type: url
 Connector backend to use CrateDB as a database in Django ORM.
 :::

Optional MD034 suppression:

-::::{grid} 2
+<!-- markdownlint-disable MD034 -->
+::::{grid} 2
 ...
-::::
+::::
+<!-- markdownlint-enable MD034 -->
docs/integrate/streamlit/index.md (1)

32-36: markdownlint MD034 on 🔗 metadata — locally suppress
Silence benign “bare URL” warnings for the grid card.

-:::{grid-item-card} Example
-:link: https://github.com/crate/cratedb-examples/tree/main/framework/streamlit
+<!-- markdownlint-disable MD034 -->
+:::{grid-item-card} Example
+:link: https://github.com/crate/cratedb-examples/tree/main/framework/streamlit
 :link-type: url
 Example program using Streamlit with CrateDB.
 :::
+<!-- markdownlint-enable MD034 -->
docs/integrate/marquez/index.md (1)

7-9: Use a lighter logo asset (SVG) instead of the large social-card JPG
Reduces page weight and improves CLS/LCP while keeping lazy-loading.

-```{div} .float-right
-[![Marquez logo](https://marquezproject.ai/img/marquez-social-card.jpg){height=60px loading=lazy}][Marquez]
+```{div} .float-right
+[![Marquez logo](https://marquezproject.ai/img/logo.svg){height=60px loading=lazy}][Marquez]

</blockquote></details>
<details>
<summary>docs/integrate/apache-superset/index.md (3)</summary><blockquote>

`21-22`: **Images: add lazy-loading and use height attribute**
Align with repo-wide convention and improve performance.


```diff
-![Apache Superset dashboard hero screenshot](https://superset.apache.org/img/hero-screenshot.jpg){h=200px}
-![CrateDB + Superset example dashboard](https://github.com/crate/crate-clients-tools/assets/453543/0f8f7bd8-2e30-4aca-bcf3-61fbc81da855){h=200px}
+![Apache Superset dashboard hero screenshot](https://superset.apache.org/img/hero-screenshot.jpg){height=200px loading=lazy}
+![CrateDB + Superset example dashboard](https://github.com/crate/crate-clients-tools/assets/453543/0f8f7bd8-2e30-4aca-bcf3-61fbc81da855){height=200px loading=lazy}

110-110: Add lazy-loading to YouTube iframes
Helps defer resource loading and speed up first paint.

-<iframe width="240" src="https://www.youtube-nocookie.com/embed/mAIH3hUoxEE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/mAIH3hUoxEE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
-<iframe width="240" src="https://www.youtube-nocookie.com/embed/21KXInqrdeg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/21KXInqrdeg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

Also applies to: 136-136


77-91: markdownlint MD034 on 🔗 metadata — locally suppress
Disable MD034 around the grid with external blog links to avoid benign “bare URL” noise.

-::::{grid}
+<!-- markdownlint-disable MD034 -->
+::::{grid}
 ...
-::::
+::::
+<!-- markdownlint-enable MD034 -->
docs/integrate/datagrip/index.md (2)

9-9: Logo sizing: prefer height and keep lazy-loading
For consistency with other pages, switch to height-based sizing.

-[![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){width=120px loading=lazy}][DataGrip]
+[![DataGrip logo](https://blog.jetbrains.com/wp-content/uploads/2019/01/datagrip_icon.svg){height=60px loading=lazy}][DataGrip]

60-63: Code fence lacks language — add one
Satisfy MD040 and improve rendering.

-```
+j```text
 jdbc:crate://<host>:5432/
-```
+```
docs/integrate/prometheus/index.md (1)

15-16: Grammar tweak: drop the article “a”

Use “as long-term storage” rather than “as a long-term storage”.

-[CrateDB] can be used as a long-term storage for Prometheus metrics.
+[CrateDB] can be used as long-term storage for Prometheus metrics.
docs/integrate/apache-airflow/index.md (1)

30-31: Grammar polish

“Pipeline parameterization uses the powerful Jinja templating engine.”

-Pipeline parameterization is using the powerful Jinja templating engine.
+Pipeline parameterization uses the powerful Jinja templating engine.
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a43e52e and b8b144e.

📒 Files selected for processing (51)
  • docs/_include/links.md (2 hunks)
  • docs/_static/css/custom.css (3 hunks)
  • docs/ingest/cdc/index.md (2 hunks)
  • docs/ingest/etl/index.md (3 hunks)
  • docs/integrate/apache-airflow/index.md (2 hunks)
  • docs/integrate/apache-flink/index.md (2 hunks)
  • docs/integrate/apache-hop/index.md (2 hunks)
  • docs/integrate/apache-iceberg/index.md (1 hunks)
  • docs/integrate/apache-kafka/index.md (2 hunks)
  • docs/integrate/apache-nifi/index.md (1 hunks)
  • docs/integrate/apache-superset/index.md (4 hunks)
  • docs/integrate/aws-dms/index.md (2 hunks)
  • docs/integrate/aws-dynamodb/index.md (1 hunks)
  • docs/integrate/aws-kinesis/index.md (2 hunks)
  • docs/integrate/aws-lambda/index.md (2 hunks)
  • docs/integrate/azure-functions/index.md (2 hunks)
  • docs/integrate/cluvio/index.md (1 hunks)
  • docs/integrate/datagrip/index.md (6 hunks)
  • docs/integrate/dbeaver/index.md (4 hunks)
  • docs/integrate/dbt/index.md (4 hunks)
  • docs/integrate/debezium/index.md (1 hunks)
  • docs/integrate/django/index.md (2 hunks)
  • docs/integrate/estuary/index.md (4 hunks)
  • docs/integrate/explo/index.md (1 hunks)
  • docs/integrate/gradio/index.md (1 hunks)
  • docs/integrate/grafana/index.md (2 hunks)
  • docs/integrate/influxdb/index.md (2 hunks)
  • docs/integrate/kestra/index.md (2 hunks)
  • docs/integrate/langchain/index.md (2 hunks)
  • docs/integrate/llamaindex/index.md (2 hunks)
  • docs/integrate/marquez/data_ingestion.py (1 hunks)
  • docs/integrate/marquez/index.md (2 hunks)
  • docs/integrate/marquez/learn.md (1 hunks)
  • docs/integrate/meltano/index.md (1 hunks)
  • docs/integrate/metabase/index.md (1 hunks)
  • docs/integrate/mongodb/index.md (2 hunks)
  • docs/integrate/mysql/index.md (1 hunks)
  • docs/integrate/n8n/index.md (1 hunks)
  • docs/integrate/node-red/index.md (3 hunks)
  • docs/integrate/plotly/index.md (2 hunks)
  • docs/integrate/powerbi/index.md (2 hunks)
  • docs/integrate/powerbi/service.rst (9 hunks)
  • docs/integrate/prometheus/index.md (2 hunks)
  • docs/integrate/pyviz/index.md (2 hunks)
  • docs/integrate/rill/index.md (2 hunks)
  • docs/integrate/risingwave/index.md (1 hunks)
  • docs/integrate/sql-server/index.md (2 hunks)
  • docs/integrate/streamlit/index.md (1 hunks)
  • docs/integrate/streamsets/index.md (2 hunks)
  • docs/integrate/tableau/index.md (1 hunks)
  • docs/integrate/telegraf/index.md (2 hunks)
✅ Files skipped from review due to trivial changes (2)
  • docs/integrate/langchain/index.md
  • docs/integrate/marquez/learn.md
🚧 Files skipped from review as they are similar to previous changes (31)
  • docs/integrate/apache-iceberg/index.md
  • docs/integrate/azure-functions/index.md
  • docs/integrate/streamsets/index.md
  • docs/ingest/etl/index.md
  • docs/_include/links.md
  • docs/integrate/sql-server/index.md
  • docs/integrate/aws-lambda/index.md
  • docs/integrate/dbeaver/index.md
  • docs/integrate/llamaindex/index.md
  • docs/integrate/influxdb/index.md
  • docs/integrate/explo/index.md
  • docs/integrate/aws-kinesis/index.md
  • docs/integrate/plotly/index.md
  • docs/integrate/powerbi/service.rst
  • docs/integrate/marquez/data_ingestion.py
  • docs/_static/css/custom.css
  • docs/integrate/aws-dynamodb/index.md
  • docs/ingest/cdc/index.md
  • docs/integrate/mysql/index.md
  • docs/integrate/debezium/index.md
  • docs/integrate/apache-hop/index.md
  • docs/integrate/powerbi/index.md
  • docs/integrate/metabase/index.md
  • docs/integrate/mongodb/index.md
  • docs/integrate/dbt/index.md
  • docs/integrate/pyviz/index.md
  • docs/integrate/apache-flink/index.md
  • docs/integrate/aws-dms/index.md
  • docs/integrate/tableau/index.md
  • docs/integrate/risingwave/index.md
  • docs/integrate/telegraf/index.md
🧰 Additional context used
🧠 Learnings (14)
📚 Learning: 2025-08-09T16:19:43.947Z
Learnt from: amotl
PR: crate/cratedb-guide#238
File: docs/integrate/azure-functions/learn.rst:1-1
Timestamp: 2025-08-09T16:19:43.947Z
Learning: In the CrateDB Guide documentation, main integration anchors (e.g., `azure-functions`) are intentionally placed in the `index.md` files of their respective integration folders, while detailed tutorials use the `-learn` suffix (e.g., `azure-functions-learn`) in their `learn.rst` or `learn.md` files. This is a deliberate architectural pattern for the documentation restructuring.

Applied to files:

  • docs/integrate/marquez/index.md
  • docs/integrate/apache-kafka/index.md
  • docs/integrate/estuary/index.md
  • docs/integrate/grafana/index.md
📚 Learning: 2025-08-05T07:14:57.416Z
Learnt from: hammerhead
PR: crate/cratedb-guide#221
File: docs/connect/configure.md:58-66
Timestamp: 2025-08-05T07:14:57.416Z
Learning: In CrateDB connection strings, the user:password@ syntax is valid for HTTP Basic authentication on port 4200, but PostgreSQL JDBC drivers do not support this format and require credentials as query parameters (?user=<user>&password=<password>) instead.

Applied to files:

  • docs/integrate/datagrip/index.md
📚 Learning: 2025-06-05T14:29:15.512Z
Learnt from: amotl
PR: crate/cratedb-guide#207
File: docs/integrate/etl/iceberg-risingwave.md:205-207
Timestamp: 2025-06-05T14:29:15.512Z
Learning: The `records.Database("crate://", echo=True)` connection string for CrateDB works with defaults: localhost as host, "crate" as user, and blank password. This is valid and functional code in the records library.

Applied to files:

  • docs/integrate/datagrip/index.md
📚 Learning: 2025-08-09T11:03:33.164Z
Learnt from: amotl
PR: crate/cratedb-guide#236
File: docs/ingest/etl/index.md:22-23
Timestamp: 2025-08-09T11:03:33.164Z
Learning: In the CrateDB Guide documentation, MyST Markdown files can use `{ref}` directives to reference labels defined in reStructuredText files using the RST syntax `.. _label:`. This cross-format referencing between MyST and RST is supported by Sphinx.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-10T18:17:49.350Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/mysql/index.md:51-55
Timestamp: 2025-08-10T18:17:49.350Z
Learning: In the CrateDB Guide documentation, the file `docs/integrate/mysql/import-csv.rst` contains the reStructuredText label `.. _mysql-import-csv:` which can be referenced from MyST Markdown files using `:link: mysql-import-csv` with `:link-type: ref`. This is another example of cross-format referencing between MyST and RST files working correctly in Sphinx.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-10T17:09:32.583Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/azure-functions/index.md:31-36
Timestamp: 2025-08-10T17:09:32.583Z
Learning: In the CrateDB Guide documentation, RST files (`.rst`) use reStructuredText anchor syntax `.. _anchor-name:` while Markdown files (`.md`) use MyST syntax `(anchor-name)=`. Cross-references between MyST Markdown and reStructuredText files work correctly - a MyST `:link:` directive can reference an RST anchor and vice versa.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-09T21:40:46.125Z
Learnt from: amotl
PR: crate/cratedb-guide#238
File: docs/integrate/streamsets/index.md:18-21
Timestamp: 2025-08-09T21:40:46.125Z
Learning: In the CrateDB Guide documentation, reStructuredText files (`.rst`) use the RST label syntax `.. _label:` while MyST Markdown files (`.md`) use the syntax `(label)=`. Both formats are used throughout the repository and labels can be cross-referenced between them.

Applied to files:

  • docs/integrate/grafana/index.md
  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-10T17:59:43.468Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/grafana/index.md:37-46
Timestamp: 2025-08-10T17:59:43.468Z
Learning: When verifying cross-references in Sphinx-based documentation, search for both Markdown references (e.g., `(reference-name)=`) and reStructuredText labels (e.g., `.. _reference-name:`) across both .md and .rst files, as Sphinx supports cross-referencing between different markup formats.

Applied to files:

  • docs/integrate/grafana/index.md
📚 Learning: 2025-08-09T11:00:03.537Z
Learnt from: amotl
PR: crate/cratedb-guide#236
File: docs/index.md:312-316
Timestamp: 2025-08-09T11:00:03.537Z
Learning: In the CrateDB Guide documentation, locally stale references (such as `(reference-architectures)=`, `(domain)=`, and similar anchor labels) should be retained even when they appear unused within the repository, as external projects might still reference them. This ensures backward compatibility for external documentation and projects.

Applied to files:

  • docs/integrate/grafana/index.md
📚 Learning: 2025-05-18T12:50:38.681Z
Learnt from: amotl
PR: crate/cratedb-guide#204
File: docs/integrate/mcp/community.md:8-20
Timestamp: 2025-05-18T12:50:38.681Z
Learning: In the CrateDB guide repository, references with the `ctk:` prefix (like `ctk:query/mcp/landscape`) are intersphinx references that link to resources in the cratedb-toolkit repository (https://github.com/crate/cratedb-toolkit/tree/main/doc), which are rendered at https://cratedb-toolkit.readthedocs.io/. These are valid cross-references between separate Sphinx documentation sets, not local file references.

Applied to files:

  • docs/integrate/grafana/index.md
📚 Learning: 2025-08-10T20:30:16.483Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/streamsets/index.md:36-40
Timestamp: 2025-08-10T20:30:16.483Z
Learning: In reStructuredText (.rst) files, reference labels are defined using the syntax `.. _label-name:`, while in Markdown (.md) files within Sphinx documentation, labels use the syntax `(label-name)=`. When verifying cross-references in documentation, check the file extension to determine the correct label syntax to search for.

Applied to files:

  • docs/integrate/grafana/index.md
📚 Learning: 2025-08-06T02:11:46.794Z
Learnt from: amotl
PR: crate/cratedb-guide#222
File: docs/integrate/powerbi/index.md:16-23
Timestamp: 2025-08-06T02:11:46.794Z
Learning: The `project:` role in MyST Markdown syntax like `[](project:#powerbi-desktop)` and `[](project:#powerbi-service)` is valid cross-reference syntax in the CrateDB Guide repository's MyST Markdown setup.

Applied to files:

  • docs/integrate/n8n/index.md
📚 Learning: 2025-06-06T08:46:34.552Z
Learnt from: amotl
PR: crate/cratedb-guide#0
File: :0-0
Timestamp: 2025-06-06T08:46:34.552Z
Learning: In MyST Markdown, the `{rubric}` syntax is correct as employed by MyST for rubric directives.

Applied to files:

  • docs/integrate/n8n/index.md
📚 Learning: 2025-08-10T17:59:43.468Z
Learnt from: amotl
PR: crate/cratedb-guide#241
File: docs/integrate/grafana/index.md:37-46
Timestamp: 2025-08-10T17:59:43.468Z
Learning: In mixed documentation projects using Sphinx, the `:link-type: ref` directive in Markdown files can reference labels defined in reStructuredText files using the `.. _label-name:` syntax, and vice versa.

Applied to files:

  • docs/integrate/n8n/index.md
🪛 markdownlint-cli2 (0.17.2)
docs/integrate/apache-airflow/index.md

68-68: Bare URL used

(MD034, no-bare-urls)


74-74: Bare URL used

(MD034, no-bare-urls)


89-89: Bare URL used

(MD034, no-bare-urls)


95-95: Bare URL used

(MD034, no-bare-urls)


102-102: Bare URL used

(MD034, no-bare-urls)

docs/integrate/apache-kafka/index.md

49-49: Bare URL used

(MD034, no-bare-urls)


55-55: Bare URL used

(MD034, no-bare-urls)

docs/integrate/apache-nifi/index.md

42-42: Bare URL used

(MD034, no-bare-urls)


55-55: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and apache nifi"

(MD053, link-image-reference-definitions)

docs/integrate/apache-superset/index.md

80-80: Bare URL used

(MD034, no-bare-urls)


86-86: Bare URL used

(MD034, no-bare-urls)


160-160: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and apache superset"

(MD053, link-image-reference-definitions)

docs/integrate/cluvio/index.md

34-34: Bare URL used

(MD034, no-bare-urls)


49-49: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and cluvio"

(MD053, link-image-reference-definitions)

docs/integrate/datagrip/index.md

36-36: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/integrate/django/index.md

40-40: Bare URL used

(MD034, no-bare-urls)

docs/integrate/estuary/index.md

82-82: Bare URL used

(MD034, no-bare-urls)

docs/integrate/gradio/index.md

41-41: Bare URL used

(MD034, no-bare-urls)

docs/integrate/grafana/index.md

40-40: Bare URL used

(MD034, no-bare-urls)


54-54: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and kestra"

(MD053, link-image-reference-definitions)

docs/integrate/kestra/index.md

28-28: Images should have alternate text (alt text)

(MD045, no-alt-text)


29-29: Images should have alternate text (alt text)

(MD045, no-alt-text)


30-30: Images should have alternate text (alt text)

(MD045, no-alt-text)


40-40: Bare URL used

(MD034, no-bare-urls)

docs/integrate/meltano/index.md

29-29: Bare URL used

(MD034, no-bare-urls)


35-35: Bare URL used

(MD034, no-bare-urls)


41-41: Bare URL used

(MD034, no-bare-urls)

docs/integrate/n8n/index.md

23-23: Bare URL used

(MD034, no-bare-urls)


35-35: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and n8n"

(MD053, link-image-reference-definitions)

docs/integrate/node-red/index.md

60-60: Bare URL used

(MD034, no-bare-urls)


66-66: Bare URL used

(MD034, no-bare-urls)

docs/integrate/prometheus/index.md

62-62: Link and image reference definitions should be needed
Unused link or image reference definition: "cratedb and power bi"

(MD053, link-image-reference-definitions)

docs/integrate/rill/index.md

58-58: Bare URL used

(MD034, no-bare-urls)

docs/integrate/streamlit/index.md

33-33: Bare URL used

(MD034, no-bare-urls)

🪛 LanguageTool
docs/integrate/datagrip/index.md

[style] ~74-~74: Using many exclamation marks might seem excessive (in this case: 6 exclamation marks for a text that’s 2782 characters long)
Context: ...71cc4a767e9){height=240px loading=lazy} ![DataGrip: query console running SQL](ht...

(EN_EXCESSIVE_EXCLAMATION)

🔇 Additional comments (8)
docs/integrate/cluvio/index.md (1)

4-8: Logo block looks good

Consistent float, size, and lazy-loading. Matches patterns elsewhere.

docs/integrate/apache-kafka/index.md (1)

7-8: Good hardening on external badge link

Use of rel="noopener noreferrer" and alt text looks correct.

docs/integrate/gradio/index.md (1)

7-8: Security and accessibility improvements look solid

target="_blank" is paired with rel, and the badge has alt text.

docs/integrate/grafana/index.md (1)

34-44: Cross-ref to RST label is correct
The card uses :link-type: ref to an RST label; this is valid in Sphinx mixed markup projects.

docs/integrate/django/index.md (1)

7-9: Good hardening and a11y on external badge
rel="noopener noreferrer", alt text, and lazy-loading are correctly applied.

docs/integrate/marquez/index.md (1)

35-39: Reference “marquez-learn” is correctly defined
The :link: marquez-learn in docs/integrate/marquez/index.md resolves to a label defined in Markdown.

• docs/integrate/marquez/learn.md:1 defines (marquez-learn)=
• No duplicate or conflicting definitions were found

docs/integrate/apache-superset/index.md (1)

7-12: Top block: solid improvements (logo sizing, badge hardening)
Consistent height sizing, lazy-loading, alt text, and rel="noopener noreferrer" are correctly applied.

docs/integrate/apache-airflow/index.md (1)

68-69: markdownlint MD034 false positives for 🔗 options

The “Bare URL” warnings are against directive options, not Markdown body text. Safe to ignore or suppress for these lines.

If desired, convert to reference-style links to appease the linter:

-:link: https://community.cratedb.com/t/automating-the-import-of-parquet-files-with-apache-airflow/1247
+:link: {parquet_tutorial}

And define at the bottom:

[parquet_tutorial]: https://community.cratedb.com/t/automating-the-import-of-parquet-files-with-apache-airflow/1247

Also applies to: 74-76, 89-91, 95-97, 102-104

Comment on lines 37 to 41
```{div}
:style: "float: right"
[![](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
```

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Replace inline float style with shared CSS class; fix image attrs

Align with the PR’s “no inline styles” direction and add lazy loading. Also prefer width over non-standard w.

-```{div}
-:style: "float: right"
-[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
-```
+```{div} .float-right
+[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){width=180px loading=lazy}](https://www.astronomer.io/)
+```
📝 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.

Suggested change
```{div}
:style: "float: right"
[![](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
[![Astronomer logo](https://logowik.com/content/uploads/images/astronomer2824.jpg){w=180px}](https://www.astronomer.io/)
```
🤖 Prompt for AI Agents
In docs/integrate/apache-airflow/index.md around lines 37 to 41, replace the
inline style attribute :style: "float: right" on the div with a shared CSS class
.float-right to avoid inline styles. Also, update the image attributes by
replacing the non-standard {w=180px} with the standard {width=180px} and add
loading=lazy for better performance. Adjust the markdown accordingly to reflect
these changes.

Comment on lines +28 to +31
![](https://kestra.io/landing/features/declarative1.svg){height=120px loading=lazy}
![](https://kestra.io/landing/features/flowable.svg){height=120px loading=lazy}
![](https://kestra.io/landing/features/monitor.svg){height=120px loading=lazy}
:::
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add descriptive alt text to images for accessibility

Images lack alt text (MD045). Provide concise, meaningful alt text.

-![](https://kestra.io/landing/features/declarative1.svg){height=120px loading=lazy}
-![](https://kestra.io/landing/features/flowable.svg){height=120px loading=lazy}
-![](https://kestra.io/landing/features/monitor.svg){height=120px loading=lazy}
+![Kestra declarative flows illustration](https://kestra.io/landing/features/declarative1.svg){height=120px loading=lazy}
+![Kestra flow orchestration illustration](https://kestra.io/landing/features/flowable.svg){height=120px loading=lazy}
+![Kestra monitoring illustration](https://kestra.io/landing/features/monitor.svg){height=120px loading=lazy}
📝 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.

Suggested change
![](https://kestra.io/landing/features/declarative1.svg){height=120px loading=lazy}
![](https://kestra.io/landing/features/flowable.svg){height=120px loading=lazy}
![](https://kestra.io/landing/features/monitor.svg){height=120px loading=lazy}
:::
![Kestra declarative flows illustration](https://kestra.io/landing/features/declarative1.svg){height=120px loading=lazy}
![Kestra flow orchestration illustration](https://kestra.io/landing/features/flowable.svg){height=120px loading=lazy}
![Kestra monitoring illustration](https://kestra.io/landing/features/monitor.svg){height=120px loading=lazy}
:::
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

28-28: Images should have alternate text (alt text)

(MD045, no-alt-text)


29-29: Images should have alternate text (alt text)

(MD045, no-alt-text)


30-30: Images should have alternate text (alt text)

(MD045, no-alt-text)

🤖 Prompt for AI Agents
In docs/integrate/kestra/index.md around lines 28 to 31, the images lack alt
text which affects accessibility. Add concise and meaningful alt text
descriptions to each image tag to improve accessibility and comply with MD045
markdown linting rules.

Comment on lines +4 to +6
```{div} .float-right
[![Prometheus logo](https://github.com/crate/crate-clients-tools/assets/453543/8ddb109f-b45f-46b0-8103-30ba491f7142){height=60px loading=lazy}][Prometheus]
```
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify CSS class availability and inclusion

The new .float-right usage depends on custom CSS being loaded. Ensure docs/conf.py includes docs/_static/css/custom.css and that .float-right is defined.

Run to verify:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find Sphinx config(s)
fd -a '^conf\.py$' docs | while read -r f; do
  echo "==> $f"
  echo "Checking sphinx_design extension..."
  rg -n "sphinx_design" "$f" || echo "MISSING: sphinx_design in $f"
  echo "Checking custom CSS inclusion..."
  rg -n 'html_css_files\s*=.*custom\.css' "$f" || echo "MISSING: custom.css in $f"
done

# Confirm the CSS class exists
rg -n '^\s*\.float-right\b' docs/_static/css/custom.css || echo "MISSING: .float-right in docs/_static/css/custom.css"

Length of output: 753


Add sphinx_design extension and include custom CSS in docs/conf.py

The .float-right rule is defined in docs/_static/css/custom.css, but your Sphinx config isn’t loading it (and isn’t enabling the {div} directive from sphinx_design). Please update docs/conf.py:

• Under your existing extensions list, add "sphinx_design".
• Ensure html_static_path = ["_static"] is set, then add or extend:

html_css_files = [
    "css/custom.css",
]

Example diff:

--- a/docs/conf.py
+++ b/docs/conf.py
@@ -XX,7 +XX,8 @@ extensions = [
     "sphinx.ext.autodoc",
     "sphinx.ext.viewcode",
-]
+    "sphinx_design",
+]

 html_static_path = ["_static"]
@@ -YY,6 +YY,9 @@ html_theme = "sphinx_rtd_theme"
 # Add any CSS files (relative to the static path) here.
+html_css_files = [
+    "css/custom.css",
+]

This will load your custom stylesheet (with .float-right) and enable the Design directives used in your Markdown.

🤖 Prompt for AI Agents
In docs/conf.py around the initial configuration section, add "sphinx_design" to
the extensions list to enable the {div} directive, ensure html_static_path
includes "_static", and add or extend the html_css_files list to include
"css/custom.css" so that the .float-right CSS rule is properly loaded and
applied in the documentation.

Comment on lines +35 to +36
![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix non-standard image attribute key

MyST/Sphinx recognizes height/width, not h/w shorthand. Use height=200px.

-![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}
+![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){height=200px}
📝 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.

Suggested change
![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}
![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){height=200px}
🤖 Prompt for AI Agents
In docs/integrate/prometheus/index.md around lines 35 to 36, the image uses a
non-standard attribute key 'h=200px' which is not recognized by MyST/Sphinx.
Replace 'h=200px' with the standard attribute 'height=200px' to ensure proper
rendering of the image height.

Comment on lines +77 to +99
::::{info-card}

:::{grid-item}
:columns: 8

{material-outlined}`manage_history;2em` &nbsp; **CrateDB as Prometheus Long-Term Storage**

Learn how to start Prometheus, CrateDB, and the CrateDB Prometheus Adapter with
Docker Compose, and how to configure Prometheus to use CrateDB as remote storage.

This webinar accompanies the "Storing long-term metrics with Prometheus in CrateDB"
tutorial.

[Prometheus with CrateDB: Long-Term Metrics Storage]
:::

:::{grid-item}
:columns: 4

<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/EfIlRXVyfZM?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
:::

::::
Copy link
Member Author

@amotl amotl Aug 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Potential build issue: non-standard directive info-card and grid-item use outside grid.

It is true that info-card is a non-standard directive, see Info Card. However, it actually wraps a grid, so using grid-item members is perfectly fine and intended.

/cc @coderabbitai

Comment on lines +47 to +48
![Rill Dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){h=200px}
![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){h=200px}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Use standard height attribute and enable lazy-loading

Replace non-standard {h=} with {height=} and add loading=lazy for perf.

-![Rill Dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){h=200px}
-![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){h=200px}
+![Rill Dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){height=200px loading=lazy}
+![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){height=200px loading=lazy}
📝 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.

Suggested change
![Rill Dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){h=200px}
![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){h=200px}
![Rill Dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){height=200px loading=lazy}
![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){height=200px loading=lazy}
🤖 Prompt for AI Agents
In docs/integrate/rill/index.md around lines 47 to 48, the image tags use a
non-standard `{h=}` attribute for height and lack lazy-loading. Replace
`{h=200px}` with the standard `{height=200px}` attribute and add `loading=lazy`
to each image tag to improve performance by enabling lazy loading.

@amotl amotl changed the title ETL/CDC: Balancing, Layout / Visual and structural overhaul for all "Integration" docs ETL/CDC: Balancing, Layout / Visual and structural overhaul for individual "Integration" pages Aug 11, 2025
Comment on lines +77 to +99
::::{info-card}

:::{grid-item}
:columns: 8

{material-outlined}`manage_history;2em` &nbsp; **CrateDB as Prometheus Long-Term Storage**

Learn how to start Prometheus, CrateDB, and the CrateDB Prometheus Adapter with
Docker Compose, and how to configure Prometheus to use CrateDB as remote storage.

This webinar accompanies the "Storing long-term metrics with Prometheus in CrateDB"
tutorial.

[Prometheus with CrateDB: Long-Term Metrics Storage]
:::

:::{grid-item}
:columns: 4

<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/EfIlRXVyfZM?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
:::

::::
Copy link
Member Author

@amotl amotl Aug 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Potential build issue: non-standard directive info-card and grid-item use outside grid.

It is true that info-card is a non-standard directive, see Info Card. However, it actually wraps a grid, so using grid-item members is perfectly fine and intended.

/cc @coderabbitai

@amotl amotl force-pushed the etl-cdc-grouping branch from 7264bf9 to 176cc1e Compare August 12, 2025 03:04
Base automatically changed from etl-cdc-grouping to main August 12, 2025 03:07
amotl added 2 commits August 12, 2025 05:37
- Improve layout on each page in `docs/integrate`
- Use cards instead of regular HTML anchors for more prominent guidance
- Custom css file instead of included html
- Naming things
@amotl amotl force-pushed the etl-cdc-balancing branch from b8b144e to 3d38d63 Compare August 12, 2025 03:38
@amotl amotl merged commit ac6ad86 into main Aug 12, 2025
2 of 3 checks passed
@amotl amotl deleted the etl-cdc-balancing branch August 12, 2025 03:43
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 27

🔭 Outside diff range comments (8)
docs/integrate/datagrip/index.md (1)

58-63: Fix JDBC URL port: Crate JDBC uses 4200 (HTTP), not 5432 (PostgreSQL wire).

You’re explicitly configuring the Crate JDBC driver (io.crate.client.jdbc.CrateDriver), which connects over the HTTP interface (default 4200). Port 5432 is for the PostgreSQL wire protocol and would be used with a PostgreSQL driver, not with CrateDriver.

Apply this diff:

-jdbc:crate://<host>:5432/
+jdbc:crate://<host>:4200/

Optional: consider adding a second example showing multiple hosts, e.g. jdbc:crate://node1:4200,node2:4200/.

docs/integrate/estuary/index.md (1)

19-41: Fix invalid image attribute: use “height” instead of “h”

MyST/Sphinx expects “height” (and/or “width”). “h=200px” is not recognized and may be ignored.

Apply this diff:

-![Estuary connectors](https://estuary.dev/static/f6d26b4e4c7ed825e241372f4c3d8804/9b7d3/real-time-graphic.webp){h=200px}
+![Estuary connectors](https://estuary.dev/static/f6d26b4e4c7ed825e241372f4c3d8804/9b7d3/real-time-graphic.webp){height=200px}
docs/integrate/powerbi/desktop.rst (3)

41-45: Update ODBC download link and avoid hardcoding a specific, outdated driver filename

The “downloads section” URL points to versions.old, which is misleading for “latest version.” Also, hardcoding a specific archive version is brittle.

Recommend:

  • Point to the current “versions/msi” path.
  • Generalize the filename guidance.

Apply this diff:

- To install the PostgreSQL ODBC driver on Windows, head to the `downloads
- section`_ for MSI installers and download the latest version corresponding to
- your architecture. For example, if you are using 64-bit Windows, at the time
- of writing the correct installer would be ``psqlodbc_12_02_0000-x64.zip``.
+ To install the PostgreSQL ODBC driver on Windows, head to the `downloads
+ section`_ for MSI installers and download the latest version corresponding to
+ your architecture (e.g., a 64-bit package for 64-bit Power BI Desktop).
-.. _downloads section: https://www.postgresql.org/ftp/odbc/versions.old/msi/
+.. _downloads section: https://www.postgresql.org/ftp/odbc/versions/msi/

Also applies to: 191-191


74-80: Fix COPY statement: missing closing quote and prefer fully qualified table name

There’s a missing closing quote on the FROM URI. Also recommend qualifying the table with schema for clarity.

Apply this diff:

-    COPY population_data
-    FROM 'file:///path/to/population_data_*.json.gz
+    COPY doc.population_data
+    FROM 'file:///path/to/population_data_*.json.gz'
     WITH (compression='gzip')
     RETURN SUMMARY;

123-134: Include “Database” in DSN parameters

PostgreSQL ODBC typically requires a Database value. For CrateDB, “crate” is a sensible default. Including it reduces connection issues.

Apply this diff to add the Database row:

 +---------------+--------------------------------------------+
 | **Parameter** | **Value**                                  |
 +===============+============================================+
 | Data Source   | ``CrateDB``                                |
 +---------------+--------------------------------------------+
 | Server        | The URL or IP of your CrateDB server.      |
 +---------------+--------------------------------------------+
+| Database      | ``crate``                                  |
++---------------+--------------------------------------------+
 | User Name     | The CrateDB user you wish to connect with. |
 +---------------+--------------------------------------------+
 | Port          | ``5432``                                   |
 +---------------+--------------------------------------------+
docs/integrate/aws-kinesis/index.md (1)

1-77: Replace hard-coded ARNs and credentials with placeholders
We scanned the entire docs/ directory for embedded AWS credentials, literal ARNs, and CrateDB URLs with user:pass, and found multiple occurrences. To avoid accidental leaks and keep examples generic, replace all concrete values with placeholders.

• docs/integrate/aws-kinesis/index.md
– Line 50: table=arn:aws:kinesis:eu-central-1:831394476016:stream/testdrive
– Line 51: --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"
• docs/topic/ml/tensorflow.rst
– Lines 71–72: aws_access_key_id=, aws_secret_access_key=<access_key>
• Other integrations with similar issues:
– MySQL (docs/integrate/mysql/index.md)
– MongoDB (docs/integrate/mongodb/learn.md)
– AWS DMS & DynamoDB (docs/integrate/aws-dms/index.md, docs/integrate/aws-dynamodb/index.md)
– InfluxDB, Apache Superset, Connect guides (multiple files under docs/)

Suggested fixes:

  • Replace actual ARN/account ID with arn:aws:kinesis:<REGION>:<ACCOUNT_ID>:stream/<STREAM_NAME> or <KINESIS_STREAM_ARN>.
  • Use ${AWS_ACCESS_KEY_ID} / ${AWS_SECRET_ACCESS_KEY} (or <AWS_ACCESS_KEY_ID>) rather than literal keys.
  • Swap crate://crate:crate@… with crate://<USERNAME>:<PASSWORD>@<CLUSTER_URL>.
  • Run a final automated grep/ripgrep across docs/ to confirm no remaining hard-coded secrets or ARNs.
docs/integrate/dbt/index.md (2)

32-36: Replace hash links with Sphinx/MyST cross-refs

Intra-doc hash links will likely break across pages. Use {ref} so Sphinx validates and updates links during builds.

Apply this diff:

-The idea is that data engineers make source data available to an environment where
-dbt projects run, for example with [Debezium](#debezium) or with [Airflow](#apache-airflow).
-Afterwards, data analysts can run their dbt projects against this data to produce models
-(tables and views) that can be used with a number of [BI tools](#bi-tools).
+The idea is that data engineers make source data available to an environment where
+dbt projects run, for example with {ref}`Debezium <debezium>` or with {ref}`Apache Airflow <apache-airflow>`.
+Afterwards, data analysts can run their dbt projects against this data to produce models
+(tables and views) that can be used with a number of {ref}`BI tools <bi-tools>`.

37-39: Fix invalid MyST image attributes and add alt/lazy

Attribute h= is not recognized by MyST; use height=. Also add alt and loading for a11y and perf.

Apply this diff:

-![](https://www.getdbt.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fwl0ndo6t%2Fmain%2F6e98931b83c4b8bbe45751dced66bc80ea4ec9ac-1999x992.png%3Ffit%3Dmax%26auto%3Dformat&w=640&q=75){h=120px}
-![](https://www.getdbt.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fwl0ndo6t%2Fmain%2Fcd8cba01b3f756a3a7ed194e6e2d6a4072fac194-1220x1200.png%3Ffit%3Dmax%26auto%3Dformat&w=640&q=75){h=120px}
-![](https://www.getdbt.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fwl0ndo6t%2Fmain%2F58b87e47c2aed57fde9ccd49c927c3dff5b57d3c-1466x1130.png%3Ffit%3Dmax%26auto%3Dformat&w=640&q=75){h=120px}
+![](https://www.getdbt.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fwl0ndo6t%2Fmain%2F6e98931b83c4b8bbe45751dced66bc80ea4ec9ac-1999x992.png%3Ffit%3Dmax%26auto%3Dformat&w=640&q=75){height=120px loading=lazy alt="dbt Cloud IDE screenshot"}
+![](https://www.getdbt.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fwl0ndo6t%2Fmain%2Fcd8cba01b3f756a3a7ed194e6e2d6a4072fac194-1220x1200.png%3Ffit%3Dmax%26auto%3Dformat&w=640&q=75){height=120px loading=lazy alt="dbt Cloud Scheduler screenshot"}
+![](https://www.getdbt.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fwl0ndo6t%2Fmain%2F58b87e47c2aed57fde9ccd49c927c3dff5b57d3c-1466x1130.png%3Ffit%3Dmax%26auto%3Dformat&w=640&q=75){height=120px loading=lazy alt="dbt Discovery API screenshot"}
♻️ Duplicate comments (15)
docs/integrate/explo/index.md (1)

22-23: Replace non-standard image attribute and enable lazy-loading

Use the standard height attribute and add lazy-loading for both screenshots. This also aligns with previous review feedback on this file.

-![Explo Explore dashboard](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.17.45.png?width=2948&height=2312&name=Screenshot%202023-07-21%20at%2013.17.45.png){h=200px}
-![Explo Explore query view](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.24.01.png?width=2932&height=1716&name=Screenshot%202023-07-21%20at%2013.24.01.png){h=200px}
+![Explo Explore dashboard](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.17.45.png?width=2948&height=2312&name=Screenshot%202023-07-21%20at%2013.17.45.png){height=200px loading=lazy}
+![Explo Explore query view](https://cratedb.com/hs-fs/hubfs/Screenshot%202023-07-21%20at%2013.24.01.png?width=2932&height=1716&name=Screenshot%202023-07-21%20at%2013.24.01.png){height=200px loading=lazy}
docs/integrate/kestra/index.md (1)

28-31: Add descriptive alt text for accessibility (MD045).

These images lack alt text. Re-raising prior recommendation with concrete copy.

-![](https://kestra.io/landing/features/declarative1.svg){height=120px loading=lazy}
-![](https://kestra.io/landing/features/flowable.svg){height=120px loading=lazy}
-![](https://kestra.io/landing/features/monitor.svg){height=120px loading=lazy}
+![Kestra declarative flows illustration](https://kestra.io/landing/features/declarative1.svg){height=120px loading=lazy}
+![Kestra flow orchestration illustration](https://kestra.io/landing/features/flowable.svg){height=120px loading=lazy}
+![Kestra monitoring illustration](https://kestra.io/landing/features/monitor.svg){height=120px loading=lazy}
docs/integrate/marquez/index.md (1)

7-11: Use a lightweight logo asset and verify CSS class availability

  • Prefer the official small logo over the heavy social-card JPG to reduce page weight. The past suggestion indicated this was already addressed; current code still references the JPG.
  • Confirm .float-right and .clearfix exist in the new custom CSS (or switch to sphinx-design utilities if that’s the convention).

Apply:

```{div} .float-right
-[![Marquez logo](https://marquezproject.ai/img/marquez-social-card.jpg){height=60px loading=lazy}][Marquez]
+[![Marquez logo](https://marquezproject.ai/img/logo.svg){height=60px loading=lazy}][Marquez]
```{div} .clearfix

If `.float-right`/`.clearfix` aren’t defined, consider using sphinx-design patterns (e.g., grid alignment) instead of float-based layout.

</blockquote></details>
<details>
<summary>docs/integrate/estuary/index.md (1)</summary><blockquote>

`81-96`: **Repeat: silence markdownlint MD034 for :link metadata**

Same benign MD034 warning as above on this card. Wrap with disable/enable markers.



```diff
+<!-- markdownlint-disable MD034 -->
 :::{grid-item-card}
 :link: https://estuary.dev/blog/the-complete-introduction-to-change-data-capture-cdc/
 :link-type: url
 :link-alt: "Change Data Capture (CDC): The Complete Guide"
 :padding: 3
 :class-card: sd-text-center sd-pt-4
 :class-header: sd-fs-6
 :class-footer: text-smaller
 CDC: The Complete Guide
 ^^^
 {material-outlined}`integration_instructions;4.5em`
 +++
 Understand what Change Data Capture (CDC) is, how it works, and when to use it.
 Compare top CDC tools like Estuary, Debezium, Fivetran & more.
 :::
+<!-- markdownlint-enable MD034 -->
docs/integrate/gradio/index.md (1)

4-8: Good security/accessibility hardening on external link and badges

Adding rel="noopener noreferrer" and descriptive alt text is correct and addresses the earlier review finding.

docs/integrate/prometheus/index.md (1)

27-36: Use standard MyST image attribute key height (not h)

Non-standard h=200px won’t be recognized by MyST/Sphinx.

Apply:

-![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){h=200px}
+![Prometheus architecture overview](https://github.com/crate/crate-clients-tools/assets/453543/26b47686-889a-4137-a87f-d6a6b38d56d2){height=200px}
docs/integrate/plotly/index.md (3)

19-27: Alt text is too generic and height attribute is non-standard; add descriptive alt text and use height=…

Alt text “plotly-1/plotly-2” doesn’t describe the images. Also, {h=200px} is not a standard HTML attribute; use {height=200px}. Add loading=lazy to defer offscreen images. This was flagged previously and remains applicable.

Apply this diff:

-![plotly-1](https://github.com/crate/crate-clients-tools/assets/453543/380114a8-7984-4966-929b-6e6d52ddd48a){h=200px}
-![plotly-2](https://github.com/crate/crate-clients-tools/assets/453543/f6a99ae7-b730-4587-bd23-499e1be02c92){h=200px}
+![Overview of Plotly chart types](https://github.com/crate/crate-clients-tools/assets/453543/380114a8-7984-4966-929b-6e6d52ddd48a){height=200px loading=lazy}
+![3D surface and heatmap examples](https://github.com/crate/crate-clients-tools/assets/453543/f6a99ae7-b730-4587-bd23-499e1be02c92){height=200px loading=lazy}

37-44: Dash images: improve alt text, standardize height attribute, and add lazy loading

Same issues here: non-descriptive alt text and {h=200px}. Recommend descriptive alt text plus {height=200px loading=lazy}.

-![dash-1](https://github.com/crate/crate-clients-tools/assets/453543/cc538982-e351-437b-97ec-f1fc6ca34948){h=200px}
-![dash-2](https://github.com/crate/crate-clients-tools/assets/453543/24908861-f0ad-43f3-b229-b2bfcc61596d){h=200px}
+![Dash app layout components](https://github.com/crate/crate-clients-tools/assets/453543/cc538982-e351-437b-97ec-f1fc6ca34948){height=200px loading=lazy}
+![Dash callbacks and graphs](https://github.com/crate/crate-clients-tools/assets/453543/24908861-f0ad-43f3-b229-b2bfcc61596d){height=200px loading=lazy}

63-65: Dash Enterprise images: alt text, height attribute, and lazy loading

Make the alt text meaningful and switch to {height=200px} with loading=lazy.

-![dash-enterprise-1](https://github.com/crate/crate-clients-tools/assets/453543/161a9b73-25eb-4ec4-aa3e-5fa73757b440){h=200px}
-![dash-enterprise-2](https://github.com/crate/crate-clients-tools/assets/453543/d199b9c9-8be0-4ff7-a7b5-835dc122cc6d){h=200px}
+![Dash Enterprise workspace overview](https://github.com/crate/crate-clients-tools/assets/453543/161a9b73-25eb-4ec4-aa3e-5fa73757b440){height=200px loading=lazy}
+![Dash Enterprise app deployment view](https://github.com/crate/crate-clients-tools/assets/453543/d199b9c9-8be0-4ff7-a7b5-835dc122cc6d){height=200px loading=lazy}
docs/integrate/apache-nifi/index.md (2)

5-5: Avoid hot-linking the NiFi logo; store locally for reliability and reproducible builds

Host the logo under docs/_static and reference it locally.

Apply:

-[![Apache NiFi logo](https://nifi.apache.org/images/apache-nifi-drop-logo.svg){height=60px loading=lazy}][Apache NiFi]
+[![Apache NiFi logo](/_static/img/integrations/apache-nifi-drop-logo.svg){height=60px loading=lazy}][Apache NiFi]

Follow-up: add the SVG at docs/_static/img/integrations/apache-nifi-drop-logo.svg (and ensure it’s committed). I can help bulk-apply this across integration pages if you want.


41-45: Suppress markdownlint MD034 for Sphinx 🔗 directive

markdownlint flags 🔗 as a bare URL. Wrap with disable/enable comments.

 :::{grid-item-card} Tutorial: Connect Apache NiFi and CrateDB
+: <!-- markdownlint-disable MD034 -->
 :link: https://community.cratedb.com/t/connecting-to-cratedb-from-apache-nifi/647
 :link-type: url
+: <!-- markdownlint-enable MD034 -->
 How to connect from Apache NiFi to CrateDB and ingest data from NiFi into CrateDB.
 :::
docs/integrate/rill/index.md (1)

47-48: Replace non-standard h with height and enable lazy-loading on images

Use the standard height attribute and enable lazy loading for performance. This mirrors earlier feedback on similar images.

-![Rill Dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){h=200px}
-![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){h=200px}
+![Rill Dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b83308971b2f12202ae0fa_b2a470f529fc0f7d9b66de4d75742674.gif){height=200px loading=lazy decoding=async}
+![Rill BI-as-code dashboard](https://cdn.prod.website-files.com/659ddac460dbacbdc813b204/65b835371c75806184829601_BI-as-code%20(1)-p-3200.webp){height=200px loading=lazy decoding=async}
docs/integrate/meltano/index.md (1)

28-31: Replace feature-branch URL with a stable reference (main, tag, or commit SHA)

The “Examples” card links to .../tree/amo/meltano/..., which is an ephemeral branch and risks future 404s.

Preferred fix (if path exists on main):

-:link: https://github.com/crate/cratedb-examples/tree/amo/meltano/framework/singer-meltano
+:link: https://github.com/crate/cratedb-examples/tree/main/framework/singer-meltano

If it does not exist on main, pin to a release tag or a commit SHA for stability.

Run this to verify availability and decide which to use:

#!/bin/bash
URL_BRANCH="https://github.com/crate/cratedb-examples/tree/amo/meltano/framework/singer-meltano"
URL_MAIN="https://github.com/crate/cratedb-examples/tree/main/framework/singer-meltano"

for U in "$URL_BRANCH" "$URL_MAIN"; do
  CODE=$(curl -s -o /dev/null -w "%{http_code}" "$U")
  echo "$CODE  $U"
done

echo "If main is 404, prefer a tag or permalink to a commit SHA instead of a feature branch."
docs/integrate/aws-kinesis/index.md (1)

48-52: Remove embedded AWS credentials and real-looking ARN; use placeholders and default credential chain

This example exposes credentials on the command line and includes a specific account/stream ARN. Replace with placeholders and rely on the AWS default credential chain (env, shared config, IAM role).

Apply this diff:

 ```shell
 uvx 'cratedb-toolkit[io-ingestr]' load table \
-  "kinesis://?aws_access_key_id=${AWS_ACCESS_KEY_ID}&aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}&region_name=eu-central-1&table=arn:aws:kinesis:eu-central-1:831394476016:stream/testdrive" \
+  "kinesis://?region_name=<region>&table=arn:aws:kinesis:<region>:<account_id>:stream/<stream_name>" \
   --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"

+Note:
+- Rely on the AWS default credential chain (env vars, ~/.aws/{config,credentials}, or IAM role).
+- Replace <...> placeholders with your values.


Optionally, consider also replacing the CrateDB demo credentials with placeholders for consistency in docs:

```diff
-  --cluster-url="crate://crate:crate@localhost:4200/testdrive/kinesis_demo"
+  --cluster-url="crate://<user>:<password>@<host>:<port>/<schema>/<table>"
docs/integrate/aws-dynamodb/index.md (1)

8-15: Harden external link: add rel and alt attributes

External link opens a new tab without rel attributes; image lacks alt. Add rel="noopener noreferrer" and a descriptive alt.

Apply this diff:

 ```{div} .float-right .text-right
 [![DynamoDB logo](https://upload.wikimedia.org/wikipedia/commons/f/fd/DynamoDB.png){height=60px loading=lazy}][DynamoDB]
 <br>
-<a href="https://github.com/crate/cratedb-toolkit/actions/workflows/dynamodb.yml" target="_blank">
-    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-toolkit/dynamodb.yml?branch=main&label=CTK%2BDynamoDB" loading="lazy"></a>
+<a href="https://github.com/crate/cratedb-toolkit/actions/workflows/dynamodb.yml" target="_blank" rel="noopener noreferrer">
+    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-toolkit/dynamodb.yml?branch=main&label=CTK%2BDynamoDB"
+         loading="lazy"
+         alt="CI status badge: cratedb-toolkit DynamoDB workflow"></a>

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (64)</summary><blockquote>

<details>
<summary>docs/integrate/explo/index.md (1)</summary><blockquote>

`31-34`: **Silence markdownlint MD034 by wrapping the URL in angle brackets**

markdownlint flags bare URLs; wrapping the :link: value in angle brackets resolves it without changing behavior of the directive.


```diff
-:link: https://cratedb.com/blog/introduction-to-time-series-visualization-in-cratedb-and-explo
+:link: <https://cratedb.com/blog/introduction-to-time-series-visualization-in-cratedb-and-explo>
docs/integrate/kestra/index.md (2)

4-8: Header layout and float utilities look good; consider async decoding for the logo.

Adds a small perf win with negligible risk.

 ```{div} .float-right
-[![Kestra logo](https://kestra.io/logo.svg){height=60px loading=lazy}][Kestra]
+[![Kestra logo](https://kestra.io/logo.svg){height=60px loading=lazy decoding=async}][Kestra]

---

`37-46`: **markdownlint MD034 false-positive on directive URL; optionally suppress.**

The bare URL is inside a Sphinx Design directive field and is expected. If CI flags it, consider a local suppression around the block.



```diff
+<!-- markdownlint-disable MD034 -->
 ::::{grid} 2
 
 :::{grid-item-card} Tutorial: Data pipeline to CrateDB
 :link: https://community.cratedb.com/t/setting-up-data-pipelines-with-cratedb-and-kestra-io/1400
 :link-type: url
 In this tutorial, we will show you how CrateDB integrates with Kestra using the
 PostgreSQL plugin to create an efficient and scalable data pipeline.
 :::
 
 ::::
+<!-- markdownlint-enable MD034 -->

If you prefer not to inline disables, we can adjust markdownlint configuration to ignore Sphinx/MyST directive fields globally.

docs/integrate/sql-server/index.md (1)

48-52: markdownlint MD053 likely a false positive; suppress locally

The reference [Microsoft SQL documentation] is used at Line 6, but markdownlint reports it as unused (MD053). This is likely due to parsing within the MyST div block. Suppress the rule just for this definition.

Apply this diff to silence MD053 for the definition:

+<!-- markdownlint-disable-next-line MD053 -->
 [Microsoft SQL documentation]: https://learn.microsoft.com/en-us/sql/
docs/integrate/marquez/index.md (1)

16-26: Redundant container div around body copy

The plain ::{div} wrapper has no attributes; unless it’s needed for spacing hooks, it can be removed to reduce DOM noise. If spacing is intended, add a semantic class to make the intent explicit.

Example:

-:::{div}
 ...
-:::

Or, if spacing is needed:

-:::{div}
+:::{div} .section-body
 ...
 :::
docs/integrate/tableau/index.md (4)

4-8: Verify CSS utility availability and consider localizing external assets

  • Confirm that .float-right and .clearfix are defined in docs/_static/css/custom.css and that docs/conf.py includes this stylesheet for all builders.
  • The logo hotlinks an external Wikipedia asset. Consider vendoring this image into docs/_static to avoid external dependency and build flakiness.

If you want, I can propose a follow-up patch to add a local asset and update this reference.


43-50: Revisit :columns: 12 on a 2-column grid

Setting :columns: 12 inside a 2-column grid will make this card span the full row, breaking the two-column rhythm. If that’s not intentional, remove the setting (or align it with the grid).

Proposed adjustment:

 :::{grid-item-card} Repository: CrateDB Tableau Connector
 :link: https://github.com/crate/cratedb-tableau-connector
 :link-type: url
-:columns: 12
 The native Tableau connector for CrateDB unlocks advanced SQL functionality
 and resolves compatibility issues beyond standard usage.
 :::

If full-width is desired only on large screens, we can use responsive columns (e.g., :columns: 12 lg:6) — let me know and I’ll draft it.


61-63: Enrich See also with related references already defined below

Surfacing [Tool: Tableau] and [Connector: Issues] here improves discoverability (you already define them below).

Apply this diff:

 ```{seealso}
-[CrateDB and Tableau]
+[CrateDB and Tableau]
+
+[Tool: Tableau]
+[Connector: Issues]

---

`65-69`: **markdownlint false positives due to MyST directives — optionally silence MD034/MD053**

The reported MD034 (bare URLs) and MD053 (unused refs) are side-effects of markdownlint not fully understanding MyST directive fences and option fields. You can safely ignore, or add a scoped suppression.


If you prefer suppression, add this at the very top of the file:

```markdown
<!-- markdownlint-disable MD034 MD053 -->

Alternatively, we can adjust your lint pipeline to use a MyST-aware linter to avoid disabling rules.

docs/integrate/debezium/index.md (1)

29-33: Prefer consistent product naming: “Microsoft SQL Server (SQL Server)”

Elsewhere on this page you use “SQL Server.” Consider aligning the card title/description to “Microsoft SQL Server (SQL Server)” or just “SQL Server” for consistency.

Example tweak:

-:::{grid-item-card} Tutorial: Replicate data from MSSQL
+:::{grid-item-card} Tutorial: Replicate data from SQL Server
@@
-Replicating data from MSSQL to CrateDB with Debezium and Kafka.
+Replicating data from SQL Server to CrateDB with Debezium and Kafka.
docs/integrate/cluvio/index.md (4)

18-22: Fix minor grammar: “time range” and “a few minutes”

Two small wording tweaks improve readability and polish.

- specific timerange or filter dashboards by any individual attribute of your data.
+ specific time range or filter dashboards by any individual attribute of your data.

- your entire company in few minutes.
+ your entire company in a few minutes.

5-5: Avoid hotlinking remote images

Serving images directly from third-party hosts can break previews/offline builds and risks content drift. Prefer vendoring assets into docs/_static and referencing them locally.

I can help convert these to local assets (optimize, copy under docs/_static/, and update references) if desired.

Also applies to: 24-26


33-38: Target URL in card: align with intent and fix linter “bare URL” warning

  • The card links to the community article, while the PR summary/AI summary imply linking to the product integration page. Confirm the intended destination.
  • markdownlint flags MD034 (bare URL) at Line 34. Since 🔗 field values are plain text (not Markdown), consider disabling MD034 around this block.

Option A (switch to the integration page for consistency with See also):

-:link: https://community.cratedb.com/t/data-analysis-with-cluvio-and-cratedb/1571
+:link: https://cratedb.com/integrations/cratedb-and-cluvio

Option B (keep the community article but silence MD034 locally):

+<!-- markdownlint-disable MD034 -->
 ::::{grid} 2
@@
 :::{grid-item-card} Data Analysis with Cluvio and CrateDB
 :link: https://community.cratedb.com/t/data-analysis-with-cluvio-and-cratedb/1571
 :link-type: url
@@
 :::
 
 ::::
+<!-- markdownlint-enable MD034 -->

43-45: Resolve MD053: unused link reference definition

markdownlint flags the reference definition “CrateDB and Cluvio” as unused, likely due to the directive context. Inline the link inside the seealso block and remove the dangling reference to satisfy the linter.

-```{seealso}
-[CrateDB and Cluvio]
-```
+```{seealso}
+[CrateDB and Cluvio](https://cratedb.com/integrations/cratedb-and-cluvio)
+```
@@
-[CrateDB and Cluvio]: https://cratedb.com/integrations/cratedb-and-cluvio

If you prefer reference-style links globally, alternatively disable MD053 around the reference section.

Also applies to: 49-49

docs/integrate/datagrip/index.md (2)

58-63: Add a short note differentiating Crate JDBC vs PostgreSQL JDBC usage.

Prevent confusion by clarifying that:

  • For the Crate JDBC driver: use jdbc:crate://<host>:4200/ and provide credentials via the UI fields or properties.
  • For the PostgreSQL JDBC driver alternative: use jdbc:postgresql://<host>:5432/ and pass credentials as query parameters (?user=<user>&password=<password>), since user:password@ in the URL is not supported by PostgreSQL JDBC.

I can draft a concise {note} block for this section if you want.


32-34: Avoid hotlinking user-attachments; store images in the repo for stability and versioning.

External GitHub user-attachments can break or throttle. Prefer committing assets under docs/_static/... and referencing them relatively to ensure reproducible docs builds and offline previews.

If you want, I can propose a standard path layout and update references accordingly.

Also applies to: 41-41, 55-55, 65-65, 74-75

docs/integrate/telegraf/index.md (4)

5-5: Use unitless width for robust rendering

Attribute lists on images typically expect numeric pixel values; “px” can be ignored by some builders. Prefer width=180 over width=180px.

Apply:

-[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){width=180px loading=lazy}][Telegraf]
+[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){width=180 loading=lazy}][Telegraf]

4-8: Optional: Avoid empty “clearfix” markup; prefer CSS-based clearfix

Empty elements add noise and are brittle. If possible, remove the extra clearfix div and clear floats via CSS (e.g., apply clearfix to the containing section).

Remove the empty block:

 ```{div} .float-right
 [![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){width=180px loading=lazy}][Telegraf]

-{div} .clearfix -


Then, in your CSS, ensure you clear floats on a meaningful container (example):

```css
/* In docs/_static/css/custom.css */
.clearfix::after {
  content: "";
  display: block;
  clear: both;
}

/* Apply .clearfix to the section container instead of inserting empty divs */

If you prefer to keep markup-only changes in MD files, consider using a Sphinx-Design grid instead of floats.


35-35: Vendor external image to avoid hotlinking and broken previews

The architecture diagram is hotlinked from influxdata.com. External assets can break builds, slow pages, and fail in offline/airgapped builds. Prefer copying the image into docs/_static/images/ (or an appropriate assets directory) and referencing it locally.

Follow-up:

  • Add the image to the repo (e.g., docs/_static/images/telegraf-architecture.png)
  • Update the reference to use a relative path
  • Add attribution if licensing requires it

35-35: Use unitless height for image attributes

For consistency with HTML expectations and Sphinx builders, prefer height=200 instead of height=200px.

Apply:

-![Telegraf architecture overview](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png){height=200px loading=lazy}
+![Telegraf architecture overview](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png){height=200 loading=lazy}
docs/integrate/grafana/index.md (1)

43-44: Wording nit: streamline the data source phrasing.

Small phrasing improvement.

Apply:

-Connecting to a CrateDB cluster uses the Grafana PostgreSQL data source adapter.
+Connect to a CrateDB cluster using Grafana’s PostgreSQL data source.
docs/integrate/dbeaver/index.md (4)

7-10: Prefer CSS over inline style; also use standard image attributes

  • Inline style defeats the goal of centralizing styles. Move margin to the CSS class and drop the inline style.
  • MyST/Sphinx consistently support width/height, not shorthand w/h. If your build isn’t configured to accept w, switch to width to avoid silently ignored attributes.

Apply this diff:

```{div} .float-right
-:style: "margin-left: 0.5em"
-[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){w=120px loading=lazy}][DBeaver]
+[![DBeaver logo](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/DBeaver_logo.svg/512px-DBeaver_logo.svg.png){width=120px loading=lazy}][DBeaver]

If margin-left is desired, add it to your custom.css for .float-right and remove the inline style here.

---

`42-42`: **Avoid external GitHub attachment for long-term stability; fix width shorthand**

- GitHub user-attachments URLs can be brittle for long-lived docs. Prefer hosting the asset under docs/_static or your CDN.
- Replace w=480px with width=480px to ensure Sphinx renders the attribute.



```diff
-![DBeaver connection settings screenshot](https://github.com/user-attachments/assets/630fcc7c-21c5-4070-be72-e38041c19d8e){w=480px loading=lazy}
+![DBeaver connection settings screenshot](https://github.com/user-attachments/assets/630fcc7c-21c5-4070-be72-e38041c19d8e){width=480px loading=lazy}

Optionally, replace the image URL with a local static path if/when you move it into the repository.


52-53: Use standard height attribute and consider self-hosting images

  • Switch h=240px to height=240px for consistent MyST/Sphinx rendering.
  • External HubSpot-hosted assets may change or be rate-limited; consider storing copies under docs/_static.
-![DBeaver data tab screenshot 1](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.05.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.05.png){h=240px loading=lazy}
-![DBeaver data tab screenshot 2](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.13.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.13.png){h=240px loading=lazy}
+![DBeaver data tab screenshot 1](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.05.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.05.png){height=240px loading=lazy}
+![DBeaver data tab screenshot 2](https://cratedb.com/hs-fs/hubfs/Screen-Shot-2019-04-05-at-17.15.13.png?width=1600&name=Screen-Shot-2019-04-05-at-17.15.13.png){height=240px loading=lazy}

61-70: Suppress markdownlint MD034 for directive option URL

markdownlint is flagging a bare URL (line 64) within a directive option, which is intended/required by sphinx-design. Suppress MD034 for the next line to keep the linter quiet without altering semantics.

 :::{grid-item-card} Blog: Use CrateDB With DBeaver
-:link: https://cratedb.com/blog/cratedb-dbeaver
+<!-- markdownlint-disable-next-line MD034 -->
+:link: https://cratedb.com/blog/cratedb-dbeaver
 :link-type: url
 DBeaver is a multipurpose database tool for developers and database administrators.
 With the help of the CrateDB JDBC Standalone Driver, you can use DBeaver with CrateDB.
 :::

Alternative: keep as-is and disable MD034 repo-wide for directive option lines if this pattern is pervasive.

docs/integrate/apache-hop/index.md (1)

38-61: Grid cards: align columns across cards and quiet markdownlint MD034 false positives

  • Consistency: Only the first card specifies :columns: 12. Set the same on the other cards (or remove from the first) to avoid uneven layout across breakpoints.
  • Lint: markdownlint flags “bare URLs” on the :link: fields even though they are directive options. Disable MD034 around this block to keep the linter quiet without changing semantics.

Apply this diff:

-::::{grid}
+<!-- markdownlint-disable MD034 -->
+::::{grid}
 :gutter: 2
 
 :::{grid-item-card} Tutorial: Use Apache Hop with CrateDB
 :link: https://community.cratedb.com/t/using-apache-hop-with-cratedb/1754
 :link-type: url
 :columns: 12
 The tutorial explains how to deploy Apache Hop using Docker and connect it to CrateDB.
 :::
 
 :::{grid-item-card} Dialect
 :link: https://hop.apache.org/manual/latest/database/databases/cratedb.html
 :link-type: url
+:columns: 12
 CrateDB dialect for Apache Hop.
 :::
 
 :::{grid-item-card} Performance
 :link: https://hop.apache.org/manual/latest/pipeline/transforms/cratedb-bulkloader.html
 :link-type: url
+:columns: 12
 CrateDB Apache Hop Bulk Loader transform.
 :::
 
 ::::
+<!-- markdownlint-enable MD034 -->
docs/integrate/estuary/index.md (4)

42-47: Wording and reference label consistency

Minor polish: “per three” reads stilted; prefer “via three”. Also align the link reference label casing to the defined footnote.

-Estuary offers its solution as a [managed product][Estuary managed], available
-per [three main deployment options][Estuary Deployment] to cater to various
+Estuary offers its solution as a [managed product][Estuary Managed], available
+via [three main deployment options][Estuary Deployment] to cater to various
 organizational needs and security requirements: Public Deployment,
-Private Deployment, and BYOC options.
+Private Deployment, and BYOC.

56-70: Silence markdownlint MD034 for :link metadata (benign bare URLs)

These :link fields intentionally contain bare URLs and trigger MD034. Add local disable/enable markers around the card.

+<!-- markdownlint-disable MD034 -->
 :::{grid-item-card}
 :link: https://estuary.dev/destination/cratedb/
 :link-type: url
 :link-alt: "CrateDB destination connector for Estuary"
 :padding: 3
 :class-card: sd-text-center sd-pt-4
 :class-header: sd-fs-6
 :class-footer: text-smaller
 CrateDB destination connector for Estuary
 ^^^
 {material-outlined}`link;4.5em`
 +++
 Continuously ingest and deliver both streaming and batch change data from
 100s of sources using Estuary's custom no-code connectors into CrateDB.
 :::
+<!-- markdownlint-enable MD034 -->

If you prefer, we can suppress MD034 globally for metadata URLs. I can open a separate PR to tune markdownlint config.


97-110: Apply MD034 suppression to this card as well

Consistent with the other cards, suppress MD034 around this :link metadata.

+<!-- markdownlint-disable MD034 -->
 :::{grid-item-card}
 :link: https://github.com/crate/cratedb-estuary
 :link-type: url
 :link-alt: "Connector Repository"
 :padding: 3
 :class-card: sd-text-center sd-pt-4
 :class-header: sd-fs-6
 :class-footer: text-smaller
 Connector Repository
 ^^^
 {material-outlined}`source;4.5em`
 +++
 Issue tracker repository.
 :::
+<!-- markdownlint-enable MD034 -->

114-117: Tiny grammar polish

“per” reads odd here; “in” is clearer.

-We are tracking interoperability issues per [Tool: Estuary] and appreciate
+We are tracking interoperability issues in [Tool: Estuary] and appreciate
 any contributions and reports.
docs/integrate/risingwave/index.md (3)

35-70: Consider replacing field-list syntax with headings for clarity and searchability

The “Synopsis” section uses a field list (:RisingWave:, :CrateDB:). Headings (e.g., “### RisingWave”, “### CrateDB”) improve navigability, anchors, and ToC/search relevance. Keeping style consistent across integration pages is ideal.

Example for “RisingWave”:

-:RisingWave:
-  Load an Apache Iceberg table, and serve it as a materialized view.
+### RisingWave
+Load an Apache Iceberg table, and serve it as a materialized view.

(Apply similarly for “CrateDB”.)


71-86: Align Learn card naming with other pages

This card is titled “RisingWave Table Loader”. The Apache Iceberg page uses “Tutorial: Use RisingWave to load Iceberg tables.” Consider unifying to the “Tutorial:” pattern for consistency across Learn grids.

Apply:

-:::{grid-item-card} RisingWave Table Loader
+:::{grid-item-card} Tutorial: Use RisingWave to load Iceberg tables

4-6: Avoid hotlinking third-party logo/assets

Both the logo and overview image hotlink external hosts. Prefer vendoring images under docs/_static/ for reliability, build repeatability (offline builds), and avoiding third-party changes.

I can generate a follow-up patch to add local assets and update paths if desired.

Also applies to: 20-27

docs/integrate/gradio/index.md (4)

4-6: Avoid lazy-loading above-the-fold logo

The page header logo is above the fold; lazy-loading can cause a flash/jank. Prefer eager load here.

Apply this diff:

-[![Gradio logo](https://github.com/raw/gradio-app/gradio/main/readme_files/gradio.svg){height=60px loading=lazy}][Gradio]
+[![Gradio logo](https://github.com/raw/gradio-app/gradio/main/readme_files/gradio.svg){height=60px}][Gradio]

7-8: Add accessible label to the CI badge link

The anchor contains only an image. Adding an aria-label improves accessibility for screen readers.

Apply this diff:

-<a href="https://github.com/crate/cratedb-examples/actions/workflows/framework-gradio.yml" target="_blank" rel="noopener noreferrer">
+<a href="https://github.com/crate/cratedb-examples/actions/workflows/framework-gradio.yml" target="_blank" rel="noopener noreferrer" aria-label="GitHub Actions workflow status for Gradio example">

29-29: Harden and make the video embed responsive

  • frameborder is obsolete; use CSS instead.
  • Add referrerpolicy to reduce cross-origin referrer leakage.
  • Make the iframe responsive to avoid overflow on small screens.

Apply this diff:

-<iframe width="480" height="320" loading="lazy" src="https://www.youtube-nocookie.com/embed/44vi31hehw4?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe loading="lazy" src="https://www.youtube-nocookie.com/embed/44vi31hehw4?si=J0w5yG56Ld4fIXfm" title="YouTube video player" style="width: 100%; aspect-ratio: 3 / 2; height: auto; border: 0;" referrerpolicy="strict-origin-when-cross-origin" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

If you prefer stricter isolation, consider adding sandbox with the minimum necessary allowlist; test carefully as it can break YouTube:

sandbox="allow-scripts allow-same-origin allow-presentation allow-popups"

49-51: Link to Hugging Face Spaces (the hosting product) instead of Wikipedia

Users looking to deploy Gradio demos are better served by the Spaces product page.

Apply this diff:

-[Hugging Face]: https://en.wikipedia.org/wiki/Hugging_Face
+[Hugging Face]: https://huggingface.co/spaces
docs/integrate/prometheus/index.md (2)

40-54: Minor phrasing improvement

“comes into place” reads awkwardly in English; “comes into play” is the standard phrase.

-This is where CrateDB comes into place: The [CrateDB Prometheus
+This is where CrateDB comes into play: The [CrateDB Prometheus
 Adapter] stores collected metrics data into CrateDB and
 takes advantage of its high ingestion and query speed to
 massively scale-out Prometheus.

55-72: Silence markdownlint MD034 for directive option URLs

markdownlint flags the :link: option lines as “bare URLs,” but these are directive options, not Markdown text. Disable MD034 locally around the grid block to avoid false positives.

 :::{rubric} Tutorials
 :::
 
-::::{grid}
+<!-- markdownlint-disable MD034 -->
+::::{grid}
@@
 ::::
+<!-- markdownlint-enable MD034 -->
docs/integrate/streamlit/index.md (2)

17-25: Minor copy edit to fix comma splice and tighten phrasing.

Split the clause and tweak wording for flow.

Apply this diff:

- - No in-depth knowledge of HTML/JS/CSS needed, the framework offers elegant default
-   styling, which can be adjusted when applicable.
+ - No in-depth knowledge of HTML/JS/CSS needed: the framework offers elegant default
+   styling that can be adjusted when applicable.

49-54: Please confirm Sphinx-Design is enabled and the icon sizing renders correctly

I didn’t find an explicit sphinx_design entry in docs/conf.py (it may be pulled in by crate.theme.rtd.conf.cratedb_guide). Before merging:

  • Verify that your Sphinx build includes the sphinx_design extension.
  • Preview the page to ensure {material-outlined} with ;2em actually scales the icon.
  • Replace the raw &nbsp; spacer with a small CSS margin on the icon’s wrapper for consistency.

Example tweak:

-{material-outlined}`manage_history;2em` &nbsp; **Streamlit 101 - A faster way to build and share data applications**
+{material-outlined}`manage_history;2em` **Streamlit 101 – A faster way to build and share data applications**

And in your CSS (e.g. css/custom.css):

.material-outlined {
  margin-inline-end: 0.25em;
}
docs/integrate/plotly/index.md (1)

6-10: Verify CSS utility classes and mobile behavior for floated logo block

Ensure .float-right and .clearfix are defined in the new shared stylesheet and that this float-based layout doesn’t overlap headings or break on narrow viewports. Consider using a grid/flex utility instead for better responsiveness.

docs/integrate/powerbi/desktop.rst (2)

109-111: Use the correct 32-bit naming: “x86” (not “x32”)

Windows commonly labels the 32-bit driver as “x86”.

Apply this diff:

- and hitting *Add*. From the drivers, select *PostgreSQL Unicode(x64)* if you
- are using a 64-bit Windows. Otherwise, select *PostgreSQL Unicode(x32)*.
+ and hitting *Add*. From the drivers, select *PostgreSQL Unicode (x64)* if you
+ are using a 64-bit Windows. Otherwise, select *PostgreSQL Unicode (x86)*.

128-129: Clarify “Server” wording

“URL” can imply http(s) and confuse readers. Prefer “Hostname or IP address”.

Apply this diff:

-| Server        | The URL or IP of your CrateDB server.      |
+| Server        | The hostname or IP address of your CrateDB server. |
docs/integrate/apache-kafka/index.md (2)

39-61: Silence markdownlint MD034 for URLs used inside directive options

markdownlint flags the bare URLs in 🔗 options (lines 49 and 55). Since these are directive options (not inline Markdown), disabling MD034 around the grid is the least invasive fix.

Apply this diff:

-::::{grid}
+<!-- markdownlint-disable MD034 -->
+::::{grid}
@@
-::::
+::::
+<!-- markdownlint-enable MD034 -->

4-11: Avoid hot-linking third-party assets for logos (optional)

For build reliability, privacy, and performance, consider vendoring the Kafka logo into docs/_static and referencing it locally instead of pulling from kafka.apache.org at build time.

If desired, I can prep a patch to add the asset and update the reference.

docs/integrate/apache-nifi/index.md (3)

30-32: Mirror screenshots locally instead of hot-linking GitHub assets

External assets can break previews and CI docs builds. Prefer local copies under docs/_static.

Proposed replacements (after you add the files):

-![NiFi flow canvas screenshot 1](https://github.com/crate/crate-clients-tools/assets/453543/ba6973dd-2eec-4f1f-a436-96aac7eb9892){height=120px loading=lazy}
-![NiFi flow canvas screenshot 2](https://github.com/crate/crate-clients-tools/assets/453543/7fd4d2e7-98bc-44ee-b441-e1835016ab4d){height=120px loading=lazy}
-![NiFi processors screenshot](https://github.com/crate/crate-clients-tools/assets/453543/ccfa4ac7-0d60-432f-b952-2b50789cd325){height=120px loading=lazy}
+![NiFi flow canvas screenshot 1](/_static/img/integrations/nifi-flow-canvas-1.png){height=120px loading=lazy}
+![NiFi flow canvas screenshot 2](/_static/img/integrations/nifi-flow-canvas-2.png){height=120px loading=lazy}
+![NiFi processors screenshot](/_static/img/integrations/nifi-processors.png){height=120px loading=lazy}

Optional: Use SVG if available for sharper rendering at small sizes.


39-39: Grid uses 2 columns but only one card; consider 1 column for balanced layout

Until there’s a second card, a single-column grid avoids an empty column on wide viewports.

-::::{grid} 2
+::::{grid} 1

49-51: Resolve markdownlint MD053 (unused reference definition) by inlining the link

markdownlint sometimes misses reference usage inside directives like seealso. Inline the link and drop the unused definition.

 ```{seealso}
-[CrateDB and Apache NiFi]
+[CrateDB and Apache NiFi](https://cratedb.com/integrations/cratedb-and-apache-nifi)

And remove the now-unused reference:
```diff
-[CrateDB and Apache NiFi]: https://cratedb.com/integrations/cratedb-and-apache-nifi

Also applies to: 55-55

docs/integrate/django/index.md (1)

37-45: Note on markdownlint MD034 false positive

The linter warning about “bare URLs” applies to normal Markdown, but here the URL is an argument to a MyST directive (:link:), which is expected. Consider suppressing MD034 for directive argument lines in your linter config rather than altering this valid pattern.

docs/integrate/metabase/index.md (2)

25-27: Prefer local assets over pinned GitHub raw URLs

Hotlinking images via GitHub commit hashes can be brittle and slower. If those images exist under docs/_assets, consider referencing them relatively to keep assets in the docs build and avoid external fetches.

Example (adjust relative paths as appropriate):

-![Metabase question example](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-question.png){h=140px}
-![Metabase dashboard example](https://github.com/crate/cratedb-guide/raw/a9c8c03384/docs/_assets/img/integrations/metabase/metabase-dashboard.png){h=140px}
+![Metabase question example](../../_assets/img/integrations/metabase/metabase-question.png){h=140px}
+![Metabase dashboard example](../../_assets/img/integrations/metabase/metabase-dashboard.png){h=140px}

55-65: MD034 “bare URL” warnings are not applicable to MyST directive arguments

The :link: values are intended to be URLs here. If markdownlint flags them, consider excluding those lines/patterns in lint config rather than changing working syntax.

docs/integrate/apache-superset/index.md (2)

11-11: Encode spaces in shields.io query parameter

Safer to percent-encode spaces in the label parameter.

-    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-examples/application-apache-superset.yml?branch=main&label=Apache Superset" loading="lazy" alt="CI status: Apache Superset"></a>
+    <img src="https://img.shields.io/github/actions/workflow/status/crate/cratedb-examples/application-apache-superset.yml?branch=main&label=Apache%20Superset" loading="lazy" alt="CI status: Apache Superset"></a>

25-28: Use shared CSS utilities instead of inline float style for consistency

Replace inline :style: "float: right" with .float-right .text-right to align with the new global utilities.

-```{div}
-:style: "float: right"
-[![Preset Cloud](https://github.com/crate/crate-clients-tools/assets/453543/9d07da87-8aff-4569-bf2a-0a16bf89f4bc){height=60px loading=lazy}][Preset Cloud]
-```
+```{div} .float-right .text-right
+[![Preset Cloud](https://github.com/crate/crate-clients-tools/assets/453543/9d07da87-8aff-4569-bf2a-0a16bf89f4bc){height=60px loading=lazy}][Preset Cloud]
+```
 ```{div} .clearfix


Also applies to: 42-44

</blockquote></details>
<details>
<summary>docs/integrate/apache-flink/index.md (1)</summary><blockquote>

`131-160`: **Grid-based Learn section reads well; linter “bare URL” warnings are ignorable here**

URLs as `:link:` values are expected in sphinx-design cards. If markdownlint flags MD034, consider a rule override for directive arguments.

</blockquote></details>
<details>
<summary>docs/integrate/rill/index.md (1)</summary><blockquote>

`4-8`: **Prefer raw.githubusercontent.com for the logo asset; keep lazy-loading**

Direct raw delivery is more reliable and cache-friendly than the github.com/.../raw indirection. Also, add decoding=async for faster rendering.


```diff
 ```{div} .float-right
-[![Rill logo](https://github.com/rilldata/rill/raw/main/docs/static/img/rill-logo-light.svg){height=60px loading=lazy}][Rill]
+[![Rill logo](https://github.com/raw/rilldata/rill/main/docs/static/img/rill-logo-light.svg){height=60px loading=lazy decoding=async}][Rill]

</blockquote></details>
<details>
<summary>docs/integrate/pyviz/index.md (3)</summary><blockquote>

`45-51`: **Make gallery images responsive and consistently lazy-loaded.**

Minor polish to improve perceived performance and layout stability.



```diff
-[![Datashader map aggregation example][ds1]][ds1]
+[![Datashader map aggregation example][ds1]{loading=lazy width=100% height=auto}][ds1]
 
-[![Datashader scatter/heat example][ds2]][ds2]
+[![Datashader scatter/heat example][ds2]{loading=lazy width=100% height=auto}][ds2]

52-53: Place link reference definitions at document bottom to avoid local scoping confusion.

While MyST generally handles reference definitions anywhere, defining them inline inside a grid item hurts maintainability and can be overlooked. Move these to the bottom with the other references.

-[ds1]: https://github.com/crate/crate-clients-tools/assets/453543/7f38dff6-04bc-429e-9d31-6beeb9289c4b
-[ds2]: https://github.com/crate/crate-clients-tools/assets/453543/23561a87-fb4f-4154-9891-1b3068e40579

Add alongside other references at the end of the file:

[ds1]: https://github.com/crate/crate-clients-tools/assets/453543/7f38dff6-04bc-429e-9d31-6beeb9289c4b
[ds2]: https://github.com/crate/crate-clients-tools/assets/453543/23561a87-fb4f-4154-9891-1b3068e40579

82-82: Make the YouTube embed responsive; avoid fixed width.

Hardcoding width=240 will look cramped and not scale on various devices. Prefer a responsive wrapper via your custom CSS (since you moved to a custom stylesheet).

Example HTML you can style globally:

<div class="video-embed ratio-16x9">
  <iframe src="https://www.youtube-nocookie.com/embed/eWpVUPHrCIA?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"></iframe>
</div>

And CSS (in your custom CSS):

.video-embed {
  position: relative; width: 100%; max-width: 560px;
}
.video-embed.ratio-16x9 { padding-top: 56.25%; }
.video-embed > iframe {
  position: absolute; top: 0; left: 0; width: 100%; height: 100%;
}
docs/integrate/meltano/index.md (1)

4-8: Avoid hotlinking external logos; store assets locally for reliability

Hotlinking images from third-party domains can break unexpectedly or slow down docs. Prefer local assets under docs/_static and reference them, or use a stable CDN you control.

If you want, I can add the assets to docs/_static and adjust references in a follow-up PR.

docs/integrate/node-red/index.md (1)

4-8: Optional: Avoid hotlinking external images; prefer local static assets

To improve reliability, performance, and control over caching, consider vendoring the Node-RED logo into docs/_static and referencing it locally instead of hotlinking Wikimedia. This also prevents unexpected third-party changes or outages from affecting our docs.

docs/integrate/aws-dynamodb/index.md (1)

27-31: Nit: Prefer formal tone (avoid contractions) in docs

Minor style consistency: expand “don't” to “do not”.

-[DynamoDB] is a fully managed NoSQL database service provided by Amazon Web Services (AWS).
-It is designed for high-performance, scalable applications and offers key-value and
-document data structures. DynamoDB is serverless, meaning users don't need to manage
-servers or infrastructure.
+[DynamoDB] is a fully managed NoSQL database service provided by Amazon Web Services (AWS).
+It is designed for high-performance, scalable applications and offers key-value and
+document data structures. DynamoDB is serverless, meaning users do not need to manage
+servers or infrastructure.
docs/integrate/dbt/index.md (2)

187-187: Harden and lazy-load the YouTube embed

Add height and loading for perf; drop obsolete frameborder; add referrerpolicy for privacy.

Apply this diff:

-<iframe width="240" src="https://www.youtube-nocookie.com/embed/5rNquRnNb4E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" height="135" src="https://www.youtube-nocookie.com/embed/5rNquRnNb4E" title="YouTube video player" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

8-8: Consider hosting third-party images locally

Hot-linking to getdbt.com/_next/image may break if providers change URLs/CSP. Prefer placing assets under docs/_static and referencing them locally for stability and build reproducibility.

Also applies to: 37-39

Comment on lines +29 to +31
![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px}
![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px}
![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix image sizing attribute: h is likely ignored by MyST; use height and add lazy-loading

MyST/Sphinx expects height=..., not h=.... As-is, the screenshots may not be sized as intended. Also, apply loading=lazy for parity with the logo.

Apply this diff:

-![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px}
-![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px}
-![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px}
+![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){height=120px loading=lazy}
+![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){height=120px loading=lazy}
+![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){height=120px loading=lazy}

Optional: Consider hosting these images under docs/_static/ to avoid external asset drift and improve build reliability on RTD.

📝 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.

Suggested change
![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){h=120px}
![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){h=120px}
![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){h=120px}
![Apache Hop pipeline editor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/da6baf11-8430-4a0f-b2df-55717ce02802){height=120px loading=lazy}
![Apache Hop workflow view screenshot](https://github.com/crate/crate-clients-tools/assets/453543/60cfc82a-db0a-49f1-8e26-a37b774b3614){height=120px loading=lazy}
![Apache Hop execution monitor screenshot](https://github.com/crate/crate-clients-tools/assets/453543/2bd59577-b664-45ae-a71e-36a130d36739){height=120px loading=lazy}
🤖 Prompt for AI Agents
In docs/integrate/apache-hop/index.md around lines 29 to 31, the image
attributes use `h=...` which MyST/Sphinx ignores; change `h=120px` to
`height=120px` and add `loading="lazy"` to each image tag to enable
lazy-loading; optionally move the image files into docs/_static/ and update the
paths to use the local _static location to avoid external asset drift.

Comment on lines +4 to +8
```{div} .float-right
[![Apache NiFi logo](https://nifi.apache.org/images/apache-nifi-drop-logo.svg){height=60px loading=lazy}][Apache NiFi]
```
```{div} .clearfix
```
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify custom CSS (.float-right/.clearfix) is loaded to avoid layout regressions

These classes rely on docs/_static/css/custom.css being included via conf.py. Please verify to prevent broken floats/clears in HTML output.

Run this to confirm the CSS is included and classes exist:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Check conf.py includes custom.css"
rg -n 'html_css_files\\s*=\\s*\\[.*custom\\.css' -A2 docs/conf.py || { echo "custom.css not referenced in conf.py"; exit 1; }

echo "Check css defines required classes"
if fd custom.css docs/_static | grep -q .; then
  fd custom.css docs/_static --exec rg -n '(^|\\.)float-right\\b|(^|\\.)clearfix\\b' {} || { echo "float-right/clearfix not defined in custom.css"; exit 1; }
else
  echo "custom.css not found under docs/_static"
  exit 1
fi

echo "OK: CSS reference and classes found"

Length of output: 383


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Step 1: Show html_css_files entries in docs/conf.py"
rg -n "html_css_files" docs/conf.py || echo "No html_css_files setting found in docs/conf.py"

echo
echo "Step 2: Check for custom.css reference in html_css_files"
rg -n "custom\.css" docs/conf.py || echo "custom.css not referenced in docs/conf.py"

echo
echo "Step 3: Locate custom.css under docs/_static"
fd custom.css docs/_static || { echo "custom.css not found under docs/_static"; exit 1; }

echo
echo "Step 4: Verify .float-right and .clearfix definitions in custom.css"
rg -nE '(^|\s)\.(float-right|clearfix)\b' docs/_static/css/custom.css \
  || echo "float-right/clearfix not defined in custom.css"

Length of output: 1012


#!/bin/bash
set -euo pipefail

echo "Searching for .float-right definition in custom.css"
rg -n '\.float-right' docs/_static/css/custom.css || echo ".float-right not defined in custom.css"

echo
echo "Searching for .clearfix definition in custom.css"
rg -n '\.clearfix' docs/_static/css/custom.css || echo ".clearfix not defined in custom.css"

Add missing .float-right and .clearfix definitions to your custom stylesheet

The Sphinx build is correctly loading css/custom.css (see docs/conf.py:101–102) and the file exists at docs/_static/css/custom.css, but neither of the classes used in your markup is defined in it. Without these rules in place, the float/clear wrappers in your docs will break.

Please update docs/_static/css/custom.css, for example:

/* docs/_static/css/custom.css */

.float-right {
  float: right;
  margin-left: 1em;
}

.clearfix::after {
  content: "";
  display: table;
  clear: both;
}

• File needing update: docs/_static/css/custom.css
• Purpose: Ensure .float-right and .clearfix are defined to avoid layout regressions in the generated HTML.

🤖 Prompt for AI Agents
In docs/_static/css/custom.css (referenced by
docs/integrate/apache-nifi/index.md lines 4–8), the classes .float-right and
.clearfix used in the MD markup are not defined, causing layout breakage; add
CSS rules to define .float-right (float:right and a left margin) and .clearfix
(using a ::after pseudo-element with content:"", display:table, clear:both) so
the float and clearing wrappers render correctly in the generated HTML.

Comment on lines +51 to +55
```shell
uvx 'cratedb-toolkit[kinesis]' load table \
"kinesis+dynamodb+cdc://${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}@aws/cdc-stream?region=eu-central-1" \
--cluster-url="crate://crate:crate@localhost:4200/testdrive/demo"
```
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove embedded AWS credentials from command; use placeholders and default credential chain

Avoid placing secrets in URLs. Replace with placeholders and rely on AWS default credential resolution.

Apply this diff:

 ```shell
 uvx 'cratedb-toolkit[kinesis]' load table \
-  "kinesis+dynamodb+cdc://${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}@aws/cdc-stream?region=eu-central-1" \
+  "kinesis+dynamodb+cdc://aws/cdc-stream?region=<region>" \
   --cluster-url="crate://crate:crate@localhost:4200/testdrive/demo"

+Note:
+- Use the AWS default credential chain (env vars, ~/.aws/{config,credentials}, or IAM role).
+- Replace and other placeholders with your values.


Optionally generalize demo DB credentials:

```diff
-  --cluster-url="crate://crate:crate@localhost:4200/testdrive/demo"
+  --cluster-url="crate://<user>:<password>@<host>:<port>/<schema>/<table>"

Comment on lines +57 to +63
::::{grid}

:::{grid-item-card} Ingestr Table Loader
:link: https://cratedb-toolkit.readthedocs.io/io/ingestr/#amazon-kinesis-to-cratedb
:link-type: url
Relay Kinesis stream into CrateDB.
:::
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Fix markdownlint MD034: avoid bare URL in directive option

markdownlint flags the bare URL in the card’s 🔗 option. Prefer an intersphinx ref if available; otherwise, silence MD034 locally.

Preferred fix (if intersphinx mapping “ctk” resolves this target):

-:{grid-item-card} Ingestr Table Loader
-:link: https://cratedb-toolkit.readthedocs.io/io/ingestr/#amazon-kinesis-to-cratedb
-:link-type: url
+:{grid-item-card} Ingestr Table Loader
+:link: ctk:io/ingestr#amazon-kinesis-to-cratedb
+:link-type: ref

Fallback: keep the URL but suppress the lint just above the directive:

+<!-- markdownlint-disable-next-line MD034 -->
 :{grid-item-card} Ingestr Table Loader
 :link: https://cratedb-toolkit.readthedocs.io/io/ingestr/#amazon-kinesis-to-cratedb
 :link-type: url

To verify other bare URLs in cards after this PR:


🏁 Script executed:

#!/bin/bash
# Find grid-item-card :link: fields that contain bare http(s) URLs
rg -nA2 $'^:::\\{grid-item-card\\}' -g 'docs/**/*.md' | rg -n '^[[:space:]]*:link:[[:space:]]+https?://'

Length of output: 103


I’ll check whether an intersphinx alias like ctk is defined in the Sphinx config before finalizing the recommendation.


🏁 Script executed:

#!/bin/bash
# 1. Locate any intersphinx_mapping definitions in docs conf files
rg -n "intersphinx_mapping" -g "docs/**/conf*.py"

# 2. Search for a 'ctk' alias anywhere in the docs directory
rg -n "ctk" -g "docs"

Length of output: 469


I’ll inspect the intersphinx_mapping in docs/conf.py to see if there’s an alias we can use (e.g. ctk).


🏁 Script executed:

#!/bin/bash
# Show the mapping update block
rg -n "intersphinx_mapping.update" -g docs/conf.py -A8 -B4

# List all mapping keys defined in the file
grep -Po "['\"]\w+['\"](?=\s*:)" docs/conf.py | sort -u

Length of output: 877


Use intersphinx ref for the CrateDB Toolkit link

We’ve confirmed that the ctk alias is defined in docs/conf.py (mapping to https://cratedb-toolkit.readthedocs.io/), so we can replace the bare URL with an intersphinx reference.

File: docs/integrate/aws-kinesis/index.md (lines 57–63)

 ::: {grid-item-card} Ingestr Table Loader
-:link: https://cratedb-toolkit.readthedocs.io/io/ingestr/#amazon-kinesis-to-cratedb
-:link-type: url
+:link: ctk:io/ingestr#amazon-kinesis-to-cratedb
+:link-type: ref
 Relay Kinesis stream into CrateDB.
 :::

No other bare HTTP URLs were found in grid-item-card directives.

📝 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.

Suggested change
::::{grid}
:::{grid-item-card} Ingestr Table Loader
:link: https://cratedb-toolkit.readthedocs.io/io/ingestr/#amazon-kinesis-to-cratedb
:link-type: url
Relay Kinesis stream into CrateDB.
:::
::::{grid}
:::{grid-item-card} Ingestr Table Loader
:link: ctk:io/ingestr#amazon-kinesis-to-cratedb
:link-type: ref
Relay Kinesis stream into CrateDB.
:::
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

60-60: Bare URL used

(MD034, no-bare-urls)

🤖 Prompt for AI Agents
In docs/integrate/aws-kinesis/index.md around lines 57 to 63, replace the bare
HTTP URL used in the grid-item-card :link: with an intersphinx reference using
the existing ctk alias; update the :link: value to point to the CrateDB Toolkit
target via the ctk intersphinx role (e.g. the equivalent ctk reference to
io/ingestr/#amazon-kinesis-to-cratedb) so the card uses the intersphinx-mapped
link instead of the hardcoded URL.

Comment on lines +24 to +26
![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){h=200px loading=lazy}
![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){h=200px loading=lazy}
::::
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Image attribute typo: use height=... instead of h=...

MyST/Sphinx expects height (and/or width) as image attributes; h won’t be recognized.

-![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){h=200px loading=lazy}
-![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){h=200px loading=lazy}
+![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){height=200px loading=lazy}
+![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){height=200px loading=lazy}
📝 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.

Suggested change
![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){h=200px loading=lazy}
![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){h=200px loading=lazy}
::::
![Cluvio dashboard with custom filters](https://github.com/crate/crate-clients-tools/assets/453543/49ca6a35-239e-4915-951c-db6649fd35a4){height=200px loading=lazy}
![Cluvio report creator screen](https://github.com/crate/crate-clients-tools/assets/453543/844a5ffd-0b92-4c77-8cdd-0b5cc5b392b1){height=200px loading=lazy}
::::
🤖 Prompt for AI Agents
In docs/integrate/cluvio/index.md around lines 24 to 26, the image attribute
uses the invalid short form `h=...`; replace `h=200px` with `height=200px`
(and/or add `width=...` if desired) for each image tag so MyST/Sphinx recognizes
the attribute; keep other attributes like `loading=lazy` unchanged.

Comment on lines +35 to 46
::::{grid} 2

:::{grid-item-card} SSIS and CrateDB
:link: https://github.com/crate/cratedb-examples/tree/main/application/microsoft-ssis
:link-type: url
Using SQL Server Integration Services with CrateDB.
+++
A demo project which uses SSIS and ODBC to read and write data from CrateDB.
:::

- [Using SQL Server Integration Services with CrateDB]
::::

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

❓ Verification inconclusive

Ensure sphinx-design is enabled; silence markdownlint MD034 around 🔗

The grid/card syntax is from sphinx-design. Ensure the extension is enabled; otherwise this won’t render. Also, markdownlint flags a “bare URL” (MD034) for the 🔗 field; that’s a false positive in this directive context. Prefer suppressing the rule locally.

Apply this diff to suppress MD034 for this block:

-::::{grid} 2
+<!-- markdownlint-disable MD034 -->
+::::{grid} 2
@@
-::::
+::::
+<!-- markdownlint-enable MD034 -->

Verify sphinx-design is enabled and available:


🏁 Script executed:

#!/bin/bash
# Check that sphinx_design is enabled
rg -n "sphinx_design" docs/conf.py

# Optional: ensure the package is present in dependency files
fd -a requirements | xargs -I{} rg -n "sphinx-design" {}
fd -a requirements.txt pyproject.toml | xargs -I{} rg -n "sphinx-design" {}

Length of output: 277


Enable sphinx-design and suppress markdownlint MD034 around the grid/card directive

Please make the following updates:

• docs/conf.py
– Add "sphinx_design" to the extensions list so the grid/card syntax renders correctly.
• requirements*.txt or pyproject.toml
– Ensure the sphinx-design package is listed in your documentation dependencies.
• docs/integrate/sql-server/index.md
– Wrap the grid/card block with markdownlint disable/enable comments to silence MD034 around the :link: fields.

Suggested diffs:

--- a/docs/conf.py
+++ b/docs/conf.py
@@ -XX,6 +XX,7 @@
 extensions = [
     "sphinx.ext.autodoc",
     "sphinx.ext.napoleon",
+    "sphinx_design",
 ]
--- a/requirements.txt
+++ b/requirements.txt
@@
 sphinx
+ sphinx-design

or add sphinx-design = "^1.0" (or latest) under [tool.poetry.dependencies] in pyproject.toml.

--- a/docs/integrate/sql-server/index.md
+++ b/docs/integrate/sql-server/index.md
@@ -35,7 +35,9 @@
-::::{grid} 2
+<!-- markdownlint-disable MD034 -->
+::::{grid} 2

 :::{grid-item-card} SSIS and CrateDB
 :link: https://github.com/crate/cratedb-examples/tree/main/application/microsoft-ssis
@@ -46,7 +48,9 @@
 ::::
+<!-- markdownlint-enable MD034 -->
📝 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.

Suggested change
::::{grid} 2
:::{grid-item-card} SSIS and CrateDB
:link: https://github.com/crate/cratedb-examples/tree/main/application/microsoft-ssis
:link-type: url
Using SQL Server Integration Services with CrateDB.
+++
A demo project which uses SSIS and ODBC to read and write data from CrateDB.
:::
- [Using SQL Server Integration Services with CrateDB]
::::
# docs/conf.py
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.napoleon",
+ "sphinx_design",
]
Suggested change
::::{grid} 2
:::{grid-item-card} SSIS and CrateDB
:link: https://github.com/crate/cratedb-examples/tree/main/application/microsoft-ssis
:link-type: url
Using SQL Server Integration Services with CrateDB.
+++
A demo project which uses SSIS and ODBC to read and write data from CrateDB.
:::
- [Using SQL Server Integration Services with CrateDB]
::::
# requirements.txt
sphinx
+ sphinx-design
Suggested change
::::{grid} 2
:::{grid-item-card} SSIS and CrateDB
:link: https://github.com/crate/cratedb-examples/tree/main/application/microsoft-ssis
:link-type: url
Using SQL Server Integration Services with CrateDB.
+++
A demo project which uses SSIS and ODBC to read and write data from CrateDB.
:::
- [Using SQL Server Integration Services with CrateDB]
::::
<!-- docs/integrate/sql-server/index.md -->
<!-- markdownlint-disable MD034 -->
::::{grid} 2
:::{grid-item-card} SSIS and CrateDB
:link: https://github.com/crate/cratedb-examples/tree/main/application/microsoft-ssis
:link-type: url
Using SQL Server Integration Services with CrateDB.
+++
A demo project which uses SSIS and ODBC to read and write data from CrateDB.
:::
::::
<!-- markdownlint-enable MD034 -->
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

38-38: Bare URL used

(MD034, no-bare-urls)

🤖 Prompt for AI Agents
In docs/integrate/sql-server/index.md around lines 35–46, wrap the grid/card
block with markdownlint disable/enable comments to silence MD034 (e.g. add
markdownlint-disable MD034 before the ::: grid block and markdownlint-enable
MD034 after it); in docs/conf.py add "sphinx_design" to the Sphinx extensions
list so the grid/card directive renders; and add the sphinx-design package to
documentation dependencies (either in requirements*.txt or pyproject.toml under
[tool.poetry.dependencies] with an appropriate version like ^1.0).

Comment on lines +44 to +62
::::{info-card}

:::{grid-item}
:columns: 8

{material-outlined}`manage_history;2em` &nbsp; **Streamlit 101 - A faster way to build and share data applications**

Learn how to get started with Streamlit in building your own interactive data
apps in no time. Streamlit is an open-source Python framework for data scientists
and AI/ML engineers to deliver dynamic data apps – in only a few lines of code.
:::

:::{grid-item}
:columns: 4

<iframe width="480" height="320" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
:::

_Streamlit 101 - A faster way to build and share data applications._
::::
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Invalid directive and structural issue: grid-item used outside a grid container.

::::{info-card} is not a standard sphinx/myst or sphinx-design directive. Also, grid-item directives must be nested inside a grid container. This will cause build warnings/errors and break layout.

Use a grid container. If you want an “info” look, wrap the grid in a div with an appropriate class and style via CSS. Minimal fix:

-::::{info-card}
+::::{grid}
@@
-::::
+::::

Optional enhancement (wrapper + grid):

-::::{info-card}
+:::{div} .info-card
+::::
@@
-::::
+::::
+:::

Pick one approach; don’t use both.

📝 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.

Suggested change
::::{info-card}
:::{grid-item}
:columns: 8
{material-outlined}`manage_history;2em` &nbsp; **Streamlit 101 - A faster way to build and share data applications**
Learn how to get started with Streamlit in building your own interactive data
apps in no time. Streamlit is an open-source Python framework for data scientists
and AI/ML engineers to deliver dynamic data apps – in only a few lines of code.
:::
:::{grid-item}
:columns: 4
<iframe width="480" height="320" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
:::
_Streamlit 101 - A faster way to build and share data applications._
::::
::::{grid}
:::{grid-item}
:columns: 8
{material-outlined}`manage_history;2em` **Streamlit 101 - A faster way to build and share data applications**
Learn how to get started with Streamlit in building your own interactive data
apps in no time. Streamlit is an open-source Python framework for data scientists
and AI/ML engineers to deliver dynamic data apps – in only a few lines of code.
:::
:::{grid-item}
:columns: 4
<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
:::
::::
🤖 Prompt for AI Agents
docs/integrate/streamlit/index.md lines 44-62: The fragment uses a nonstandard
'::::{info-card}' wrapper and places 'grid-item' directives outside a proper
'grid' container which will break the build; fix by removing the invalid
'info-card' directive and either (A) wrap the two grid-item blocks inside a
proper grid container (i.e., open a single grid block and nest both grid-item
directives directly inside it) or (B) if you want an informational visual, wrap
a proper grid inside a simple div/admonition with an "info" or "info-card" class
(create the div/admonition first, then include a valid grid block with the
grid-item children), ensuring only one approach is used and that every grid-item
is directly nested in its grid container.

Comment on lines +59 to +60
<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
:::
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Iframe embed: add height (or aspect-ratio) and tighten privacy defaults.

No height produces a 150px default in browsers and may distort the player. Also add a strict referrer policy.

Apply this diff (keeps your smaller footprint):

-<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+<iframe width="240" height="135" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="Streamlit 101 – video" frameborder="0" referrerpolicy="strict-origin-when-cross-origin" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

Alternatively, for responsive layout, wrap with a CSS class using aspect-ratio: 16/9 and set width: 100%; height: auto; in CSS (iframes won’t honor height: auto without a container trick).

📝 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.

Suggested change
<iframe width="240" loading="lazy" src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
:::
<iframe
width="240"
height="135"
loading="lazy"
src="https://www.youtube-nocookie.com/embed/UI4f4iiVT6c?si=J0w5yG56Ld4fIXfm"
title="Streamlit 101 – video"
frameborder="0"
referrerpolicy="strict-origin-when-cross-origin"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
:::
🤖 Prompt for AI Agents
In docs/integrate/streamlit/index.md around lines 59-60, the iframe lacks a
height (causing a 150px browser default) and misses stricter privacy defaults;
add either an explicit height or use an enclosing responsive class that applies
aspect-ratio: 16/9 and width: 100%/a fixed width, and add a strict referrer
policy (e.g., referrerpolicy="no-referrer") to the iframe; update the markup to
include the height/aspect-ratio via inline style or CSS class and add
referrerpolicy="no-referrer" (and optionally tighten sandbox/allow attributes if
needed for playback) so the player renders correctly and leaks no extra referrer
data.

data by translating drag-and-drop actions into data queries through an intuitive interface.

![](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}
![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix non-standard image attribute; add lazy-loading

The attribute h=200px is not a standard MyST/HTML attribute and likely won’t be applied. Use height and consider loading=lazy for consistency/perf.

Apply this diff:

-![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}
+![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){height=200px loading=lazy}
📝 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.

Suggested change
![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){h=200px}
![Tableau dashboard example](https://cratedb.com/hs-fs/hubfs/08-index.png?width=1536&name=08-index.png){height=200px loading=lazy}
🤖 Prompt for AI Agents
In docs/integrate/tableau/index.md around line 17, replace the non-standard
attribute h=200px with a proper height attribute and add lazy-loading; change
the image attribute block to use height=200px and loading=lazy (e.g.
![...](...){height=200px loading=lazy}) so the height is applied correctly and
the image loads lazily for better performance.

Comment on lines +4 to +8
```{div} .float-right
[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){width=180px loading=lazy}][Telegraf]
```
```{div} .clearfix
```
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Confirm Sphinx-Design and CSS utilities are wired up

These blocks rely on the MyST {div} directive and custom classes (.float-right, .clearfix). Please verify:

  • sphinx_design is enabled in docs/conf.py
  • docs/_static/css/custom.css is loaded and defines those classes

Run:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Check Sphinx extension:"
rg -n "sphinx_design" docs/conf.py || { echo "Missing sphinx_design in docs/conf.py"; exit 1; }

echo "Check custom CSS inclusion:"
rg -n "html_css_files\\s*=\\s*\\[" -n docs/conf.py -A 5 | sed -n 'p'
rg -n "custom\\.css" docs/conf.py || { echo "custom.css not referenced in conf.py"; exit 1; }

echo "Check CSS utility classes exist:"
fd -a custom.css docs/_static | while read -r css; do
  echo "Scanning $css"
  rg -n "\\.float-right|\\.clearfix" "$css" || { echo "Expected .float-right/.clearfix not found in $css"; exit 1; }
done

echo "OK: sphinx_design enabled and CSS utilities present."

Length of output: 205


Enable sphinx_design and verify CSS utilities

The documentation build currently fails to register MyST’s {div} directive because sphinx_design isn’t enabled. Please:

  • In docs/conf.py, add "sphinx_design" to the extensions list:

     extensions = [
    +  "sphinx_design",
       # …other extensions
     ]
  • Confirm html_css_files includes your custom CSS (e.g. "css/custom.css").

  • Verify that docs/_static/css/custom.css defines both .float-right and .clearfix.

Once these changes are in place, rebuild and confirm the floating div and clearfix utilities render as expected.

📝 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.

Suggested change
```{div} .float-right
[![Telegraf logo](https://github.com/crate/crate-clients-tools/assets/453543/3f0b4525-5344-42fe-bae6-1b0970fa0540){width=180px loading=lazy}][Telegraf]
```
```{div} .clearfix
```
extensions = [
"sphinx_design",
# …other extensions
]
🤖 Prompt for AI Agents
In docs/integrate/telegraf/index.md around lines 4–8: the MyST `{div}` directive
used for layout requires the sphinx_design extension and CSS utilities to be
available; edit docs/conf.py to add "sphinx_design" to the extensions list,
ensure html_css_files includes "css/custom.css" (or the correct path under
_static), and make sure docs/_static/css/custom.css defines the .float-right and
.clearfix classes; after making these changes rebuild the docs to confirm the
floating div and clearfix utilities render correctly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cross linking Linking to different locations of the documentation. guidance Matters of layout, shape, and structure. refactoring Changing shape or layout, or moving content around. sanding-1200 Fine sanding.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant