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

5.0 KB · 116 lines · HTML Raw History
  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 }}