187 Commits
Author SHA1 Message Date
Trung Nguyen 02b412b178 Docs: answer with cards (steps, tables, notes, follow-up questions) in Gordon chat (#26452)
## Description

Gordon answers everything in plain markdown, even when the answer is a
procedure or a comparison. Those answers are harder to scan than they
need to be. This PR lets Gordon put a small card inside its answer when
that helps:

- **Steps** for procedures, with commands in code boxes
- **Tables** for comparisons (limits, plans, options)
- **Notes** for warnings, active incidents or tips
- **Code snippets** for config files
- **Follow-up questions** as chips. Selecting one asks it as your next
question.

```
You can containerize it with docker init, then run it with Compose.

┌───────────────────────────────────────────────┐
│ Containerize a Node.js app                    │
│ ① Generate the Docker assets                  │
│   [ docker init ]                             │
│ ② Build and run the app                       │
│   [ docker compose up --build ]               │
│ ▌ Use Docker Hardened Images for security     │
│ ( How do I add a database service? )          │
└───────────────────────────────────────────────┘

Sources:
- https://docs.docker.com/guides/nodejs/
```

Short answers, explanations and greetings stay plain markdown.

### How it works

```
chat ── "I can draw cards" (ui: "openui-v1") ──▶ Gordon
chat ◀── markdown answer, with at most one ```openui-lang block ── Gordon
chat: draws the block as a card, everything else as markdown
```

- The chat sends one extra field with each question. Only then does
Gordon's backend tell the model it may add a card. Without the field,
answers are the same as today.
- A card is a fenced block of [OpenUI
Lang](https://www.openui.com/docs/openui-lang) inside the normal answer
text, so the conversation history and stored messages stay plain text.
- The chat draws the block with its own styles. Anything it doesn't
recognize is left out, and if the card code can't load, the block shows
as a plain code block.

### Visual change to all answers

Gordon's answers are no longer inside a grey bubble. A framed card
inside the grey bubble looked like a box in a box. Answers now sit on
the panel background at full width, and the card stands out as its own
block. Your own messages keep the blue bubble.

<!-- screenshots: before / after, light and dark -->

### Rollout

- Cards are **on in local builds and deploy previews**, and **off in
production**.
- To turn them on in production, set `params.gordon.cards: true` in
`hugo.yaml`.
- Gordon's backend already supports this, so no other change is needed.

### Other notes

- **Safety:** card text from the model is only ever inserted as text,
never as HTML.
- **Page weight:** the card code (about 120 KB gzipped) is a separate
bundle. It's only downloaded when an answer first contains a card, never
on page load.
- **Copy button:** copies the answer with cards written out as markdown
(numbered steps, a table, `> [!NOTE]`), not the raw card code. Follow-up
chips are left out.
- **Instructions Gordon gets:** the prompt lives entirely in Gordon's
backend, which injects it when the chat sends `ui: "openui-v1"`. This
repo only has the component list the chat draws
(`assets/js/gordon-cards/components.mjs`). The backend's card prompt
describes the same components, so when adding or changing one, the
backend's prompt changes with it.
- **New dependencies:** `@openuidev/lang-core` (the OpenUI Lang parser)
and `zod`, pinned. Its usage telemetry never runs in a browser, and
`.npmrc` already blocks install scripts.

### How to test

1. Run `docker compose watch` and open http://localhost:1313. Local
builds use Gordon's staging backend.
2. Open Gordon from the header and ask:
- **Should show a card:** "How do I containerize my Node.js app?", "What
are the Docker Hub pull limits?", "How do I set up a registry mirror?"
   - **Should stay plain text:** "What is Docker Scout?", "hi"
3. Select a follow-up chip. It should ask that question.
4. Select **Copy** on an answer with a card. The pasted text should be
markdown.
5. Reload the page. Cards should come back from the conversation
history.
6. Check dark mode.
7. In the browser's Network tab, check:
   - each question to `/public/ask` includes `"ui": "openui-v1"`;
   - `gordon-cards.js` only loads after the first answer with a card.

## Related issues or tickets

<!-- none public -->

## Reviews

- [x] Technical review
- [ ] Editorial review
- [ ] Product review
2026-10-27 17:16:06 +01:00
David Karlsson da6c1308a0 Merge pull request #26316 from dvdksn/prune-guides
docs: prune guide catalog and refine topic categories
2026-10-09 11:54:45 +02:00
Alexa KristensenandCursor e44889768c ux: improve Mermaid rendering and theme switching (#26304)
## Summary

**Problem:** Mermaid diagrams briefly showed their raw source before the
SVG appeared, stayed on the wrong palette after a light/dark theme
toggle, and could leave Mermaid's error graphic in the page when a
diagram failed to parse.

**Why this change:** Diagrams are used more often in the docs, so the
renderer needs to match the site theme and avoid flashing source text
while SVGs load.

**Solution:** Replace `mermaid.run()` with a controlled
`mermaid.render()` loop that caches each block's source, skips stale
async results, re-renders when the `<html>` dark class changes,
suppresses Mermaid's default error SVG, and hides `pre.mermaid` until an
SVG is present (or a render error sets `data-error` so the source can
still be inspected).

@netlify /get-started/docker-concepts/the-basics/what-is-a-registry/

Preview:
https://deploy-preview-26304--docsdocker.netlify.app/get-started/docker-concepts/the-basics/what-is-a-registry/
Example of pre-fix behavior:
https://deploy-preview-26283--docsdocker.netlify.app/accounts/organization/

Generated by Cursor

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-08 10:41:05 -05:00
David Karlsson 5542bb1ed4 docs: remove shallow product-tour guides
The Build Cloud, Compose, Scout, Testcontainers Cloud, and
container-supported development guides mostly repeat product benefits
and introduce videos instead of teaching distinct tasks.

Remove these five guides and their unused images, update incoming links,
and redirect all former page and chapter URLs to the relevant product
docs or hands-on lab. Keep both administration guides.
2026-10-08 14:00:49 +00:00
David Karlsson c93c72c7c2 Merge pull request #25979 from dvdksn/codex/sandbox-interactive-diagram
docs: prototype interactive Sandboxes diagram
2026-09-21 16:23:46 +02:00
David Karlsson 9b1f7de05f docs: unify Hub, DVP, and Registry API references (#26048)
@netlify /reference/api/

[Preview the API
reference](https://deploy-preview-26048--docsdocker.netlify.app/reference/api/)

Adds a shared API reference experience for Hub, DVP, and Registry: a
catalog, operation navigation, linked schemas, request and response
examples, and matching HTML and Markdown output. A validation and
generation pipeline prepares the reference data for Hugo and runs as
part of Docker and Netlify builds.

Migrates the three specifications to OpenAPI 3.2, correcting response
shapes, nullable fields, and authentication and token examples. The Hub
migration also corrects SCIM contracts and CSV exports; DVP gains
complete report response schemas and examples. Registry keeps its
documented Hub-specific subset, with authentication and media
negotiation expressed through OpenAPI security and content fields.

Validation is strict for both checks and generation, with no exception
baseline or bypass flag. The build uses the migrated sources directly,
without migration scripts or records.

Page and specification URLs remain stable, including the DVP alias.
Operation and schema anchors change. Engine and Governance retain their
existing references.

Validated locally with Go tests, strict validation of all three
specifications (zero diagnostics), scoped formatting and lint, and a
full Hugo build checking all 176 HTML/Markdown page pairs, example
parity, reference links, and byte-identical published specifications. A
browser check confirmed raw CSV rendering and the generated request
header. No live API requests were made.
2026-09-17 16:56:32 +02:00
David KarlssonandClaude Sonnet 4.6 f02e2a5633 Revamp the guides section: taxonomy, single-page structure, and new landing/filter UX (#25338)
## What

A full revamp of the `/guides` section — taxonomy, structure, and UX.

Preview: https://deploy-preview-25338--docsdocker.netlify.app/guides/

### Taxonomy & structure
- Replaces the sprawling 24-tag set with a focused 9-tag taxonomy
aligned to use case / SDLC: **Languages & frameworks, AI, Testing,
CI/CD, Security, Databases, Deployment, Admin, Hands-on labs**.
- Removes the languages taxonomy entirely (`data/languages.yaml` and all
`languages:` front matter).
- Collapses all multi-page guide series into single pages, with aliases
so old sub-page URLs continue to resolve.
- Deletes redirect-only shim pages and flattens directory-wrapped single
pages.

### Landing page (`/guides/`)
- A clean index: hero, then category sections listing each guide as a
plain **title / summary** row.
- **Browse rail** (sticky, left): click a topic to filter the page to
just that topic's guides; "All guides" resets. A count + Clear bar
appears while filtering.
- **Text filter**: instant client-side search over title, summary, and
tags. Topic filter and text search are mutually exclusive and share the
same flat-list view.
- No more "Featured guides" section.

### Guide content pages
- Removes the left sidebar for the guides section (mobile drawer kept).
- Centered reading column (`92ch`) with the TOC taking the remaining
width.
- Summary rendered as a lead paragraph under the h1.
- TOC scrollbar auto-hides until hover; breadcrumbs render at a
consistent size inside and outside `prose`.

## Notes
- Deep full-text search across guide bodies is still handled by the
existing site-wide Pagefind (⌘K); the landing filter is the fast
metadata-narrowing surface.
- `series.html` is retained — it's still used by `get-started` pages.

## Validation
- Site builds clean locally (Hugo dev server, no errors / broken refs).
- All collapsed sub-page URLs redirect via aliases.

## Follow-ups

- Prune guides that we no longer need/want
- Tighten the guides that span too many concepts (e.g. language guides;
remove cicd/deploy/sscs)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 10:47:10 +02:00
David Karlsson d95336d485 Merge pull request #25178 from dvdksn/mermaid-codeblock-hook
layouts: render mermaid code blocks as diagrams
2026-05-27 14:49:57 +02:00
David Karlsson 9789556384 layouts: render ```mermaid code blocks as diagrams
Adds a Hugo codeblock render hook that turns ```mermaid fences into
<pre class="mermaid"> containers, plus a lazily-loaded mermaid bundle
that only ships on pages that actually contain a diagram. Mirrors the
existing YouTube embed pattern (Store flag + conditional script tag in
baseof) so the main scripts.js bundle stays unchanged.
2026-05-27 11:08:46 +02:00
David KarlssonandClaude Sonnet 4.6 28ca826bf1 analytics: fix Marlin endpoint URL double-encoding in head.html
Hugo's html/template JS-escapes string values inside <script> blocks.
Calling jsonify per-field produced quoted strings like "https://..."
which were then re-escaped, embedding literal quote characters in the
endpoint value passed to the SDK.

Fix by jsonifying the whole config dict at once and marking it safeJS
so html/template does not apply a second round of escaping.

Also extract the environment ternary out of the Marlin constructor call
for readability.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 15:42:49 +02:00
David KarlssonandClaude Opus 4.7 a6c2209c7f analytics: add Marlin SDK and migrate dropdown Heap markers
Introduces @docker/marlin-sdk-web-public for first-party pageview and
click analytics, bundled into scripts.js via Hugo's existing js.Build
pipeline. Config is emitted to window.__marlinConfig from head.html and
gated to prod/staging only.

Renames data-heap-id attributes on the markdown-dropdown buttons to
marlin-action so they are picked up by the SDK's auto-click tracking.

TODO: replace the REPLACE-ME endpoint placeholders in hugo.yaml with
the canonical Marlin ingestion URLs from the data-platform team.

TODO: heap.track() calls in youtube-script.html are left in place —
the public SDK exposes no equivalent track() method, so video
play/pause events cannot be migrated yet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2026-05-22 13:40:16 +02:00
David KarlssonandClaude Sonnet 4.6 ee71c80562 chore: migrate icons from Material Symbols to Heroicons
Replaces @material-symbols/svg-400 (5.5 MB) with heroicons (488 KB) — an
11x reduction in icon asset size. Heroicons uses a single consistent
distribution format (24px solid SVGs, fill="currentColor") eliminating
the need for the separate utils/svg.html partial, the icon-svg-stroke CSS
utility, and the dual-path resolution logic in icon.html.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2026-05-18 12:05:54 +02:00
Derek Misler 68ba732d88 Apply new empty state to docs.docker.com
Signed-off-by: Derek Misler <derek.misler@docker.com>
2026-04-08 14:20:17 -04:00
David KarlssonandClaude Sonnet 4.6 db740fe266 docs: add auto/system theme option to theme toggle (#24519)
> 🤖 Generated with [Claude Code](https://claude.com/claude-code)

## Summary

`theme.js` unconditionally wrote the resolved preference to
`localStorage` on every page load, permanently locking in a concrete
`"light"` or `"dark"` value even for first-time visitors — making it
impossible to track OS preference changes after any site visit. Removed
the unconditional `localStorage.setItem` from `theme.js` so the early
script only reads (never writes); the Alpine.js toggle in `header.html`
now cycles through three states (light → dark → auto), with "auto"
removing the `theme-preference` key and resolving from
`prefers-color-scheme` with a live `matchMedia` change listener so the
theme updates immediately when the OS preference changes. A contrast
icon indicates auto mode; all three icon spans are driven by Alpine
`x-show` directives rather than pure CSS dark-mode classes.

**Verified:** logic matches the standard three-state pattern;
`prefers-color-scheme` media query and `matchMedia` change listener are
the canonical browser APIs for system-preference tracking.
**Checked:** no other files reference `theme-preference` or the theme
toggle; no CSS changes required.

Closes #23177

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 06:19:52 +02:00
Derek Misler 1bf9cb9c3b Rebrand "Docker AI" references to "Gordon" across docs.docker.com
Signed-off-by: Derek Misler <derek.misler@docker.com>
2026-03-06 11:48:48 -05:00
Shakirth Anisha d827401e6f Merge pull request #24108 from shakirth-anisha/ros2_guide
docs: Add guide for running ROS2 with Docker
2026-02-16 14:26:51 +01:00
David Karlsson f929b8f1ed site: implement pagefind component ui for search modal
- Add pagefind-component-ui.css and .js assets
- Replace search bar with custom button that opens modal
- Add custom result template with Tailwind classes
- Add dark mode styling for modal and result highlights
- Support Cmd/Ctrl+K keyboard shortcut

Assisted-By: cagent
2026-02-09 15:43:37 +01:00
David Karlsson dac9999c44 site: update footer styling
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2026-01-21 15:56:23 +01:00
David Karlsson 2c59158bc3 site: update landing page layout
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2026-01-21 15:56:23 +01:00
David Karlsson f0dd5b6c80 site(gordon): do not persist open state
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2026-01-13 12:21:28 +01:00
David Karlsson 14d73dab86 site(gordon): escape HTML in markdown text to preserve angle brackets
Configure marked.js to escape HTML entities in text tokens while
preserving code blocks. This allows angle brackets like <target-name>
to display correctly in regular text without being interpreted as HTML
tags, while keeping code examples intact.

Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2026-01-13 12:21:28 +01:00
David Karlsson d3a595ef6a site: use gordon for ask ai
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2026-01-13 12:21:28 +01:00
David Karlsson 88c600157b fix: improve contrast in code blocks where language is unrecognized
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2026-01-07 10:11:23 +01:00
David Karlsson 824a2d5366 site: add dhi migrations/examples as featured guides
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2025-12-17 14:07:35 +01:00
David Karlsson 4cc579f17b site: improve header buttons, remove support link
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
2025-12-12 17:43:34 +01:00
ArthurandUsha Mandya c3df922b83 cagent (#23336)
Add cagent docs to open-source section.

---------

Co-authored-by: Usha Mandya <47779042+usha-mandya@users.noreply.github.com>
2025-09-04 15:46:45 +01:00
Arthur ed2dca923b chore: update favicon (#23314)
Use the official favicon.
2025-08-27 07:50:54 +01:00
Arthur 81c1094570 ux: improve release notes formatting (#23293)
Improve formatting of dowload links in release notes.
2025-08-22 12:34:28 +02:00
Arthur 20492f8441 mcp: various touch ups (#23251)
Reorder pages in MCP TOC, touch up content, add summary bars, use tabs
where appropriate, etc.
2025-08-20 15:44:19 +02:00
Arthur 00da2c5f7f ux: clean up footer (#23261)
Simplify the footer.

<img width="1238" height="516" alt="screen"
src="https://github.com/user-attachments/assets/fe397763-28ab-4ad4-84d5-ba3fc9767885"
/>
2025-08-19 11:07:03 +02:00
Arthur 39ff715091 ux: move support and theme buttons to topnav (#23243)
Move the contact support button and the theme switch button to the top
nav bar.
2025-08-15 10:51:55 +02:00
Arthur 854038023f dmr: touch ups (#23239)
Minor touch ups in DMR section.
2025-08-13 10:20:44 +01:00
Arthur b427433371 ux: copy search term to AI widget (#23212)
Harmonize buttons in the nav and automatically copy the search term to
the AI widget.
Uses "cmd k" to open the AI widget instead of search.
Touch up search results.
2025-08-11 09:33:02 +02:00
Arthur 158aa8e833 fix: better support for unrecognized languages (#23188)
<!--Delete sections as needed -->

## Description

Degrade nicely when a code fence uses an unrecognized language.

<img width="1865" height="628" alt="Frame 35"
src="https://github.com/user-attachments/assets/e819a128-4025-404b-a421-51f571382d2e"
/>
2025-07-30 16:55:18 +02:00
Arthur c7f64f3ee1 ui: add 'open in Claude/Chatgpt' to page options (#23110) 2025-07-18 15:16:24 +02:00
Arthur b6c022761b add MCP Gateway (#22935)
<!--Delete sections as needed -->

## Description

<!-- Tell us what you did and why -->

## Related issues or tickets

<!-- Related issues, pull requests, or Jira tickets -->

## Reviews

<!-- Notes for reviewers here -->
<!-- List applicable reviews (optionally @tag reviewers) -->

- [ ] Technical review
- [ ] Editorial review
- [ ] Product review
2025-07-09 16:56:49 +02:00
Arthur a949a7335a fix: visual touch-ups (#23012)
- **increase h2 mt**
- **tabs: remove rounded border**
- **fix page action icons**
- **increase article width**
- **reduce breadcrumb font size**
2025-07-07 12:41:58 +02:00
Arthur 21b9a3f8bc chore: reduce font size (#22968) 2025-07-01 11:19:01 -04:00
Arthur 03ae6f16f8 chore: fix search result color (#22962)
Some parts of the search results window are hard to read. Let's fix
this.

Before: see live website
After: 

![Screenshot 2025-07-01 at 12 45
40](https://github.com/user-attachments/assets/34e8e10c-d2ab-4c8b-9d83-07299915464e)
![Screenshot 2025-07-01 at 12 45
49](https://github.com/user-attachments/assets/a851dcdb-5423-40bc-9a8b-19cd949c408c)
2025-07-01 13:00:56 +02:00
Arthur 5d9bf839f1 fix: codeblock line nums (#22866) 2025-06-18 15:38:16 +02:00
Craig Osterhout 983d541636 dhi: add initial docs (#22852)
<!--Delete sections as needed -->

## Description

Add initial DHI docs

## Related issues or tickets

ENGDOCS- 22650

## Reviews

<!-- Notes for reviewers here -->
<!-- List applicable reviews (optionally @tag reviewers) -->

- [ ] Technical review
- [ ] Editorial review
- [ ] Product review

---------

Signed-off-by: Craig <craig.osterhout@docker.com>
2025-06-16 22:06:49 +01:00
Sarah Sanders a4d2113313 fix: highlighting in code blocks (#22836)
## Description
- Highlighted lines for code blocks in dark mode are not rendering
correctly

## Related issues or tickets
https://docker.atlassian.net/browse/ENGDOCS-2731

## Reviews
- [ ] Technical review
- [ ] Editorial review
- [ ] Product review
2025-06-16 11:15:12 -04:00
Arthur f60a4283a7 ux: touch up tabs (#22783) 2025-06-05 10:12:35 +01:00
Allie Sadler 5485c9f412 Revert "ux: touch up tabs" (#22779)
Reverts docker/docs#22774
2025-06-05 08:21:51 +01:00
Arthur 17ef8a68a3 ux: touch up tabs (#22774)
Reduce magins, add hover effect, add light background

![Frame
31](https://github.com/user-attachments/assets/1b028adf-3baf-4588-9161-329b272ffb8e)
2025-06-05 09:01:58 +02:00
Arthur fce604bc19 MCP: MCP Toolkit in Docker Desktop (#22673)
Docs for the new GUI for the MCP Toolkit.


https://deploy-preview-22673--docsdocker.netlify.app/ai/mcp-catalog-and-toolkit/
2025-06-04 14:49:58 +01:00
Arthur 6a940f3b2a ux: update code block styling (#22761)
![export](https://github.com/user-attachments/assets/9a9df60b-22db-42b9-9b5d-3d2c7812bb0e)
2025-06-04 15:38:11 +02:00
Arthur 9eff1ba5fc theme: extract more styles (#22734)
Extract shared styling into appropriate utilities.
Improve toc width.
2025-05-30 09:20:56 -07:00
Arthur 1686e58dd1 fix: various theme improvements (#22725)
Harmonize various areas of the theme.
2025-05-30 11:57:20 +02:00
Arthur 038e6dc682 chore: update Tailwind to v4 (#22666)
- Extract classes to utilities and components.
- Reduce number of colors used.
- Harmonize button colors.
- Restyle admonitions.
- Move **Page options** button to main article.
- Various color tweaks.
2025-05-28 08:37:10 +01:00