Skip to content

Release Notes — Format & Structure Guide

How to create and maintain release note pages in cavai-release-notes.

Repository Structure

cavai-release-notes/
├── index.html                  # Landing page — card grid for monthly + individual releases
├── shared/                     # CSS, images, logos shared across all pages
│   ├── style.css               # Main stylesheet (monthly overviews + landing page)
│   ├── release-page.css        # Individual release pages only
│   ├── bubbles.png             # Mascot image
│   ├── cavai-logo.svg          # Header logo
│   └── cavai-logo-white.png    # Footer logo
├── 2026-03/                    # Monthly overview — March 2026
│   ├── index.html
│   └── img-*.png               # Screenshots for feature cards
├── 2026-04/                    # Monthly overview — April 2026
├── releases/
│   ├── af-8.23.1/index.html    # Individual release — AF patch
│   ├── ce-6.8.5/index.html     # Individual release — CE patch
│   └── ...
└── cli/                        # CLI tool (deploy, generate, preview)

Deploy

bash
npm run deploy    # Deploys to Cloudflare Pages via wrangler

Deploys the entire working directory. All files (including untracked) are uploaded.


Page Types

1. Individual Release Page (releases/<version>/index.html)

One page per version bump. Uses shared/release-page.css.

Structure

html
<link rel="stylesheet" href="../../shared/style.css">
<link rel="stylesheet" href="../../shared/release-page.css">

<!-- Hero with version title and GitHub changelog link -->
<header class="hero">
  <h1 class="hero-title">Application Frontend 8.23.1</h1>
  <p class="hero-sub">April 23, 2026</p>
  <a class="hero-gh-link" href="https://github.com/Cavai/.../compare/v8.23.0...v8.23.1">Full changelog on GitHub →</a>
</header>

<main class="release-page">
  <!-- One section per type: Improvements, Bug Fixes, New Features -->
  <div class="release-section">
    <div class="release-section-label imp">Improvements</div>
    <div class="release-item">
      <!-- Content + meta -->
    </div>
  </div>
</main>

When all items share the same PR

Group into two bolker (Improvements + Bug Fixes) instead of separate items:

html
<div class="release-item">
  <div class="release-item-body expanded" style="display:flex;flex-direction:column;gap:1.2em">
    <p><strong>Title</strong><br>Description paragraph.</p>
    <p><strong>Title</strong><br>Description paragraph.</p>
  </div>
  <div class="release-item-meta">
    <!-- Author, reviewer(s), PR link, date — listed ONCE -->
  </div>
</div>

Key points:

  • expanded class removes the fade/max-height (no "Read more" needed)
  • gap: 1.2em adds spacing between entries
  • Title on its own line via <br>, not inline with em-dash
  • Meta block appears once at the bottom

When items have different PRs

Use separate release-item blocks, each with its own meta:

html
<div class="release-item">
  <div class="release-item-title">Feature Title</div>
  <div class="release-item-body"><p>Description.</p></div>
  <button class="release-item-toggle">Read more ↓</button>
  <div class="release-item-meta"><!-- meta --></div>
</div>

The toggle button auto-hides if content fits without truncation (JS handles this).

Section label classes

ClassLabelColor
impImprovementsOrange accent
fixBug FixesTeal accent
newNew FeaturesPink accent

2. Monthly Overview Page (YYYY-MM/index.html)

Published at end of month or start of next. Uses shared/style.css only (not release-page.css).

Structure

html
<link rel="stylesheet" href="../shared/style.css">

<!-- Hero -->
<header class="hero">
  <h1 class="hero-title">Release Notes</h1>
  <p class="hero-sub">What's new in the Cavai platform — features, fixes, and improvements.</p>
  <span class="hero-date">APRIL 2026</span>
  <div class="hero-versions" id="hero-filters">
    <!-- One pill per repo that has changes this month -->
    <span class="hero-version-pill" data-filter="AF" title="Application Frontend — ...">Frontend</span>
    <span class="hero-version-pill" data-filter="CE" title="Creative Engine — ...">Engine</span>
  </div>
</header>

