Skip to content

feat: redesign doc-kit.nodejs.org - #1192

Open
ovflowd wants to merge 22 commits into
mainfrom
feat/site-redesign
Open

ovflowd wants to merge 22 commits into
mainfrom
feat/site-redesign

Conversation

@ovflowd

@ovflowd ovflowd commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

PREVIEW: https://feat-site-redesign-doc-kit.nodejs.workers.dev/

Description

This PR redesigns doc-kit.nodejs.org: a new theme and home page, illustrations for the guides, and a pass over the docs so every topic lives on one page. The whole site is built with doc-kit's own extension points (theme slots, components, stylesheets and a custom template), so it doubles as an example of how far you can take customizing doc-kit.

Site

  • A home page that shows what doc-kit does: the sources and outputs of one kittens module, the worker pool building a site, benchmarks and a getting-started path. It's MDX (www/pages/index.mdx) with plain fenced code blocks, so the samples get doc-kit's own highlighting, code boxes, tabs and copy buttons.
  • The hero and the pipeline are animated SVGs in www/public/home/, with a narrower drawing of each for phones. They come from the same build simulation and layout the canvas version had, so they show the same run, but the site doesn't ship any animation code anymore.
  • A neutral theme over @node-core/ui-components, light and dark, with Inter and styled search and theme menus. Kit (the cat) and the headline are placeholders until we settle them in Proposal: Kit, doc-kit's mascot, and a tagline for the site #1197.
  • Five illustrations in the guides, each on the page it explains. They're self-contained SVGs with their own styles, colors and fonts, so they work as plain images here and on GitHub, follow the theme switch, and play once before stopping on the finished picture.
  • www is a private workspace package (@doc-kit/www) with the source of the social card (node --run og renders www/og/og.html). The numbers on the home page come from node scripts/benchmark.mjs: this site's 40 pages build in 2.9 s, and the Node.js v26.12.1 API docs in 10.1 s.

Documentation

  • Every page and README was checked against the code, and each topic lives in one place that the others link to: flags in the CLI page, global options in Configuration, the theme reference in the html generator's README, and so on.
  • index.md became introduction.md, and there's a new guide for documenting TypeScript and JSDoc with @doc-kit/typedoc.
  • Every generator has its own page, including json-all, json-simple, llms-txt-full and the legacy ones. The overview links all of them, and the sidebar keeps to the main ones.
  • The specification is the same as on main.

Package changes

Two patches to @doc-kit/generator-react:

  • Islands that hydrate on interaction (code tabs, copy buttons) used to swallow the click or tap that started their hydration, so you had to press twice. The runtime now holds those presses and replays them once the island is ready, covered by presses.test.mjs.
  • In the default theme, the heading layout only applies to API entry headings now, not to any div with a heading inside <main>. The selected code tab stands out again (the neutral palette made it blend in) and tabs wrap on narrow screens. The default template also gets a canonical link, built from pageURL, and theme-color.

Follow-ups

Validation

node --run format:check, node --run lint and node --run test (778 tests) pass, and a production build of the site has no missing assets. The link check only flags two things that are broken on main too: the spec's own #722-level-1--experimental anchor, and the relative links of the contributing pages once they're inlined into all.html.

The home page:

home-dark home-light
The whole home page, dark, light and on a phone

home-full-dark home-full-light home-phone

The docs, in both themes, on a phone and with search open:

Dark Light
docs-dark docs-light

docs-phone search-dark

The illustrations, each on the page it explains (Getting started, Writing documentation, Customizing the site, Creating generators and Generators):

diagram-build-output diagram-entry-anatomy
diagram-theme-slots diagram-dependent
diagram-generator-graph

Related Issues

Refs #1197

Check List

  • I have read the Contributing Guidelines and made commit messages that follow the guideline.
  • I have run node --run test and all tests passed.
  • I have check code formatting with node --run format:check & node --run lint.
  • I've covered new added functionality with unit tests if necessary.

