orchard
mirrorEvery site I host, in one repo, along with the Cloudflare Tunnel and Caddy that front them. It's all Go, Vite, and SQLite, and it runs on a desktop at home with nothing listening on an inbound port.
blogbuncaddycloudflare-tunneldockergogolanghomelabhtml-templatemonorepoself-hostedseosqlitestatic-sitetypstuptime-monitoringviteweb-analytics
1<!doctype html>
2<html lang="en">
3<head>
4<meta charset="utf-8">
5<meta name="viewport" content="width=device-width, initial-scale=1">
6<meta name="robots" content="noindex, nofollow">
7<title>chat · a conversation with a model on hardware you own</title>
8<link rel="stylesheet" href="{{asset "static/app.css"}}">
9 <!-- Analytics, first party and on this estate. The id is identity rather than
10 a credential, so it is a constant here like every other site's. -->
11 <script>
12 (function (m, e, t, r, i, c, s) {
13 m.collectorQueue = m.collectorQueue || r;
14 m.collectorServer = c;
15 m.collectorId = s;
16 m.collectorScript = e.createElement(t);
17 m.collectorScript.src = c + i;
18 e.head.appendChild(m.collectorScript);
19 })(window, document, "script", [], "/static/collector.js",
20 "https://analytics.bythewood.me", "73f89553-a3fa-4c4a-b567-9a9a0550240b");
21 </script>
22</head>
23<body class="landing-body">
24<main class="landing">
25 <a class="brand" href="/">
26 <span class="key">C<i class="cur"></i></span>
27 <span class="brand-name">chat</span>
28 </a>
29
30 <p class="eyebrow">Self hosted · {{.Model}} · {{.Ctx}} token window</p>
31
32 <h1>A conversation with a model running on <span class="accent">hardware you own</span>.</h1>
33
34 <p class="lede">
35 No API key, no third party, and nothing leaving the house. It reaches for a tool
36 when the answer depends on something it cannot know, reads the files you give it,
37 and keeps the thread in a database you can delete.
38 </p>
39
40 <ul class="points">
41 <li><b>Ten tools</b>, all keyless: search, page fetching, weather, markets, scores, odds, music, conversion and arithmetic.</li>
42 <li><b>Attachments</b> by drag and drop or picker. PDFs, spreadsheets, documents, code and logs, read into the turn and never stored.</li>
43 <li><b>Incognito</b> writes nothing down, here or at the model gateway, verified by counting rows either side of a turn.</li>
44 <li><b>Compaction</b> summarises the oldest exchanges once the window fills, so a long thread keeps working.</li>
45 </ul>
46
47 <div class="ctas">
48 <a class="btn" href="/login">Open chat →</a>
49 <a class="btn ghost" href="{{.Source}}" target="_blank" rel="noopener">View source</a>
50 </div>
51
52</main>
53</body>
54</html>