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
4<head>
5 <meta charset="utf-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1">
7
8 <title>{{ .Title }}</title>
9 <meta name="description" content="{{ .Description }}">
10 <link rel="canonical" href="{{ .Canonical }}">
11 {{- if .Staging }}
12 <!-- The test hostname must never be indexed, or it competes with the real
13 blog as a duplicate. robots.txt has to say it too, since a crawler that
14 obeys robots.txt never reads this tag. -->
15 <meta name="robots" content="noindex, nofollow">
16 {{- end }}
17
18 <link rel="icon" type="image/svg+xml" href="/favicon.svg">
19
20 <link rel="alternate" type="application/atom+xml" title="Isaac Bythewood's Blog" href="/feed.xml">
21
22 {{- if .ShowSocial }}
23 <meta property="og:type" content="article">
24 <meta property="og:site_name" content="Isaac Bythewood's Blog">
25 <meta property="og:title" content="{{ .Title }}">
26 <meta property="og:description" content="{{ .Description }}">
27 <meta property="og:url" content="{{ .Canonical }}">
28 <meta property="og:image" content="{{ .OGImage }}">
29 <meta property="og:image:width" content="1200">
30 <meta property="og:image:height" content="630">
31
32 <meta name="twitter:card" content="summary_large_image">
33 <meta name="twitter:title" content="{{ .Title }}">
34 <meta name="twitter:description" content="{{ .Description }}">
35 <meta name="twitter:image" content="{{ .OGImage }}">
36 {{- end }}
37
38 {{- if .JSONLD }}
39 <script type="application/ld+json">{{ .JSONLD }}</script>
40 {{- end }}
41
42 {{- range .Styles }}
43 <link href="{{ . }}" rel="stylesheet">
44 {{- end }}
45
46 {{- if .Analytics }}
47 <script>
48 (function (m, e, t, r, i, c, s) {
49 m.collectorQueue = m.collectorQueue || r;
50 m.collectorServer = c;
51 m.collectorId = s;
52 m.collectorScript = e.createElement(t);
53 m.collectorScript.src = c + i;
54 e.head.appendChild(m.collectorScript);
55 })(window, document, "script", [], "/static/collector.js",
56 "https://analytics.bythewood.me", "{{ .AnalyticsID }}");
57 </script>
58 {{- end }}
59</head>
60
61<body>
62 <nav class="navbar navbar-dark navbar-expand-md bg-deep d-print-none">
63 <div class="container">
64 <a href="/" class="navbar-brand logo shadow" aria-label="Isaac Bythewood"></a>
65 <button class="navbar-toggler border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
66 <span class="navbar-toggler-icon"></span>
67 </button>
68 <div class="collapse navbar-collapse" id="navbarSupportedContent">
69 <ul class="navbar-nav ms-3">
70 {{- range .NavTags }}
71 <li class="nav-item">
72 <a class="nav-link{{ if eq .Name $.ActiveTag }} active{{ end }}" href="{{ .URL }}">{{ .Name }}</a>
73 </li>
74 {{- end }}
75 </ul>
76 </div>
77 </div>
78 </nav>
79
80 {{- if .Breadcrumbs }}
81 <div class="breadcrumb-bar py-2 overflow-auto d-print-none">
82 <div class="container">
83 <nav style="--bs-breadcrumb-divider: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='%235a5a72'/%3E%3C/svg%3E");" aria-label="breadcrumb">
84 <ol class="breadcrumb mb-0">
85 {{- range .Breadcrumbs }}
86 {{- if .URL }}
87 <li class="breadcrumb-item"><a href="{{ .URL }}">{{ .Title }}</a></li>
88 {{- else }}
89 <li class="breadcrumb-item active">{{ .Title }}</li>
90 {{- end }}
91 {{- end }}
92 </ol>
93 </nav>
94 </div>
95 </div>
96 {{- end }}
97
98 <main class="flex-grow-1 pb-5">
99 {{- template "content" . }}
100 </main>
101
102 <footer class="bg-deep text-light d-print-none">
103 <div class="container">
104 <div class="row links">
105 <div class="col-12 col-lg-6 mb-4 mb-lg-0">
106 <div class="h5 font-monospace mb-3">Blog</div>
107 <p>A blog by <a href="https://isaacbythewood.com/">Isaac Bythewood</a>,
108 a Senior Solutions Architect at Craftmaster Furniture located in
109 Elkin, NC. Mostly webdev musings and the occasional deep dive into
110 infrastructure, security, and tooling. No warranty, technical
111 support, or mental support will be provided for anything read
112 here.</p>
113 </div>
114 <div class="col-6 col-lg-2 offset-lg-2">
115 <div class="h5 font-monospace mb-3">Projects</div>
116 <ul class="list-unstyled">
117 {{- range .FooterProjects }}
118 <li class="mb-2"><a href="{{ .Href }}" class="link-footer" target="_blank">{{ .Label }}</a></li>
119 {{- end }}
120 </ul>
121 </div>
122 <div class="col-6 col-lg-2">
123 <div class="h5 font-monospace mb-3">Links</div>
124 <ul class="list-unstyled">
125 {{- range .FooterLinks }}
126 <li class="mb-2"><a href="{{ .Href }}" class="link-footer" target="_blank">{{ .Label }}</a></li>
127 {{- end }}
128 </ul>
129 </div>
130 </div>
131 </div>
132 <div class="footer-plane">
133 <div class="footer-plane-overlay"></div>
134 <div class="footer-plane-grid"></div>
135 </div>
136 </footer>
137
138 <div class="footer-bar d-print-none">
139 <div class="container">
140 <div class="row align-items-center">
141 <div class="col-sm-6 d-flex align-items-center justify-content-center justify-content-sm-start order-1 order-sm-0">
142 <small>© {{ .Year }} Isaac Bythewood</small>
143 </div>
144 <div class="col-sm-6 d-flex justify-content-center justify-content-sm-end py-3 py-sm-0">
145 <a href="{{ .SourceURL }}" target="_blank" class="footer-bar-link" aria-label="GitHub">
146 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 16 16">
147 <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/>
148 </svg>
149 </a>
150 <a href="https://isaacbythewood.com/" target="_blank" class="logo shadow ms-3" style="width: 20px; height: 20px;" aria-label="Isaac Bythewood"></a>
151 </div>
152 </div>
153 </div>
154 </div>
155
156 <script src="{{ .Script }}"></script>
157</body>
158</html>