@ovflowd
ovflowd requested a review from a team as a code owner October 27, 2026 14:56
@vercel

vercel Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
api-docs-tooling Ready Ready Preview Oct 29, 2026 8:46pm UTC

Request Review

@codecov

codecov Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 17.66917% with 219 lines in your changes missing coverage. Please review.
✅ Project coverage is 92.86%. Comparing base (854a944) to head (e0d7ced).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
scripts/benchmark.mjs 0.00% 217 Missing ⚠️
scripts/build-docs-content.mjs 0.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1192      +/-   ##
==========================================
- Coverage   93.42%   92.86%   -0.57%     
==========================================
  Files         286      288       +2     
  Lines       28502    28840     +338     
  Branches     2870     2890      +20     
==========================================
+ Hits        26628    26782     +154     
- Misses       1852     2036     +184     
  Partials       22       22              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

api-links Generator

Performance estimate (single CI run)

  • Generation time: 60.6% slower (660.00 ms → 1.06 s)
  • Peak memory: 5.4% lower (298.81 MB → 282.70 MB)

json Generator

Performance estimate (single CI run)

  • Generation time: 4.8% faster (10.02 s → 9.54 s)
  • Peak memory: 2.5% lower (1.13 GB → 1.10 GB)

legacy-html Generator

Performance estimate (single CI run)

  • Generation time: 26.3% slower (9.83 s → 12.42 s)
  • Peak memory: 4.2% lower (1.76 GB → 1.69 GB)

legacy-json Generator

Performance estimate (single CI run)

  • Generation time: 2.7% slower (9.39 s → 9.64 s)
  • Peak memory: 3.6% lower (1.12 GB → 1.08 GB)

llms-txt Generator

Performance estimate (single CI run)

  • Generation time: 3.7% slower (8.12 s → 8.42 s)
  • Peak memory: 0.8% higher (1.11 GB → 1.11 GB)

orama-db Generator

Output size: 1 file changed · net +436.78 KB

File size details
File Main PR Change
orama-db.json 29.24 MB 29.66 MB +436.78 KB (+1.5%)

Performance estimate (single CI run)

  • Generation time: 55.6% slower (5.74 s → 8.93 s)
  • Peak memory: 10.2% lower (1.40 GB → 1.26 GB)

web Generator

Output size: 136 files changed · net +197.19 KB

