Skip to content

feat: add dedicated marketing site - #8

Merged
murilopmachado merged 3 commits into
mainfrom
feat/add-marketing-site
Aug 4, 2026
Merged

feat: add dedicated marketing site#8
murilopmachado merged 3 commits into
mainfrom
feat/add-marketing-site

Conversation

@murilopmachado

Copy link
Copy Markdown
Member

Summary

Adds a dedicated marketing site for ReviewForge at web/index.html (AxeForge brand kit, relay flavor, dark-only), plus robots.txt/sitemap.xml and a resized OG/Twitter image.

  • Hero with a live simulated reviewforge review --pr 42 --persona eli --dry-run terminal feed (real severity tags critical/warning/suggestion, grounded in the README's learning-report example)
  • "How it reviews" feature grid: multi-provider AI, line-level severity, rules presets, verdicts + confidence
  • Full personas table (bob/robert/maya/eli), straight from the README
  • 4-step "what happens when a PR opens" pipeline
  • 4 use-case cards with real CLI flags
  • Install section with the actual go install github.com/AxeForging/reviewforge@latest command plus a real GitHub Action snippet
  • Standard AxeForge relay-flavor footer, cross-linking all five sibling properties
  • Full SEO head block (OG/Twitter using a resized doc/banner.pngog-image.jpg, canonical, SoftwareApplication JSON-LD)

Impeccable audit — 20/20

Ran the mechanical detector plus a full manual 5-dimension audit (each scored 0-4):

Dimension Score Notes
Accessibility 4/4 Global :focus-visible, clean h1→h2→h3 hierarchy, empty alt on the decorative logo (adjacent text carries it), prefers-reduced-motion stops the auto-cycling interval but still seeds real content (state preserved, not killed), text contrast ≥6.9:1 for accent-as-text and ≥7.7:1 for muted text against the relay dark background.
Performance 4/4 All animations are transform/opacity only (feed-line entrance, pulse dot), interval-based DOM updates are throttled (2.4s) and capped at 6 lines, fonts load with display=optional (no font-swap CLS), images are small (favicon/icon 7-9KB, OG image only used off-page for social cards).
Theming 4/4 var(--af-*) tokens used throughout; the only hardcoded hex colors are the two severity-status dots (info/warn) — justified, since severity color-coding is core product semantics independent of brand flavor.
Responsive 4/4 (after fixes) Verified with real headless Chromium screenshots at 375px and 1440px plus a Playwright scrollWidth/clientWidth check — found and fixed two real overflow bugs (see below).
Implementation integrity 4/4 All copy/CLI flags/persona names/severity tags are pulled directly from the README, no fabricated stats or generic placeholder copy; the simulated terminal feed uses a specific, technically coherent example (unclosed response body, missing backoff, non-idempotent retry, etc.).

Bugs found and fixed

Two real page-wide horizontal-overflow bugs, same root-cause class as the one previously found in gumshoe's build — a grid/flex item's default min-width: auto refuses to shrink below a long unbroken token's intrinsic width:

  1. .usecase-card: the "One workflow, every repo" card's uses: your-org/.github/.github/workflows/reviewforge.yml@main snippet grew past its card into the neighboring card on desktop, and blew out the whole grid into a page-wide horizontal scrollbar on mobile. Fixed with min-width: 0 on the grid item + max-width: 100% on the code span.
  2. .install-step: the go install ... command and the GitHub Action YAML snippet live in <pre style="white-space: pre">, whose min-content width equals its full unwrapped line — that pinned the flex item wide enough to push the whole page into horizontal scroll on mobile. Fixed with min-width: 0 on the flex item, so its own pre { overflow-x: auto } now correctly scrolls the long code line internally instead.

Verified via Playwright: documentElement.scrollWidth now equals clientWidth at both 375px and 1440px (was 451 vs 375 on mobile before the fix).

Detector flags — all triaged as false positives

  • codex-grid-background: the hairline dot-grid hero background is an intentional cross-site AxeForge brand convention (same pattern used in heyra, rsvp-m5, gumshoe), not generated-UI slop.
  • single-font: false positive — axeforge.css defines and applies both --af-font-sans (Inter) and --af-font-mono (JetBrains Mono); this page correctly layers mono declarations for code/terminal/kicker text on top of the inherited sans body font (verified by grepping axeforge.css's font-family declarations).
  • em-dash-overuse (flagged 33): roughly 70% of that count is CSS custom-property names (--af-accent, etc.) and real CLI flags (--pr, --dry-run, --save-report, ...) caught by the detector's -- proxy, not prose dashes. The actual 11 prose em-dashes are normal, varied marketing-copy usage — not saturation.

Known pre-existing issue (out of scope)

This repo has a known GEMINI_API_KEY reliability problem (flagged in a prior stage). It's out of scope for this PR — no repo secrets access from this session to fix it — but it should be resolved before driving marketing traffic to this page, since the page markets Gemini as one of the three supported providers.

Test plan

  • node detect.mjs --json web/index.html — 3 flags, all triaged (see above), no real findings
  • Manual 5-dimension audit — 20/20
  • Headless Chromium screenshots at 375px and 1440px, full page — no clipped/truncated content, topbar wraps cleanly on mobile
  • Playwright scrollWidth === clientWidth check at both breakpoints — passes (no horizontal overflow)
  • Re-ran detector + re-screenshotted after fixes to confirm

GitHub Pages site at web/ covering the AI review pipeline (multi-provider,
line-level severity comments, rules presets, verdicts), reviewer personas,
and real CLI/Action install steps. Follows the AxeForge relay brand kit
and SEO pattern shared with heyra, rsvp-m5, and gumshoe.
…0/20)

Full 5-dimension impeccable audit (accessibility, performance, theming,
responsive, implementation integrity) on web/index.html. Score: 20/20.

Fixed 2 real bugs found via manual responsive verification (chromium
headless screenshots + scrollWidth checks at 375w/1440w), same bug class
as gumshoe's prior fix -- a grid/flex item's default min-width:auto lets
long unbroken content refuse to shrink below its intrinsic width:

- .usecase-card: the "One workflow, every repo" card's <code> (a long
  unbroken uses:... token) grew past the card into the neighboring card
  on desktop and blew out the grid to a page-wide horizontal scroll on
  mobile. Added min-width:0 on the grid item + max-width:100% on the code.
