Skip to main content

ADR-0012: ADR: Replace archived remark-kroki-plugin dependency

Status​

Accepted

Context​

The remark-kroki-a11y plugin currently wraps remark-kroki-plugin to add accessibility features (source code display, natural language descriptions) to Kroki-generated diagrams. However, remark-kroki-plugin has been archived by its owner:

  • Repository: https://github.com/atooni/remark-kroki-plugin
  • Archived: December 7, 2024 (read-only)
  • Last npm publish: v0.1.1, over a year ago
  • Dependencies: Uses outdated remark@^13.0.0
  • Open issues: 2 unresolved bugs
  • Forks: 3, none actively maintained

This creates problems:

  1. MDX 2/3 compatibility: The plugin generates raw HTML nodes that require rehype-raw with special configuration in Docusaurus 3
  2. No bug fixes: Open issues will never be addressed upstream
  3. Complex setup: Users must configure multiple plugins in correct order
  4. Security risk: No security updates for archived dependency
  5. Adoption visibility: Consumers install both remark-kroki-a11y and remark-kroki-plugin, so usage is fragmented and setup remains leaky

The replacement must preserve the existing kroki option names and the accessibility AST changes, while allowing the render backend to be asynchronous.

Options​

Option A: Integrate remark-kroki-plugin code​

Fork and integrate the remark-kroki-plugin code directly into remark-kroki-a11y.

Pros:

  • Full control over the codebase
  • Can fix MDX 2/3 compatibility issues properly
  • Can address the 2 open bugs
  • Simpler installation for users (one plugin instead of two)
  • No dependency on archived project
  • Can optimize for our specific use case

Cons:

  • Maintenance burden for Kroki API integration
  • Need to keep up with Kroki service changes
  • ~130 lines of additional code to maintain

Option D: Compose with internal dependency + adapter​

Use remark-kroki-plugin as an internal dependency of remark-kroki-a11y, exposed via an adapter layer.

Pros:

  • Consumers install only remark-kroki-a11y
  • No code duplication
  • Single public API contract
  • Enables internal replacement later (remark-kroki, own fork) without consumer API changes

Cons:

  • Short-term dependency on archived upstream remains
  • Requires adapter maintenance for API/AST compatibility
  • Security and maintenance risk remain until engine replacement

Option B: Keep wrapping remark-kroki-plugin​

Continue using remark-kroki-plugin as an external dependency.

Pros:

  • Less code to maintain
  • No immediate work required

Cons:

  • Technical debt accumulates
  • Dependency on dead project
  • Complex user setup with rehype-raw workaround
  • Cannot fix upstream bugs
  • Risk of future incompatibilities

Option C: Switch to remark-kroki (show-docs)​

Switch to the actively maintained remark-kroki package.

Package info:

  • Repository: https://github.com/show-docs/remark-kroki
  • npm: remark-kroki v0.3.8 (published Oct 2025)
  • Stars: 34 | Forks: 4 | Contributors: 2
  • Last update: Added MDX 3.0 support
  • Dependencies: Modern (unist-util-visit@^5, node-fetch@^3)

Features:

  • Multiple output formats: inline SVG, base64-encoded images, HTML object tags
  • Docusaurus v2 and v3 compatible
  • MDX 3.0 support built-in
  • Customizable Kroki server configuration
  • Language alias support

Pros:

  • Actively maintained with recent MDX 3.0 support
  • Modern dependencies (no outdated remark@13)
  • No rehype-raw workaround needed (supports MDX3 target)
  • Drop-in replacement potential
  • Community maintained

Cons:

  • Different API - requires adapter work in remark-kroki-a11y
  • Less control than full integration (Option A)
  • Still external dependency (though healthy one)
  • Need to verify compatibility with our a11y wrapper approach

Decision​

Use Option C behind a compatibility adapter. remark-kroki-a11y remains the single public plugin and dynamically loads the ESM-first remark-kroki package. The adapter maps krokiBase to server, maps legacy imgType/imgTitle metadata to type/alt, and selects img-html-base64 output by default.

The render request remains asynchronous, but no separate process is required: the adapter returns the promise from remark-kroki, so unified consumers can await the normal remark pipeline. imgRefDir and imgDir are retained as accepted legacy configuration but are no longer used because diagrams are embedded as data URLs.

Consequences​

  • Consumers can remove their direct remark-kroki-plugin dependency.
  • Existing accessibility/source HTML generation is unchanged.
  • Generated SVGs are no longer written to imgDir; builds do not need a writable static image directory.
  • The adapter contract is covered by a local HTTP-server unit test.

References​


Date: 2026-02-09 Author: Bart van der Wal & Claude


Single Source of Truth

This ADR is automatically copied from docs/adr/0012-integrate-remark-kroki-plugin.md in the repository. Edit the source file to update this page.