File size details
File Main PR Change
assets/style-oesv8pX0.css 138.33 KB — -138.33 KB (-100.0%)
assets/style-Ce7eUXNk.css — 138.25 KB +138.25 KB
all.html 34.78 MB 34.87 MB +90.75 KB (+0.3%)
assets/SearchBox-CO1D6OpE.js 84.66 KB — -84.66 KB (-100.0%)
assets/SearchBox-Bsm8K4KX.js — 84.66 KB +84.66 KB
assets/dist-DoZgt__T.js 30.42 KB — -30.42 KB (-100.0%)
assets/dist-BpoaviFJ.js — 30.42 KB +30.42 KB
assets/SideBar-CPulXDxB.js 25.61 KB — -25.61 KB (-100.0%)
assets/SideBar-C5lmR971.js — 25.61 KB +25.61 KB
assets/client-C8VB29IJ.js — 25.51 KB +25.51 KB
assets/client-CvDsf290.js 25.08 KB — -25.08 KB (-100.0%)
assets/Combination-DKBdP9ny.js 16.11 KB — -16.11 KB (-100.0%)
assets/Combination-Dy2XyHDu.js — 16.11 KB +16.11 KB
assets/ThemeToggle-Cy9wC9fJ.js 13.69 KB — -13.69 KB (-100.0%)
assets/ThemeToggle-BglR9xYC.js — 13.69 KB +13.69 KB
assets/dist-Du9tVJue.js 10.20 KB — -10.20 KB (-100.0%)
assets/dist-B2FKcICo.js — 10.20 KB +10.20 KB
assets/compat-WmL6WsBB.js 10.13 KB — -10.13 KB (-100.0%)
assets/compat-C8PI-7kW.js — 10.13 KB +10.13 KB
assets/Layout-B_nNXd6C.js 10.13 KB — -10.13 KB (-100.0%)
assets/Layout-ChWi3F4J.js — 10.13 KB +10.13 KB
errors.html 570.64 KB 578.77 KB +8.13 KB (+1.4%)
assets/Tooltip-DprR-0re.js 7.93 KB — -7.93 KB (-100.0%)
assets/Tooltip-D3crrQRN.js — 7.93 KB +7.93 KB
assets/dist-CVH4ky_E.js 6.99 KB — -6.99 KB (-100.0%)
assets/dist-XoZjnJAg.js — 6.99 KB +6.99 KB
assets/jsx-runtime-UrFv8_8t.js 5.67 KB — -5.67 KB (-100.0%)
assets/jsx-runtime-B8LDeEc_.js — 5.67 KB +5.67 KB
quic.html 985.73 KB 991.17 KB +5.44 KB (+0.6%)
fs.html 2.36 MB 2.36 MB +5.30 KB (+0.2%)
cli.html 678.65 KB 683.01 KB +4.36 KB (+0.6%)
n-api.html 1.05 MB 1.06 MB +4.02 KB (+0.4%)
assets/dist-CfYN1pZU.js 3.93 KB — -3.93 KB (-100.0%)
assets/dist-C8nMdr7h.js — 3.93 KB +3.93 KB
assets/CodeTabs-DbfhZNUh.js 3.89 KB — -3.89 KB (-100.0%)
assets/CodeTabs-T41tuh22.js — 3.89 KB +3.89 KB
deprecations.html 607.14 KB 610.65 KB +3.52 KB (+0.6%)
assets/CodeBox-B7zIVcZb.js 3.44 KB — -3.44 KB (-100.0%)
assets/CodeBox-CcxFGOPM.js — 3.44 KB +3.44 KB
assets/hooks.module-CrdVMmcC.js 3.40 KB — -3.40 KB (-100.0%)
assets/hooks.module-CeVNoI0q.js — 3.40 KB +3.40 KB
http2.html 1.31 MB 1.31 MB +3.16 KB (+0.2%)
http.html 1.23 MB 1.23 MB +3.13 KB (+0.2%)
crypto.html 2.03 MB 2.03 MB +3.09 KB (+0.1%)
webcrypto.html 679.97 KB 682.97 KB +3.00 KB (+0.4%)
zlib.html 1.00 MB 1.00 MB +2.88 KB (+0.3%)
test.html 1.47 MB 1.47 MB +2.75 KB (+0.2%)
perf_hooks.html 910.85 KB 913.53 KB +2.67 KB (+0.3%)
stream.html 1.27 MB 1.28 MB +2.61 KB (+0.2%)
net.html 669.51 KB 671.79 KB +2.28 KB (+0.3%)
assets/FunctionSignature-KaFwdAhR.js 2.28 KB — -2.28 KB (-100.0%)
assets/FunctionSignature-WrUzRot-.js — 2.28 KB +2.28 KB
buffer.html 1.82 MB 1.82 MB +2.20 KB (+0.1%)
process.html 1.20 MB 1.20 MB +2.20 KB (+0.2%)
util.html 1.26 MB 1.27 MB +2.14 KB (+0.2%)
assets/Banner-BXh3IvMW.js 2.13 KB — -2.13 KB (-100.0%)
assets/Banner-MqJUzBg0.js — 2.13 KB +2.13 KB
webstreams.html 565.37 KB 567.29 KB +1.92 KB (+0.3%)
globals.html 302.32 KB 304.14 KB +1.83 KB (+0.6%)
assets/ChangeHistory-B-Ue51W9.js 1.77 KB — -1.77 KB (-100.0%)
assets/ChangeHistory-BL3Epynz.js — 1.77 KB +1.77 KB
diagnostics_channel.html 553.45 KB 555.20 KB +1.75 KB (+0.3%)
stream_iter.html 795.20 KB 796.82 KB +1.63 KB (+0.2%)
events.html 868.13 KB 869.67 KB +1.55 KB (+0.2%)
tls.html 550.08 KB 551.61 KB +1.53 KB (+0.3%)
dtls.html 315.63 KB 317.11 KB +1.48 KB (+0.5%)
v8.html 574.48 KB 575.95 KB +1.47 KB (+0.3%)
url.html 533.89 KB 535.33 KB +1.44 KB (+0.3%)
worker_threads.html 662.16 KB 663.52 KB +1.36 KB (+0.2%)
sqlite.html 542.99 KB 544.19 KB +1.20 KB (+0.2%)
module.html 533.03 KB 534.17 KB +1.14 KB (+0.2%)
dns.html 442.02 KB 443.10 KB +1.08 KB (+0.2%)
readline.html 380.83 KB 381.81 KB +1008.00 B (+0.3%)
inspector.html 225.17 KB 226.14 KB +992.00 B (+0.4%)
child_process.html 706.48 KB 707.43 KB +976.00 B (+0.1%)
esm.html 196.06 KB 197.01 KB +976.00 B (+0.5%)
vm.html 656.78 KB 657.73 KB +976.00 B (+0.1%)
dgram.html 313.50 KB 314.37 KB +896.00 B (+0.3%)
modules.html 238.02 KB 238.88 KB +880.00 B (+0.4%)
ffi.html 203.64 KB 204.47 KB +848.00 B (+0.4%)
assets/DataTag-hXEjxW1l.js 844.00 B — -844.00 B (-100.0%)
assets/DataTag-CghWFdcT.js — 844.00 B +844.00 B
assets/DocumentationIndex-Df9NZxCc.js 833.00 B — -833.00 B (-100.0%)
assets/DocumentationIndex-Cv-kaQsv.js — 833.00 B +833.00 B
packages.html 234.52 KB 235.33 KB +832.00 B (+0.3%)
vfs.html 213.64 KB 214.44 KB +816.00 B (+0.4%)
bench.html 213.44 KB 214.21 KB +784.00 B (+0.4%)
cluster.html 317.74 KB 318.51 KB +784.00 B (+0.2%)
single-executable-applications.html 170.65 KB 171.42 KB +784.00 B (+0.4%)
os.html 173.40 KB 174.12 KB +736.00 B (+0.4%)
repl.html 314.00 KB 314.70 KB +720.00 B (+0.2%)
assert.html 673.00 KB 673.69 KB +704.00 B (+0.1%)
async_hooks.html 293.14 KB 293.80 KB +672.00 B (+0.2%)
timers.html 192.26 KB 192.91 KB +672.00 B (+0.3%)
async_context.html 329.94 KB 330.58 KB +656.00 B (+0.2%)
console.html 194.17 KB 194.81 KB +656.00 B (+0.3%)
assets/ArrowUpRightIcon-lZ5pU3N4.js 618.00 B — -618.00 B (-100.0%)
assets/ArrowUpRightIcon-D12e1I-O.js — 618.00 B +618.00 B
assets/Badge-4_4Ydmj6.js 607.00 B — -607.00 B (-100.0%)
assets/Badge-jrvZGGAz.js — 607.00 B +607.00 B
https.html 250.17 KB 250.75 KB +592.00 B (+0.2%)
assets/AlertBox-0cPDytBv.js 591.00 B — -591.00 B (-100.0%)
assets/AlertBox-CjRAxe15.js — 591.00 B +591.00 B
tty.html 113.75 KB 114.29 KB +560.00 B (+0.5%)
addons.html 389.74 KB 390.24 KB +512.00 B (+0.1%)
assets/CodeBracketIcon-D9xazdMh.js 512.00 B — -512.00 B (-100.0%)
debugger.html 148.25 KB 148.75 KB +512.00 B (+0.3%)
path.html 186.18 KB 186.68 KB +512.00 B (+0.3%)
assets/CodeBracketIcon-bzqgeNpb.js — 512.00 B +512.00 B
domain.html 131.21 KB 131.68 KB +480.00 B (+0.4%)
assets/dist-BWeclI7o.js 477.00 B — -477.00 B (-100.0%)
assets/dist-G-DOaBXg.js — 477.00 B +477.00 B
assets/ChevronDownIcon-D2lj3d79.js 468.00 B — -468.00 B (-100.0%)
assets/ChevronDownIcon-DV7Zvyh7.js — 468.00 B +468.00 B
permissions.html 94.66 KB 95.10 KB +448.00 B (+0.5%)
assets/renderLabel-D0F8hafQ.js 447.00 B — -447.00 B (-100.0%)
assets/renderLabel-B6g_jEkR.js — 447.00 B +447.00 B
environment_variables.html 39.42 KB 39.83 KB +416.00 B (+1.0%)
report.html 238.08 KB 238.47 KB +400.00 B (+0.2%)
tracing.html 131.00 KB 131.39 KB +400.00 B (+0.3%)
typescript.html 53.18 KB 53.57 KB +400.00 B (+0.7%)
punycode.html 68.26 KB 68.62 KB +368.00 B (+0.5%)
wasi.html 83.99 KB 84.34 KB +368.00 B (+0.4%)
intl.html 58.75 KB 59.09 KB +352.00 B (+0.6%)
querystring.html 70.20 KB 70.53 KB +336.00 B (+0.5%)
documentation.html 29.88 KB 30.19 KB +320.00 B (+1.0%)
embedding.html 72.99 KB 73.28 KB +304.00 B (+0.4%)
string_decoder.html 68.94 KB 69.24 KB +304.00 B (+0.4%)
404.html 22.67 KB 22.90 KB +240.00 B (+1.0%)
index.html 27.92 KB 28.15 KB +240.00 B (+0.8%)
assets/Blockquote-D8YNwYkq.js 167.00 B — -167.00 B (-100.0%)
assets/Blockquote-BiLRjBBs.js — 167.00 B +167.00 B
assets/useRemoteConfig-CUnbvqRE.js 151.00 B — -151.00 B (-100.0%)
assets/useRemoteConfig-Ct7Qcl8-.js — 151.00 B +151.00 B
assets/withIsland-kBv49iz5.js 105.00 B — -105.00 B (-100.0%)
assets/withIsland-d8Ozlw57.js — 105.00 B +105.00 B

