website/templates/index.html
iris b82a2ca1b3 config: hoist forge URL out of templates + add nginx deploy snippet
Addresses two review notes on PR #1:

**argus 🔴**: hardcoded `http://localhost:3000/hyperhive/hyperhive`
is meaningless to a public visitor at hyperhive.darkest.space.
Moved to `[extra] forge_url` in config.toml so it's swappable
without touching templates. Both consumer sites now reference
`{{ config.extra.forge_url }}`:

- `templates/base.html` — footer "code on the forge" link
- `templates/index.html` — hero CTA button

Default value points at the operator's current public mirror
(`git.berlin.ccc.de/vinzenz/hyperhive`); update when a canonical
hyperhive/hyperhive mirror lands.

**mara**: README now has a Deploy section with a minimal nginx
virtual-server example for serving the dist at
hyperhive.darkest.space, plus a one-liner NixOS module variant
for operators using the nginx module. Both stay self-contained
(no TLS termination boilerplate, no rewrites, no proxy_pass).
2026-05-27 12:56:34 +02:00

69 lines
2.7 KiB
HTML

{% extends "base.html" %}
{% block content %}
{# Hero — hex motif left, headline + tagline + CTA right. Stacks
vertically on narrow viewports via the .hero CSS grid. #}
<section class="hero">
<div class="hero-art" aria-hidden="true">
{# Inline so the SVG inherits the page's font + can be styled
(hover pulse animation on the rings). Same source as the
dashboard branding/hyperhive.svg — single canonical copy at
static/hyperhive.svg drives favicon + og:image + hero inline.
If a future visual divergence is wanted (smaller favicon,
titled og:image), split into named copies then.
`format="plain"` returns the raw markup string instead of
parsing the SVG as XML. #}
{% set hex_svg = load_data(path="static/hyperhive.svg", format="plain") %}
{{ hex_svg | safe }}
</div>
<div class="hero-text">
<h1>
<span class="banner-glyph">░▒▓</span>
hyperhive
<span class="banner-glyph">▓▒░</span>
</h1>
<p class="hero-tagline">{{ config.description }}</p>
<p class="hero-cta">
<a class="cta-primary" href="{{ config.extra.forge_url }}">
◆ explore the code →
</a>
</p>
</div>
</section>
{# Landing prose — pulled from _index.md so non-engineers can edit
copy without touching templates. #}
<section class="prose">
{{ section.content | safe }}
</section>
{# Three-column "what's inside" — quick orientation for visitors
who clicked through from a link without context. Copy here is
intentionally short; deep dives belong in /docs (future). #}
<section class="grid-3">
<article class="card">
<h2><span class="card-glyph"></span> the swarm</h2>
<p>
Each agent is a NixOS container with its own claude session,
a logical name, and a parent in the topology tree. Containers
come and go; the topology is the operator's facts file.
</p>
</article>
<article class="card">
<h2><span class="card-glyph"></span> the dashboard</h2>
<p>
One web page shows live agent state, the broker stream, the
approval queue, scheduled prompts, and the rebuild pipeline.
Everything that mutates the swarm passes through here.
</p>
</article>
<article class="card">
<h2><span class="card-glyph"></span> the boundary</h2>
<p>
Agents can ask, schedule, request approvals, and message peers
— but never spawn / destroy / mutate config themselves. Those
actions queue up and wait on the human at the dashboard.
</p>
</article>
</section>
{% endblock %}