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{{/* The home page drops the breadcrumb bar entirely: it is the root, so there
2 is no trail to show and an empty bar would leave a stray rule under the
3 navbar. */}}
4{{ define "breadcrumb_bar" }}{{ end }}
5
6{{ define "main" }}
7<section class="hero">
8 <div class="container">
9 <div class="row">
10 <div class="col-12 col-lg-7">
11 <span class="hero-eyebrow">
12 <span class="eyebrow-dot" aria-hidden="true"></span>
13 v0.2.0 · alpha · self-hosted
14 </span>
15 <h1 class="hero-title">
16 Website status monitoring for operators who host their <span class="accent">own stack</span>.
17 </h1>
18 <p class="hero-sub">
19 HTTP checks every three minutes. Lighthouse audits. Security header analysis.
20 Full-site SEO crawl. ntfy alerts on state transitions. Your data
21 never leaves your infrastructure.
22 </p>
23 <div class="hero-ctas">
24 <a href="/login" class="btn btn-primary">Access dashboard →</a>
25 <a href="{{ .SourceURL }}" target="_blank" rel="noopener" class="btn btn-outline-light">View source</a>
26 </div>
27 </div>
28 <div class="col-12 col-lg-5 mt-5 mt-lg-0 d-flex align-items-center">
29 <div class="terminal-block w-100">
30 <span class="t-line"><span class="t-comment"># probe cycle</span></span>
31 <span class="t-line"><span class="t-prompt">probe$</span><span class="t-out">GET https://bythewood.me</span></span>
32 <span class="t-line"><span class="t-key">status</span>=<span class="t-val">200 OK</span> <span class="t-key">rtt</span>=<span class="t-val">142ms</span></span>
33 <span class="t-line"><span class="t-key">cert</span>=<span class="t-val">valid · 87d</span></span>
34 <span class="t-line"><span class="t-prompt">probe$</span> <span class="t-cursor"></span></span>
35 </div>
36 </div>
37 </div>
38 </div>
39</section>
40
41<section class="stat-strip">
42 <div class="container">
43 <div class="row g-4">
44 <div class="col-6 col-md-4">
45 <div class="stat">
46 <div class="stat-label">properties</div>
47 <div class="stat-value">{{ num .TotalProperties }}</div>
48 </div>
49 </div>
50 <div class="col-6 col-md-4">
51 <div class="stat">
52 <div class="stat-label">checks logged</div>
53 <div class="stat-value">{{ num .TotalChecks }}</div>
54 </div>
55 </div>
56 <div class="col-12 col-md-4">
57 <div class="stat">
58 <div class="stat-label">online since</div>
59 <div class="stat-value" style="font-size: 1.05rem;">
60 {{ if .FirstCheckAt }}{{ .FirstCheckAt }}{{ else }}—{{ end }}
61 </div>
62 </div>
63 </div>
64 </div>
65 </div>
66</section>
67
68<section class="container my-5 py-4">
69 <div class="row g-4">
70 <div class="col-12 col-md-6 col-lg-4">
71 <div class="feature">
72 <div class="feature-label">uptime</div>
73 <div class="feature-title">Live HTTP probes</div>
74 <p class="feature-desc">Three-minute checks with two-strike debouncing. Alerts fire only on real state transitions, never on flaps.</p>
75 </div>
76 </div>
77 <div class="col-12 col-md-6 col-lg-4">
78 <div class="feature">
79 <div class="feature-label">performance</div>
80 <div class="feature-title">Lighthouse audits</div>
81 <p class="feature-desc">Daily headless runs scoring performance, accessibility, best practices, and SEO. Top weighted metrics and savings opportunities ranked by impact.</p>
82 </div>
83 </div>
84 <div class="col-12 col-md-6 col-lg-4">
85 <div class="feature">
86 <div class="feature-label">security</div>
87 <div class="feature-title">Header analysis</div>
88 <p class="feature-desc">HTTPS, HSTS, HSTS preload, content-sniffing protection, clickjack defence, and server-version leak checks on every probe.</p>
89 </div>
90 </div>
91 <div class="col-12 col-md-6 col-lg-4">
92 <div class="feature">
93 <div class="feature-label">crawler</div>
94 {{/* 39 is the count crawler_checks.go registers. Keep them in step. */}}
95 <div class="feature-title">Weekly SEO spider</div>
96 <p class="feature-desc">In-process spider runs weekly. 39 ranked checks across SEO, links, sitemap, accessibility, content, performance, and security.</p>
97 </div>
98 </div>
99 <div class="col-12 col-md-6 col-lg-4">
100 <div class="feature">
101 <div class="feature-label">sharing</div>
102 <div class="feature-title">Public status pages</div>
103 <p class="feature-desc">Flip a property public and share the URL. Customers see live status, response graphs, and uptime at a glance, no account required.</p>
104 </div>
105 </div>
106 <div class="col-12 col-md-6 col-lg-4">
107 <div class="feature">
108 <div class="feature-label">ownership</div>
109 <div class="feature-title">Single binary, single container</div>
110 <p class="feature-desc">Go + SQLite, shipped as one Docker Compose stack. Your data, your ingress, your retention policy. No SaaS lock-in.</p>
111 </div>
112 </div>
113 </div>
114</section>
115{{ end }}