- Nix 41%
- SCSS 19.2%
- CSS 19.1%
- HTML 17.8%
- Awk 2.9%
The sticky sidebar's viewport-tracking kept it painting over the footer once a page's main content was shorter than the sidebar tree (confirmed against the live hive-metric doc page). Drop position:sticky (the sidebar still self-scrolls via its existing max-height + overflow-y:auto, so it still doesn't lengthen the page) and give body a 100vh floor so a short page still fills the viewport. |
||
|---|---|---|
| .forgejo/workflows | ||
| content | ||
| nix | ||
| sass | ||
| static | ||
| templates | ||
| .gitignore | ||
| config.toml | ||
| flake.lock | ||
| flake.nix | ||
| README.md | ||
hyperhive website
Marketing landing for hyperhive, deployed at hyperhive.darkest.space.
Built with Zola, the Rust static site generator. The landing page is Zola-rendered; the dist also ships generated reference docs sourced from the main repo:
/options/— the NixOS options reference (services.hyperhive.*host options + per-agenthyperhive.*), built from the main repo'spackages.<system>.docs./docs/— the prose docs (docs/**/*.md) rendered to themed HTML bynix/docs.nix.
Both come from the hyperhive flake input, so they always track the
revision you pin (or override) — see Deploy.
░▒▓█▓▒░ scaffolded by `iris`, a claude agent in the swarm ░▒▓█▓▒░
▣ the hive renders its own door ◇
Copy, theme, layout, and the flake here are AI-authored —
templates / SCSS / nix / markdown all from an agent in this same
hyperhive deployment, reviewed by the operator before merge.
Hex motif art lives upstream in hyperhive/branding/; everything
else came out of one prompt-and-iterate session against the
#502 thread.
Build
git clone https://forge.darkest.space/hyperhive/website.git
cd website
# one-shot build to ./public
nix build .#website
# → result/ is the dist (landing + /options/ + /docs/), ready to
# drop under any static host
# validate everything CI checks (build + nixfmt formatting)
nix flake check
# build just the generated docs sub-trees for inspection
nix build .#options # nix options reference → result/
nix build .#docs # prose docs → result/
# dev server (live reload on http://127.0.0.1:1111/)
nix develop
zola serve # serves the landing only; /options + /docs need nix build
Layout
config.toml # zola config (single source of truth for site meta)
content/_index.md # landing page copy — edit here for prose changes
templates/
base.html # base layout (head, footer, og tags)
index.html # landing template extending base
sass/
main.scss # theme — Catppuccin Mocha + amber accent
static/
hyperhive.svg # single canonical hex motif — favicon + og:image
# + inline hero (via Zola `load_data`)
nix/
docs.nix # renders the main repo's docs/**/*.md → /docs/ HTML
docs.css # Catppuccin Mocha theme for the rendered docs
flake.nix # `nix build` → site dist, `nix flake check` → CI gate
.forgejo/workflows/
ci.yml # runs `nix flake check` on every PR
Deploy
Pinning the docs to your hyperhive revision
The generated /options/ + /docs/ pages come from the hyperhive
flake input. By default it tracks the main repo's default branch, so
a plain nix build .#website publishes the latest docs. To publish
the docs for the exact revision you actually run, override the input.
One-off, from the command line:
nix build .#website \
--override-input hyperhive git+https://forge.darkest.space/hyperhive/hyperhive.git?ref=v1.2.3
# or point it at a local checkout:
nix build .#website --override-input hyperhive path:/srv/hyperhive
Or wire it in from the deployment flake that consumes this one, so the website and the running hive share a single pinned revision:
{
inputs.hyperhive.url = "git+https://forge.darkest.space/hyperhive/hyperhive.git";
inputs.website.url = "git+https://forge.darkest.space/hyperhive/website.git";
# one source of truth for the revision — the site renders the docs
# for the same hyperhive you deploy.
inputs.website.inputs.hyperhive.follows = "hyperhive";
}
Serving the dist
The build output is a plain public/ directory of static files —
drop it under any HTTP server's docroot. nginx vhost example for
serving it at hyperhive.darkest.space:
server {
listen 80;
listen [::]:80;
server_name hyperhive.darkest.space;
# If you've got TLS in front, the usual `return 301
# https://$host$request_uri;` redirect goes here and the
# listen lines move to a sibling server { listen 443 ssl …; }
# block. Keeping this snippet minimal — plain HTTP on a
# cert-managed host is the smallest working config.
# Point at wherever `nix build .#website && cp -r result/. …`
# lands. The dist is fully self-contained: no server-side
# rendering, no rewrites, no API.
root /var/www/hyperhive-website;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 7-day cache on the immutable assets (SVG, CSS, fonts).
# `nix build` produces a fresh path each rebuild, so caching
# is safe — operator can just `mv -T result-new /var/www/…`
# to swap, no cache-busting hashes needed.
location ~* \.(svg|css|js|woff2|png|ico)$ {
expires 7d;
add_header Cache-Control "public, immutable";
}
}
If you're running NixOS, the equivalent module config is:
services.nginx.virtualHosts."hyperhive.darkest.space" = {
enableACME = true;
forceSSL = true;
root = "${pkgs.callPackage ./website {}}"; # or nix build path
};
Theme
Catppuccin Mocha palette + the hyperhive amber from the swarm's identity hex mark. Monospace identity throughout (same family as the dashboard / agent terminals) so the website reads as part of the same project, not a separate marketing artifact.
Theme variables live in sass/main.scss (single source of truth).
The hex motif in the hero is the same SVG that ships on the
dashboard / forge / agent containers.