Skip to main content
Version: 0.5

ADR-001: Jekyll to Docusaurus Migration

Status​

Accepted

Date​

2026-01-22

Context​

The Apache Mahout website was built using Jekyll 4.3.2 with Bootstrap 5, MathJax 3 for math rendering, and Kramdown for Markdown processing. As the project evolved with the introduction of Qumat (quantum computing capabilities), we needed to evaluate our documentation infrastructure.

Problems with Jekyll​

  1. Ruby ecosystem maintenance - Managing Ruby/Bundler dependencies and versions adds complexity
  2. Limited interactivity - Jekyll is purely static; no React components for dynamic content
  3. Documentation versioning - No built-in support for multi-version documentation
  4. Developer experience - Hot reload and local development workflows are slower
  5. Documentation sync - No standard pattern for syncing /docs with website content

Requirements​

  • Documentation versioning for Qumat releases (0.4, 0.5, etc.)
  • Math/LaTeX support for quantum computing documentation
  • /docs directory as source of truth for documentation
  • Fast local development with hot reload
  • React components for enhanced interactivity
  • Modern JavaScript tooling (Node.js ecosystem)

Decision​

Migrate from Jekyll to Docusaurus 3.x with the following configuration:

Technology Choices​

ComponentDecisionRationale
FrameworkDocusaurus 3.xActive development, React-based, built-in versioning
Math renderingKaTeXFaster than MathJax, lighter bundle size, covers 95%+ use cases
Migration approachNew directory (website-new/)Safe migration, can keep Jekyll during transition
VersioningEnabled from startSupports Qumat release cycle

Architecture​

website-new/
├── docusaurus.config.ts # Main configuration
├── sidebars.ts # Sidebar navigation
├── package.json
├── scripts/
│ └── sync-docs.js # Syncs /docs → website-new/docs
├── docs/ # Current version (synced from /docs)
├── versioned_docs/ # Previous versions (snapshots)
│ └── version-0.4/
├── versions.json # Version manifest
├── blog/ # Migrated from Jekyll _posts
├── src/
│ ├── components/ # React components
│ ├── css/custom.css # Theme customizations
│ └── pages/index.tsx # Custom homepage
└── static/ # Images and assets

Documentation Sync Workflow​

The /docs directory at the repository root is the source of truth. A sync script copies documentation to the website at build time:

  1. npm run sync - Copies /docs and /qdp/docs to website-new/docs/
  2. Transforms frontmatter as needed
  3. Runs automatically before npm run build and npm run start

This pattern allows:

  • Documentation to live alongside code
  • Website to always reflect latest /docs
  • Version snapshots to preserve historical documentation

Versioning Strategy​

  • current (0.5-dev): Active development, synced from /docs
  • 0.4: First stable snapshot, frozen documentation

To create a new version:

npm run docusaurus docs:version X.Y

Consequences​

Positive​

  1. Versioned documentation - Users can view docs for their specific Qumat version
  2. Faster builds - Node.js build pipeline is faster than Jekyll
  3. React components - Can add interactive examples, code playgrounds
  4. Better DX - Fast hot reload, TypeScript support, modern tooling
  5. KaTeX performance - Math rendering is 10x faster than MathJax
  6. Active community - Docusaurus has strong Meta backing and active maintenance

Negative​

  1. Learning curve - Team needs to learn React/Docusaurus patterns
  2. Migration effort - One-time cost to migrate all content
  3. KaTeX limitations - Some advanced MathJax features may not work (rare edge cases)

Neutral​

  1. Bundle size - Slightly larger JavaScript bundle, but better caching
  2. CI/CD changes - GitHub Actions updated from Ruby to Node.js

Implementation Notes​

Key Files Changed​

  • .github/workflows/website.yml - Now uses Node.js instead of Ruby
  • website-new/docusaurus.config.ts - Main Docusaurus configuration
  • website-new/scripts/sync-docs.js - Documentation sync script
  • website-new/src/components/WaveAnimation/ - Ported hero animation

Redirect Strategy​

Client-side redirects handle old Jekyll URLs:

  • /news.html → /blog

Additional redirects can be added to docusaurus.config.ts as needed.

References​