/preview — HTML Preview
Render vault content as styled HTML for browser viewing. Markdown stays the source of truth; HTML is the presentation layer.
Context
Today's date: !date +%Y-%m-%d
Config: @_core/config.yaml Preview rules: @.claude/rules/preview-formats.md HTML shells: @_templates/html/ Processing logic: @_core/PROCESSING.md
Usage
/preview docs/project-a/checkout-flow.md
/preview decisions/project-a/2026-06-29-auth-approach.md
/preview progress all
/preview progress project-a --week
/preview decide auth-approach
/preview block api-rate-limit
/preview meet 2026-06-29-sync-sprint-review
/preview reports/2026-06-29-progress-all.md
Flags
| Flag | Effect |
|---|---|
--with-links |
Inline first paragraph from linked notes |
--no-open |
Write HTML only, do not open browser |
--shell memo|prd|status|executive |
Force template shell |
--link |
Write preview: path to source note frontmatter |
Session Task Progress
TaskCreate: "Resolve preview source"
activeForm: "Resolving preview source..."
TaskCreate: "Render HTML"
activeForm: "Rendering HTML preview..."
TaskCreate: "Open and verify"
activeForm: "Opening preview in browser..."
Processing Steps
1. Parse Input
Determine source mode:
| Input pattern | Action |
|---|---|
Path to .md file |
Read that file directly |
progress {project|all} |
Synthesize like /progress, use status shell |
decide {slug} |
Glob decisions/*/*{slug}*.md, pick latest |
block {slug} |
Glob blockers/*/*{slug}*.md |
meet {slug} |
Glob meetings/*{slug}*.md |
doc {project} {slug} |
Read docs/{project}/{slug}.md |
If ambiguous, ask user to clarify path.
2. Gather Content
File mode: Read markdown + frontmatter.
Synthesis mode (progress): Follow /progress gather steps:
- Scan dailies, blockers, docs, decisions for project/timeframe
- Build structured sections: Shipped, In Progress, Blockers, Decisions
- Count metrics for status shell
3. Select HTML Shell
Auto-detect from source:
| Source | Shell |
|---|---|
docs/ |
shell-prd.html |
decisions/, meetings/, blockers/ |
shell-memo.html |
progress synthesis |
shell-status.html |
reports/*executive* |
shell-executive.html |
| Other | shell-memo.html (default) |
Override with --shell flag.
4. Convert Markdown → HTML
- Remove YAML frontmatter block
- Map frontmatter to shell vars:
project,status,date,title(from H1 or filename) - Convert body markdown to semantic HTML
- Resolve
[[wikilinks]]per preview-formats.md - Escape user content in HTML (no XSS — literal text only)
5. Write Output
- Ensure
reports/previews/exists - Filename:
{date}-{slug}.html(slug from source file or synthesis type) - Load shell template, replace all
{{PLACEHOLDER}}tokens - Write complete self-contained HTML file
6. Open Browser
Unless --no-open:
# macOS
open "reports/previews/{filename}.html"
# Linux
xdg-open "reports/previews/{filename}.html" 2>/dev/null
# Windows
start "" "reports/previews/{filename}.html"
7. Optional: Link Back to Source
If --link and source is a single vault note:
- Edit source frontmatter:
preview: reports/previews/{filename}.html
8. Append Vault Log
Append to 01-index/_vault-log.md:
- Action:
preview - Files: output HTML path + source path
- Details: shell used, synthesis or file mode
Output
Preview ready: reports/previews/2026-06-29-checkout-flow.html
Shell: prd
Source: docs/project-a/checkout-flow.md
Opened in browser.
Error Handling
| Situation | Action |
|---|---|
| Source file not found | Suggest similar paths via Glob |
| Empty vault (progress) | Report "no data in timeframe" — do not write empty HTML |
| Browser open fails | Report file path; user can open manually |
Design Principles
- Typography first — readable fonts, generous line-height, print-ready
- No dependencies — pure HTML/CSS, no npm/pip required
- Self-contained — single file, embedded styles, works offline
- Source preserved — never modify markdown body unless
--linkrequested