Site content (schedule, bios, nav, calendar) + publish-on-merge CI #3

Merged
forgejo-admin merged 3 commits from external-web-publish into main 2026-08-03 23:56:17 +00:00

Three commits: the site content, the CI pipeline that publishes the module, and changeset-driven versioning.

Deploy target for reference: https://tangonexus.com/nexus/ (production celilo module status reports domain: tangonexus.com, route: /nexus, currently 0.2.0+1). The domain root is a separate WordPress site, which is why this publishes into a subfolder and why every asset URL carries the /nexus prefix.

1. Content

  • Sticky frosted nav at the top — Schedule / Bios (in-page anchors) left, Partiful / Tickets (outbound) right.
  • Weekend schedule for all five sessions, plus a September 2026 calendar card with the 11th–13th highlighted and an .ics download.
  • Bios for the live acts and DJs. Every photo renders as the same square tile; the crop is chosen per image with object-position, and clicking one opens a native <dialog> lightbox (Esc-to-close and focus trapping come free).
  • Hero mark now generates at its container's width, so its painted curtain reaches the viewport edges. Glyph size is driven by canvas height (buildTextMask uses H * 0.74), so the wordmark itself is unchanged; the stream count scales with width to keep the curtain's density.

Photos go through astro:assets — 2.7 MB of PNG becomes 380 KB of WebP. Michelle Badion's tile is a pre-crop, since object-position can crop but not zoom; her lightbox shows the untouched original.

2. Publish on merge to main

.forgejo/workflows/release.yml, modelled on lunacycle's (build-bus Phase 4). Publishing ends at the registry — nothing is deployed; rolling a version out to tangonexus.com/nexus stays celilo-mgr's job.

Change Why
@celilo/visualizer: file:../celilo/packages/visualizer^0.2.0 the sibling checkout does not exist in CI
mise.toml pins node the celilo native runner ships mise + build-essential, no node
on_install registers the repo with the forge mints the scoped CELILO_PUBLISH_TOKEN the workflow authenticates with
tsconfig picks up @types/node celilo module check runs tsc and was failing on astro.config.mjs's process.env, which would have blocked the publish

3. Changeset-driven versioning

manifest.yml#version is now stamped by celilo module version from celilo-module/.changeset/*.md, matching lunacycle. release.yml gained a version phase: pending changesets stamp the version + CHANGELOG and open a "Version Packages" PR (publish skipped); no pending changesets means that PR already merged, so publish runs against a current manifest.

This replaces a guarantee that never existed here. An earlier revision of this PR claimed the stale gate forced a version bump on any source change. It does not: checkModuleStale scopes its git pathspec to the module dir (git-hygiene.ts:54-66), and this repo keeps the site at the repo root, outside celilo-module/. I verified it by committing a src/-only change and watching the gate report ✓ manifest.yml is current. So content merges were publishing fresh +N revisions of a frozen version number. Changesets are what actually make the version move.

⚠️ The changesets live in celilo-module/.changeset, not the repo root. celilo module version <dir> reads <dir>/.changeset, and unlike lunacycle our manifest sits in a subdirectory. A changeset written to the repo root is silently ignored — the version job sees nothing pending and goes straight to publish. This is called out in the workflow, the manifest, and .changeset/README.md, because it is invisible when you get it wrong.

The hand-set 0.3.0 is reverted to 0.2.0 and expressed as a minor changeset instead, so the first release through this pipeline is stamped by the pipeline rather than by hand.

What merging this does

  1. Merge → version phase finds the pending changeset, stamps 0.2.0 → 0.3.0, writes CHANGELOG.md, and opens a "Version Packages" PR. Nothing publishes yet.
  2. Merge that PR → publish phase packages the module and uploads 0.3.0 to celilo-registry.
  3. Rollout to tangonexus.com/nexus is a separate operator action.

Verified

  • npm run build, astro check (0 errors — the pre-existing process error is fixed), lint:css clean.
  • bun test in celilo-module/scripts: 9 pass, including three new cases covering the forge registration.
  • celilo module check ./celilo-module: 5 ok, 0 fail.
  • celilo module version ./celilo-module run locally against this exact layout: 0.2.0 → 0.3.0 (minor); consumed 1 changeset(s), wrote CHANGELOG.md. State restored afterwards so CI does the real stamping.
  • In a real browser: all 11 lightbox tiles open, the sticky nav blurs content passing under it, anchor jumps clear the nav, nothing overflows at 390px.

Notes

  • secrets.CELILO_PUBLISH_TOKEN is set on the repo. The on_install registration still earns its place — it makes the token reproducible on a fresh forge, and overwrites the manual secret with a package-scoped one on the next deploy.
  • Local visualizer work needs the local copy installed over the published one (npm install --no-save ../celilo/packages/visualizer, or npm link); otherwise the site builds against published 0.2.0 and your edits are invisible. Ordinary site work just needs npm install.
  • Azalea Jane has no photo and no bio yet, so she renders as a name with "Bio coming soon."
  • src/pages/play.astro carries a print-export change (?scale/?sync) that was already staged before this branch.
  • The fully-painted hero curtain is the one thing I could not verify automatically — the widget pauses when the tab is hidden and headless Chrome never advances the paint. Geometry was verified numerically instead.

🤖 Generated with Claude Code

Three commits: the site content, the CI pipeline that publishes the module, and changeset-driven versioning. Deploy target for reference: **https://tangonexus.com/nexus/** (production `celilo module status` reports `domain: tangonexus.com`, `route: /nexus`, currently 0.2.0+1). The domain root is a *separate* WordPress site, which is why this publishes into a subfolder and why every asset URL carries the `/nexus` prefix. ## 1. Content - **Sticky frosted nav** at the top — `Schedule` / `Bios` (in-page anchors) left, `Partiful` / `Tickets` (outbound) right. - **Weekend schedule** for all five sessions, plus a September 2026 calendar card with the 11th–13th highlighted and an `.ics` download. - **Bios** for the live acts and DJs. Every photo renders as the same square tile; the crop is chosen per image with `object-position`, and clicking one opens a native `<dialog>` lightbox (Esc-to-close and focus trapping come free). - **Hero mark** now generates at its container's width, so its painted curtain reaches the viewport edges. Glyph size is driven by canvas *height* (`buildTextMask` uses `H * 0.74`), so the wordmark itself is unchanged; the stream count scales with width to keep the curtain's density. Photos go through `astro:assets` — 2.7 MB of PNG becomes 380 KB of WebP. Michelle Badion's tile is a pre-crop, since `object-position` can crop but not zoom; her lightbox shows the untouched original. ## 2. Publish on merge to main `.forgejo/workflows/release.yml`, modelled on lunacycle's (build-bus Phase 4). Publishing **ends at the registry** — nothing is deployed; rolling a version out to `tangonexus.com/nexus` stays celilo-mgr's job. | Change | Why | | --- | --- | | `@celilo/visualizer`: `file:../celilo/packages/visualizer` → `^0.2.0` | the sibling checkout does not exist in CI | | `mise.toml` pins node | the celilo `native` runner ships mise + build-essential, no node | | `on_install` registers the repo with the forge | mints the scoped `CELILO_PUBLISH_TOKEN` the workflow authenticates with | | `tsconfig` picks up `@types/node` | `celilo module check` runs `tsc` and was failing on `astro.config.mjs`'s `process.env`, which would have blocked the publish | ## 3. Changeset-driven versioning `manifest.yml#version` is now stamped by `celilo module version` from `celilo-module/.changeset/*.md`, matching lunacycle. `release.yml` gained a `version` phase: pending changesets stamp the version + CHANGELOG and open a **"Version Packages" PR** (publish skipped); no pending changesets means that PR already merged, so publish runs against a current manifest. **This replaces a guarantee that never existed here.** An earlier revision of this PR claimed the stale gate forced a version bump on any source change. It does not: `checkModuleStale` scopes its git pathspec to the *module dir* (`git-hygiene.ts:54-66`), and this repo keeps the site at the **repo root**, outside `celilo-module/`. I verified it by committing a `src/`-only change and watching the gate report `✓ manifest.yml is current`. So content merges were publishing fresh `+N` revisions of a frozen version number. Changesets are what actually make the version move. ⚠️ **The changesets live in `celilo-module/.changeset`, not the repo root.** `celilo module version <dir>` reads `<dir>/.changeset`, and unlike lunacycle our manifest sits in a subdirectory. A changeset written to the repo root is silently ignored — the version job sees nothing pending and goes straight to publish. This is called out in the workflow, the manifest, and `.changeset/README.md`, because it is invisible when you get it wrong. The hand-set `0.3.0` is reverted to `0.2.0` and expressed as a **minor changeset** instead, so the first release through this pipeline is stamped by the pipeline rather than by hand. ### What merging this does 1. Merge → `version` phase finds the pending changeset, stamps **0.2.0 → 0.3.0**, writes `CHANGELOG.md`, and opens a "Version Packages" PR. **Nothing publishes yet.** 2. Merge that PR → `publish` phase packages the module and uploads 0.3.0 to celilo-registry. 3. Rollout to `tangonexus.com/nexus` is a separate operator action. ## Verified - `npm run build`, `astro check` (**0 errors** — the pre-existing `process` error is fixed), `lint:css` clean. - `bun test` in `celilo-module/scripts`: 9 pass, including three new cases covering the forge registration. - `celilo module check ./celilo-module`: 5 ok, 0 fail. - `celilo module version ./celilo-module` run locally against this exact layout: `0.2.0 → 0.3.0 (minor); consumed 1 changeset(s), wrote CHANGELOG.md`. State restored afterwards so CI does the real stamping. - In a real browser: all 11 lightbox tiles open, the sticky nav blurs content passing under it, anchor jumps clear the nav, nothing overflows at 390px. ## Notes - `secrets.CELILO_PUBLISH_TOKEN` is set on the repo. The `on_install` registration still earns its place — it makes the token reproducible on a fresh forge, and **overwrites** the manual secret with a package-scoped one on the next deploy. - **Local visualizer work** needs the local copy installed over the published one (`npm install --no-save ../celilo/packages/visualizer`, or `npm link`); otherwise the site builds against published 0.2.0 and your edits are invisible. Ordinary site work just needs `npm install`. - Azalea Jane has no photo and no bio yet, so she renders as a name with "Bio coming soon." - `src/pages/play.astro` carries a print-export change (`?scale`/`?sync`) that was already staged before this branch. - The fully-painted hero curtain is the one thing I could not verify automatically — the widget pauses when the tab is hidden and headless Chrome never advances the paint. Geometry was verified numerically instead. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Fills out the landing page with the weekend's real content and drops the
placeholder signup form.

- Sticky frosted nav: Schedule/Bios (in-page) left, Partiful/Tickets
  (outbound) right
- Weekend schedule for all five sessions, plus a September 2026 calendar
  card and an .ics download
- Bios for the live acts and DJs, each photo a uniform square tile whose
  crop is set per image via object-position, opening in a native <dialog>
  lightbox
- Hero mark now generates at the container's width so its painted curtain
  reaches the viewport edges; glyph size is height-driven so the wordmark
  is unchanged

Photos are served through astro:assets (2.7MB of PNG -> 380KB of WebP).
Michelle Badion's tile is a pre-crop, since object-position cannot zoom;
her lightbox shows the untouched original.

Module version bumped to 0.3.0 for the republish.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Modelled on lunacycle's release.yml (build-bus Phase 4). A push to main
packages celilo-module/ and uploads the .netapp to celilo-registry;
nothing is deployed — rolling a published version out stays celilo-mgr's
job.

No version job: lunacycle is version_source: changeset, but tango-nexus
versions its manifest by hand, and `module publish` enforces a
source-after-manifest stale gate — so a source change must bump
`version:` in the same commit or the job fails rather than shipping a
stale version.

To make it work on a runner:

- @celilo/visualizer moves from a file: link to the published ^0.2.0.
  The sibling checkout it pointed at does not exist in CI. Local
  visualizer work now needs `npm link` (or a temporary file: override).
- mise.toml pins node, since the celilo native runner ships no node.
- on_install registers the repo with the forge, minting a token scoped
  to the tango-nexus package alone and installing it as the repo's
  CELILO_PUBLISH_TOKEN secret. Both capabilities are optional, so a
  forge/registry outage warns instead of failing the site deploy.
- tsconfig picks up @types/node, so astro.config.mjs's process.env
  typechecks. `celilo module check` runs tsc and was failing on it,
  which would have blocked the publish.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
forgejo-admin changed title from Add schedule, bios, nav and calendar to the event site to Site content (schedule, bios, nav, calendar) + publish-on-merge CI 2026-08-03 23:09:54 +00:00
The manifest version is now stamped by `celilo module version` from
celilo-module/.changeset/*.md instead of being hand-edited, matching
lunacycle. release.yml grows a `version` phase: pending changesets open a
"Version Packages" PR and skip publish; no pending changesets means that
PR merged and the manifest is current, so publish runs.

This replaces a guarantee that never existed here. `module publish`'s
source-after-manifest stale gate scopes its pathspec to the module dir
(git-hygiene.ts checkModuleStale), and this repo keeps the site at the
repo root, outside celilo-module/ — so content changes never tripped it
and a merge shipped a fresh +N revision of a frozen version number.
Verified by committing a src/-only change and watching the gate pass.

Note the changesets live in celilo-module/.changeset, NOT the repo root:
`celilo module version <dir>` reads <dir>/.changeset, and unlike lunacycle
our manifest is in a subdirectory. A changeset at the repo root would be
silently ignored.

The hand-set 0.3.0 is reverted to 0.2.0 and expressed as a minor changeset
instead, so the first release through this pipeline is stamped by the
pipeline rather than by hand. Verified locally: 0.2.0 -> 0.3.0, CHANGELOG
written, changeset consumed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
celilo/tango-nexus!3
No description provided.