<main class="page">
  <!-- Summary paragraph -->
  <div class="month-summary"><p>High-level month summary.</p></div>

  <!-- Highlights — feature cards -->
  <div class="section-head">Highlights</div>
  <div class="feature-card fade-in"><!-- ... --></div>

  <!-- Changelog — collapsible per-repo list (optional) -->
  <div class="section-head">Changelog</div>
  <div class="changelog-repo fade-in"><!-- ... --></div>
</main>

Filter pills

Only include repos that had changes. Available repo codes:

CodeLabelDescription
AFFrontendApplication Frontend
CEEngineCreative Engine
ABBackendApplication Backend
CCComposerCreative Composer
LPLogs ParserAnalytics pipeline
MCPMCPAI assistant tools
APAssets ProxyCDN and API proxy
DOCSDocsDocumentation
SLScriptsScript Library
WEBWebsitecavai.com

Feature card

html
<div class="feature-card fade-in">
  <div class="feature-header">
    <div class="feature-icon new">✨</div>         <!-- or imp: ⚙ -->
    <span class="feature-title">Animation System</span>
    <span class="feature-badge badge-feature">New Feature</span>
  </div>

  <p class="feature-lead">One-sentence summary.</p>

  <!-- Optional: subtitles and sub-sections -->
  <div class="feature-subtitle">Builder</div>
  <div class="feature-body"><p>Details.</p></div>

  <!-- Optional: images -->
  <div class="media-row">
    <img src="img-something.png" alt="Description">
  </div>
  <p class="media-caption">Caption text.</p>

  <!-- REQUIRED: Meta with author(s), reviewer(s), PR(s), date -->
  <div class="feature-meta">
    <!-- Author -->
    <span class="author-link" style="display:inline-flex;align-items:center">
      <span class="author-tooltip">NicolayKjarnet<br><strong>Author</strong></span>
      <img class="meta-avatar" src="https://github.com/NicolayKjarnet.png?size=32" alt="">
    </span>
    <a class="meta-name" href="https://github.com/NicolayKjarnet" target="_blank" rel="noopener">NicolayKjarnet</a>

    <!-- Reviewer(s) — ALWAYS include, use opacity:.45 -->
    <span class="author-link" style="display:inline-flex;align-items:center">
      <span class="author-tooltip">McSneaky<br><strong>Reviewer</strong></span>
      <img class="meta-avatar" src="https://github.com/McSneaky.png?size=32" alt="" style="opacity:.45">
    </span>
    <a class="meta-name" href="https://github.com/McSneaky" target="_blank" rel="noopener" style="opacity:.45">McSneaky</a>

    <span class="meta-dot">&middot;</span>

    <!-- PR link(s) with repo tooltip -->
    <a class="pr-link repo-link" href="https://github.com/Cavai/Application-Frontend/pull/1854" target="_blank" rel="noopener">
      <span class="repo-tooltip"><strong>APPLICATION FRONTEND</strong>Ad builder UI — configuration panels and management views</span>
      AF #1854
    </a>

    <span class="meta-date">Apr 22–23</span>
  </div>
</div>

Badge classes

ClassTextUse for
badge-featureNew FeatureBrand new functionality
badge-improvementImprovementEnhancement to existing feature
badge-fixFixesBug fix or correction

Feature icon

TypeHTMLMeaning
new&#10024; (✨)New feature
imp&#9881; (⚙)Improvement or fix

Meta Block — Required Fields

Every feature card and release item MUST include:

  1. Author(s) — full opacity avatar + name
  2. Reviewer(s)opacity: .45 on avatar and name link. Check gh pr view <number> --repo Cavai/<repo> --json reviews --jq '.reviews[].author.login'
  3. PR link(s) — with repo-link class and repo-tooltip containing repo name + description
  4. Date range<span class="meta-date">Apr 22–23</span>

Author HTML

html
<span class="author-link" style="display:inline-flex;align-items:center">
  <span class="author-tooltip">USERNAME<br><strong>Author</strong></span>
  <img class="meta-avatar" src="https://github.com/USERNAME.png?size=32" alt="">
