repos
/ orchard main

orchard

mirror

Every 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

3.6 KB · 92 lines · HTML Raw History
 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<title>search &middot; cited answers, read off the web</title>
 7<meta name="description" content="A search that reads the web and checks every sentence of its answer against the source it cites.">
 8<meta name="robots" content="noindex">
 9<link rel="stylesheet" href="{{ asset "static/app.css" }}">
10{{- if .Analytics }}
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", "{{ .AnalyticsID }}");
21</script>
22{{- end }}
23</head>
24<body>
25<div class="crt"></div>
26<div class="vignette"></div>
27
28<header class="bar landingbar">
29  <div class="barin">
30    <a class="brand" href="/">
31      <span class="key"><span class="cursor"></span></span>
32      <span>search</span>
33    </a>
34    <span class="spacer"></span>
35    <a class="ghost" href="{{ .SourceURL }}" target="_blank" rel="noopener">source</a>
36    <a class="ghost" href="/search">{{ if .Authenticated }}open{{ else }}sign in{{ end }}</a>
37  </div>
38</header>
39
40<main class="landing">
41  <section class="hero">
42    <span class="eyebrow">self-hosted &middot; local model &middot; cited</span>
43    <h1>Search that shows its <span class="accent">working</span>.</h1>
44    <p class="lede">
45      Ask a question. It searches the web, reads the pages it finds, and writes an
46      answer where every sentence carries the passage it came from. Then it checks
47      each one against that passage and tells you which held up.
48    </p>
49    <div class="ctas">
50      <a href="/search" class="act primary">{{ if .Authenticated }}Open search{{ else }}Sign in{{ end }}</a>
51      <a href="{{ .SourceURL }}" target="_blank" rel="noopener" class="act">View source</a>
52    </div>
53  </section>
54
55  <section class="grid">
56    <div class="card">
57      <span class="label">verified, not asserted</span>
58      <p>Every claim is checked against the passage it cites and marked unsupported
59      when that passage does not state it. Code gets its own pass, where each file is
60      parsed and every package it imports is looked up in the registry that would
61      have to have it.</p>
62    </div>
63    <div class="card">
64      <span class="label">nothing leaves the house</span>
65      <p>The model runs here and starts only while a question is in flight. No
66      prompt reaches a third party, and no question is written to disk.</p>
67    </div>
68    <div class="card">
69      <span class="label">it reads, then remembers</span>
70      <p>Pages are cleaned to text and kept, so a later question can reuse what an
71      earlier one fetched even when the two share no words.</p>
72    </div>
73    <div class="card">
74      <span class="label">it corrects itself</span>
75      <p>When most of an answer fails its own check, that means the search missed.
76      It re-plans and looks again rather than handing over something it cannot back.</p>
77    </div>
78  </section>
79
80  <section class="strip">
81    <div class="stat"><span class="statv">{{ num .Pages }}</span><span class="statl">pages read</span></div>
82    <div class="stat"><span class="statv">{{ num .Chunks }}</span><span class="statl">passages indexed</span></div>
83    <div class="stat"><span class="statv">{{ num .Sites }}</span><span class="statl">sites drawn from</span></div>
84  </section>
85
86  <footer class="foot">
87    <p class="faint">Access needs an account.</p>
88  </footer>
89</main>
90</body>
91</html>