Go / Web platform2026 rebuild

nikom.work: Go portfolio renderer

A small Go SSR application that replaces an uncacheable Laravel portfolio and closes a 2.9-million-URL filter crawl trap.

01

Context

The previous portfolio started a Laravel session on public GET requests, returned Cache-Control: no-cache, private, and exposed every tag toggle as another crawlable query URL. The July 2026 Search Console export contained 2,900,597 URLs excluded by noindex while only the homepage was indexed.

02

Constraint

Keep the useful project proof and contact workflow, remove the database-backed presentation layer, remain deployable as one tiny container, and avoid competing with the two specialist practice sites.

03

Engineering decisions

  1. Render the public site from immutable in-memory content with no session or database reads on GET requests.
  2. Use buttons and local DOM filtering for portfolio categories; filters never create URLs.
  3. Permanently redirect every legacy query-string view to its clean path and every retired topic page to one capability hub.
  4. Pre-compress text responses, emit validators, and give the CDN explicit shared-cache and stale-on-error policy.
  5. Keep SQLite only for durable contact intake and use an outbox so Brevo contact, deal, note, and notification steps can retry independently.
04

Evidence surface

  • GSC baseline: 2,900,631 not indexed versus 1 indexed URL on 10 July 2026.
  • Coverage causes: 2,900,597 noindex URLs, 22 discovered-not-indexed, 9 crawled-not-indexed, and 1 server error.
  • Public Laravel HTML returned two session cookies and Cloudflare DYNAMIC on every sampled page.
  • The new indexable contract is intentionally bounded to identity, work, capabilities, contact, and original engineering cases.