Files
privatae-bastion/client-go/uiassets/page.html
T
Privatae 4f8285ef18
ci / personal-data (push) Successful in 4s
ci / test (push) Successful in 3m36s
ci / fuzz (push) Successful in 3m35s
bastion 0.60.0
2026-11-02 00:10:58 +00:00

72 lines
3.3 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="referrer" content="no-referrer">
<title>Privatae bastion — this machine</title>
<link rel="stylesheet" href="/assets/app.css">
<link rel="stylesheet" href="/assets/given.css">
<link rel="stylesheet" href="/assets/home.css">
<!-- htmx injects its own indicator stylesheet with insertAdjacentHTML (it does
`<style>` + `.htmx-indicator{opacity:0...}` when includeIndicatorStyles is
true, which is its default). This page's CSP is `default-src 'self'` with no
style-src escape and no nonce, so the browser BLOCKS that injection and logs
a violation on every load. Nothing here uses hx-indicator, so the effect is
nil and the console noise is the whole cost — but a CSP that is violated on
every page teaches whoever reads the console to ignore it, which is the one
thing a CSP cannot afford.
Turn the injection OFF rather than widen the policy. Found by the disk-map
unit while building against this CSP; it fires on the pages shipped in
0.25.0 too, so it predates that work. -->
<meta name="htmx-config" content='{"includeIndicatorStyles":false}'>
<script src="/assets/htmx.min.js"></script>
</head>
<body>
<header>
<h1>This machine</h1>
<p class="sub">The bastion running here, and the Hosts it serves.</p>
{{template "nav" "machine"}}
<!-- The older pages, until the steps that replace them land (plan Addendum 4):
what each Host may do here, and the disk. -->
<p class="sub">
<a href="/given">What this machine has given away</a> &middot;
<a href="/diskmap">This machine's disk</a>
</p>
</header>
<!-- The ONE piece of htmx in the page: re-fetch the same fragment the server
rendered below, every few seconds, and swap it in. No client-side state,
no JSON, no duplicate rendering path — the fragment is the truth. -->
<main id="status"
hx-get="/fragments/status"
hx-trigger="every 3s"
hx-swap="innerHTML">
{{template "status" .}}
</main>
{{/* Loaded once when the page opens (uimachine.go): they read files and walk
processes, and nothing in them changes at the status block's pace. */}}
<main class="machine-sections">
<h3>Report</h3>
<div class="panel">
<form method="post" action="/machine/report"><button class="go" type="submit">Write report</button></form>
<p class="dim">One Markdown file: the agents running now, scheduled jobs that start one, MCP tool-server problems,
changes since your baseline, and the last seven days of activity. No AI model writes any of it.</p>
</div>
<h3>Scheduled jobs that start an agent</h3>
<div class="panel" hx-get="/fragments/machine/schedules" hx-trigger="load" hx-swap="innerHTML"><p class="dim">Reading…</p></div>
<h3>MCP tool servers on this machine</h3>
<div class="panel" hx-get="/fragments/machine/tools" hx-trigger="load" hx-swap="innerHTML"><p class="dim">Reading…</p></div>
<h3>Changes since your baseline</h3>
<div class="panel" id="machine-baseline" hx-get="/fragments/machine/baseline" hx-trigger="load" hx-swap="innerHTML"><p class="dim">Reading…</p></div>
</main>
<footer>
privatae-bastion {{.Version}} · this page is served from this machine only and
is not reachable from anywhere else.
</footer>
</body>
</html>