Performance estimate (single CI run)

  • Generation time: 4.2% faster (25.02 s → 23.97 s)
  • Peak memory: 4.6% lower (1.99 GB → 1.90 GB)

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

🚀 Deploying Preview to Cloudflare 🚀

Preview Deployments by commit

Status Deployment URL Commit Updated (UTC) See this deployment's details
  • Build: Success ✅

View logs ↗
No Preview URL. Enable ↗ e0d7ced 2026-10-29T20:46:48.113Z View logs ↗
  • Build: Success ✅

View logs ↗
No Preview URL. Enable ↗ 545de1a 2026-10-29T20:19:12.933Z View logs ↗
  • Build: Success ✅

View logs ↗
No Preview URL. Enable ↗ 68fcb10 2026-10-29T20:08:56.220Z View logs ↗
  • Build: Success ✅

View logs ↗
No Preview URL. Enable ↗ e5b8ad1 2026-10-27T18:30:54.256Z View logs ↗
  • Build: Success ✅

View logs ↗
No Preview URL. Enable ↗ b413a20 2026-10-27T15:02:24.291Z View logs ↗
  • Build: Success ✅

View logs ↗
No Preview URL. Enable ↗ 77c20f8 2026-10-27T14:57:39.593Z View logs ↗

@avivkeller

