<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nikhil Kumar Rajak</title>
    <description>The latest articles on DEV Community by Nikhil Kumar Rajak (@ryzrr).</description>
    <link>https://dev.to/ryzrr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980574%2Fb672cff1-96b6-4d0a-bb25-47921a808dd6.png</url>
      <title>DEV Community: Nikhil Kumar Rajak</title>
      <link>https://dev.to/ryzrr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryzrr"/>
    <language>en</language>
    <item>
      <title>Making webpack's Docs Update Themselves | GSoC 2026, wrapped</title>
      <dc:creator>Nikhil Kumar Rajak</dc:creator>
      <pubDate>Sun, 23 Aug 2026 12:36:05 +0000</pubDate>
      <link>https://dev.to/ryzrr/making-webpacks-docs-update-themselves-gsoc-2026-wrapped-2jmn</link>
      <guid>https://dev.to/ryzrr/making-webpacks-docs-update-themselves-gsoc-2026-wrapped-2jmn</guid>
      <description>&lt;p&gt;&lt;strong&gt;Contributor:&lt;/strong&gt; Nikhil Kumar Rajak (&lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;@ryzrr&lt;/a&gt;)&lt;br&gt;
&lt;strong&gt;Organization:&lt;/strong&gt; &lt;a href="https://github.com/webpack" rel="noopener noreferrer"&gt;webpack&lt;/a&gt; · &lt;strong&gt;Project:&lt;/strong&gt; &lt;a href="https://github.com/webpack/webpack-doc-kit" rel="noopener noreferrer"&gt;webpack-doc-kit&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Mentors:&lt;/strong&gt; Aviv Keller (&lt;a href="https://github.com/avivkeller" rel="noopener noreferrer"&gt;@avivkeller&lt;/a&gt;), Claudio Wunder (&lt;a href="https://github.com/ovflowd" rel="noopener noreferrer"&gt;@ovflowd&lt;/a&gt;), Sebastian Beltran (&lt;a href="https://github.com/bjohansebas" rel="noopener noreferrer"&gt;@bjohansebas&lt;/a&gt;)&lt;br&gt;
&lt;strong&gt;Teammates:&lt;/strong&gt; Mohamed Shams El-Deen (&lt;a href="https://github.com/moshams272" rel="noopener noreferrer"&gt;@moshams272&lt;/a&gt;), Tushar Thakur (&lt;a href="https://github.com/TusharThakur04" rel="noopener noreferrer"&gt;@TusharThakur04&lt;/a&gt;)&lt;br&gt;
&lt;strong&gt;Period:&lt;/strong&gt; 25 May to 17 August 2026&lt;/p&gt;


&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;webpack's docs lived at webpack.js.org and every API change meant somebody updating them by hand. Pages go stale and nobody notices until a reader does.&lt;/p&gt;

&lt;p&gt;webpack-doc-kit fixes that. It takes webpack's TypeScript declarations, runs them through TypeDoc, hands the output to &lt;a href="https://github.com/nodejs/doc-kit" rel="noopener noreferrer"&gt;nodejs/doc-kit&lt;/a&gt; for linking and UI, and produces a site that regenerates itself.&lt;/p&gt;

&lt;p&gt;We split the work three ways. Shams took AST parsing and content, Tushar took routing and navigation and UI, and I took the operational side: how docs get generated on a release, versioned &amp;amp; deployed.&lt;/p&gt;

&lt;p&gt;My six deliverables were PR-based doc sync, release-aware doc generation, versioned output folders, a deployment pipeline, CI validation before merge, and README fetch automation. &lt;strong&gt;All six shipped.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Merged PRs in webpack-doc-kit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines added / removed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+1,959 / −1,419&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distinct files touched&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First / last merge&lt;/td&gt;
&lt;td&gt;28 May (&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/110" rel="noopener noreferrer"&gt;#110&lt;/a&gt;) / 14 Aug (&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/241" rel="noopener noreferrer"&gt;#241&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merged PRs in other repos&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upstream issue filed and fixed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything below is merged into &lt;code&gt;main&lt;/code&gt;. Nothing is open or pending.&lt;/p&gt;


&lt;h2&gt;
  
  
  The release pipeline
&lt;/h2&gt;

&lt;p&gt;webpack releases happen in &lt;code&gt;webpack/webpack&lt;/code&gt;. The docs live in &lt;code&gt;webpack/webpack-doc-kit&lt;/code&gt;. A release in one needs to produce updated docs in the other with nobody doing anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/110" rel="noopener noreferrer"&gt;#110&lt;/a&gt;&lt;/strong&gt; set up &lt;code&gt;versions.json&lt;/code&gt; as the single source of truth everything downstream reads, plus the script that maintains it and the workflow that runs it.&lt;/p&gt;

&lt;p&gt;My mentor proposed an object schema with &lt;code&gt;latest&lt;/code&gt;, &lt;code&gt;label&lt;/code&gt;, &lt;code&gt;major&lt;/code&gt;, &lt;code&gt;exactVersion&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt; and &lt;code&gt;frozen&lt;/code&gt; per entry. Review cut it to a flat array of tag strings, because everything else is derivable from the semver string and position &lt;code&gt;[0]&lt;/code&gt; with &lt;code&gt;unshift()&lt;/code&gt; already tells you which is latest. Right call, and I didn't see it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script validates with &lt;code&gt;semver&lt;/code&gt;, finds any entry with the same major, replaces in place or unshifts to the front. The workflow runs it on &lt;code&gt;workflow_dispatch&lt;/code&gt; and opens a draft PR, with every action SHA pinned. That trigger was itself a review correction: I'd reached for something else before realising releases fire in a different repo entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/116" rel="noopener noreferrer"&gt;#116&lt;/a&gt;&lt;/strong&gt; removed a &lt;code&gt;commit&lt;/code&gt; input I'd added on the belief that cross-repo triggering needed it. Review asked why. It didn't. Opening a PR to delete your own code is a bit humbling, but the workflow came out correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack/pull/21074" rel="noopener noreferrer"&gt;webpack/webpack#21074&lt;/a&gt;&lt;/strong&gt; is the dispatching half, in the core repo. It runs after release, finds &lt;code&gt;webpack&lt;/code&gt; in the published-packages list, and calls &lt;code&gt;createWorkflowDispatch&lt;/code&gt; against webpack-doc-kit's &lt;code&gt;release.yml&lt;/code&gt; with &lt;code&gt;tag: "v" + pkg.version&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Review caught two things. I'd interpolated a GitHub Actions &lt;code&gt;${{ }}&lt;/code&gt; expression straight into JavaScript, which moved to an env value parsed with &lt;code&gt;JSON.parse&lt;/code&gt;. And I picked the published package by index &lt;code&gt;[0]&lt;/code&gt; instead of by name, which works right up until it doesn't.&lt;/p&gt;

&lt;p&gt;The version running today isn't quite that one. Two weeks after it merged, Aviv replaced the credential in &lt;a href="https://github.com/webpack/webpack/pull/21082" rel="noopener noreferrer"&gt;#21082&lt;/a&gt;: the &lt;code&gt;DISPATCH_TOKEN&lt;/code&gt; PAT became a GitHub App installation token, minted in a preceding step by &lt;code&gt;actions/create-github-app-token&lt;/code&gt; from &lt;code&gt;BOT_APP_ID&lt;/code&gt; and &lt;code&gt;BOT_PRIVATE_KEY&lt;/code&gt; and handed to &lt;code&gt;github-script&lt;/code&gt; as &lt;code&gt;steps.app-token.outputs.token&lt;/code&gt;. A PAT is one person's account and one person's scope, sitting in the secret store until someone remembers to rotate it. An app token is org-owned, scoped to the app's installation, and expires within the hour. &lt;code&gt;secrets.GITHUB_TOKEN&lt;/code&gt; was never an option here, it can't reach another repository, which is the entire reason a second credential exists in the first place. He also renamed the job from &lt;code&gt;trigger-webpack-doc-kit&lt;/code&gt; to &lt;code&gt;trigger-documentation-update&lt;/code&gt;, and left the script itself alone with both fixes included.&lt;/p&gt;

&lt;p&gt;Full chain: webpack publishes, core dispatches, it updates &lt;code&gt;versions.json&lt;/code&gt;, opens a PR, Vercel builds a preview, maintainer merges.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fetching content across the ecosystem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/122" rel="noopener noreferrer"&gt;#122&lt;/a&gt;&lt;/strong&gt; automated pulling in loaders and plugins READMEs from across the org. At +612/−968 across 10 files, my second largest change. It pages through the org's public repos following &lt;code&gt;rel="next"&lt;/code&gt; in the &lt;code&gt;Link&lt;/code&gt; header, skips archived ones, sorts the rest by name suffix, then fetches, cleans and writes each README with a generated &lt;code&gt;site.json&lt;/code&gt; for the sidebar. Review made &lt;code&gt;GH_TOKEN&lt;/code&gt; optional, since it threw when unset and would have broken local builds.&lt;/p&gt;

&lt;p&gt;The harder problem was that the generated &lt;code&gt;site.json&lt;/code&gt; files weren't picked up at all. Fix was converting the root site config from JSON to an &lt;code&gt;.mjs&lt;/code&gt; module that imports and concatenates them, because a committed file can import uncommitted generated ones. That's why &lt;code&gt;pages/site.mjs&lt;/code&gt; exists.&lt;/p&gt;

&lt;p&gt;I also hit a build failure I couldn't explain at first: unknown language tags in code fences caused a fatal Shiki error and an empty output folder. This was fixed upstream in the Node.js repo by my mentor. More information on it is in the PR review comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/140" rel="noopener noreferrer"&gt;#140&lt;/a&gt;&lt;/strong&gt; pulled cleanup out of both fetch scripts into one shared &lt;code&gt;sanitize.mjs&lt;/code&gt;. My version inlined the patterns in each helper; review suggested hoisting every regex to a named constant and splitting cleanup into exported step functions composed through a &lt;code&gt;STEPS&lt;/code&gt; array. That's what merged and it reads better. The key export rewrites relative links through a caller-supplied resolver, which matters because READMEs point back at their own repo while governance docs point at their migrated page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/127" rel="noopener noreferrer"&gt;#127&lt;/a&gt;&lt;/strong&gt; did the same for webpack's governance docs. The part I like is that one ordered &lt;code&gt;FILE_MAP&lt;/code&gt; drives output slugs, sidebar labels, sidebar order and the link rewrite table, derived with &lt;code&gt;Object.fromEntries&lt;/code&gt; so they can't drift. Adding a doc is a one-line change. I caught a bug myself before review: nested sidebar groups key off &lt;code&gt;label&lt;/code&gt; while only top-level groups use &lt;code&gt;groupName&lt;/code&gt;, and mixing them up renders wrong in a way that's easy to miss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/215" rel="noopener noreferrer"&gt;#215&lt;/a&gt;&lt;/strong&gt; fixed "Edit this page" pointing at a file that doesn't exist in this repo. Needed a &lt;code&gt;source&lt;/code&gt; frontmatter with a GitHub edit URL, which turned out to be more than a string change: GitHub's &lt;code&gt;/edit/&lt;/code&gt; route needs a real branch name, and &lt;code&gt;HEAD&lt;/code&gt; works for raw reads and silently doesn't work for editing. So repo discovery had to start capturing each repo's actual &lt;code&gt;default_branch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/137" rel="noopener noreferrer"&gt;#137&lt;/a&gt;&lt;/strong&gt; wrapped every external fetch in a retry helper after deploys started failing on transient 503s:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;baseDelay&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;baseDelay&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It honours a &lt;code&gt;retry-after&lt;/code&gt; header when the server sends one instead of guessing. A sustained outage still fails the build, because shipping docs with half the content missing is worse than not shipping.&lt;/p&gt;




&lt;h2&gt;
  
  
  CI and validation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/146" rel="noopener noreferrer"&gt;#146&lt;/a&gt;&lt;/strong&gt; builds the site on every PR, caching webpack sources keyed on a hash of &lt;code&gt;versions.json&lt;/code&gt; and uploading the output as an artifact so there's a downloadable version available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/155" rel="noopener noreferrer"&gt;#155&lt;/a&gt;&lt;/strong&gt; added CodeQL on PRs, pushes to main, and a weekly schedule. &lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/157" rel="noopener noreferrer"&gt;#157&lt;/a&gt;&lt;/strong&gt; added zizmor, which lints GitHub Actions workflows themselves, and in the same pass added &lt;code&gt;persist-credentials: false&lt;/code&gt; to every existing checkout step in the repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/170" rel="noopener noreferrer"&gt;#170&lt;/a&gt;&lt;/strong&gt; added dependency review. My version shipped a license allow and deny list; review cut it, because the project has no license policy and the config would have been inventing one. The merged step has no configuration at all, which is the right amount.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/192" rel="noopener noreferrer"&gt;#192&lt;/a&gt;&lt;/strong&gt; was my largest change and the most reviewed. 232 lines across four files, running Lighthouse against the Vercel preview on every PR and posting a score table.&lt;/p&gt;

&lt;p&gt;It's a two-workflow split. The audit runs unprivileged and uploads its result as an artifact; a second workflow triggered on completion, holding &lt;code&gt;pull-requests: write&lt;/code&gt;, picks it up and posts. You can't give write access to a job that checked out untrusted fork code, so the split is what makes it safe rather than just convenient. Thresholds warn rather than error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"performance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"warn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minScore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deliberate. A blocking gate on day one is a gate people learn to route around. The workflows are adapted from nodejs.org and carry an &lt;code&gt;Adapted from&lt;/code&gt; header at review's request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/195" rel="noopener noreferrer"&gt;#195&lt;/a&gt;&lt;/strong&gt; replaced the bare &lt;code&gt;/docs&lt;/code&gt; and &lt;code&gt;/guides&lt;/code&gt; entries with eight URLs covering one render path each, since auditing only index pages measures the path least likely to regress. This PR only exists because I implemented the change in review, then didn't commit it before #192 merged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/196" rel="noopener noreferrer"&gt;#196&lt;/a&gt;&lt;/strong&gt; fixed the contrast and accessible-name failures the audit surfaced. The theme toggle and GitHub link got real accessible names instead of being unlabelled buttons to a screen reader. Merged under five hours after #192, which is the whole argument for shipping it advisory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/210" rel="noopener noreferrer"&gt;#210&lt;/a&gt;&lt;/strong&gt; fixed the audit failing constantly. On &lt;code&gt;pull_request&lt;/code&gt; it started before Vercel had a preview and spent five minutes polling a URL that didn't exist. Fix was to stop racing the deploy and be triggered by it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deployment_status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That also let me delete a third-party wait action. But it cost something I didn't expect: &lt;code&gt;deployment_status&lt;/code&gt; carries no PR context, so the number has to be recovered through &lt;code&gt;listPullRequestsAssociatedWithCommit&lt;/code&gt; and written into the artifact for the commenting workflow to find.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It warns instead of failing, since a missing comment beats a red X on a PR whose scores were fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/234" rel="noopener noreferrer"&gt;#234&lt;/a&gt;&lt;/strong&gt; added path-based labelling across seven categories. The trigger is the interesting bit: labelling a fork PR needs write access, which &lt;code&gt;pull_request&lt;/code&gt; can't grant, so this uses &lt;code&gt;pull_request_target&lt;/code&gt; with an explicit zizmor ignore. Safe only because the job never checks out PR code, and the annotation is in the file so the next person knows why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/135" rel="noopener noreferrer"&gt;#135&lt;/a&gt;&lt;/strong&gt; fixed three small things. Our &lt;code&gt;.jsx&lt;/code&gt; components were silently skipped by ESLint because no config block covered them. A typo in the lint-staged glob had &lt;code&gt;json.yml&lt;/code&gt; as one extension instead of two, so neither matched. And CI had no concurrency, so stale runs didn't cancel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docs migration and site fixes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/163" rel="noopener noreferrer"&gt;#163&lt;/a&gt;, &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/168" rel="noopener noreferrer"&gt;#168&lt;/a&gt;, &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/177" rel="noopener noreferrer"&gt;#177&lt;/a&gt;, &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/185" rel="noopener noreferrer"&gt;#185&lt;/a&gt;&lt;/strong&gt; took &lt;code&gt;pages/&lt;/code&gt; from 130 &lt;code&gt;#TODO[...]&lt;/code&gt; placeholder links to zero. Slicing it into batches worked: the last touched 35 files and merged with zero inline comments, because the earlier rounds had settled what a valid target looks like.&lt;/p&gt;

&lt;p&gt;The best decision was in #163. Instead of pinning links at &lt;code&gt;/docs/api/v5.x/...&lt;/code&gt;, review steered them at unversioned paths with a Vercel redirect sending anything without a version segment to the current major, and &lt;code&gt;update-versions.mjs&lt;/code&gt; rewriting that redirect when the version changes. Links survive a major bump without anyone editing them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/168" rel="noopener noreferrer"&gt;#168&lt;/a&gt;&lt;/strong&gt; also converted legacy admonition markers to GFM alert syntax and added a Magic Comments section to the code splitting guide, because several resolved links needed a target that didn't exist yet. One rule came out of it: a TODO isn't resolved because the URL returns 200, it's resolved when the target is reachable from navigation. Where no good target existed, links got unwrapped to plain text instead, since a dead link is worse than no link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/153" rel="noopener noreferrer"&gt;#153&lt;/a&gt;&lt;/strong&gt; added real landing pages for &lt;code&gt;/docs/loaders&lt;/code&gt; and &lt;code&gt;/docs/plugins&lt;/code&gt;, which the footer was already linking to. The tricky part wasn't content, it was ignore rules: per-package pages there are generated and ignored, but these two are hand-written and need to stay tracked, so both ignore files changed to a contents glob plus a negation for &lt;code&gt;index.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/160" rel="noopener noreferrer"&gt;#160&lt;/a&gt;&lt;/strong&gt; added the API version picker. My first approach to detecting the current version pattern-matched against the sidebar JSON. It worked, but review pointed out the theme config already exposes it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#theme/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check whether the boring solution already exists before reaching for a clever one. The same PR fixed the governance overview never highlighting, because it generated as &lt;code&gt;/about/governance/index&lt;/code&gt; rather than the directory route.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/171" rel="noopener noreferrer"&gt;#171&lt;/a&gt;&lt;/strong&gt; fixed no top-level nav item ever highlighting, because the shared NavBar was never told which page it was rendering. Fixing it exposed that the two URL helpers disagreed about slashes, one stripping a leading slash and the other re-adding it, so versioned paths came out doubled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/223" rel="noopener noreferrer"&gt;#223&lt;/a&gt;&lt;/strong&gt; was the same class of bug three weeks later: two places still building sidebar links by string concatenation instead of the helper that already existed. Three lines. That's when I stopped treating these as individual bugs. The helper it uses was written by Shams, and a lot of what made the back half of the summer faster was one of us fixing something the other two could then just use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/228" rel="noopener noreferrer"&gt;#228&lt;/a&gt;&lt;/strong&gt; added category rules for five namespaces whose pages were generated, reachable by URL, and invisible in navigation. Content the site already had and wasn't showing. That surfaced a second problem immediately, nested namespaces all collapsing onto the same "Overview" label, fixed with a depth guard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/191" rel="noopener noreferrer"&gt;#191&lt;/a&gt;&lt;/strong&gt; replaced six hand-written homepage SVGs with Lucide icons. My first version moved them into a dedicated file, still hand-authored; review suggested a library instead. My one concern was licensing, which was a non-issue since Lucide ships its license in source. The second commit deleted the file I'd just written. Net −108 lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/231" rel="noopener noreferrer"&gt;#231&lt;/a&gt;&lt;/strong&gt; stopped the homepage config section jumping on tab switch, by giving the code block a minimum height in line-heights rather than pixels, so the floor tracks the code font instead of quietly breaking next time type sizing changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/236" rel="noopener noreferrer"&gt;#236&lt;/a&gt;&lt;/strong&gt; moved the footer social links into the brand column wrapped in a labelled nav, so the group gets announced properly, and added Bluesky. &lt;strong&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/241" rel="noopener noreferrer"&gt;#241&lt;/a&gt;&lt;/strong&gt; switched the theme toggle to doc-kit's island component, which owns its own state, and wrapped the sidebar as an island hydrated on idle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Upstream
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/nodejs/nodejs.org/pull/8999" rel="noopener noreferrer"&gt;nodejs/nodejs.org#8999&lt;/a&gt;&lt;/strong&gt; fixed active nav link matching in the shared UI components package, which compared only the first path segment, so &lt;code&gt;/about&lt;/code&gt; and &lt;code&gt;/about/sponsors&lt;/code&gt; highlighted together. The fix makes the longest matching prefix win:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;active&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;allowSubPath&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A link only matches when the pathname equals it or begins with it followed by a slash, so &lt;code&gt;/about&lt;/code&gt; doesn't match &lt;code&gt;/about-us&lt;/code&gt;. Shipped with eight test cases. Node's own nav is unaffected since its items are single segment; this matters for consumers with nested navigation, which is us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/nodejs/doc-kit/issues/831" rel="noopener noreferrer"&gt;nodejs/doc-kit#831&lt;/a&gt;&lt;/strong&gt; is an issue I filed rather than code I wrote, included for what it unblocked. doc-kit rendered GitHub alert syntax as plain blockquotes, since &lt;code&gt;remark-gfm&lt;/code&gt; doesn't cover it. A maintainer implemented native support in &lt;a href="https://github.com/nodejs/doc-kit/pull/832" rel="noopener noreferrer"&gt;#832&lt;/a&gt; five days later, and that's what #168 relies on. Reporting it upstream fixed it for every doc-kit consumer instead of just us.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current state
&lt;/h2&gt;

&lt;p&gt;The pipeline is complete and running. A webpack release now produces updated docs without manual intervention. Every PR gets built, scanned by CodeQL and zizmor, checked for vulnerable dependencies, audited by Lighthouse against its own preview, and labelled by what it touched.&lt;/p&gt;

&lt;p&gt;All six deliverables landed. All 31 PRs are merged. What's left is the cutover from webpack.js.org, which sits with the maintainers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's left
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lighthouse assertions are still advisory.&lt;/strong&gt; All four categories warn. Once scores are stable across the eight audited URLs, accessibility is the obvious first candidate to promote to error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The banner is manual.&lt;/strong&gt; &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/151" rel="noopener noreferrer"&gt;#151&lt;/a&gt; landed as a hand-edited config after review argued maintainers sometimes need it to say something other than the latest release. A hybrid was discussed and deferred: manual config when present, latest blog post for a month otherwise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;None of my 31 PRs shipped tests.&lt;/strong&gt; Fine for CSS and link rewrites. Less fine for the Lighthouse formatting script and the category rules, both pure functions in a repo that now has a test harness. My teammate Shams is steadily writing tests and I'll be assisting him, so this one is a work in progress rather than an open gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Picking the right trigger is the real design decision in a CI workflow.&lt;/strong&gt; Across five CI pull requests I ended up using four different triggers, each one for a good reason and each one with a downside. When I moved away from &lt;code&gt;pull_request&lt;/code&gt;, the workflow finally ran reliably, but I lost all the PR context that trigger used to give me automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review kept making the diff smaller.&lt;/strong&gt; Drop the license allowlist for a policy that doesn't exist. Use a library instead of hand-writing SVGs. Use the helper that already exists. Reduce the version schema because the rest is derivable. Almost every suggestion removed code rather than adding it, which is really a lesson about code quality that I picked up here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any hand-built URL string in this codebase was a bug waiting.&lt;/strong&gt; Four PRs, four symptoms, same root cause. The fix wasn't finding them all, it was routing everything through the shared helpers so new ones can't appear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI is only worth adding if someone acts on it.&lt;/strong&gt; Non-blocking is what got Lighthouse merged. Acting on it the same afternoon is what stopped it becoming another green badge nobody reads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix it upstream when you can.&lt;/strong&gt; The alert syntax thing could have been worked around locally. Reporting it meant every doc-kit consumer got it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Push the change you agreed to before asking for merge.&lt;/strong&gt; #195 exists because I didn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks
&lt;/h2&gt;

&lt;p&gt;To my mentors, Aviv Keller, Claudio Wunder and Sebastian Beltran, and special thanks to Alex and Even. Most of my PRs are better specifically because my first approach got pushed back on.&lt;/p&gt;

&lt;p&gt;To Shams and Tushar, for constant back-and-forth about where our three pieces met. And to the wider webpack team, for running an org where a first-time contributor gets treated as a contributor.&lt;/p&gt;




&lt;h2&gt;
  
  
  All merged pull requests
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;webpack/webpack-doc-kit&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PR&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/110" rel="noopener noreferrer"&gt;#110&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat: add versions.json version metadata contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/116" rel="noopener noreferrer"&gt;#116&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat: simplify release.yml&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/122" rel="noopener noreferrer"&gt;#122&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat: automate fetching and sanitization of webpack ecosystem readmes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/127" rel="noopener noreferrer"&gt;#127&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat: add governance docs fetcher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/135" rel="noopener noreferrer"&gt;#135&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;chore: lint jsx components and add ci concurrency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/137" rel="noopener noreferrer"&gt;#137&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(build): retry transient fetch fails during build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/140" rel="noopener noreferrer"&gt;#140&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat: sanitized fetched docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/146" rel="noopener noreferrer"&gt;#146&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ci: run site build on PRs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/151" rel="noopener noreferrer"&gt;#151&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat(banner): show latest webpack release instead of Node.js banner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/153" rel="noopener noreferrer"&gt;#153&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat(docs): add loaders and plugins index pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/155" rel="noopener noreferrer"&gt;#155&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ci: add CodeQL scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/157" rel="noopener noreferrer"&gt;#157&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ci: add zizmor scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/160" rel="noopener noreferrer"&gt;#160&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix: version picker to the API docs and highlight the overview as active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/163" rel="noopener noreferrer"&gt;#163&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(docs): resolve the guide TODOs for the plugin to its API references&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/168" rel="noopener noreferrer"&gt;#168&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(docs): resolve few more guide TODOs links and fixed warning tags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/170" rel="noopener noreferrer"&gt;#170&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ci: add dependency review workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/171" rel="noopener noreferrer"&gt;#171&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(theme): pass pathname to NavBar for active link highlighting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/177" rel="noopener noreferrer"&gt;#177&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(guides): resolve few more TODOs links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/185" rel="noopener noreferrer"&gt;#185&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(guides): resolve remaining TODO reference links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/191" rel="noopener noreferrer"&gt;#191&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat(home): add custom feature-section icons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/192" rel="noopener noreferrer"&gt;#192&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ci: add Lighthouse audits on pull requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/195" rel="noopener noreferrer"&gt;#195&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(ci): audit one page per type in Lighthouse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/196" rel="noopener noreferrer"&gt;#196&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(a11y): resolve axe color-contrast and accessible-name failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/210" rel="noopener noreferrer"&gt;#210&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(ci): run Lighthouse on deployment_status instead of pull_request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/215" rel="noopener noreferrer"&gt;#215&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(markdown): point "Edit this page" at the upstream repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/223" rel="noopener noreferrer"&gt;#223&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(url): normalize the Options link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/228" rel="noopener noreferrer"&gt;#228&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(sidebar): add groups for namespaced plugins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/231" rel="noopener noreferrer"&gt;#231&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix(home): stop config section resizing on tab switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/234" rel="noopener noreferrer"&gt;#234&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat(ci): label pull requests by changed paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/236" rel="noopener noreferrer"&gt;#236&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;feat(footer): group social links under the brand column and add Bluesky&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/webpack/webpack-doc-kit/pull/241" rel="noopener noreferrer"&gt;#241&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fix: use doc-kit's island theme toggle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;webpack/webpack&lt;/strong&gt; · &lt;a href="https://github.com/webpack/webpack/pull/21074" rel="noopener noreferrer"&gt;#21074&lt;/a&gt; ci: trigger webpack-doc-kit release workflow on publish&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nodejs/nodejs.org&lt;/strong&gt; · &lt;a href="https://github.com/nodejs/nodejs.org/pull/8999" rel="noopener noreferrer"&gt;#8999&lt;/a&gt; fix: navbar active link should match the most specific path&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nodejs/doc-kit&lt;/strong&gt; · &lt;a href="https://github.com/nodejs/doc-kit/issues/831" rel="noopener noreferrer"&gt;#831&lt;/a&gt; feat: Add support for GitHub Alerts natively (filed, fixed upstream in &lt;a href="https://github.com/nodejs/doc-kit/pull/832" rel="noopener noreferrer"&gt;#832&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webpack</category>
      <category>gsoc2026</category>
    </item>
    <item>
      <title>GSoC 2026 with webpack | weeks 3 to 6 - a lot happened</title>
      <dc:creator>Nikhil Kumar Rajak</dc:creator>
      <pubDate>Sun, 05 Jul 2026 13:34:45 +0000</pubDate>
      <link>https://dev.to/ryzrr/gsoc-2026-with-webpack-weeks-3-to-6-a-lot-happened-7e2</link>
      <guid>https://dev.to/ryzrr/gsoc-2026-with-webpack-weeks-3-to-6-a-lot-happened-7e2</guid>
      <description>&lt;p&gt;Hey, ryzrr back 🙌. a lot shipped since the last post so let's get into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  what i shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/127" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat: add governance docs fetcher under pages/contribute/governance
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#127&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/127" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 09, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;
Adds a script &lt;code&gt;scripts/markdown/governance.mjs&lt;/code&gt;  that fetches the webpack governance repository's markdown files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What kind of change does this PR introduce?&lt;/strong&gt;
Automated governance docs fetching.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Did you add tests for your changes?&lt;/strong&gt;
No&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this PR introduce a breaking change?&lt;/strong&gt;
No&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If relevant, what needs to be documented once your changes are merged or what have you already documented?&lt;/strong&gt;
None&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use of AI&lt;/strong&gt;
For  Regex  logic and lookaheads&lt;/p&gt;


    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/127" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/strong&gt; - governance docs fetcher, pulls webpack governance docs at build time and renders them under &lt;code&gt;/about/governance&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/146" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        ci: run site build on PRs
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#146&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/146" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 18, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Adds the CI Build  to run on every PR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What kind of change does this PR introduce?&lt;/strong&gt;
CI Addition&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Did you add tests for your changes?&lt;/strong&gt;
Not Needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does this PR introduce a breaking change?&lt;/strong&gt;
No&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If relevant, what needs to be documented once your changes are merged or what have you already documented?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;None
&lt;strong&gt;Use of AI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/146" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/strong&gt; - CI now builds the site on every PR and uploads the artifact for downloadble version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/151" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat(banner): show latest webpack release instead of Node.js banner
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#151&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/151" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 20, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fixes : #143
&lt;strong&gt;Summary&lt;/strong&gt;
Bugfix + feature  :-  fixes the Node.js banner leaking in and shows a webpack release banner instead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What kind of change does this PR introduce?&lt;/strong&gt;
Feat&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Did you add tests for your changes?&lt;/strong&gt;
No&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does this PR introduce a breaking change?&lt;/strong&gt;
no&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If relevant, what needs to be documented once your changes are merged or what have you already documented?&lt;/strong&gt;
NA&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use of AI&lt;/strong&gt;
for regex&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/151" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/strong&gt; - release banner, auto-script approach got dropped in favour of a hand-edited self-documenting JSON config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/155" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        ci: add CodeQL scanning
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#155&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/155" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 22, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;
Adds a CodeQL security-scanning&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What kind of change does this PR introduce?&lt;/strong&gt;
CI/tooling&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did you add tests for your changes?&lt;/strong&gt;
No&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this PR introduce a breaking change?&lt;/strong&gt;
No&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If relevant, what needs to be documented once your changes are merged or what have you already documented?&lt;/strong&gt;
NA&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use of AI&lt;/strong&gt;
No&lt;/p&gt;


    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/155" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
 / #157&lt;/strong&gt; - CodeQL and zizmor scanning, both merged clean&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/160" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        fix : version picker to the API docs and highlight the overview as active
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#160&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/160" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 29, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;
Adds   the  version picker and the fixup  to make overview in the governance section  as  active (highlighted)&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What kind of change does this PR introduce?&lt;/strong&gt;
Fixes some Bug and one improvement&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did you add tests for your changes?&lt;/strong&gt;
NO&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this PR introduce a breaking change?&lt;/strong&gt;
NO&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If relevant, what needs to be documented once your changes are merged or what have you already documented?&lt;/strong&gt;
NA&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use of AI&lt;/strong&gt;
for the  regex  and testing&lt;/p&gt;


    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/160" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/strong&gt; - version picker on API docs + sidebar active-state fix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/153" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat(docs): add loaders and plugins index pages
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#153&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/153" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 21, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;This adds the loaders and plugins index pages, so &lt;code&gt;/docs/loaders&lt;/code&gt; and &lt;code&gt;/docs/plugins&lt;/code&gt; finally point to real landing pages instead of dead links (the footer already linked to them). I copied the content over from webpack.js.org and fixed up the links: our own loaders/plugins point to their local pages, built-in plugins point to their API docs, and the third-party ones keep their npm/GitHub links.&lt;/p&gt;
&lt;p&gt;This also unblocks the &lt;code&gt;#TODO[/loaders]&lt;/code&gt; and &lt;code&gt;#TODO[/plugins]&lt;/code&gt; markers in the guides from #147, since they now have somewhere to go.&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/153" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/strong&gt; - loaders and plugins index landing pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/163" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        fix(docs): resolve the guide TODOs for the plugin to its API references
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#163&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/163" rel="noopener noreferrer"&gt;&lt;time&gt;Jul 03, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Issue - #158&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;
Fixes some of the  TODOs  links&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What kind of change does this PR introduce?&lt;/strong&gt;
Fixing the  Todos&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did you add tests for your changes?&lt;/strong&gt;
No&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this PR introduce a breaking change?&lt;/strong&gt;
No&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If relevant, what needs to be documented once your changes are merged or what have you already documented?&lt;/strong&gt;
NA&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use of AI&lt;/strong&gt;
Yes.&lt;/p&gt;


    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/163" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/strong&gt; - resolved guide TODO placeholder links to plugin API references&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  what I actually learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;one table should drive everything&lt;/strong&gt;&lt;br&gt;
Thanks to my mentor for this clear direction,&lt;br&gt;
for the governance fetcher, i built a single &lt;code&gt;FILE_MAP&lt;/code&gt; that drives output slugs, sidebar labels, link rewrites, and output order. adding a new governance doc is a one-line change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FILE_MAP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;README.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Overview&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CHARTER.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;charter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Charter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pageLink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/about/governance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`/about/governance/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of scattering config across multiple files, one source of truth means one place to change. took me a bit to land on this but it made everything downstream cleaner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;automation vs manual control is a real design work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;my first cut of the release banner was fully automated, script pulls the latest release and generates the banner. clean in theory. but there are real situations where a maintainer needs the banner to say something specific and automation just gets in the way.&lt;/p&gt;

&lt;p&gt;so we decided going up with a self-documenting JSON config instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"//"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"To put a banner up, copy 'example' into 'index' and edit the text."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"type is 'default' (blue), 'warning' (orange), or 'error' (red)."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"websiteBanners"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack 5.x.0 is now available, read the release notes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/blog/posts/your-release-post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;no entry, no banner. dead simple, no magic. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;always check if something already has what you need&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;my first approach for detecting the current version in the version picker was this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isVersioned&lt;/span&gt;
  &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sidebar&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;docs&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;api&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;v&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;x/&lt;/span&gt;&lt;span class="p"&gt;)?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pattern-matching against the sidebar JSON to extract the version. it worked, &lt;br&gt;
but i completely forgot the config already exposes it directly. the fix was simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#theme/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;versionBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isVersioned&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`/docs/api/v&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;major&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.x`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;one import, done. lesson: before doing something clever, check if the boring solution already exists somewhere in the codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;read review comments before pushing a fix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;i pushed a fixup on PR before reading the comments properly and fixed the thing. caught it myself, but coincidently it was correct. not a disaster but the kind of thing you don't forget.&lt;/p&gt;




&lt;h2&gt;
  
  
  what's next
&lt;/h2&gt;

&lt;p&gt;wrapping up loose ends mostly. identifying anything missing, catching edge cases, and generally making sure things hold up before we call it production-ready. CI hardening, filling automation gaps, and tackling the version routing things.&lt;/p&gt;

&lt;p&gt;will be back, ryzrr! &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webpack</category>
      <category>gsoc</category>
      <category>documentation</category>
    </item>
    <item>
      <title>First post of my GSoC'26 journey at webpack, more to come 🚀</title>
      <dc:creator>Nikhil Kumar Rajak</dc:creator>
      <pubDate>Sat, 20 Jun 2026 08:19:11 +0000</pubDate>
      <link>https://dev.to/ryzrr/first-post-of-my-gsoc26-journey-at-webpack-more-to-come-4p06</link>
      <guid>https://dev.to/ryzrr/first-post-of-my-gsoc26-journey-at-webpack-more-to-come-4p06</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ryzrr/gsoc-2026-with-webpack-working-on-webpack-doc-kit-228j" class="crayons-story__hidden-navigation-link"&gt;GSoC 2026 with webpack | working on webpack-doc-kit&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/ryzrr" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980574%2Fb672cff1-96b6-4d0a-bb25-47921a808dd6.png" alt="ryzrr profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ryzrr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nikhil Kumar Rajak
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nikhil Kumar Rajak
                
              
              &lt;div id="story-author-preview-content-3947414" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/ryzrr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980574%2Fb672cff1-96b6-4d0a-bb25-47921a808dd6.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nikhil Kumar Rajak&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/ryzrr/gsoc-2026-with-webpack-working-on-webpack-doc-kit-228j" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 20&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/ryzrr/gsoc-2026-with-webpack-working-on-webpack-doc-kit-228j" id="article-link-3947414"&gt;
          GSoC 2026 with webpack | working on webpack-doc-kit
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webpack"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webpack&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gsoc"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gsoc&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ryzrr/gsoc-2026-with-webpack-working-on-webpack-doc-kit-228j" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;17&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ryzrr/gsoc-2026-with-webpack-working-on-webpack-doc-kit-228j#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devjournal</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>GSoC 2026 with webpack | working on webpack-doc-kit</title>
      <dc:creator>Nikhil Kumar Rajak</dc:creator>
      <pubDate>Sat, 20 Jun 2026 08:15:53 +0000</pubDate>
      <link>https://dev.to/ryzrr/gsoc-2026-with-webpack-working-on-webpack-doc-kit-228j</link>
      <guid>https://dev.to/ryzrr/gsoc-2026-with-webpack-working-on-webpack-doc-kit-228j</guid>
      <description>&lt;p&gt;Hola, i'm ryzrr, working on webpack-doc-kit as part of GSoC 2026 with the webpack org. first post here, I know I'm a bit late 🥲 gonna keep it focused on what i actually did instead of writing a whole essay about my feelings on open source, will definitely write but in the next blog post :) &lt;/p&gt;

&lt;p&gt;my part of the project is CI/CD ,deployment automation and release awareness for the pipeline. sounds interesting ,right ? but let me tell you it's the stuff that quietly breaks everything if you get it wrong, so i'll take it.&lt;/p&gt;

&lt;h2&gt;
  
  
  community bonding
&lt;/h2&gt;

&lt;p&gt;mostly just read stuff. issues, existing pipeline code, how versioning worked before i touched anything. also figured out how my work overlaps with my team mates so we don't end up building the same thing twice by accident &amp;amp; followed by a daily conversation on Discord and discussions and  a onboarding meet.&lt;/p&gt;

&lt;p&gt;barely wrote any code this phase. felt weird at first not to be shipping anything but turns out understanding the thing you're about to automate is kind of important. who knew.&lt;/p&gt;

&lt;h2&gt;
  
  
  what i actually shipped
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;versions.json&lt;/strong&gt; - the file that tracks the latest version of the webpack release across the whole doc pipeline. had to exist before anything downstream could rely on it, so this was step one. &lt;/p&gt;
&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/110" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat: add versions.json version metadata contract
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#110&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/110" rel="noopener noreferrer"&gt;&lt;time&gt;May 26, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Links to : #105&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Summary&lt;/h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Adds &lt;code&gt;versions.json&lt;/code&gt; as the shared version metadata contract for the documentation pipeline. This is the single source of truth that &lt;code&gt;update-versions.mjs&lt;/code&gt;, &lt;code&gt;place-output.mjs&lt;/code&gt;, &lt;code&gt;release.yml&lt;/code&gt;  will all read from.&lt;/p&gt;
&lt;p&gt;Real values: &lt;code&gt;v5.x&lt;/code&gt; reflects the actual latest webpack release on npm (&lt;code&gt;5.107.1&lt;/code&gt;) and the commit matches the current &lt;code&gt;HEAD_COMMIT&lt;/code&gt;. The &lt;code&gt;v6.x&lt;/code&gt; entry has &lt;code&gt;null&lt;/code&gt; values since v6 has no npm release yet, these get filled automatically by &lt;code&gt;release.yml&lt;/code&gt; when webpack tags a v6 release.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What kind of change does this PR introduce?&lt;/h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;New file, no existing behaviour is modified.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Did you add tests for your changes?&lt;/h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Tests will come alongside &lt;code&gt;update-versions.mjs&lt;/code&gt; which reads and mutates this file. Adding them here in isolation would not be meaningful without the script that uses it.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Does this PR introduce a breaking change?&lt;/h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;No. Nothing currently depends on this file.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;If relevant, what needs to be documented?&lt;/h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Schema is already documented and  shared with the team.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Use of AI&lt;/h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Used  for writing the PR Desc.&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/110" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;readme fetch automation&lt;/strong&gt; - with this now pulls readme content of all the loaders and plugins available in the webpack ecosystem on its own instead of someone copy pasting it in manually.&lt;/p&gt;
&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/122" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat: automate fetching and sanitization of webpack ecosystem readmes
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#122&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145889151%3Fv%3D4" alt="ryzrr avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/ryzrr" rel="noopener noreferrer"&gt;ryzrr&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/webpack/webpack-doc-kit/pull/122" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 05, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Issue Link  : #103&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;
Introduced &lt;code&gt;fetch-readmes.mjs&lt;/code&gt;  which fetches the readme of all loaders and plugins present in the  webpack org and passes the md file to pipeline   to generate the documentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What kind of change does this PR introduce?&lt;/strong&gt;
New Feature (Build/Automation Script).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Did you add tests for your changes?&lt;/strong&gt;
NO&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does this PR introduce a breaking change?&lt;/strong&gt;
NO&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If relevant, what needs to be documented once your changes are merged or what have you already documented?&lt;/strong&gt;
NA&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use of AI&lt;/strong&gt;
Yes, for testing  and refinement of the regex and sanitization logic&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/webpack/webpack-doc-kit/pull/122" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;release-triggered version sync&lt;/strong&gt; - A .yml file, this is the one that keeps everything aware of the version(latest one) a github actions workflow that watches for new release tags on the core webpack repo, then raise a PR with the updates &lt;code&gt;versions.json&lt;/code&gt;, and opens up for maintainer review. vercel grabs that PR and rebuilds the docs. so a new release basically ships updated docs on its own now. feels like magic, is not magic, is just yaml.👌&lt;/p&gt;

&lt;h2&gt;
  
  
  two bugs that i encountered during my week (briefly)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;remark-alerts&lt;/strong&gt; had edge cases , like there  where no support for github remarks. spent way too long assuming i was doing something wrong before realizing it just wasn't handled. filed a feature request upstream on &lt;code&gt;nodejs/doc-kit&lt;/code&gt; instead of duct-taping around it. Thanks to my mentor , who helped me figured the root issue for this.&lt;/p&gt;
&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/nodejs/doc-kit/pull/832" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat(remark): add alert support
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#832&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/avivkeller" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F38299977%3Fv%3D4" alt="avivkeller avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/avivkeller" rel="noopener noreferrer"&gt;avivkeller&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/nodejs/doc-kit/pull/832" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 06, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fixes #831:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/user-attachments/assets/20d79083-e5f8-4636-8c22-2c23dce301da"&gt;&lt;img width="911" height="342" alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F20d79083-e5f8-4636-8c22-2c23dce301da"&gt;&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nodejs/doc-kit/pull/832" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;shiki&lt;/strong&gt; was silently failing builds on languages it didn't support. no error, no warning, just a build that quietly didn't work. found it by accident honestly 😅. glad it was now and not three weeks from now when someone else hits it in prod. Again my mentors help me out , they raised an upstream PR  for it and fixed  the issue.🙇&lt;/p&gt;
&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/nodejs/nodejs.org/pull/8952" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        fix(shiki): fallback to plaintext on unknown lang
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#8952&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/avivkeller" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F38299977%3Fv%3D4" alt="avivkeller avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/avivkeller" rel="noopener noreferrer"&gt;avivkeller&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/nodejs/nodejs.org/pull/8952" rel="noopener noreferrer"&gt;&lt;time&gt;Jun 06, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;In the event that an unknown language is added, we should fall back to &lt;code&gt;text&lt;/code&gt;, rather than fail the entire build&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nodejs/nodejs.org/pull/8952" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  what's next
&lt;/h2&gt;

&lt;p&gt;tightening up CI checks and syncing more with my teams as our pieces start overlapping. probably more to say about that next time.&lt;/p&gt;

&lt;p&gt;that's it for post one. short and sweet, like my attention span this week.&lt;br&gt;
will be back, shortly - ryzrr!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>webpack</category>
      <category>gsoc</category>
    </item>
  </channel>
</rss>
