This commit overhauls the CI build process to improve robustness, prevent version drift, and provide better compatibility testing.
The `ci-build-test-site.yml` workflow has been removed and its responsibilities have been merged into the `ci-build-starters-matrix.yml` workflow. This consolidation provides a single source of truth for all build logic.
Three new jobs have been added to the matrix to act as version guards:
1. **smoke-test-min:** Builds the `test/` site using the minimum Hugo version declared in the framework's `hugo.yaml`. This ensures we do not accidentally introduce features that break our minimum supported version.
2. **smoke-test-latest:** Builds the `test/` site using the latest available Hugo version. This job is allowed to fail and acts as a canary to provide early warning of breaking changes in new Hugo releases.
3. **canary-academic-latest:** Builds the `academic-cv` starter with the latest Hugo version. As one of our most popular starters, this provides a more realistic canary for issues that new users might encounter.
- Add preact dependency to all 6 starter package.json files for proper js.Build resolution
- Use automatic JSX runtime (JSX: "automatic", JSXImportSource: "preact") in libraries.html
- Restore proper ES module imports in hero/client.jsx and Icon.jsx components
- Remove vendored preact script loading since preact is now bundled via js.Build
- Fixes CI build failures with "Could not resolve preact/jsx-runtime" errors
- Provides cleaner, more standard JS tooling for users extending with custom components
BREAKING CHANGE: Starters now require `preact` in `package.json`to resolve preact dependency before hugo build
landing-page starter, which uses preact blocks, was only working only in monorepo due to Preact installed in root package.json but not starter package.json.
- Switch js.Build to classic JSX with global factory in `modules/blox-tailwind/layouts/_partials/libraries.html` (JSX=transform, JSXFactory=preact.h, JSXFragment=preact.Fragment)
- Update `modules/blox-tailwind/blox/hero/client.jsx` to call `preact.render` and remove `preact` import
- Remove `preact` import from `modules/blox-tailwind/blox/shared/js/components/Icon.jsx` (classic JSX uses global `preact.h`)
- Keep vendored `assets/dist/lib/preact/preact.min.js` and load it only when `needs_preact` is set
- Fixes CI error “Could not resolve preact/jsx-runtime” without requiring `preact` in each starter
Dev tools
- Add HBX Dev HUD (floating button + panel) with live log viewer
- Add get-build-id helper to dedupe logs per build (during `hugo server` refreshes)
Callouts
- Implement Obsidian-compatible callouts (15+ types) with shared renderer
- Add i18n title translations (en, es, fr) for all callout types
- Deprecate `callout` shortcode with suppressible warning; keep working
- Migrate starters to Markdown callouts (>[!TYPE]) and update docs
Logging
- Centralize logging in partial `functions/logger` with info/warn/error levels
- Use fmt.Warnidf for suppressible warnings (consistent IDs)
- Only show info in Dev HUD/JSON (no longer use warnf for info logging); warn/error still printed in CLI
- Include source metadata and build ID on each entry
Blocks – Collection
- Add support for `content.filters.kinds`
- Add `content.filters.tags` (array) alongside existing `filters.tag` (string)
Build/Tailwind/JS
- Fix missing Tailwind v4 styles in Hugo render: include preact-built assets, extract classes from JSX/TSX to `@sources`
- Load Preact client per block, publish source maps in dev; on-demand Alpine
CI
- Re-implement fast fails with panicOnWarning now that info logging as warnf removed
- Fix package splitter change detection: strip trailing slashes; collapse paths to starter roots
Starters/Docs
- Restructure courses under `courses/hugo-blox/`
- Update menus and landing pages
- Replace deprecated callout usage in content and docs
- Replace missing hero icon `download` with `arrow-down-tray` in academic-cv guide
Icons
- Improve icon resolver: default pack inference, better fallback, and precise missing-icon warnings (with page ref)
Implements Hugo's new blockquote render hooks (v0.132.0+) to support standard
Markdown alert syntax, improving content portability across platforms.
Features:
- 5 alert types: note, tip, important, warning, caution
- Custom titles with `> [!TYPE]+ Custom Title` syntax
- Multilingual support (EN, ES, FR, DE, ZH) with `callout_*` i18n keys
- Shared renderer for both shortcodes and render hooks
- Backward compatibility with deprecated `{{< callout >}}` shortcode
Example usage:
```markdown
> [!NOTE]
> This is a note callout with important information.
> [!WARNING]+ Custom Warning Title
> This warning has a custom title instead of just "Warning".
> [!TIP]
> Here's a helpful tip for better workflow!
```
Breaking changes: None (backward compatible)
Deprecation: `{{< callout >}}` shortcode now shows warning, use standard syntax
Configuration required (already applied to all sites by default):
```yaml
markup:
goldmark:
parser:
attribute:
block: true
```
- Convert singular to plural: project→projects, publication→publications, event→events
- Rename: post→blog, teaching→courses (with "blog" being the justified exception to plural rule)
- Update i18n translations (en, zh, zh-Hant, de, nl, fr, es, pt)
- Fix template references to use new content type names
- Update section IDs to maintain compatibility with menu references
- Fix debug template to better handle variable log structures
This change provides a more intuitive content structure with URL paths that match
common expectations, following standard practices where collection types use plural
names (with blog as the standard exception).
- Centralize logger: warnf/errorf for normal pages; HTML comments for adapters
- Add dev console logs and export structured logs to /hbx-debug.json
- Remove --panicOnWarning from dev scripts; builds no longer fail on warnings
- Fix prior lint/format issues across scripts and templates
- Add dynamic JavaScript loading system for blocks
- Implement multi-layer background support (texture + gradient)
- Add Tailwind color variable conversion in templates
- Support light/dark background color modes
- Prevent framework CSS conflicts with custom styles
- Fix Hugo documentation inconsistency: mount hugo_stats.json to match @source directive
- Module provides all Tailwind v4 configuration - zero user config required
- Add comprehensive color variables safelist for dynamic YAML usage
- Enable build stats and cachebusters for optimal performance
- Maintain hugo_stats.json in .gitignore (auto-generated per site)
Benefits:
- Automatic Tailwind v4 support for all existing users (no breaking changes)
- Proper Hugo Stats content detection with corrected paths
- Module handles all complexity - users just import and use
Add standalone option to update starter templates with latest module
commits using Go pseudo-versions instead of creating new release tags.
- New functions for commit info extraction and pseudo-version formatting
- Updates go.mod files with v0.0.0-YYYYMMDDHHMMSS-abcdefabcdef format
- Updates Hugo versions in hugoblox.yaml, netlify.toml, and deploy.yml
- Uses deploy.yml workflow filename (GitHub Pages convention)
- Supports --dry-run for preview and --yes for execution
- Perfect for GitHub UI workflows and development environments
Validated with:
`poetry run python scripts/release_modules.py --update-starters-to-commits --dry-run --log-level INFO`
- Update view-starter-dev.sh to default to academic-cv if no starter specified
- Update view-starter-prod.sh to default to academic-cv if no starter specified
- Update usage documentation to show starter name as optional parameter
- Maintain backward compatibility with existing usage patterns
Fix progress bar display in resume-languages block: Correct stroke-dashoffset calculation to show accurate progress. Previously, progress bars displayed the gap segment (remaining progress) starting from the first quadrant, whereas for 80% progress it should appear in the 4th quadrant, causing the visual representation to appear inverted.
See #3252
Change 'items-center' to 'items-start' to prevent shorter content from centering vertically, ensuring the Skills and Hobbies categories align at the same top level regardless of content size/height differences.