Documentation

The four formats

What each format is, how to run it, and what to edit to change the content.

Adjuvant ships the same design as four separate things. This document explains what each one is, how to run it, and, most importantly, what you edit and where, because the answer differs depending on how deep you want to go.


The short version

I want toDo thisNeed Python?
Put a website onlineUpload html/ to any hostNo
Change wording, products, colours on that siteEdit the HTML and CSS in html/ directlyNo
Change wording, products, colours in every format at onceEdit JSON in source/content/, then rebuildYes
Use Hugo, Jekyll or JBakeUse that folder as a normal projectNo, but each needs its own engine

You never need anything that is not in the ZIP. There is no separate "core" to buy, no licence server, no account, and no download that expires. source/ is the whole generator.


What each folder is

html/ : the site, already built

Plain HTML, CSS and JavaScript. Open index.html in a browser and it works, including from a file path with no server. Upload the folder's contents to any host: shared hosting, S3, Netlify, Cloudflare Pages, a Raspberry Pi.

This is what most buyers use, and nothing else in the package is required to use it.

hugo/ : a Hugo theme

A complete theme plus an exampleSite/. Hugo builds it into a static site.

cd hugo/exampleSite
hugo server --themesDir ../..
# open http://localhost:1313

To use it in an existing Hugo project, copy the theme folder into your themes/ directory and set theme = "adjuvant" in your config. Content lives in data/*.json, matching the same content model the other formats use.

jekyll/ : a Jekyll site

A complete site, not just a theme, because the layouts and the content model belong together.

cd jekyll
bundle exec jekyll serve
# open http://localhost:4000

Content is in _data/*.json. Layouts are in _layouts/, sections in _includes/sections/.

jbake/ : a JBake project

For JVM shops. Maven drives the build.

cd jbake
mvn generate-resources
# output in target/site

source/ : the generator behind all four

The design tokens, the stylesheet, the behaviour modules, the markup partials, the content model, and the two build scripts. Editing here and rebuilding regenerates every format, which is what keeps them identical.


Do I need "core access" to change the externalized content?

No. This is the question the architecture exists to answer, so it is worth being explicit.

The content model is plain JSON files sitting in source/content/ inside your download. They are yours. Open them in any text editor. There is no hosted service, no API key, no subscription and no repository you need access to. If this project vanished tomorrow, every file you need would still be on your disk and still work.

What source/ gives you that editing html/ directly does not:

  • One edit reaches every format. Change the company name once and it updates the HTML, Hugo, Jekyll and JBake builds, plus the structured data, the sitemap and the page titles.
  • No hunting. Changing a product name by hand means finding it in the catalog page, the detail page, the schema.org block and the sitemap. In the content model it is one field.

If you only ever ship the HTML site, editing html/ directly is completely legitimate and fully supported. The documentation covers both routes. Use whichever suits you.


Adding a blog post or news article

This is the one thing you will want to do repeatedly, so each format supports it the idiomatic way: write a markdown file. You do not touch the content model, you do not rebuild anything, and nothing overwrites what you create.

Hugo

Create content/article/my-post.md:

---
title: "Second fill-finish line qualified"
description: "The standing-first paragraph, shown in a heavier weight."
tag: "Facilities"
article_date: "2026-08-14"
author: "Operations"
read_minutes: 4
---
Your opening paragraph. This one is styled as a lead automatically.

An ordinary paragraph.

> A pull quote, written as a plain markdown blockquote.

Another paragraph.

layouts/article/single.html renders the hero, the badge, the byline and the body wrapper, so the file holds only what you would actually type. The first paragraph gets the lead treatment and a blockquote gets the pull-quote treatment through element selectors in the stylesheet, so markdown needs no classes.

Jekyll

Identical, in _articles/my-post.md, with layout: article in the front matter. The collection is configured in _config.yml and publishes to /article/<name>.html.

JBake

Content lives under src/main/jbake/content/. JBake accepts markdown with its own header format; follow the shape of the generated article files there.

Plain HTML

There is no engine, so there is no markdown step. Copy an existing article page in html/, change the text, and add a link to it. Or add the article to source/content/articles.json and rebuild, which also updates the other three formats and the news listings.

One caveat worth knowing

The listing pages that index articles (the intelligence feed, the home page news section) are generated from articles.json. A markdown file you add appears at its own URL and is a real page, but it will not automatically appear in those listings. To have it listed as well, add it to articles.json and rebuild. Most people adding an occasional post link to it directly and never need this.


What lives in which file

All paths relative to source/content/.

FileHolds
site.jsonCompany name, tagline, navigation, footer, social links, portal button
home.jsonEvery section of the home page: hero, mandate, pipeline, network, science, partnering, news, contact
pages.jsonEvery interior page: which sections it has, in what order, and their content
products.jsonThe product catalog: names, NDC codes, forms, strengths, categories
collections.jsonFacilities, partners, and other repeated lists
articles.jsonNews and briefing articles
ui.jsonInterface labels: column headers, button text, empty states, ARIA strings
seo.jsonDomain, meta tags, Open Graph, robots policy, schema.org, sitemap, analytics

Design values live one level up in source/tokens/tokens.json: colours, type scale, spacing, radii, shadows and motion. A skin is a small file that overrides a few of them.


Rebuilding

Python 3 only. It ships with macOS and Linux; on Windows it is a free download from python.org. No npm, no package.json, no Sass, nothing to install.

cd source
python3 build-core.py                 # tokens and assets -> dist/
python3 build-site.py                 # content model -> the HTML site

To regenerate the other formats, run the vendor.py inside hugo/, jekyll/ or jbake/. Each one reads the same source/ and rewrites its own files.

A worked example

Changing the company name everywhere:

  1. Open source/content/site.json.
  2. Change "brand" to your company name.
  3. Run the two commands above.
  4. Every page, title tag, Open Graph tag and schema.org block now carries it.

Changing the brand colour:

  1. Open source/tokens/tokens.json.
  2. Change color.brand.primary.
  3. Rebuild. All 36 pages follow, in both light and dark mode.

Choosing a format

FormatChoose it when
HTMLYou want a site online today, or you are handing files to a client who will not run a build
HugoYou want fast rebuilds and a single binary, and you may add many pages later
JekyllYou are publishing on GitHub Pages, or your team already uses Ruby
JBakeYou are in a JVM shop and want the site built by Maven alongside your other artifacts

They produce the same design. Pick on workflow, not on looks.


What is deliberately not included

  • Astro and WordPress. Not in this release.
  • A backend. The contact form and portal sign-in are front-end demos. Wire them to your own handler, or point data-endpoint at a form service.
  • Real content. Every company, person, product, NDC number and figure in the demo is invented. Replace them.

Support: [email protected]. Include the format, the page and what you were doing.