Changelog

hyperctl v0.20.0 (2026-05-12)

NEW: hyperctl v0.20.0 is a substantial release that adds support for a new ht-apply directive, template variables, templating plugins (!), computed template data, git-based hosting providers, multi-provider hosting environments, and more.

BREAKING: hyperctl v0.20.0 drops support for the site.config.drafts_dir – drafts are now defined by setting draft:true in page data files. This release also changes template data namespace names which are now derived from their file path.

  • Added a new ht-apply directive to perform variable substitution. HyperTemplates now supports ${ ... } variables, which can be used in element attributes and element text nodes.

    1<head>
    2  <title ht-apply>${ site.title, "Default Title" } – ${ page.title, "✱" }</title>
    3  <meta ht-apply name='description' content='${ page.description, "Placeholder Description" }'>
    4</head>
    
    Learn more
  • Added support for a --ht-value( ... ) variable substitution in layout <style> elements.

    1<head>
    2  <style id='components'></style>
    3  <style id='layout' ht-apply>
    4    :root {
    5      --color-1: --ht-value("page.colors.primary,site.colors.primary", rgba(236, 120, 184, 1.0));
    6    }
    7  </style>
    8</head>
    
    Learn more
  • Added support for extending HyperTemplates with plugins, including template variable plugins, and computed namespace plugins. A plugin is a Javascript file that exports a default function, accepts positional arguments, and has access to predefined local bindings.

    data/tags.js
     1// tags.js generates a data.tags object of unique website tags w/ tag counts
     2// example output: {"html":{"count":3,"label":"HTML"},"css":{"count":1,"label":"CSS"},"rss":{"count":4,"label":"RSS"}}
     3export default function tagcloud() {
     4    var result = {}
     5    for (let page of site.pages) {
     6        let tags = page.tags || []
     7        console.log(`${ page.path } has ${ tags.length } tags`)
     8        for (let tag of tags) {
     9            let id = tag.toLowerCase();
    10            result[id] = (result[id] || { label: tag, count: 0 })
    11            result[id].count += 1
    12        }
    13    }
    14    return result
    15};
    
    Learn more
  • Added builtins for providing automated templating features powered by layout fragments. Builtins can be disabled and/or overriden by adding layout fragments to your theme.

    Learn more
  • Added new site.providers (plural) setting for configuring named providers, and HyperTemplates now supports git-based hosting services using the new git provider.

     1providers:
     2  cloudflare_r2:
     3    kind: s3
     4    endpoint: https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.r2.cloudflarestorage.com
     5    config:
     6      bucket: my-website
     7    secrets:
     8      - name: access_key_id
     9        key: AWS_ACCESS_KEY_ID
    10      - name: secret_access_key
    11        key: AWS_SECRET_ACCESS_KEY
    12  github:
    13    kind: git
    14    endpoint: [email protected]:herdworks/hypertemplates-web.git
    15    config:
    16      branch: gh-pages
    17      publish_dir: public
    18    exclude:
    19      paths:
    20        - '\.tar\.gz$'
    21    secrets:
    22      - name: ssh_private_key
    23        key: GH_DEPLOY_KEY
    
    Learn more
  • Added a new site.environments setting for configuring named hosting environments, consisting of one or more providers:

    1environments:
    2  production: [cloudflare_r2]
    3  staging: [github]
    
    Learn more
  • Added page.ugly_url so pages can generate <path>.html pages instead of <path>/index.html pages.

    Learn more
  • Added support for CSV template data files. Delimited data must contain a header row, and header rows must have unique non-empty column names.

    Learn more
  • Changed hyperctl cms data ls to enumerate the full build context instead of just website data.

  • Changed hyperctl cms data inspect <namespace> to hyperctl cms data inspect <keypath>. Accepts template data keypaths (e.g. site.pages, data.social.twitter) instead of only top-level namespaces – extremely useful for developing computed namespaces!

  • Changed hyperctl cms data commands to support --verbose and -v flags. Computed namespace console output is silenced by default in hyperctl cms data commands. Use --verbose to route console output to stderr.

  • Changed all --config / -c arguments to use a default value of site.yaml.

  • Fixed build, deploy, and dev server commands to honor site.config.builds_dir when constructing build output paths.

  • Fixed an infinite loop that could during builds with multiple feeds.

  • Removed site.config.drafts_dir setting and loading of pages from a drafts directory.

hyperctl v0.19.0 (2026-04-21)

NEW: hyperctl version v0.19.0 adds support for site.pages, site.drafts, and site.assets template data, and brings several improvements to ht-block elements, including access to page.* template data from ht-block templates.

  • Added site.pages, site.drafts, and site.assets to template data
  • Added page.* template data to ht-block
  • Added support for template data array accessors (e.g. page.attachments.1.kind)
  • Added support for ht-block user data
  • Improved markdown detection of inline vs block-level ht-block elements
    NOTE: block-level ht-block elements should no longer be wrapped in <p> tags.
  • Improved markdown detection of <!--more--> comments (now allows whitespace variants, e.g. <!-- more -->)

hyperctl v0.18.2 (2026-04-12)

  • Added byline.username field for backwards compatibility with very early versions of hyperctl
  • Fixed a race condition in hyperctl dev server that would cause the server to crash intermittently
  • Fixed a bug that generated broken URLs in Atom feed <link rel='self'> elements; we're not properly joining "atom.xml" instead of concatenating "atom.xml" to page paths

hyperctl v0.18.1 (2026-03-01)

hyperctl v0.18.0 (2026-02-26)

💬 Join the community

Stay up-to-date with the latest releases and other news from the Team behind HyperTemplates. Ask the developers questions, get help from the community, and share your creations! 🎨