avivkeller commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

No Preview URL. Enable ↗

cc @nodejs/web-admins The preview URL is https://27dcb7e5-doc-kit.nodejs.workers.dev, any idea why it's not showing there?

@ovflowd

ovflowd commented Oct 27, 2026

Copy link
Copy Markdown
Member Author

No Preview URL. Enable ↗

cc @nodejs/web-admins The preview URL is 27dcb7e5-doc-kit.nodejs.workers.dev, any idea why it's not showing there?

Weird... No idea... @dario-piotrowicz any idea?

@avivkeller avivkeller left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Initial round of reviews... I didn't read all files, but this is a start

Comment thread package.json Resolved
Comment thread docs/cli.md Resolved
Comment thread scripts/build-docs-content.mjs Resolved
Comment thread www/public/og.png Resolved
Comment thread www/theme/components/CopyButton.jsx Resolved
Comment thread www/theme/components/CopyCode.jsx Resolved
Comment thread www/theme/components/highlight.mjs Resolved
Comment thread www/theme/components/InstallTabs.jsx Resolved
Comment thread www/theme/data.mjs Resolved
Comment thread www/theme/home/Home.jsx Resolved

@avivkeller avivkeller left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

There's still a decent way to go, I see a lot of things that your AI likely just decided to change but make this diff a lot more than it needs to be.

