Files
claude-timemachine aa36b2905a initial: zero-trust markdown tutorials site
Single-binary Go service that renders markdown pages from a runtime
volume mount. Targeted at public, no-auth, no-WAF deployment behind a
TLS ingress; security posture is defense-in-depth at every layer:

- goldmark with no WithUnsafe — raw HTML in author markdown is stripped
- CSP without 'unsafe-inline', plus HSTS, COOP, CORP, Permissions-Policy
- static handler rejects non-GET/HEAD, directory listings, dotfiles, traversal
- content loader rejects symlinks that escape the content root, dotfiles,
  and .md files larger than 1 MiB
- per-page template trees (cloned from layout) so define-blocks don't
  collide between home/category/page
- SIGHUP triggers atomic library swap — live edits on volume, no rebuild

Locale layout content/<locale>/<category>/<slug>.md. Categories without
_index.md still appear on the home page with a humanized name. Search is
a ~70-line vanilla JS scan over /search.json?lang=<locale>; swap for a
real indexer if the corpus ever balloons.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 00:52:53 +02:00

18 lines
611 B
HTML

{{define "title"}}automc tutorials{{end}}
{{define "content"}}
<h1>Tutorials</h1>
<p class="lead">Pick a topic. New here? Start with <strong>install client</strong>, then <strong>register</strong>.</p>
<ul class="category-list">
{{range .Categories}}
<li class="category-item">
<a href="/{{$.Locale}}/{{.Name}}/">
<h2>{{if .Index}}{{.Index.Title}}{{else}}{{humanize .Name}}{{end}}</h2>
{{with .Index}}{{with .Summary}}<p>{{.}}</p>{{end}}{{end}}
<span class="page-count">{{len .Pages}} page{{if ne (len .Pages) 1}}s{{end}}</span>
</a>
</li>
{{end}}
</ul>
{{end}}