Files
llmgw/internal/web/templates/site.html
T
Ilker ManapandClaude Opus 5.5 fea5774fe5 The install guide shows every screen of a real install
/install takes a reader from three bare Ubuntu machines to a first answer:
what each machine needs and the commands that check it, the release fetched
and its checksum checked, the eight setup screens, the system's state and
the console, and a first request with a key from the account page. Every
screen is from an install of v0.14.9 on three fresh VMs, recorded with tmux
and kept as terminal frames: the page shows them as text, and plays a
session back when asked, fetching it compressed from /install/cast/. The
administrator's password and the API key were masked before the recording
was kept, and a test fails if either shape reaches the page.

/about gains what llmgw now does beyond routing, and its install steps are
today's: the setup screens and node add, not onboard-node.sh and a model
file, with a link into the guide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:35:08 +02:00

177 lines
13 KiB
HTML

{{/* The look /about and /install share: their fonts, from this binary or,
for the published website, from Google; and one stylesheet. */}}
{{define "sitestyle"}}{{if .Site}}<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wdth,wght@112,600;125,800&family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap">
{{end}}<style>
{{if not .Site}}@font-face{font-family:"Archivo";font-weight:600 800;font-stretch:112% 125%;font-display:swap;src:url("{{asset "fonts/archivo-latin.woff2"}}") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:"Archivo";font-weight:600 800;font-stretch:112% 125%;font-display:swap;src:url("{{asset "fonts/archivo-latin-ext.woff2"}}") format("woff2");unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:"IBM Plex Sans";font-weight:100 700;font-display:swap;src:url("{{asset "fonts/plex-sans-latin.woff2"}}") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:"IBM Plex Sans";font-weight:100 700;font-display:swap;src:url("{{asset "fonts/plex-sans-latin-ext.woff2"}}") format("woff2");unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:"IBM Plex Mono";font-weight:400;font-display:swap;src:url("{{asset "fonts/plex-mono-400-latin.woff2"}}") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-weight:400;font-display:swap;src:url("{{asset "fonts/plex-mono-400-latin-ext.woff2"}}") format("woff2");unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:"IBM Plex Mono";font-weight:500;font-display:swap;src:url("{{asset "fonts/plex-mono-500-latin.woff2"}}") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-weight:500;font-display:swap;src:url("{{asset "fonts/plex-mono-500-latin-ext.woff2"}}") format("woff2");unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
{{end}}:root{
--bg:#F3F5F5; --surface:#FFFFFF; --ink:#142023; --muted:#56696C; --line:#D3DCDC;
--fiber:#0B7F7D; --fiber-soft:#DDEFEE; --om1:#C4621A; --om1-soft:#F6E6D9;
--code-bg:#15201F; --code-ink:#DCEAE8; --code-dim:#7F9A97;
--display:"Archivo","Arial Narrow",system-ui,sans-serif;
--body:"IBM Plex Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
--mono:"IBM Plex Mono",ui-monospace,"SFMono-Regular",Menlo,monospace;
}
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]){
--bg:#0E1617; --surface:#152022; --ink:#E2ECEB; --muted:#8FA5A4; --line:#26383A;
--fiber:#3FC2BC; --fiber-soft:#133634; --om1:#EE9350; --om1-soft:#3A2717;
--code-bg:#0A1011; --code-ink:#D5E5E3; --code-dim:#6E8886;
color-scheme:dark;
}
}
:root[data-theme="dark"]{
--bg:#0E1617; --surface:#152022; --ink:#E2ECEB; --muted:#8FA5A4; --line:#26383A;
--fiber:#3FC2BC; --fiber-soft:#133634; --om1:#EE9350; --om1-soft:#3A2717;
--code-bg:#0A1011; --code-ink:#D5E5E3; --code-dim:#6E8886;
color-scheme:dark;
}
*{box-sizing:border-box}
body{background:var(--bg);color:var(--ink);font:400 16px/1.6 var(--body);margin:0;padding-inline:20px;padding-block:0}
.wrap{max-width:1080px;margin:0 auto}
a{color:var(--fiber);text-underline-offset:3px}
a:focus-visible,button:focus-visible,input:focus-visible+label{outline:2px solid var(--fiber);outline-offset:3px;border-radius:4px}
h1,h2,h3{font-family:var(--display);text-wrap:balance;margin:0}
h2{font-size:clamp(1.6rem,3.2vw,2.1rem);font-variation-settings:"wdth" 112;font-weight:600;letter-spacing:-.01em}
h3{font-size:1.05rem;font-variation-settings:"wdth" 112;font-weight:600}
p{margin:0}
code,pre{font-family:var(--mono);font-size:.875rem}
:not(pre)>code{background:var(--fiber-soft);padding:.1em .35em;border-radius:4px;font-size:.85em}
.eyebrow{font:500 .75rem/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
/* top bar */
.bar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-block:22px;border-bottom:1px solid var(--line)}
.mark{font:800 1.25rem/1 var(--display);font-variation-settings:"wdth" 125;letter-spacing:-.02em;color:var(--ink);text-decoration:none;display:flex;align-items:center;gap:10px}
.mark svg{flex:none}
.bar nav{display:flex;gap:20px;flex-wrap:wrap;font-size:.9rem}
.bar nav a{color:var(--muted);text-decoration:none}
.bar nav a:hover{color:var(--ink)}
/* hero */
.hero{display:grid;grid-template-columns:1.05fr .95fr;gap:48px;align-items:center;padding-block:64px 56px}
.hero h1{font-size:clamp(2.5rem,6vw,4.4rem);line-height:.98;font-weight:800;font-variation-settings:"wdth" 125;letter-spacing:-.03em}
.hero h1 em{font-style:normal;color:var(--fiber)}
.lede{margin-top:22px;font-size:1.12rem;color:var(--muted);max-width:34em}
.cta{display:flex;flex-wrap:wrap;gap:12px;margin-top:30px}
.btn{display:inline-flex;align-items:center;gap:8px;font:600 .95rem/1 var(--body);padding:13px 18px;border-radius:8px;text-decoration:none;border:1px solid var(--fiber);background:var(--fiber);color:var(--bg)}
.btn.ghost{background:transparent;color:var(--ink);border-color:var(--line)}
.btn.ghost:hover{border-color:var(--ink)}
.oneline{margin-top:26px;display:flex;align-items:center;gap:10px;background:var(--code-bg);color:var(--code-ink);border-radius:8px;padding:12px 12px 12px 16px;max-width:100%}
.oneline code{flex:1;min-width:0;overflow-x:auto;white-space:nowrap;background:none;padding:0;font-size:.9rem;color:var(--code-ink)}
.oneline .p{color:var(--code-dim);user-select:none}
/* schematic */
figure{margin:0}
.schem{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:18px}
.schem svg{display:block;width:100%;height:auto}
.schem figcaption{margin-top:12px;font-size:.85rem;color:var(--muted)}
.s-label{font:500 11px var(--mono);fill:var(--muted)}
.s-strong{font:600 13px var(--body);fill:var(--ink)}
.s-box{fill:var(--bg);stroke:var(--line)}
.s-gw{fill:var(--fiber-soft);stroke:var(--fiber);stroke-width:1.5}
.s-fab{fill:none;stroke:var(--line);stroke-dasharray:5 4}
.s-link{fill:none;stroke:var(--line);stroke-width:2}
.s-gpu-a{fill:var(--fiber)} .s-gpu-b{fill:var(--om1)}
.s-gpu-idle{fill:var(--line)}
.pulse{fill:var(--fiber)}
.pulse.b{fill:var(--om1)}
@media (prefers-reduced-motion:reduce){.pulse{display:none}}
/* sections */
section{padding-block:56px;border-top:1px solid var(--line)}
.sec-head{display:grid;grid-template-columns:260px 1fr;gap:40px}
.sec-head .intro{color:var(--muted);margin-top:12px;font-size:.95rem}
.facts{display:grid;grid-template-columns:1fr 1fr;gap:28px 40px}
.fact h3{display:flex;gap:10px;align-items:baseline}
.fact h3::before{content:"";width:10px;height:10px;border-radius:2px;background:var(--fiber);flex:none;transform:translateY(-1px)}
.fact p{margin-top:6px;color:var(--muted);font-size:.95rem;max-width:36em}
/* steps */
.steps{list-style:none;margin:0;padding:0;display:grid;gap:28px;counter-reset:s}
.steps li{display:grid;grid-template-columns:44px 1fr;gap:4px 16px;counter-increment:s}
.steps li>*{grid-column:2}
.steps li::before{content:counter(s);grid-column:1;grid-row:span 4;font:800 1.5rem/1.1 var(--display);font-variation-settings:"wdth" 125;color:var(--fiber)}
.steps p{color:var(--muted);font-size:.95rem;max-width:40em}
.code{position:relative;margin-top:10px;background:var(--code-bg);color:var(--code-ink);border-radius:8px;min-width:0}
.code pre{margin:0;padding:16px 18px;overflow-x:auto;line-height:1.55}
.code .c{color:var(--code-dim)}
.copy{position:absolute;top:8px;right:8px;font:500 .75rem/1 var(--body);padding:7px 10px;border-radius:6px;border:1px solid #2d4442;background:#1c2b2a;color:var(--code-ink);cursor:pointer}
.copy:hover{border-color:var(--code-dim)}
/* nodes table in step */
.term{margin-top:10px;background:var(--code-bg);color:var(--code-ink);border-radius:8px;overflow-x:auto}
.term pre{margin:0;padding:14px 18px;font-size:.8rem;line-height:1.6}
.term .ok{color:#6FD3A6}
/* proxy tabs */
.tabs{min-width:0}
.tabs input{position:absolute;opacity:0;pointer-events:none}
.tablist{display:flex;gap:4px;border-bottom:1px solid var(--line)}
.tablist label{cursor:pointer;padding:10px 16px;font:600 .9rem/1 var(--body);color:var(--muted);border-bottom:2px solid transparent;margin-bottom:-1px}
#t-caddy:checked~.tablist label[for="t-caddy"],#t-nginx:checked~.tablist label[for="t-nginx"]{color:var(--ink);border-color:var(--fiber)}
.panel{display:none;margin-top:16px}
#t-caddy:checked~.p-caddy,#t-nginx:checked~.p-nginx{display:block}
.panel .meta{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 16px;font-size:.88rem;color:var(--muted)}
.panel .code pre{max-height:460px}
.rules{margin-top:28px;display:grid;grid-template-columns:1fr 1fr;gap:18px 32px;padding:0;list-style:none}
.rules li{font-size:.92rem;color:var(--muted);padding-left:16px;border-left:2px solid var(--om1)}
.rules strong{color:var(--ink);font-weight:600;display:block}
/* downloads */
.dl{width:100%;border-collapse:collapse;font-size:.92rem}
.dl-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:10px;background:var(--surface)}
.dl th{text-align:left;font:500 .72rem/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted);padding:14px 16px;border-bottom:1px solid var(--line)}
.dl td{padding:12px 16px;border-bottom:1px solid var(--line);vertical-align:top}
.dl tr:last-child td{border-bottom:0}
.dl td:first-child{white-space:nowrap;font-weight:500}
.dl code{background:none;padding:0;font-size:.85rem}
.dl .note{color:var(--muted)}
.ver{display:flex;flex-wrap:wrap;gap:10px 24px;align-items:baseline;margin-bottom:18px}
.tag{font:500 .8rem/1 var(--mono);padding:6px 9px;border-radius:5px;background:var(--fiber-soft);color:var(--fiber)}
/* status */
.status{display:grid;grid-template-columns:1fr 1fr;gap:32px}
.status h3{margin-bottom:10px}
.status ul{margin:0;padding:0;list-style:none;display:grid;gap:10px}
.status li{font-size:.93rem;color:var(--muted);display:grid;grid-template-columns:18px 1fr;gap:8px}
.status li::before{font:600 .9rem/1.6 var(--mono)}
.proven li::before{content:"✓";color:var(--fiber)}
.open li::before{content:"○";color:var(--om1)}
.next{font:500 .66rem/1 var(--mono);letter-spacing:.08em;text-transform:uppercase;padding:4px 6px;border-radius:4px;background:var(--om1-soft);color:var(--om1);white-space:nowrap;align-self:center}
.fab-grid{display:grid;grid-template-columns:1fr;gap:28px;min-width:0}
.term .warn{color:#E9B35A} .term .fail{color:#F07C6C} .term .dim{color:var(--code-dim)}
.watch{display:grid;grid-template-columns:1fr 1fr;gap:18px 32px;padding:0;margin:0;list-style:none}
.watch li{font-size:.92rem;color:var(--muted);padding-left:16px;border-left:2px solid var(--fiber)}
.watch strong{color:var(--ink);font-weight:600;display:block}
.watch code{font-size:.8em}
.order{display:grid;grid-template-columns:repeat(3,1fr);gap:0;border:1px solid var(--line);border-radius:10px;background:var(--surface);overflow:hidden}
.order div{padding:16px 18px;border-right:1px solid var(--line)}
.order div:last-child{border-right:0}
.order b{display:block;font:800 1.4rem/1 var(--display);font-variation-settings:"wdth" 125;color:var(--fiber);margin-bottom:8px}
.order b.x{color:var(--om1)}
.order h3{font-size:.95rem}
.order p{font-size:.88rem;color:var(--muted);margin-top:4px}
footer{border-top:1px solid var(--line);padding-block:28px 40px;display:flex;flex-wrap:wrap;justify-content:space-between;gap:12px;font-size:.85rem;color:var(--muted)}
footer a{color:var(--muted)}
@media (max-width:860px){
.hero{grid-template-columns:1fr;gap:36px;padding-block:44px 40px}
.sec-head{grid-template-columns:1fr;gap:20px}
.facts,.rules,.status,.watch,.order{grid-template-columns:1fr}
.order div{border-right:0;border-bottom:1px solid var(--line)}
.order div:last-child{border-bottom:0}
.bar nav{display:none}
}
</style>
{{end}}