datadesigner-docs
Data Designer Docs Maintenance is a unified skill for adding, updating, moving, and removing documentation pages on the NeMo Data Designer Fern docs site hosted at `datadesigner.docs.buildwithfern.com/nemo/datadesigner`. Use this skill when editing user-facing documentation in the `fern/` directory, managing concept pages and recipes under `fern/versions/latest/pages/`, or adding Dev Notes posts, ensuring all edits target the authoring source of truth rather than the legacy `docs/` directory.
git clone --depth 1 https://github.com/NVIDIA-NeMo/DataDesigner /tmp/datadesigner-docs && cp -r /tmp/datadesigner-docs/.agents/skills/datadesigner-docs ~/.claude/skills/datadesigner-docsSKILL.md
# Data Designer Docs Maintenance
Unified skill for adding, updating, moving, and removing pages on the NeMo Data Designer Fern docs site.
Current URL: **`datadesigner.docs.buildwithfern.com/nemo/datadesigner`** (see `instances` in [`fern/docs.yml`](../../../fern/docs.yml)). Source of truth for everything user-facing is `fern/`.
## Scope Rule
**ALL doc edits happen under `fern/`.** The legacy `docs/` directory is the original MkDocs source. `docs/notebook_source/*.py` remains canonical for notebook code, but **do not add new top-level prose pages under `docs/`**. Concept pages, recipes, plugins, and Dev Notes prose live under `fern/versions/latest/pages/`.
## Versioning Model
`main` contains only the latest Fern authoring docs. Historical release snapshots live on the CI-managed `docs-website` branch and must not be edited on `main`.
```
fern/versions/
├── latest.yml ← authoring nav file
└── latest/pages/ ← authoring MDX tree
```
`docs.yml` on `main` registers only `slug: latest`. When you edit docs, edit `latest/pages/` and `latest.yml`.
Dev Notes are patched into the published latest docs by CI. Add new posts to `latest/pages/devnotes/posts/` and `latest.yml` on `main`.
For future Fern-native releases, do not copy page trees by hand on `main`. The release workflow snapshots `latest` into a frozen version on `docs-website`.
## Layout at a Glance
```
fern/
├── README.md ← maintainer cheat sheet
├── docs.yml ← title, theme, versions:, redirects, custom-domain
├── fern.config.json ← organization + fern-api version pin
├── main.css ← bundled NVIDIA theme CSS
├── assets/ ← logos, favicon, recipe assets, devnote post images (shared)
├── images/ ← /images/* references from MDX (mirrors docs/images/)
├── styles/ ← per-component CSS (notebook-viewer, authors, metrics-table, …)
├── components/ ← React/JSX MDX components
│ ├── NotebookViewer.tsx ← renders converted .ipynb cells with outputs
│ ├── Authors.tsx ← devnote bylines (uses devnotes/authors-data.ts)
│ ├── MetricsTable.tsx ← benchmark tables w/ best-value highlight
│ ├── TrajectoryViewer.tsx ← multi-turn tool-call traces (research dev notes)
│ ├── BadgeLinks.tsx ← header shields (license, github, etc.)
│ ├── Tag.tsx, CustomCard.tsx, CustomFooter.tsx
│ ├── notebooks/ ← gitignored per-tutorial *.json + *.ts output
│ └── devnotes/ ← .authors.yml, authors-data.ts, per-post trajectory data
├── scripts/
│ └── ipynb-to-fern-json.py ← .ipynb → fern/components/notebooks/*.{json,ts}
└── versions/
├── latest.yml ← authoring navigation tree
└── latest/pages/ ← authoring MDX content
```
## URL Routing Rules
Fern's URL is computed from the **section/page titles in the active version YAML**, not the file path:
```
File system Published URL
──────────────────────────────────────────────────── ────────────────────────────────────────
latest/pages/concepts/columns.mdx /concepts/columns
latest/pages/concepts/tool_use_and_mcp.mdx /concepts/tool-use-and-mcp/overview
latest/pages/recipes/code_generation/text_to_sql.mdx /recipes/code-generation/text-to-sql
latest/pages/devnotes/posts/text-to-sql.mdx /dev-notes/text-to-sql-for-nemotron-super
```
Rules:
- **Section title → kebab-case slug**: `"Dev Notes"` → `dev-notes`, `"Code Generation"` → `code-generation`, `"Tool Use & MCP"` → `tool-use-and-mcp`.
- **Page title → kebab-case slug**: `page: Text-to-SQL for Nemotron Super` → `text-to-sql-for-nemotron-super` (the filename `text-to-sql.mdx` is irrelevant for routing).
- **Subdirectories in the file path are dropped** — `devnotes/posts/foo.mdx` becomes `/dev-notes/<page-title>` (no `/posts/`).
When in doubt, recompute by walking the page's position in the active version YAML and slugifying each title.
## Operations
### Add a Page
1. Pick the file location: `fern/versions/latest/pages/<subdir>/<filename>.mdx`. Underscores in filenames are fine — they don't affect the URL.
2. Write minimal frontmatter:
```mdx
---
title: "<Page Title>"
description: "One-line SEO description (or empty string)"
---
# <Page Title>
<content>
```
3. Add an entry under the appropriate `section:` in `fern/versions/latest.yml`:
```yaml
- page: <Page Title>
path: ./latest/pages/<subdir>/<filename>.mdx
```
4. The URL becomes `/<section-slug>/<page-title-slug>`. Update any cross-references in other MDX accordingly.
5. If the page is a Dev Note, add it to the `Dev Notes` section in `latest.yml`.
### Update a Page
Editing prose is straightforward — change the MDX, save. No mirror step (one canonical tree).
For title changes, also update the `page:` value in `latest.yml` *and* fix any incoming links pointing at the old slugified title.
### Move / Rename a Page (with Redirect)
1. `git mv` the file.
2. Update `path:` in `latest.yml`.
3. Update incoming links: `grep -rn "<old-slug>" fern/versions/latest/pages/`.
4. Add a redirect to `fern/docs.yml`:
```yaml
redirects:
- source: "/nemo/datadesigner/<old-section>/<old-slug>"
destination: "/nemo/datadesigner/<new-section>/<new-slug>"
```
Note redirects use the path-prefixed form because `instances[0].url` includes `/nemo/datadesigner`.
### Remove a Page
1. `grep -rn "<filename-or-slug>"` to find inbound links.
2. `git rm` the MDX file.
3. Remove the `- page:` entry from `latest.yml`.
4. Fix or remove all inbound links.
5. Add a redirect in `docs.yml` if the URL was public.
### Worked Example: Add a How-To Under Concepts
Request: *"Add a how-to about deduplicating generated rows."*
1. Create `fern/versions/latest/pages/concepts/deduplication.mdx`:
```mdx
---
title: "Deduplication"
description: "Strategies for remoCommit current changes with a clear, descriptive message
Create a GitHub PR with a well-formatted description matching the repository PR template (flat Changes by default; optional Added/Changed/Removed/Fixed grouping)
Perform a thorough code review of the current branch or a GitHub PR by number.
Search local documentation in the docs/ folder for content related to a topic
Search GitHub issues, discussions, and PRs for content related to a topic
Update an existing GitHub PR description to reflect current changes after incorporating feedback
Use when the user wants to create a dataset, generate synthetic data, or build a data generation pipeline.