Files
Anthias/website
Viktor Petersson e23201d607 feat(website): generate llms.txt and llms-full.txt (#3179)
* feat(website): generate llms.txt and llms-full.txt

Add a post-build generator that produces llms.txt (a curated index)
and llms-full.txt (the full text of every page) for the marketing
site, following the llmstxt.org convention and served from the site
root.

The generator extracts clean Markdown from the rendered public/ HTML
rather than the Markdown/data sources, so it captures the marketing
copy that lives in Hugo layouts (home, features, get-started) and
never drifts from what visitors actually see. Wired into `bun run
build` and the deploy-website workflow.

Also fixes four pre-existing `sort $map` calls in the /api templates:
in Hugo, sorting a map collapses it to a slice, so the keys were
replaced by numeric indices — API paths, HTTP status codes, request
body content-types, and schema field names all rendered as 0, 1, 2…
on the live page. Hugo already ranges maps in sorted-key order, so
dropping `sort` fixes it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(website): escape backslashes before pipes in llms table cells

CodeQL js/incomplete-sanitization: the Markdown table-cell escaping
replaced "|" but not "\", so a literal backslash in a cell could
combine with the pipe escape. Escape backslashes first.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(website): collapse mixed-content whitespace and harden llms entrypoint

Address Copilot review:
- serializeMixed() now collapses text-node whitespace the same way
  inline() does, so HTML source indentation/newlines can't leak into
  list items and other mixed-content blocks.
- main() gets a .catch that sets a non-zero exit code, so build/CI
  failures (missing public/, read/write/parse errors) are deterministic.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 06:54:53 +01:00
..

Anthias Website

This is the source code for anthias.screenly.io, built with Hugo and Tailwind CSS v4.

Local Development

The site needs the Tailwind output and self-hosted fonts to be generated before Hugo serves anything. Run the bun pipeline once, then start Hugo (or use bun run dev to do both with watchers):

cd website
bun install
bun run css:build      # generates assets/styles/style.css and static/fonts/
hugo server

Or, with hot reload on CSS + templates:

cd website
bun run dev            # bun css:watch + hugo server in parallel

The site will be available at http://localhost:1313.

Skipping the bun step will load the page with broken styling and 404s for /fonts/...woff2 — the font files come from the npm package @fontsource/plus-jakarta-sans and are materialized at build time, not committed. Icons are handled the same way: bun run icons:install copies a curated subset of Font Awesome SVGs from @fortawesome/fontawesome-free into assets/images/icons/ (gitignored). Both run automatically as part of css:build / css:watch.

Home-page screenshot slider

The hero on / is a slider fed by PNGs in assets/images/screenshots/. The directory is gitignored — captures are produced by the marketing-screenshots.yaml workflow and pulled into the build at deploy time. To preview the real slider locally:

bun run screenshots:fetch     # latest successful master run
bun run dev

The fetch script needs the gh CLI authenticated; it targets Screenly/Anthias by default so the upstream artifact is reachable even from a fork clone. Pass --ref <branch> to pull from a different branch's most recent run, or --repo <owner>/<repo> to point at a different repo. Without screenshots, Hugo still builds — the slider section simply omits.

Build

cd website
bun run build          # bun css:build && hugo

Output goes to website/public/.

Project Structure

website/
├── assets/                       # Hugo Pipes inputs
│   ├── docs/                     # Doc images / d2 diagram
│   ├── fonts/                    # Generated by bun fonts:install (gitignored)
│   ├── images/                   # Site images, logos, hero
│   └── styles/                   # Built Tailwind + chroma stylesheets
├── content/
│   ├── _index.md
│   ├── api.md                    # /api/ — OpenAPI rendered server-side
│   ├── docs/                     # /docs/* (rendered via layouts/docs/)
│   ├── faq.md                    # /faq/ — driven by data/faq.yaml
│   ├── features.md
│   └── get-started.md
├── data/
│   ├── faq.yaml                  # FAQ entries grouped by section
│   └── openapi.yaml              # drf-spectacular dump for the /api/ page
├── layouts/
│   ├── _default/
│   │   ├── _markup/              # Goldmark render hooks (image, blockquote)
│   │   ├── api.html              # /api/ template
│   │   ├── baseof.html           # Base HTML
│   │   ├── faq.html              # /faq/ template
│   │   └── ...
│   ├── docs/                     # /docs/ list and single layouts
│   ├── index.html                # Home page
│   └── partials/                 # navbar, footer
├── scripts/
│   └── install-fonts.ts          # Materializes Plus Jakarta Sans from npm
├── src/
│   └── main.css                  # Tailwind entrypoint
├── static/
│   ├── fonts/                    # Generated by bun fonts:install (gitignored)
│   └── robots.txt
├── hugo.toml                     # Hugo configuration
├── package.json                  # Bun scripts: dev / css:build / fonts:install
└── public/                       # Build output (gitignored)