Also, we need to discuss the marketing aspect of this, i.e. this adds a tagline, mascot, logo, and a whole lot of things we haven't properly discussed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's put some more thought into these animations, e.g. making sure there are finalized and clean before we ship them (so no overflowing arrows, etc

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Fair point, I went through all of them frame by frame. In dependent.svg the connectors were drawn before section-pages had landed, and entry-anatomy's leaders ran through the editor's border, so I fixed both, plus a few labels that were too tight. They also play once now and stop on the finished picture instead of looping.

Comment thread docs/cli.md Outdated
URLs documenting them, used to link types (`metadata.typeMap`).
- `--minify` {boolean} Minify the output (`global.minify`). **Default:**
`false`.
- `-p`, `--threads` {number} Worker threads to use, at least 1 (`threads`).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Does our typed list system support ,?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Nope, it doesn't. It takes the first code span as the name, so the type gets lost. I went back to main's -p, --threads <n> form for all of them.

Comment thread docs/configuration.md Resolved
Comment thread docs/creating-generators.md Resolved
Comment thread docs/creating-generators.md Resolved
Comment thread www/pages/index.mdx Resolved
Comment thread www/pages/index.mdx Resolved
Comment thread www/pages/index.mdx Resolved
Comment thread www/theme/components/pipeline/build.mjs Resolved

@avivkeller avivkeller left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I'm sorry 😭

Comment thread docs/cli.md Resolved
Comment thread docs/configuration.md Resolved
Comment thread docs/generators.md Resolved
Comment thread docs/generators.md Resolved
Comment thread docs/introduction.md Resolved
Comment thread www/pages/index.mdx Resolved
Comment thread www/theme/plugins/rehype-diagrams.mjs Resolved
Comment thread www/benchmark.mjs Resolved
Comment thread www/benchmark.mjs Resolved
Rewrites every page, package README and generator README for clarity and
accuracy against the code, and splits the docs into guides, which teach a
task with one running example, and reference pages, which list every
option. Guides link to the reference instead of repeating it.

- `index.md` becomes `introduction.md`, and a new guide covers documenting
  TypeScript and JSDoc with `@doc-kit/typedoc`.
- Every generator page follows one layout: what it makes, what it reads
  and writes, usage, options, then details.
- The specification gains a reading guide, a table of its constructs and
  examples for every directive, and resolves rules it stated as both MUST
  and SHOULD.
- Code examples whose Markdown bullets the formatter rewrote (the
  changelog, `index.md` and `llms.txt` samples) are plain text again, so
  they show what doc-kit actually reads and writes.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Gives doc-kit's own site a theme of its own, built entirely through the
html generator's public extension points (theme slots, components,
stylesheets, a template and rehype plugins), so the site doubles as an
example of customizing doc-kit.

- A home page that shows what doc-kit does: an isometric hero, the
  sources and outputs of one kittens module, the worker pool building a
  site, benchmarks and a getting-started path. Its canvases are islands
  that respect reduced motion.
