diff --git a/README.adoc b/README.adoc index 308e9f6..d595cea 100644 --- a/README.adoc +++ b/README.adoc @@ -7,6 +7,8 @@ ifdef::env-github[] ++++
+Docs +CI Contributors Forks Stars @@ -25,6 +27,8 @@ Organization landing page for Dev-Centr — tools and resources to become a bett endif::[] ifndef::env-github[] +image:https://img.shields.io/badge/docs-Dev--Centr-22c55e?style=for-the-badge[Docs,link=https://docs.devcentr.org/devcentr-org/] +image:https://img.shields.io/github/actions/workflow/status/dev-centr/devcentr.org/ci.yml?branch=main&style=for-the-badge&label=CI[CI,link=https://github.com/dev-centr/devcentr.org/actions/workflows/ci.yml] image:https://img.shields.io/github/contributors/dev-centr/devcentr.org.svg?style=for-the-badge[Contributors,link=https://github.com/dev-centr/devcentr.org/graphs/contributors] image:https://img.shields.io/github/forks/dev-centr/devcentr.org.svg?style=for-the-badge[Forks,link=https://github.com/dev-centr/devcentr.org/network/members] image:https://img.shields.io/github/stars/dev-centr/devcentr.org.svg?style=for-the-badge[Stars,link=https://github.com/dev-centr/devcentr.org/stargazers] @@ -70,7 +74,7 @@ Site copies live in `public/brand/`. Canonical org-wide assets (including `logo. * **URL:** link:https://devcentr.org/help[/help] (`/support` redirects to `/help#support`) * Hub for self-help (docs) vs assisted support (coming soon), plus status, GitHub, and `support@devcentr.org`. -* Planning notes: `docs/help-and-support-plans.adoc` +* Planning notes: link:https://docs.devcentr.org/devcentr-org/latest/help-and-support-plans.html[Help & support plans] (Antora) === Status @@ -111,6 +115,7 @@ pnpm dev * `public/` — Static assets (includes generated feeds under `public/news/`) * `src/lib/news-posts.generated.json` / `changelog-entries.generated.json` — build outputs from `pnpm news:build` * `app.config.ts` — SolidStart/Vinxi configuration +* `docs/` — Antora component (published on link:https://docs.devcentr.org/devcentr-org/[docs.devcentr.org]) * `DESIGN.md` — Design philosophy and guidelines == Site Generation diff --git a/docs/antora.yml b/docs/antora.yml new file mode 100644 index 0000000..185742d --- /dev/null +++ b/docs/antora.yml @@ -0,0 +1,6 @@ +name: devcentr-org +title: devcentr.org +version: master +start_page: ROOT:index.adoc +nav: + - modules/ROOT/nav.adoc diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc new file mode 100644 index 0000000..05bb2e9 --- /dev/null +++ b/docs/modules/ROOT/nav.adoc @@ -0,0 +1,9 @@ +* xref:index.adoc[Overview] +** xref:explanation/site-architecture.adoc[Site architecture] +** xref:explanation/news-and-changelog.adoc[News & changelog pipeline] +** xref:explanation/theme-reveal.adoc[Theme reveal] +** xref:explanation/toolchain-advisor.adoc[Toolchain Advisor] +** xref:how-to/local-development.adoc[Local development] +** xref:help-and-support-plans.adoc[Help & support plans] +** xref:walkthrough-vscode-and-ci.adoc[VS Code & CI walkthrough] +* xref:changelog.adoc[Changelog] diff --git a/docs/modules/ROOT/pages/changelog-details/2026-08-10 - antora-site-docs.adoc b/docs/modules/ROOT/pages/changelog-details/2026-08-10 - antora-site-docs.adoc new file mode 100644 index 0000000..6307728 --- /dev/null +++ b/docs/modules/ROOT/pages/changelog-details/2026-08-10 - antora-site-docs.adoc @@ -0,0 +1,44 @@ += 2026-08-10 — Antora component and site docs +:navtitle: 2026-08-10 Antora site docs + +== Summary + +First-class Antora documentation for the devcentr.org marketing site, covering architecture, build pipelines, and recently changed subsystems that previously lived only in README fragments or inline code comments. + +== Added + +=== Antora component + +* `docs/antora.yml` — component `devcentr-org`, published on the org docs hub. +* Navigation and pages under `docs/modules/ROOT/`. + +=== Explanation pages + +* xref:explanation/site-architecture.adoc[Site architecture] — routes, static SolidStart build, CI sibling checkouts, Pages deploy. +* xref:explanation/news-and-changelog.adoc[News & changelog pipeline] — `build-news.mjs`, feeds, mirror sources, troubleshooting. +* xref:explanation/theme-reveal.adoc[Theme reveal] — View Transitions + WAAPI elliptical reveal from the mode toggle. +* xref:explanation/toolchain-advisor.adoc[Toolchain Advisor] — SDL sync from `dev-centr/toolchain-advisor`. + +=== How-to + +* xref:how-to/local-development.adoc[Local development] — prerequisites, sibling clones, common scripts. + +=== Moved into Antora + +* xref:help-and-support-plans.adoc[Help & support plans] (planning notes for `/help`). +* xref:walkthrough-vscode-and-ci.adoc[VS Code & CI walkthrough]. + +=== README + +* Docs badge → `https://docs.devcentr.org/devcentr-org/` +* CI badge → GitHub Actions workflow status. + +== Cross-repo + +* `dev-centr/docs` playbook registers this component; activity log and xref:home::where-docs-live.adoc[Where documentation lives] updated. + +== Knowledge gaps addressed + +* How `/changelog` ingests sibling Antora files (previously only mentioned briefly in README). +* Theme reveal state machine and mobile constraints (previously only in code comments). +* Toolchain advisor data path from SDL to `public/catalog/advisor.json`. diff --git a/docs/modules/ROOT/pages/changelog.adoc b/docs/modules/ROOT/pages/changelog.adoc new file mode 100644 index 0000000..fee25b8 --- /dev/null +++ b/docs/modules/ROOT/pages/changelog.adoc @@ -0,0 +1,29 @@ += Changelog + +Timeline of notable documentation and site changes in the devcentr.org repository. + +== 2026-08-10 — Antora component and site docs + +* Added Antora component (`docs/antora.yml`) with overview, site architecture, news/changelog pipeline, theme reveal, toolchain advisor, and local development guides. +* README badges for docs portal and CI workflow. +* See xref:changelog-details/2026-08-10 - antora-site-docs.adoc[Detailed changelog]. + +== 2026-08-09 — News voice and API keys essay + +* `content/news/README.adoc` — clarified news vs changelog voice; scene-driven writing checklist. +* News post on API keys vs tokens (narrative; canonical explanation lives in general-knowledge). + +== 2026-08-08 — Business Bootstrap support-systems hub (news) + +* News post announcing Business Bootstrap capability areas on docs.devcentr.org. + +== 2026-08-06 — Theme reveal stabilization + +* Restored elliptical View Transition reveal anchored to the mode toggle (`src/lib/theme-reveal.ts`). +* Mobile WebKit and Chrome fixes: px origins, unique keyframe names, WAAPI radii after `transition.ready`, reverse contract when returning to OS/load baseline. + +== 2026-07-24 — Help hub, status probes, news CMS + +* `/help` and `/status` community surfaces; changelog mirror from Antora sibling repos. +* Pages CMS config (`.pages.yml`) and `content/news/` authoring guide. +* GitHub Actions CI deploy to Pages with multi-repo changelog ingest. diff --git a/docs/modules/ROOT/pages/explanation/news-and-changelog.adoc b/docs/modules/ROOT/pages/explanation/news-and-changelog.adoc new file mode 100644 index 0000000..2151e37 --- /dev/null +++ b/docs/modules/ROOT/pages/explanation/news-and-changelog.adoc @@ -0,0 +1,81 @@ += News and changelog pipeline +:navtitle: News & changelog +:description: How authored news posts and mirrored Antora changelogs are built for devcentr.org. + +devcentr.org separates **narrative news** from **shipping notes**: + +* **News** (`/news`) — outward-facing essays and announcements authored in this repo. +* **Changelog** (`/changelog`) — day-to-day bullets mirrored from Antora changelogs in sibling repos. + +Do not put changelog bullets in news posts, and do not hand-edit the generated JSON catalogs. + +== News (authored) + +=== Source + +AsciiDoc files in `content/news/YYYY-MM-DD-slug.adoc`. + +Each post should set: + +[source,asciidoc] +---- += Post title +:description: One-line summary for feeds and meta +:revdate: 2026-08-10 +:keywords: news, blog, optional-topic +---- + +=== Authoring options + +* **Pages CMS** — GitHub-connected editor; config in `.pages.yml` at the repo root. +* **Git / PR** — create or edit files under `content/news/`, run `pnpm news:build`, open a PR. + +Voice and checklist: see `content/news/README.adoc` in the repository (conversational, scene-driven; changelog bullets belong elsewhere). + +=== Build output + +`scripts/build-news.mjs` (also `predev` / `prebuild`) writes: + +* `src/lib/news-posts.generated.json` — post metadata and rendered HTML for Solid routes +* `public/news/rss.xml` and `public/news/atom.xml` — syndication feeds + +Routes: `src/routes/news/` (and `/blog` alias). + +== Changelog (mirrored) + +=== Sources + +At build time, `build-news.mjs` ingests Antora timeline files from sibling checkouts: + +[cols="1,2",options="header"] +|=== +| Source ID | Antora file + +| `devcentr` +| `devcentr/docs/modules/ROOT/pages/changelog.adoc` + +| `general-knowledge` +| `general-knowledge/docs/modules/ROOT/pages/changelog.adoc` + +| `docs-portal` +| `docs/docs/modules/ROOT/pages/activity-log.adoc` (monthly activity-log format) +|=== + +CI checks out `dev-centr/devcentr`, `dev-centr/general-knowledge`, and `dev-centr/docs` into the workspace before running the script. +Locally, place sibling clones next to this repo or rely on the `../` fallback paths. + +=== Build output + +* `src/lib/changelog-entries.generated.json` — deduplicated, date-sorted entries +* Route: `src/routes/changelog.tsx` renders the mirror index with links back to canonical docs URLs + +=== Fixing a changelog entry + +Edit the source `changelog.adoc` or `activity-log.adoc` in the owning repository — not `changelog-entries.generated.json`. +Rebuild (or push to `main` and let CI regenerate). + +== Troubleshooting + +* **Empty `/changelog` locally** — clone `dev-centr/devcentr`, `general-knowledge`, and `docs` as siblings, then `pnpm news:build`. +* **News post missing** — confirm filename ends in `.adoc`, is not `README.adoc`, and has `:revdate:`. +* **Feeds stale** — run `pnpm news:build`; feeds are regenerated from the news JSON, not hand-edited. diff --git a/docs/modules/ROOT/pages/explanation/site-architecture.adoc b/docs/modules/ROOT/pages/explanation/site-architecture.adoc new file mode 100644 index 0000000..f80c164 --- /dev/null +++ b/docs/modules/ROOT/pages/explanation/site-architecture.adoc @@ -0,0 +1,77 @@ += Site architecture +:navtitle: Site architecture +:description: SolidStart static shell, routes, CI sibling checkouts, and GitHub Pages deploy for devcentr.org. + +devcentr.org is a **static** SolidStart (Vinxi) application. +`app.config.ts` sets `ssr: false` and `server.preset: "static"` so the build emits HTML under `.output/public` for GitHub Pages. + +== Stack + +* **SolidStart + Vinxi** — file-based routes under `src/routes/` +* **Tailwind CSS v4** — `src/app.css`, Kobalte primitives for accessible UI +* **AsciiDoc** — news posts (`content/news/`) compiled with `@asciidoctor/core` at build time +* **GitHub Actions** — `.github/workflows/ci.yml` builds and deploys on push to `main` + +== Public routes + +[cols="1,2",options="header"] +|=== +| Path | Purpose + +| `/` +| Landing — hero, ecosystem copy, toolchain diagram, apps teaser + +| `/news`, `/blog` +| News index and posts (`/blog` is an SEO alias) + +| `/changelog` +| Changelog mirror from Antora sibling repos + +| `/help`, `/support` +| Help hub (`/support` redirects to `/help#support`) + +| `/status`, `/health` +| Client-side endpoint probes (`/health` redirects to `/status`) + +| `/apps`, `/apps/products`, `/apps/services`, `/apps/standards` +| Apps catalogue (data in `src/lib/apps-catalog.ts`) + +| `/ideas/:slug` +| Idea pages for catalogue entries with `ideaSlug` + +| `/toolchain-advisor` +| Interactive toolchain decision flow (SDL from `toolchain-advisor` repo) + +| `/resting-lanczos` +| Image resampling comparison demo +|=== + +== Build pipeline + +`pnpm run build` runs, in order: + +. `prebuild` — `scripts/sync-advisor-catalog.mjs` then `scripts/build-news.mjs` +. `vinxi build` — static route artifacts +. `postbuild` — `scripts/spa-fallback.mjs` for client-side routing on Pages + +CI (`.github/workflows/ci.yml`) additionally checks out sibling repos into the workspace root before `build-news.mjs`: + +* `toolchain-advisor/` — SDL catalog for `/toolchain-advisor` +* `general-knowledge/`, `devcentr/`, `docs/` — Antora changelogs and activity log for `/changelog` + +Locally, the same scripts fall back to `../` paths when CI checkouts are absent. + +== Deploy + +On push to `main`, the `deploy` job uploads `.output/public` via `actions/deploy-pages`. +A `.nojekyll` file is added so GitHub Pages serves `_build` and `_server` paths correctly. +Custom domain `devcentr.org` is configured in the repository's Pages settings. + +== Key source locations + +* `src/routes/` — page components +* `src/components/` — shared UI (header, footer, diagrams, advisor widget) +* `src/lib/` — catalog data, changelog loader, theme reveal, site links +* `content/news/` — authored news (see xref:explanation/news-and-changelog.adoc[News & changelog pipeline]) +* `public/brand/` — SVG logo marks (canonical org assets live in `.github` profile repos) +* `scripts/` — news/changelog build, advisor sync, SPA fallback, logo rasterize diff --git a/docs/modules/ROOT/pages/explanation/theme-reveal.adoc b/docs/modules/ROOT/pages/explanation/theme-reveal.adoc new file mode 100644 index 0000000..250f1d2 --- /dev/null +++ b/docs/modules/ROOT/pages/explanation/theme-reveal.adoc @@ -0,0 +1,36 @@ += Theme reveal +:navtitle: Theme reveal +:description: Light/dark toggle animation using View Transitions, CSS variables, and WAAPI on devcentr.org. + +The header **mode toggle** (`src/components/mode-toggle.tsx`) applies light/dark theme changes with an elliptical reveal anchored to the toggle button center. + +Implementation lives in `src/lib/theme-reveal.ts` with styles in `src/app.css`. + +== Behavior + +* **Expand** — when the user picks a theme different from the load/OS baseline (State A), an ellipse grows from the toggle to cover the viewport. +* **Contract** — when returning to the load/OS baseline, the ellipse shrinks back into the toggle. +* **Reduced motion** — if `prefers-reduced-motion: reduce`, the theme applies instantly with no animation. +* **No View Transitions** — browsers without `document.startViewTransition` also apply instantly. + +== Mechanics + +. On click, `mode-toggle.tsx` captures the toggle center synchronously via `elementCenter()` (never `clientX`/`clientY` — zero is a valid coordinate on mobile edges). +. `applyThemeWithCircleReveal()` sets CSS custom properties on ``: +** `--theme-reveal-x`, `--theme-reveal-y` — origin in layout-viewport pixels +** `--theme-reveal-rx`, `--theme-reveal-ry` — elliptical radii (wider than tall to cover corners) +. `document.startViewTransition()` runs the Kobalte `setColorMode` callback. +. After `transition.ready`, the Web Animations API animates only the radii (`easeOutSine`, 450ms). +. `transition.finished` clears the reveal dataset and CSS variables. + +`src/components/theme-system-sync.tsx` calls `syncThemeRevealBaseline()` on load and when the OS color scheme changes so expand/contract direction stays correct. + +== Constraints + +* Only one reveal at a time — if `data-theme-reveal` is already set on ``, subsequent toggles are ignored until cleanup. +* The toggle must expose `data-theme-toggle` (or pass an explicit `origin`) so the anchor is stable on mobile WebKit and Chrome. + +== Related + +* Brand motion assets: `public/brand/README.adoc` +* Design notes: `DESIGN.md` at the repository root diff --git a/docs/modules/ROOT/pages/explanation/toolchain-advisor.adoc b/docs/modules/ROOT/pages/explanation/toolchain-advisor.adoc new file mode 100644 index 0000000..d03dda8 --- /dev/null +++ b/docs/modules/ROOT/pages/explanation/toolchain-advisor.adoc @@ -0,0 +1,28 @@ += Toolchain Advisor +:navtitle: Toolchain Advisor +:description: Public toolchain decision flow on devcentr.org, synced from dev-centr/toolchain-advisor SDL definitions. + +`/toolchain-advisor` hosts an interactive decision flow that matches the SDL definitions used by the DevCentr desktop app. + +== Data flow + +. `scripts/sync-advisor-catalog.mjs` copies `catalog/advisor.sdl` from a `toolchain-advisor` checkout. +. It compiles SDL to JSON via `toolchain-advisor/scripts/compile-sdl.mjs`. +. Outputs land in `public/catalog/advisor.json` and `public/catalog/advisor.sdl`. +. `src/components/ToolchainAdvisor.tsx` loads the JSON at runtime. + +CI checks out `dev-centr/toolchain-advisor` into `toolchain-advisor/` before sync. +Locally, place a sibling clone at `../toolchain-advisor` or run `pnpm sync-advisor` after cloning. + +If compilation fails but a committed `advisor.json` exists in the definitions repo, the sync script falls back to that file. + +== Route + +* Page: `src/routes/toolchain-advisor.tsx` +* Styles: `src/toolchain-advisor.css` +* Definitions repo: https://github.com/dev-centr/toolchain-advisor + +== Related docs + +* xref:general-knowledge::explanation/infrastructure/toolchain-management.adoc[Toolchain management] (general-knowledge) +* xref:devcentr::index.adoc[DevCentr] — desktop host for the same advisor definitions diff --git a/docs/help-and-support-plans.adoc b/docs/modules/ROOT/pages/help-and-support-plans.adoc similarity index 100% rename from docs/help-and-support-plans.adoc rename to docs/modules/ROOT/pages/help-and-support-plans.adoc diff --git a/docs/modules/ROOT/pages/how-to/local-development.adoc b/docs/modules/ROOT/pages/how-to/local-development.adoc new file mode 100644 index 0000000..3fc7cfc --- /dev/null +++ b/docs/modules/ROOT/pages/how-to/local-development.adoc @@ -0,0 +1,74 @@ += Local development +:navtitle: Local development +:description: Clone, install, run, and troubleshoot the devcentr.org SolidStart site locally. + +== Prerequisites + +* Node.js **22+** (`package.json` `engines`) +* link:https://pnpm.io/[pnpm] **9** (CI uses `pnpm/action-setup@v4` with version 9) + +== Quick start + +[source,bash] +---- +git clone https://github.com/dev-centr/devcentr.org.git +cd devcentr.org +pnpm install +pnpm dev +---- + +`predev` runs `scripts/build-news.mjs`, which needs news posts under `content/news/` (always present in the repo). + +Open the URL printed by Vinxi (typically `http://localhost:3000`). + +== Full fidelity (changelog + advisor) + +For `/changelog` and `/toolchain-advisor` with live sibling data, clone checkouts beside this repo: + +[source,bash] +---- +cd .. +git clone https://github.com/dev-centr/toolchain-advisor.git +git clone https://github.com/dev-centr/devcentr.git +git clone https://github.com/dev-centr/general-knowledge.git +git clone https://github.com/dev-centr/docs.git +cd devcentr.org +pnpm news:build +pnpm sync-advisor +pnpm dev +---- + +Without siblings, news still builds; changelog ingest logs `changelog skip (missing)` for absent repos; advisor sync warns and exits cleanly if no SDL is found. + +== Common scripts + +[cols="1,2",options="header"] +|=== +| Command | Purpose + +| `pnpm dev` +| Dev server (`predev` rebuilds news) + +| `pnpm build` +| Production static build to `.output/public` + +| `pnpm news:build` +| Regenerate news JSON, changelog JSON, RSS, and Atom + +| `pnpm sync-advisor` +| Copy and compile toolchain-advisor SDL → `public/catalog/` + +| `pnpm brand:raster` +| Rasterize SVG logos to PNG sizes under `public/brand/` +|=== + +== Editor setup + +Committed `.vscode/settings.json` and `.vscode/extensions.json` enable dprint format-on-save and recommend the SolidJS extension. +See xref:walkthrough-vscode-and-ci.adoc[VS Code & CI walkthrough] for rationale. + +== Troubleshooting + +* **Stale news or changelog** — run `pnpm news:build` after editing `content/news/` or after pulling sibling changelog files. +* **Advisor page empty** — run `pnpm sync-advisor` with `toolchain-advisor` checked out; verify `public/catalog/advisor.json` exists. +* **Build fails on CI but works locally** — CI uses `pnpm install --no-frozen-lockfile`; ensure lockfile is committed after dependency changes. diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc new file mode 100644 index 0000000..1dda8fc --- /dev/null +++ b/docs/modules/ROOT/pages/index.adoc @@ -0,0 +1,53 @@ += devcentr.org +:description: Organization landing site for Dev-Centr — SolidStart marketing shell, news, changelog mirror, and public tools. + +link:https://devcentr.org[devcentr.org] is the public organization landing page for link:https://github.com/dev-centr[Dev-Centr]. +It is a static SolidStart site deployed to GitHub Pages on every push to `main`. + +Repository:: +https://github.com/dev-centr/devcentr.org + +Live site:: +https://devcentr.org + +== What lives here + +* **Marketing home** — Developer ecosystem positioning, apps catalogue, and links to the flagship DOS at link:https://devcentr.app[devcentr.app]. +* **News** (`/news`, SEO alias `/blog`) — Narrative AsciiDoc posts from `content/news/`. +* **Changelog** (`/changelog`) — Mirror index of Antora changelogs from sibling repos (built at CI time). +* **Community** — Help hub (`/help`), status probes (`/status`), and toolchain surfaces. +* **Public tools** — Toolchain Advisor (`/toolchain-advisor`), resting-lanczos demo (`/resting-lanczos`), and apps catalogue (`/apps`). + +== Documentation map + +[cols="1,2",options="header"] +|=== +| Topic | Page + +| Routes, build pipeline, and CI checkouts +| xref:explanation/site-architecture.adoc[Site architecture] + +| News vs changelog, `build-news.mjs`, feeds +| xref:explanation/news-and-changelog.adoc[News & changelog pipeline] + +| Light/dark toggle animation +| xref:explanation/theme-reveal.adoc[Theme reveal] + +| SDL catalog sync and `/toolchain-advisor` +| xref:explanation/toolchain-advisor.adoc[Toolchain Advisor] + +| `pnpm dev`, sibling repos, troubleshooting +| xref:how-to/local-development.adoc[Local development] + +| `/help` IA and future support desk +| xref:help-and-support-plans.adoc[Help & support plans] + +| `.vscode` and GitHub Actions deploy +| xref:walkthrough-vscode-and-ci.adoc[VS Code & CI walkthrough] +|=== + +== Related docs + +* xref:home::where-docs-live.adoc[Where documentation lives] — org-wide docs portal map +* xref:devcentr::index.adoc[DevCentr app docs] — flagship Development Orchestration Suite +* link:https://docs.devcentr.org[docs.devcentr.org] — aggregated Antora site diff --git a/docs/walkthrough-vscode-and-ci.adoc b/docs/modules/ROOT/pages/walkthrough-vscode-and-ci.adoc similarity index 88% rename from docs/walkthrough-vscode-and-ci.adoc rename to docs/modules/ROOT/pages/walkthrough-vscode-and-ci.adoc index 2de5655..61e4477 100644 --- a/docs/walkthrough-vscode-and-ci.adoc +++ b/docs/modules/ROOT/pages/walkthrough-vscode-and-ci.adoc @@ -20,7 +20,7 @@ This document records the project-specific setup for editor configuration and co * Workflow file: `.github/workflows/ci.yml` * Triggers: push and pull_request to `main` -* Build job: Ubuntu, Node 22, pnpm 9; `pnpm install --frozen-lockfile` then `pnpm run build`. Static build output is in `.output/public`. A `.nojekyll` file is added there so GitHub Pages serves `_build` and `_server` correctly. +* Build job: Ubuntu, Node 22, pnpm 9; checks out sibling repos for changelog ingest and toolchain-advisor SDL; `pnpm install --no-frozen-lockfile` then `pnpm run build`. Static build output is in `.output/public`. A `.nojekyll` file is added there so GitHub Pages serves `_build` and `_server` correctly. * Deploy job (runs only on push to `main`): uploads `.output/public` as the Pages artifact and deploys via `actions/deploy-pages`. Requires GitHub Pages to be set to "Deploy from a GitHub Actions workflow" in the repo Settings → Pages. Custom domain (e.g. devcentr.org) can be set there. === Static build (app.config.ts)