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 <title>{{ .Title }} ยท {{ .SiteName }}</title>
7 <meta name="description" content="{{ .Description }}">
8 {{/* Nothing here is worth indexing and every page but the form is behind a
9 session, so the tag is unconditional rather than staging-only. */}}
10 <meta name="robots" content="noindex, nofollow">
11 <meta name="theme-color" content="#0e0d0a">
12 <link rel="icon" type="image/svg+xml" href="/favicon.ico">
13
14 {{ range .Styles }}<link href="{{ . }}" rel="stylesheet">{{ end }}
15 {{ range .PageStyles }}<link href="{{ . }}" rel="stylesheet">{{ end }}
16
17 {{- if .Analytics }}
18 <script>
19 (function (m, e, t, r, i, c, s) {
20 m.collectorQueue = m.collectorQueue || r;
21 m.collectorServer = c;
22 m.collectorId = s;
23 m.collectorScript = e.createElement(t);
24 m.collectorScript.src = c + i;
25 e.head.appendChild(m.collectorScript);
26 })(window, document, "script", [], "/static/collector.js",
27 "https://analytics.bythewood.me", "{{ .AnalyticsID }}");
28 </script>
29 {{- end }}
30</head>
31
32<body>
33 {{ template "nav" . }}
34
35 <main>
36 {{ template "main" . }}
37 </main>
38
39 {{ template "footer" . }}
40
41 <script type="module" src="{{ .Script }}"></script>
42 <script type="module" src="{{ .PageScript }}"></script>
43</body>
44</html>