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 <link rel="canonical" href="{{ .Canonical }}">
9 {{/* The staging hostname is a complete duplicate of the real site, which is
10 the one way it can damage it. robots.txt refuses the crawl and this
11 refuses the index, because either alone has a hole: a crawler that
12 ignores robots.txt still sees the meta tag, and one that obeys it never
13 fetches the page to read the tag. */}}
14 {{ if .Staging }}<meta name="robots" content="noindex, nofollow">{{ end }}
15 <link rel="icon" type="image/svg+xml" href="/favicon.ico">
16
17 {{ if .JSONLD }}<script type="application/ld+json">{{ .JSONLD }}</script>{{ end }}
18
19 {{ template "extra_head" . }}
20
21 {{ range .Styles }}<link href="{{ . }}" rel="stylesheet">{{ end }}
22 {{ template "extra_css" . }}
23
24 {{ template "collector" . }}
25</head>
26
27<body>
28 {{ template "nav" . }}
29
30 {{ template "breadcrumb_bar" . }}
31
32 <main>
33 {{ template "main" . }}
34 </main>
35
36 {{ template "footer" . }}
37
38 <script type="module" src="{{ .Script }}"></script>
39 {{ template "extra_js" . }}
40</body>
41</html>