* 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>
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-sansand are materialized at build time, not committed. Icons are handled the same way:bun run icons:installcopies a curated subset of Font Awesome SVGs from@fortawesome/fontawesome-freeintoassets/images/icons/(gitignored). Both run automatically as part ofcss: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)