Skip to main content
Settings
Search
Appearance
Theme Mode
About
Jekyll v3.10.0
Environment Production
Last Build
2026-06-18 05:36 UTC
Current Environment Production
Build Time Jun 18, 05:36
Jekyll v3.10.0
Build env (JEKYLL_ENV) production
Page Location
Page Info
Layout default
Collection docs
Path _docs/features/vendored-assets.md
URL /docs/features/vendored-assets/
Date 2026-06-18
Theme Skin
SVG Backgrounds
Layer Opacity
0.6
0.04
0.08

Vendored Bootstrap & Icon Assets

Bootstrap 5.3.3 CSS/JS and Bootstrap Icons are committed under assets/vendor/ rather than loaded from a CDN. This ensures:

  • GitHub Pages safety — Pages’ default Jekyll build does not run npm or curl
  • Offline development — works without an internet connection
  • Version pinning — no surprise CDN updates breaking the theme

For full details on refreshing vendor files, see the Vendor Assets guide.

Directory Layout

assets/vendor/
├── bootstrap/
│   ├── css/
│   │   └── bootstrap.min.css
│   └── js/
│       └── bootstrap.bundle.min.js
└── bootstrap-icons/
    └── font/
        ├── bootstrap-icons.css
        └── fonts/

Additional vendor libraries (MathJax, Font Awesome, jQuery, GitHub Calendar) are also stored here and listed in vendor-manifest.json. Mermaid is the one exception: it lives under assets/vendor/mermaid/ but is not in the manifest — it is copied from the npm mermaid package via npm run vendor:mermaid instead of downloaded from a CDN.

How Assets Are Loaded

CSS (via _includes/core/head.html)

<link href="{{ '/assets/vendor/bootstrap/css/bootstrap.min.css' | relative_url }}" rel="stylesheet">
<link rel="stylesheet" href="{{ '/assets/vendor/bootstrap-icons/font/bootstrap-icons.css' | relative_url }}">
<link rel="stylesheet" href="{{ '/assets/css/main.css' | relative_url }}">

JavaScript (via _includes/components/js-cdn.html)

<script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>

Refreshing Vendor Files

# Full vendor refresh (requires curl, jq, and shasum/sha256sum)
./scripts/vendor-install.sh

# Same thing via the npm script
npm run vendor:install

# Preview what would change without downloading
./scripts/vendor-install.sh --dry-run

# Refresh Mermaid (copied from the npm package, not the manifest)
npm install && npm run vendor:mermaid

vendor-manifest.json in the repo root lists every curl-downloaded asset with its expected SHA-256 checksum. The script is idempotent: it skips any file that already exists with a matching checksum, and re-downloads on mismatch (--force re-downloads everything).

How to verify

# Confirm the committed vendor tree is present
ls assets/vendor/bootstrap/css/bootstrap.min.css \
   assets/vendor/bootstrap/js/bootstrap.bundle.min.js \
   assets/vendor/bootstrap-icons/font/bootstrap-icons.css

# Dry-run reports "already up to date" when checksums match
./scripts/vendor-install.sh --dry-run

A clean checkout already ships these files, so a dry run should report nothing to download.

Custom CSS Override

Place site-specific CSS overrides in assets/css/user-overrides.css (you create this file; it is not shipped with the theme). It is linked from _includes/core/head.html only when you opt in by setting user_overrides: true in _config.yml — the link is wrapped in {% if site.user_overrides %}. Do not load a second full Bootstrap stylesheet.

See also

  • [[Bootstrap Integration]]
  • [[Development]]