- A neutral palette over `@node-core/ui-components`, with light and dark
  themes, a cat logo, Inter, and styled search and theme menus.
- Five isometric illustrations in the guides, inlined as SVG so they
  follow the color scheme, each on the one page it explains.
- The sidebar groups guides, reference, generators and packages; the
  build script also takes the site's own pages from `www/pages`, and
  leaves out the legacy-format generators and the generators documented
  on another generator's page. Redirects send their old URLs to the
  sections that now cover them.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Islands that hydrate on interaction, such as code tabs and copy buttons,
start loading their component on pointerover, focusin or touchstart. The
click or tap that follows lands before the component exists, so it did
nothing and had to be repeated.

The runtime now holds an interaction island's presses until it is
hydrated, then dispatches them again, each once the innermost island
around it is ready. The site's redesign surfaced this on every code
block.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
…diagrams

The diagram parser removed the XML declaration and comments with one
regex replace before tokenizing, which CodeQL flags as incomplete
multi-character sanitization: a crafted input could re-form `<!--` after
the replace. Each one already arrives as its own token, so the parser now
skips those tokens instead. The inlined diagrams are byte-for-byte the
same.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Moves `PRESS_EVENTS` into `ui/constants.mjs`, and says why only a held
click is prevented: preventing a pointerdown would also suppress the
mouse events that follow it, which are held too, and preventing a
mousedown would stop focus and text selection.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
The site's dependencies (Inter, Preact and the html generator its theme
builds on) move from the root package.json into a private `@doc-kit/www`
package, so the root only holds the repo's own tooling again. Preact still
resolves to the one copy the html generator uses.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
`www/og/og.html` is the card behind `www/public/og.png`, and
`node --run og` renders it again with Playwright, in the site's own
fonts, so the image can change with the site. It reproduces the current
image pixel for pixel.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
The home page and the introduction quote build times that were measured
by hand. `node --run benchmark` in `www/` now measures them: it builds
this site and a Node.js release's API docs, each target on its own and
all of them in one run, from a clean output every time, and writes the
medians, the page and word counts, the JavaScript the home page loads up
front, the machine and the commit to `www/theme/benchmarks.json`, which
`data.mjs` reads.

The numbers are re-measured with it: five runs each, for this site's 40
pages and the Node.js v26.12.1 API docs.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
The site builds every generator's page again, rather than folding
json-all, json-simple and llms-txt-full into their parent pages and
leaving the legacy-format package out. Their READMEs get their content
back, in the layout every generator page shares, and the legacy package's
pages are rewritten to match, checked against its code. The overview
lists them all, while the sidebar keeps to the main generators.

The page globs also merge into one, and the redirects for these pages
are gone, as they exist again.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
The home page's words and code samples now live in `www/pages/index.mdx`
instead of a JSX component, so they're edited like any other page. Its
code samples are fenced blocks, highlighted by doc-kit and shown in its
own code boxes and tabs, with their copy buttons, which replaces the
theme's own highlighter, copy button, code box, install tabs and output
tabs. What MDX can't express stays in thin components: the two canvas
animations, the sections' layout, and the hand-drawn previews and card
art.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Each topic now lives on one page and the others link to it: CLI flags in
cli.md, global options and URL templates in configuration.md, type links
in writing-docs.md, the typedoc and html READMEs as the references their
guides point to. Generator READMEs lose the shared boilerplate, and the
internal stages are trimmed down.

Snippets use `npx @doc-kit/cli` and are back to what they did on main.
The spec is back to main's, flags use the typed-list form doc-kit parses,
and statements that documented bugs as behaviour are gone.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
The heading row layout matched any div holding a heading inside <main>,
so pages that render their own headings there got it too. API entry
headings now carry a `heading` class, and the layout applies to that.

With the neutral brand palette, the selected code tab was no brighter
than the others, and in dark mode it was dimmer. It now takes the text
color, and tabs wrap on narrow screens instead of scrolling out of view.

