Skip to content

Worker: Build justinsforge.com Homepage

URL: https://mkdocs.justinsforge.com/memory/handoffs/justinsforge-homepage-build-2026-04-28/

You are a fresh Claude Code worker (Opus 4.7, dangerously-skip-permissions). Your job is to build out https://justinsforge.com as Justin's forge resource hub: a single mobile-first landing page with links to all forge tools and surfaces. Pattern follows https://justinkrystal.com which is the family hub.

Critical Read Order

  1. forge/FORGE-DOCTRINE.md (Section 9 communication rules apply to your code + comments + commits).
  2. forge/CLAUDE.md (auto-loaded).
  3. ~/.claude/projects/-home-justinwieb-forge/memory/MEMORY.md State Topics for context.
  4. ~/.claude/projects/-home-justinwieb-forge/memory/project_default_domain_justinsforge.md (the directive that drives this build).
  5. forge/docs/sites-playbook.md (Web Builder mode reference; full pipeline for new pages).
  6. forge/sites/_shared/tokens.css (design tokens; reuse these).
  7. forge/sites/_shared/forge-include.js (shared include behavior, if used).
  8. forge/sites/_templates/ (existing templates).
  9. forge/sites/justinkrystal.com/landing/index.html and forge/sites/justinkrystal.com/landing/admin.html (reference patterns).
  10. forge/sites/justinsforge.com/landing/index.html (existing minimal landing, you replace or extend it).

Existing state

forge/sites/justinsforge.com/landing/index.html already exists as a minimal "Justin's second brain" landing. Your job is to expand it into the full forge resource hub, OR replace it cleanly.

The Cloudflare tunnel ingress for justinsforge.com root is not currently configured in the media-server tunnel (only subdomains are: mkdocs, n8n, etc.). For the root domain to serve, add ingress: cf-add is at forge/scripts/forge_cloudflare_cf.py after Phase 4.3 rename. The deploy origin is the same media-server container that serves justinkrystal.com — port 8085 currently. Decide: same origin different vhost, or different origin/port. Coordinate via forge/sites/justinsforge.com/docker-compose.yml if you spin a new container.

Goals

  1. Mobile-first. Justin opens this from Venus (iPhone). Touch targets, readable on small screens, dark theme matching the existing landing.
  2. Single source of truth for forge URLs. The page surfaces every forge admin and read surface that Justin uses. Anything added or removed across forge updates here.
  3. Non-public. Add <meta name="robots" content="noindex, nofollow">. Cloudflare Access is NOT yet configured on justinsforge.com root. After your deploy, ask Justin if the root needs CF Access (probably yes since it surfaces admin URLs even though clicking them requires auth).
  4. Categorized. Group links so the LLM-grep test still works for Justin (he'll search the page mentally for "n8n" or "frigate" without scrolling 30 entries).

Section structure (proposed)

Section Items
Brain mkdocs.justinsforge.com (Forge knowledge viewer)
Operations finn.justinsforge.com (Proxmox), portainer.justinsforge.com, filebrowser.justinsforge.com, prowlarr.justinsforge.com, qtorrent.justinsforge.com, radarr.justinsforge.com, sonarr.justinsforge.com
Home homeassistant.justinsforge.com, frigate.justinsforge.com
Automation n8n.justinsforge.com
Capture inbox.justinsforge.com (note: webhook endpoint, not browseable, surface as documentation only)
Family hub justinkrystal.com (link out to the family/personal namespace)
Brand sites shopnovadesign.com, justinwieb.com, gusoutdoor.co, sipnservesociety.com (and any other live brand domains)

Use icons sparingly (single emoji or unicode glyph per row matches the justinkrystal admin.html pattern). Prefer text labels with descriptive function next to each.

Doctrine compliance

  • No em dashes in any HTML, CSS, JS, or docstring you produce. Use commas, colons, semicolons, parentheses.
  • Append URL: https://mkdocs.justinsforge.com/<path>/ to any new .md you create in indexed dirs.
  • Variable conventions if you write Python/shell: snake_case [source]_[entity]_[state] per FORGE-DOCTRINE-VARIABLES.md.
  • File-flat for new scripts: any new build/deploy script goes directly under forge/scripts/ as forge_<context>_<function>.{py,sh}.

Deploy pipeline

forge/scripts/forge_sites_deploy.sh (Phase 4.3 rename; was scripts/sites/deploy.sh). Reads from forge/sites/<site>/, builds, ships to media-server LXC. Verify the script supports justinsforge.com as a deployable site.

If the script only supports the existing site list, extend it or invoke the equivalent for justinsforge: copy via rsync or docker cp to the media-server container, restart the relevant container.

Preview locally first via forge/scripts/forge_sites_preview.sh justinsforge.com (Phase 4.3 rename; was scripts/sites/preview.sh). Surfaces a Tailscale URL Justin can open from Venus.

Cloudflare considerations

After deploy:

  1. Add ingress: python3 forge/scripts/forge_cloudflare_cf.py add @ justinsforge.com http://192.168.86.74:<port> (where @ is the apex; cf.py may need flag for apex). Or add as www subdomain and CNAME redirect.
  2. The site is publicly indexable unless gated. Decide with Justin whether root should be behind CF Access (recommend YES given it lists admin URLs). If yes, add an Access app for justinsforge.com with the "Justin Secure Only" reusable policy, and copy from existing app structures.

Design hints

Justin's existing justinsforge.com/landing/index.html already uses: - Dark palette: bg #0c0c0e, card #16161a, text #ededed, muted #8c8c93, accent gold #c9a227 - Fonts: DM Sans (body) + Playfair Display (headings) + JetBrains Mono (code) - Robot meta noindex+nofollow

Maintain this palette. The justinkrystal admin.html uses the same palette so you can lift card styles and link rows directly.

Stop conditions

  • Cloudflare ingress for the apex requires user authentication for the apex domain. If the existing cf-add tooling can't do apex, surface to Justin.
  • Deploy script forge_sites_deploy.sh doesn't recognize justinsforge.com as a target. Read the script to see how to extend it.
  • Adding a CF Access app for the apex domain is a sensitive change (locks the page from the public). Confirm the app + policy before activating.
  • Cross-site asset reuse from justinkrystal: only fonts (CDN) and CSS tokens (_shared/) are reusable. Don't copy family photos or Press-Your-Luck assets.

Deliverables

  1. forge/sites/justinsforge.com/landing/index.html (the new homepage).
  2. Any helper assets (icons, favicon if missing, manifest.json for iOS home screen).
  3. Optional admin.html if you want to split admin links from the public landing.
  4. Updated forge/sites/justinsforge.com/README.md documenting the structure and deploy steps.
  5. Cloudflare ingress entry for the apex (after Justin confirms).
  6. Cloudflare Access app for the apex (after Justin confirms).

When done, append a checkpoint to forge/memory/daily/$(date +%Y-%m-%d).md and write a brief deploy summary to a new memory entry at ~/.claude/projects/-home-justinwieb-forge/memory/reference_justinsforge_homepage.md so future sessions know the layout.

[Claude Code, justinsforge.com homepage worker]