</span>
<a class="meta-name" href="https://github.com/USERNAME" target="_blank" rel="noopener">USERNAME</a>

Reviewer HTML (same but dimmed)

html
<span class="author-link" style="display:inline-flex;align-items:center">
  <span class="author-tooltip">USERNAME<br><strong>Reviewer</strong></span>
  <img class="meta-avatar" src="https://github.com/USERNAME.png?size=32" alt="" style="opacity:.45">
</span>
<a class="meta-name" href="https://github.com/USERNAME" target="_blank" rel="noopener" style="opacity:.45">USERNAME</a>

Known contributors

GitHub usernameRole
NicolayKjarnetDeveloper
McSneakyDeveloper (Kevin)
haakonmydlandDeveloper (Haakon)
copilot-pull-request-reviewerGitHub Copilot (automated reviewer)
html
<a class="pr-link repo-link" href="https://github.com/Cavai/REPO/pull/NUMBER" target="_blank" rel="noopener">
  <span class="repo-tooltip"><strong>REPO DISPLAY NAME</strong>Short description</span>
  CODE #NUMBER
</a>

Repo tooltip descriptions:

CodeDisplay nameTooltip description
AFAPPLICATION FRONTENDAd builder UI — configuration panels and management views
CECREATIVE ENGINEThe runtime that displays and powers interactive creatives — handles all visual rendering, styling, animations, user flows, and analytics
CCCREATIVE COMPOSERPrepares creatives for delivery — optimizes fonts, compresses data, and packages everything the Engine needs to run the ad
ABAPPLICATION BACKENDThe server behind the platform — manages user accounts, campaigns, creatives, and connects to external services
MCPCAVAI MCP SERVERLets AI assistants like Claude manage campaigns, pull reports, and work with creatives through natural language

Landing Page (index.html)

Monthly overview card

html
<!-- In #panel-monthly .release-grid -->
<a class="release-card fade-in" href="2026-04/">
  <div class="release-card-header">
    <span class="release-card-date">April 2026</span>
    <span class="release-card-version">Monthly</span>
  </div>
  <div class="release-card-body">
    One-sentence summary of the month.
  </div>
  <div class="release-card-highlights">
    <span class="release-highlight">Tag 1</span>
    <span class="release-highlight">Tag 2</span>
  </div>
  <span class="release-card-arrow">&rarr;</span>
</a>

Comment out with <!-- --> until the month is complete.

Individual release card

html
<!-- In #panel-releases .release-grid, ordered newest first -->
<a class="release-card fade-in" data-repo="af" href="releases/af-8.23.1/">
  <div class="release-card-header">
    <span class="release-card-date">Frontend 8.23.1</span>
    <span class="release-card-version">Apr 23</span>
  </div>
  <div class="release-card-body">
    Short summary of what changed.
  </div>
  <div class="release-card-highlights">
    <span class="release-highlight">Tag</span>
  </div>
  <span class="release-card-arrow">&rarr;</span>
</a>

data-repo values: af, ce, ab — used by the filter buttons.


Checklist — New Individual Release

  1. Create releases/<repo>-<version>/index.html
  2. Add hero with version, date, GitHub changelog link
  3. Group items by type (Improvements / Bug Fixes / New Features)
  4. If all items share one PR → use grouped format (one body, one meta)
  5. If items have different PRs → use separate items
  6. Add reviewers — check with gh pr view
  7. Add card to landing page index.html (newest first in grid)
  8. Update monthly overview highlights if applicable
  9. Commit, push, npm run deploy

Checklist — New Monthly Overview

  1. Create YYYY-MM/index.html
  2. Add hero with month, filter pills for relevant repos
  3. Write month summary paragraph
  4. Create feature cards for each major highlight
  5. Add author + reviewer(s) to every feature card
  6. Add screenshots to feature cards where useful (save as img-*.png in same folder)
  7. Optionally add changelog section with collapsible per-repo items
  8. Add monthly card to landing page (comment out until ready)
  9. Uncomment card when month is complete
  10. Commit, push, npm run deploy

Internal documentation