feat(web): read the meta description and footer brand from config (BUNYIP-501) #502

Merged
nrupard merged 2 commits from feat/BUNYIP-501-debrand-chrome into main 2026-08-07 20:07:17 +02:00
Owner

B3 of the BUNYIP-459 epic, part 1: the config-driven de-brand of the framework chrome.

What

The document <head> and the footer no longer carry hardcoded bunyip brand copy; they read from config, so the shared layout scaffolding (which B4 will extract) carries no bunyip string.

Changes

  • Config.brand_description (BRAND_DESCRIPTION, default bunyip's copy) feeds the <meta name="description">, installed via a views::layout OnceLock (the B1 / B2 pattern).
  • The footer brand line "Bunyip · {domain}" now reads app_name() (from B1) -> {app_name} · {domain}.
  • main installs the description; bunyip-web/.env.example documents BRAND_DESCRIPTION.

Byte-identical by default

BRAND_DESCRIPTION unset -> the default string; APP_NAME unset -> "Bunyip". The meta and footer render identically, and the 211 bunyip-web tests pass unchanged.

Scope: B3 is two parts, this is part 1

This PR does B3's "strip bunyip strings from layout.rs meta / footer, read from config" acceptance criterion. B3's other half - physically relocating the marketing / legal / docs page bodies (handlers/public.rs landing, handlers/content.rs pricing / story / roadmap / legal, src/docs/*.md) and the brand assets (bunyip-hero.png, mokosh-logo.png) into a separable skin module - is a large reorganization (~1500 lines + routes) that primarily enables the deferred B4 (the web-kit crate). It stays open under BUNYIP-501 as that issue's remaining acceptance criteria; this PR does not close the issue.

Stacked on B1 + B2

Branches off B2 (PR #501), which sits on the merged B1. The PR base is feat/BUNYIP-500-theming, so it shows only B3's diff and merges after B2. (B1 -> B2 -> B3 is the intended merge order; keeping the epic children stacked avoids the sibling conflicts that arise when they branch off main in parallel.)

Validation

cargo fmt --all --check, cargo clippy --workspace --all-targets -- -D warnings, and cargo test -p bunyip-web are green.

B3 of the BUNYIP-459 epic, part 1: the config-driven de-brand of the framework chrome. ## What The document `<head>` and the footer no longer carry hardcoded bunyip brand copy; they read from config, so the shared layout scaffolding (which B4 will extract) carries no bunyip string. ## Changes - `Config.brand_description` (`BRAND_DESCRIPTION`, default bunyip's copy) feeds the `<meta name="description">`, installed via a `views::layout` `OnceLock` (the B1 / B2 pattern). - The footer brand line `"Bunyip · {domain}"` now reads `app_name()` (from B1) -> `{app_name} · {domain}`. - `main` installs the description; `bunyip-web/.env.example` documents `BRAND_DESCRIPTION`. ## Byte-identical by default `BRAND_DESCRIPTION` unset -> the default string; `APP_NAME` unset -> "Bunyip". The meta and footer render identically, and the 211 bunyip-web tests pass unchanged. ## Scope: B3 is two parts, this is part 1 This PR does B3's "strip bunyip strings from `layout.rs` meta / footer, read from config" acceptance criterion. B3's other half - physically relocating the marketing / legal / docs page bodies (`handlers/public.rs` landing, `handlers/content.rs` pricing / story / roadmap / legal, `src/docs/*.md`) and the brand assets (`bunyip-hero.png`, `mokosh-logo.png`) into a separable skin module - is a large reorganization (~1500 lines + routes) that primarily enables the deferred B4 (the web-kit crate). It stays open under BUNYIP-501 as that issue's remaining acceptance criteria; this PR does not close the issue. ## Stacked on B1 + B2 Branches off B2 (PR #501), which sits on the merged B1. The PR base is `feat/BUNYIP-500-theming`, so it shows only B3's diff and merges after B2. (B1 -> B2 -> B3 is the intended merge order; keeping the epic children stacked avoids the sibling conflicts that arise when they branch off `main` in parallel.) ## Validation `cargo fmt --all --check`, `cargo clippy --workspace --all-targets -- -D warnings`, and `cargo test -p bunyip-web` are green.
B3 of the theme-agnostic web-kit epic, part 1: de-brand the framework chrome. The document head and the footer no longer carry hardcoded bunyip copy.

Config.brand_description (BRAND_DESCRIPTION, default bunyip's copy) feeds the <meta name="description">, installed via a views::layout OnceLock (the B1/B2 pattern). The footer brand line "Bunyip · {domain}" now reads app_name() (from B1). main installs the description; .env.example documents BRAND_DESCRIPTION.

Byte-identical by default: BRAND_DESCRIPTION unset yields the default string and APP_NAME unset yields "Bunyip", so the meta and footer render identically and the 211 bunyip-web tests pass. This does B3's "strip bunyip strings from layout.rs meta/footer, read from config" criterion; B3's other half (relocating the marketing/legal/docs pages and brand assets into a skin module) stays open under BUNYIP-501. Stacked on B2 (PR #501).

#BUNYIP-501

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
nrupard changed target branch from feat/BUNYIP-500-theming to main 2026-08-07 19:55:37 +02:00
nrupard scheduled this pull request to auto merge when all checks succeed 2026-08-07 19:56:15 +02:00
Merge branch 'main' into feat/BUNYIP-501-debrand-chrome
All checks were successful
E2E / PR gate (pull_request) Successful in 43s
Check / fmt + clippy + build + tests (pull_request) Successful in 10m53s
Create release / Create release from merged PR (pull_request) Has been skipped
ba3c0a025f
nrupard scheduled this pull request to auto merge when all checks succeed 2026-08-07 19:56:31 +02:00
nrupard deleted branch feat/BUNYIP-501-debrand-chrome 2026-08-07 20:07:18 +02:00
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
psa-systems/bunyip!502
No description provided.