GOSW — Next Steps & Plan Tracker
Living checklist of plans made on the GOSW site. Check items off as they ship. Each round’s checklist is followed by the full finalized plan text for reference.
Round: Author field + review fixes + redesign eval (planned 2026-07-12)
Author metadata
Review-finding fixes
Catalog redesign (evaluation done; build deferred)
Phase A attempt — reverted, lesson learned: - Built type: grid with a fixed image-height: 220px crop (object-fit: cover) on the existing landscape cover art. Rendered and screenshotted cleanly, but the owner rejected it: the fixed-height crop cuts off meaningful parts of the cinematic photos (text/faces sliced off top or bottom of each poster). - Reordering implication: Phase A as originally scoped (“cheap win on existing art, before any art rework”) doesn’t actually work standalone — a uniform-crop grid needs source art that’s already close to a consistent ratio, or crop-aware image editing per post. So Phase B (poster ratio) likely needs to come before a real Phase A, not after. - Correction to the Part 3 evaluation (still valid, unaffected by the revert): “51 posts have no cover image” was wrong — a grep-tool truncation artifact (default 250-result cap on 301 files), not a real gap. Verified with a full untruncated pass: all 301 posts have a valid image: field. Found and fixed 2 unrelated broken path typos along the way (image/ → images/, and a duplicated -cover-cover.jpg suffix) — both now point to real files and are already deployed. So Phase B is “pick one ratio + regenerate/crop existing art” only — no backfill needed.
Index hero / cinematic entry point
Implementation notes: - scripts/build_hero_manifest.py (new) — reads posts/*.qmd, takes the 5 newest, writes hero-images.js (a plain const GOSW_HERO_IMAGES = [...] array with title/date/image/url per post). - hero-images.js (new, generated — committed like _site/, since there’s no build step on deploy) — loaded client-side by index.qmd’s hero. - index.qmd — replaced the old static banner image (images/gosw_jj_design_banner.jpg) with a full-bleed hero: auto-crossfading carousel (5s interval, opacity fade, respects prefers-reduced-motion by freezing on slide 1), a light bottom scrim, and two CTAs (“Explore Posts” → blog.html, “Subscribe” → #subscribe). Everything else on the page (audio player, mission paragraphs, subscribe form) is untouched. - _gosw-rules.scss — new .gosw-hero block. Two bugs caught during verification: (1) an initial negative top margin made the hero overlap the page’s own “Welcome to SpiritWorshipGen” title — fixed with a small positive top margin, full-bleeding horizontally only; (2) the hero originally overlaid a static “I am a Spirit…” tagline centered on the image, which clashed with post covers that already carry their own bold graphic headline text (owner caught this via local preview) — removed the tagline entirely and moved the scrim + CTAs to a bottom-anchored band, so the post’s own cover art carries the message with zero risk of text-on-text collision regardless of which of the 5 images is showing. - .claude/commands/new-post.md — STEP 6 now also runs python scripts/build_hero_manifest.py after render; STEP 8’s git-add list includes hero-images.js. Fully self-maintaining — publishing a new post automatically refreshes the hero, no manual step. - Verified via quarto render index.qmd + a headless-browser screenshot (light theme) — clean full-bleed hero, correct crossfade wiring, no overlap.
Deviations from the plan below (during implementation)
- The plan text below says “remove
*.md” — owner corrected mid-session: the GitHub repo being private doesn’t stop Netlify from publicly serving_site/*.html. Landed on a middle ground instead — explicit!excludesin_quarto.ymlfor the 6 purely-internal docs, whileCATEGORIES.mdandnext-steps.mdkeep rendering (owner wantsnext-steps.htmlviewable in-browser via the Dawn theme). - The author-insertion script had a bug: inserting
author:right after the first physicaltitle:line broke one post (2025-05-02-hearing-god-after-prayer.qmd) whose YAMLtitlewrapped onto a second line. Caught by full-corpus YAML validation and fixed by hand; confirmed no other posts were affected.
Full plan text (as approved)
GOSW: author field, review-finding fixes, and catalog-redesign evaluation
Context
Three requests, addressed together:
- Author metadata is inconsistent. Of 301 posts, 184 carry
author:and every one says"Sammy Egot"(two forms: bareauthor: Sammy Egotandauthor: "Sammy Egot" # or your name); the other 117 have no author line at all. The author’s name is Samuel Egot, and it should appear on every post and on every future post. - The last code review found real weaknesses. The one live problem:
_quarto.ymlrenders"*.md", so internal docs are published as public pages (confirmed live:CLAUDE.html,CATEGORIES.html,SKILLS.html,PUBLISHING_LOG.html,favorite_blogpost_samples.html,gosw_workflow.html,quarto-blog-commands.html). The remaining 9 findings are latent bugs in the one-offscripts/normalize_categories.py(its job is done; the corpus is clean) plus two doc inconsistencies. - Catalog / “Netflix” redesign — this round delivers the evaluation + a phased build plan only (the build itself is a separate approved round).
Decisions locked with the user: retire the one-off rewriter but archive it for reference and add a read-only checker in its place; change the YAML author: field only (leave in-body “— Sammy Egot” quote signatures and the Facebook profile link untouched); redesign = evaluate + plan only this round.
Per standing preference, all git add/commit/push and quarto render commands are handed off to the user to run locally — this plan does not run them.
Part 0 — Create next-steps.md tracker (do this first)
Create a new next-steps.md at the repo root: a living, checkbox tracker of every plan/recommendation made on the GOSW site, so work can be ticked off as it lands. It stays internal (dropping "*.md" from render in Part 2 keeps it off the public site). Structure it as grouped Markdown checklists — one section per initiative — so future rounds append to it rather than starting fresh. Every subsequent part of this plan maps to a checkbox here.
Part 1 — Author field on every post
Bulk edit (throwaway script, run from scratchpad — not committed, to avoid adding another fragile one-off to the repo). For each posts/*.qmd, operating only inside the --- front-matter block, preserving CRLF and leaving everything else byte-for-byte identical:
- If an
author:line exists → replace that whole line withauthor: "Samuel Egot"(this also drops the# or your namecomment and the old name). - If no
author:line exists → insertauthor: "Samuel Egot"immediately after thetitle:line (or, if no title line, as the first line after the opening---).
Net result: all 301 posts have exactly author: "Samuel Egot". Body-text quote signatures and the fb.com/sammy.egot link label are not touched.
/new-post skill — .claude/commands/new-post.md: - Add author: "Samuel Egot" to the YAML front-matter template (STEP 2, the block around line 92), so all future posts carry it. - Fix STEP 2 line ~101: categories guidance says “Sentence Case” → change to “Title Case” (matches CATEGORIES.md and the normalized corpus).
Part 2 — Fix the review findings
A. Live leak — stop publishing internal docs. In _quarto.yml, remove "*.md" from the project: render: list (leaving "*.qmd", "posts/**/*.qmd", "!videos/**"). Every real page is a .qmd (index, about, contact, blog), so nothing public is lost. Then remove the already-committed stale pages from _site/: CATEGORIES.html, CLAUDE.html, SKILLS.html, PUBLISHING_LOG.html, favorite_blogpost_samples.html, gosw_workflow.html, quarto-blog-commands.html (via git rm, since _site/ is committed directly and re-render alone won’t purge orphans).
B. Retire + archive the one-off rewriter. Move scripts/normalize_categories.py → scripts/archive/normalize_categories.py (kept for reference, out of any run path). This eliminates every rerun/data-corruption finding at the source (findings: comma/quote parse fragility ×4, unconditional lowercase-dedup dropping casing, no dry-run/backup, plus the efficiency/scope-creep notes) — a script that no longer runs cannot misbehave on a rerun.
C. Add read-only scripts/check_categories.py. A safe, no-write checker (uses PyYAML, already installed) that reads all posts/*.qmd front matter and reports, exiting non-zero if anything is found: - case-drift clusters (categories differing only by case), - duplicate categories within a single post, - malformed list syntax / stray trailing commas, - categories not found in CATEGORIES.md (advisory: possible typo or a not-yet-catalogued category). This gives the pre-publish safety the rewriter never had, without any ability to corrupt files.
D. Doc consistency — CATEGORIES.md. Title-case the few non-Title entries in the “Additional Categories In Use” list (e.g. Divine alignment → Divine Alignment, End times → End Times, Night watch → Night Watch, Spiritual transformation → Spiritual Transformation, God's approval → God's Approval, God's plan → God's Plan, Guarding your heart → Guarding Your Heart). Done via a small Python write (not terminal echo) to keep the curly apostrophes intact. Posts still using an old-case form are not rewritten here — check_categories.py will surface them for the next normalization round (bundled with the deferred singleton-pruning decision), keeping this change surgical.
Part 3 — Catalog redesign: evaluation + phased plan (deliverable only)
What works: strong, cohesive “Dawn” theme (warm-paper light + dark, editorial serif, gold/sage accents) — post pages already feel premium; normalized categories give a clean backbone for genres/rows; 250/301 posts have cover art; search + theming work.
What blocks a catalog feel: 1. blog.qmd uses type: default — a plain vertical text list, not a poster wall (biggest gap). 2. index.qmd is a text welcome + subscribe form — no hero / featured / cinematic entry point. 3. Cover art is landscape ~1200×628, mixed jpg/png/webp; the target is portrait 9:16 / 4:5. Mixing ratios breaks a poster grid — #1 practical blocker; needs one locked poster ratio + regenerated/cropped art. 4. 51 posts have no cover image → blank tiles without a branded placeholder or backfill. 5. 301 posts in one flat date list is overwhelming — no curation (rows by category, “new,” “most-read,” Part 1/2 as series).
Recommended phasing (self-contained, no external deps — keeps the site’s no-web-font ethos): - Phase A (cheap, high impact): switch blog.qmd to type: grid with fixed image-height + image-placeholder; add the category filter. Ships a card catalog immediately on existing art. - Phase B (art direction): pick ONE poster ratio (recommend 4:5 to match the IG/FB source art, or classic 2:3), batch-regenerate/crop covers, backfill the 51 imageless posts. Prereq for a clean grid. - Phase C (the Netflix feel): custom EJS listing template + CSS for a hero/featured band on the landing page and horizontal scroll-snap “shelves” per category; optional “most-read”/“new this week” rows.
Build is deferred to a separate approved round; this section is the reference doc for it.
Files touched this round
next-steps.md— new, living plan/checklist tracker at repo root.posts/*.qmd—author:line normalized on all 301 (throwaway scratchpad script; not committed)._quarto.yml— drop"*.md"from render._site/—git rmthe 7 stale internal HTML pages.scripts/normalize_categories.py→scripts/archive/normalize_categories.py(moved).scripts/check_categories.py— new, read-only..claude/commands/new-post.md— addauthor:to template; Sentence → Title Case.CATEGORIES.md— Title-case a handful of entries.
Verification
- Author:
grep -c 'author: "Samuel Egot"'acrossposts/= 301; no^author:line still contains “Sammy Egot”; spot-check one formerly-missing file and one formerly-quoted file;check_categories.py(and a YAML parse) succeeds on all 301. - Leak: after removing
"*.md"and re-rendering,_site/CLAUDE.html,_site/CATEGORIES.html, etc. are gone and not regenerated;_site/index/about/contact/blog.htmlstill present. - Checker:
python scripts/check_categories.pyruns and reports cleanly (or lists only the known advisory non-canonical entries). - Docs:
new-post.mdtemplate showsauthor: "Samuel Egot"and “Title Case”;CATEGORIES.mdentries are Title Case. - Deploy (user runs locally):
quarto render, then the git add/commit/push handoff (includinggit rmof the stale_sitepages andgit add -f _site/).