The default template also gets a canonical link, built from `pageURL`,
and `theme-color` for both schemes.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
The home and 404 pages render a real <main> now that doc-kit's heading
layout only applies to API entries, and the code tab and canonical link
overrides are gone with doc-kit handling both.

The script marking the platform's shortcut key and the last input type
is gone too, with the CSS that read it: the search button's label and
the theme menu's focus ring come from ui-components, so their fixes go
there.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
The all page is built again, and `@node-core/doc-kit-legacy` is back in
the sidebar. The home page's components are every export of its module,
its count of generators is taken from the repository at build time, and
the footer lists the sidebar's pages instead of its own copy of them.

On the home page, the hand-drawn site and search previews are gone,
leaving the real outputs, the install tabs show up once, and the steps
end with `doc-kit preview` now that it has shipped.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
`scripts/benchmark.mjs` replaces `www/benchmark.mjs`, without the word
counts and the copy of the site's sources, and builds every Markdown file
in Node.js's `doc/api` instead of leaving `quic.md` out by hand. The home
page's data no longer spells out numbers, and the numbers are refreshed.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Each SVG now carries its own styles, light and dark colors, timing, and
the subset of Inter and IBM Plex Mono it uses, so it renders the same as
a plain image on the site and on GitHub. Images follow the page's color
scheme, so they also follow the site's theme switch. The site's rehype
plugin that inlined them and the stylesheets that styled them are gone.

The motion plays once and holds on the finished picture, which is also
what reduced motion shows, instead of looping. dependent.svg no longer
shows connectors from section-pages before it has landed, the chips in
entry-anatomy.svg sit inside the editor so no leader crosses its edge,
and chip labels get more room at their ends.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
The hero and the pipeline are exported SVGs now, with a narrower drawing
of each for phones, and the canvas engine that drew them at runtime, with
its two islands, is gone. They're drawn from the same build simulation
and layout the canvas used, so they show the same run, and like the
guides' diagrams they carry their own styles and fonts and follow the
color scheme.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
ui-components styles everything in a <main> as an article's prose: link
colors, heading sizes and spacing, beyond the heading layout doc-kit
now scopes to API entries. The home and 404 pages lay out their own
content, so they mark it with `role="main"` rather than undo all of it.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
A domed brow between the ears instead of a flat one, softer ear tips,
fuller cheeks and a rounder jaw and nose, in the mark, the favicon, the
app icon, the hero and the social card. The social card lists only the
inputs doc-kit reads itself.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
@ovflowd

ovflowd commented Oct 29, 2026

Copy link
Copy Markdown
Member Author

Thanks for going through all of it, and yeah, fair point on the size. This round should be a lot leaner. The docs and READMEs link to one place instead of repeating each other, the snippets match main again, and the canvas engine and the diagram plumbing are gone in favor of exported SVGs. The theme workarounds also became proper fixes in doc-kit itself. All in all the hand-written diff went from +16k to +9.7k lines.

For the branding (Kit, the tagline and the colors) I opened #1197 so we can figure it out there. The PR keeps them as placeholders until we do.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
@ovflowd

ovflowd commented Oct 29, 2026

Copy link
Copy Markdown
Member Author

Latest Preview: https://feat-site-redesign-doc-kit.nodejs.workers.dev/

Without them, the outputs' three code blocks sat next to each other, so
doc-kit grouped them into a second row of tabs inside the first one and
left the other two empty. The site preview now shows `options` as the
real page does, without a `?`.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
return island;
};

describe('holdPresses', () => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

it looks like there's a keyboard activation edge case here. if an island starts hydration from a keyboard-generated click, holdPresses() attaches its listeners after that click has already dispatched, so there's no later click to replay. mouse input can still work since pointerdown happens before click.

could we cover a first activation via Enter/Space in a browser test and make sure the intended button action runs after hydration? we may need to retain the triggering event itself when it's a click.

This branch was successfully deployed

1 active deployment
Preview – api-docs-tooling — e0d7ced1 Deployed Oct 29, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants