Project Pages (publishing conventions)

This document summarizes the project-pages publishing conventions that a project started from this skeleton adopts. The canonical, authoritative description lives in the homelab project: documents/09-project-pages-conventions.md. This document is the skeleton’s summary of it and points back to the canonical source.

Why pages exist

A project’s published pages are its read interface: status, live state, work plan (TODO), rules (prompts), and knowledge (documents). A human or LLM can understand the project — and decide how to work with it — without escaping the project’s sandbox.

The standard page set

A project publishes a directory tree served at /projects/<id>/, with a consistent relative nav. Every page is required:

Page Content
index.html Status: what the project is, its current status, how it works.
dashboard.html Dashboard: live state (point-in-time values from the owning host).
todo.html Condensed TODO: open work items.
prompts.html Prompts index: the entire prompts/ tree, grouped by directory, linking to full-text pages.
documents.html Documents index: every file in documents/, linking to full-text pages.
records.html Records index: every file in records/, linking to full-text pages.

Rules:

Registration and publishing (homelab model)

Sanitization (non-negotiable)

Published pages must contain no MAC addresses, private LAN IPs, usernames, home paths, or private-key material. The exact gate patterns live in the homelab (scripts/labs-deploy.sh, tests/03-labs-site.sh, tests/06-project-pages.sh); the homelab re-runs the gate at publish time.

Conformance checklist

  1. Read the canonical conventions doc in the homelab.
  2. Generate the standard page set per the rules above (the skeleton’s site.in/ + scripts/site-build.sh + scripts/site-condense.sh + make site produce it).
  3. Register once in the homelab sources/projects.yaml with a readable pages_source.
  4. Confirm the leak gate passes over the generated output.
  5. After a homelab deploy, verify curl https://labs.bannister.us/projects/<id>/ returns 200 and the content is sanitized.

Live example