- .install-step: the CLI install command and Action YAML snippet (inside
  <pre white-space:pre>, whose min-content == its full unwrapped line)
  pinned the flex item to that width, forcing page-wide horizontal
  scroll on mobile. Added min-width:0 to the flex item so its own
  pre { overflow-x: auto } correctly scrolls internally instead.

Verified via Playwright: documentElement.scrollWidth now equals
clientWidth at both 375px and 1440px (was 451 vs 375 on mobile before).

Detector (detect.mjs) flags 3 items, all triaged as non-issues:
- codex-grid-background: confirmed intentional cross-site AxeForge brand
  convention (same pattern as heyra/rsvp-m5/gumshoe), not generated slop.
- single-font: false positive -- axeforge.css defines and applies both
  --af-font-sans (Inter) and --af-font-mono (JetBrains Mono); this page
  correctly layers mono declarations for code/terminal/kicker text on
  top of the inherited sans body font.
- em-dash-overuse (33 flagged): ~70% is CSS custom-property names
  (--af-accent etc.) and real CLI flags (--pr, --dry-run, --save-report,
  ...) matched by the detector's "-- " proxy, not prose dashes. The
  actual 11 prose em-dashes are normal marketing-copy usage, not
  saturation.
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

StructLint — 4 violation(s) found

58/62 rules passed · 4 violation(s) detected against .structlint.yaml.

Files not matching any allowed naming pattern (3)
  • File not in allowed naming pattern: web/axeforge.css
  • File not in allowed naming pattern: web/index.html
  • File not in allowed naming pattern: web/sitemap.xml
Directories not in the allowed list (1)
  • Directory not in allowed list: web

View full run · Powered by StructLint

Team credit should stay at the org level, not name a specific
contributor -- more people than one work on AxeForging repos.
@murilopmachado
murilopmachado merged commit 40fc8e0 into main Aug 4, 2026
3 of 5 checks passed
@murilopmachado
murilopmachado deleted the feat/add-marketing-site branch August 4, 2026 19:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant