Skip to content

All versions since 1.4.0

1.4.0

Added

  • Open Graph image generation: builds a branded 1200x630 PNG per docs page. Favicon logo, page title, and description on Northwestern purple with a light purple accent border. Slack, Teams, and social media link previews use these images.
    • Enabled by default. Set site in your Astro config. pnpm users: run pnpm add canvaskit-wasm to enable (build skips OG gracefully without it).
    • Disable with ogImage: false.
    • Adds og:image, og:image:type, og:image:width, og:image:height, og:image:alt, og:logo, twitter:image, and twitter:image:alt meta tags to every page. Overrides twitter:card to summary_large_image.
    • New dependency: astro-og-canvas.

1.5.0

Added

  • defineNorthwesternConfig config helper. Single function that returns a complete Astro config with integration ordering (mermaid → starlight), plugin registration, and Expressive Code. Replaces the manual defineConfig + starlight() + northwesternMermaid() wiring. New ./config package export.
  • Automatic Expressive Code line numbers. defineNorthwesternConfig injects pluginLineNumbers() and GitHub syntax themes (github-dark / github-light). No ec.config.mjs file needed. A Vite plugin separates serializable config from plugin instances so the <Code> Astro component continues to work.
  • Type declarations (.d.ts) shipped for all public exports.
  • OG images for changelog version pages with multi-line titles (e.g., “Changelog / 1.4.0”).
  • JSON-LD structured data on each page.
  • Unit test suite (Vitest) covering config.ts, expressive-code.ts, mermaid.ts, and rehype-table-scroll.ts. E2E tests moved to tests/e2e/. CI runs unit tests in a dedicated job.

Fixed

  • Replaced astro-og-canvas + canvaskit-wasm with satori + @resvg/resvg-wasm. pnpm users no longer need canvaskit-wasm as a direct dependency.
  • OG image generation logs a warning and disables when Starlight title is empty or site is not set, instead of crashing or producing broken URLs.
  • OG font buffer uses correct Uint8Array offset slicing instead of casting the full backing ArrayBuffer.
  • Larger OG text: title 48→56px, description 28→32px, logo 60→80px. Separate vertical (60px) and horizontal (220px) padding to avoid clipping.
  • Runtime config validation now catches invalid theme, Mermaid, and config-helper options with friendly errors at the public API boundary instead of failing later with cryptic behavior.
  • Rehype table scroll skips tables already inside .nu-table-scroll, preventing double-wrapping on incremental rebuilds.
  • Aside borders use solid brand colors (#5091cd, #008656, #ffc520, #ef553f) and a 3px left accent stripe instead of a translucent 1px box border. Dark mode borders match the text accent for each variant.

Changed

  • h1 keeps Noto Serif; h2–h6 switched to Poppins.
  • Package exports map includes types fields pointing to dist/*.d.ts for all entry points.

1.5.1

Added

  • Legacy .html redirects. Sites migrated from VuePress had every page served at <slug>.html; external bookmarks and inbound links still point there. A new legacyHtmlRedirects option on defineNorthwesternConfig (default true) scans src/content/docs and emits a redirect from <slug>.html to the canonical <slug>/ URL for every page, with the URL hash preserved on forward so deep links like #schedule-management still land on the right anchor.

1.6.0

Added

  • Fullscreen Mermaid diagrams can be downloaded as high-resolution PNG files. PNG exports render at up to 4× the diagram’s intrinsic size, use the active Mermaid theme’s configured canvas color for reliable contrast, and share the same descriptive filenames as SVG downloads.

1.6.1

Fixed

  • Starlight plugins that extend the Markdown processor no longer stop working. Astro 7 renders Markdown with the Sätteri processor and hands every integration the same live processor object. Plugins extend the pipeline by changing that object. The theme replaced it with a unified() processor from two astro:config:setup hooks, which run after Starlight has already set up its plugins, so everything those plugins had registered was thrown away.

    The visible effect was starlight-links-validator 0.25 or newer: it validated zero links on every build and still printed “All internal links are valid”, so broken internal links passed unnoticed. Any plugin that configures itself against the Sätteri processor was affected the same way.

    defineNorthwesternConfig() now sets markdown.processor to unified() while astro.config.* is evaluated, before starlight() is created. No plugin ever sees Sätteri, and the theme only extends the processor it is given instead of replacing it. A processor you configure yourself is left alone.

  • Mermaid no longer swaps the Markdown processor either. astro-mermaid 2.1 supports Sätteri on its own.

1.6.2

Fixed

  • OG image text no longer unescapes twice. Entities were decoded in sequence with &amp; first, so a title containing the escaped text &amp;lt; came out as <. Decoding is now a single pass, and escaped text stays escaped.
  • The meta-refresh patterns used to rewrite legacy .html redirect pages are bounded. The previous patterns scanned the rest of the page from every start position, so time grew with the square of the page size: a 200 KB page of near-matches took over half a second. A tag longer than the bound is left alone, which skips hash forwarding for that page but keeps the redirect.

1.6.3 Latest

Fixed

  • A CDN blip fetching an OG font no longer fails the whole build. The fonts for OG images are fetched from the Northwestern CDN at build time, because their licenses do not allow shipping them inside the package. Each font was fetched once, with no timeout, and any failure threw: one refused connection took down a docs build, and with it the deploy behind it.

    Font requests now time out after 10 seconds and retry twice with exponential backoff. Network errors, timeouts, and 5xx responses are retried; a 4xx is a wrong URL rather than a blip, so it is reported immediately. A font that still will not load is logged as a warning and the image renders in whichever font did load, since an OG image in the wrong typeface beats a failed build. Only an empty font list still throws, because satori has nothing to draw text with. Results are cached per URL, failures included, so an outage costs one retry sequence for the build instead of one per page.