diff --git a/site/src/components/ChangelogShowcase.astro b/site/src/components/ChangelogShowcase.astro new file mode 100644 index 00000000..314dc78a --- /dev/null +++ b/site/src/components/ChangelogShowcase.astro @@ -0,0 +1,178 @@ +--- +import Icon from './Icon.astro'; + +/** + * ChangelogShowcase - a landing-page CHANGELOG section. + * + * A clean vertical timeline of the latest releases. Content is grounded in the + * real entries on /changelog/ (versions, dates, change bullets) so the section + * never drifts from the actual product history. Self-contained, no props, no + * client JS, no app-window frame - this is a content section, not a mock. + * + * Category chips map the changelog tag vocabulary to a reader-friendly set: + * shipped -> New (sky) + * changed -> Improved (emerald) + * fixed -> Fixed (amber) + */ + +interface Release { + version: string; + date: string; + category: 'New' | 'Improved' | 'Fixed'; + title: string; + bullets: string[]; +} + +// Latest four releases, taken from /changelog/ and split into 2-3 bullet lines. +const releases: Release[] = [ + { + version: 'v1.9', + date: '2026-05-26', + category: 'New', + title: 'BYOK envelope encryption for self-host', + bullets: [ + 'Register your own AWS KMS key as the root of trust for the per-user DEK envelope.', + 'Existing encrypted material is re-wrapped on first key activation.', + 'Plaintext DEKs stay only in the Redis cache with a bounded TTL.', + ], + }, + { + version: 'v1.8', + date: '2026-05-22', + category: 'New', + title: 'SAML SSO for Business plans', + bullets: [ + 'Connect Okta, Azure AD, or any SAML 2.0 identity provider.', + 'Just-in-time provisioning is on by default.', + 'Admins can pin a default role for new sign-ins.', + ], + }, + { + version: 'v1.7', + date: '2026-05-20', + category: 'New', + title: 'API keys dashboard', + bullets: [ + 'Per-key scopes, last-used timestamps, and one-click rotation.', + 'Existing keys auto-migrated to full-access scope.', + ], + }, + { + version: 'v1.6', + date: '2026-05-15', + category: 'Improved', + title: 'Per-mailbox health bands', + bullets: [ + 'Mailboxes surface a health band: healthy, watch, quarantined, or blocked.', + 'Bands are driven by rolling placement, complaint, and bounce signals.', + 'Pool selection now skips anything not healthy.', + ], + }, +]; + +const categoryStyle = (c: Release['category']) => { + if (c === 'New') { + return { chip: 'bg-sky-50 text-sky-700 ring-sky-100', dot: 'bg-sky-500', rail: 'bg-sky-500' }; + } + if (c === 'Improved') { + return { chip: 'bg-emerald-50 text-emerald-700 ring-emerald-100', dot: 'bg-emerald-500', rail: 'bg-emerald-500' }; + } + return { chip: 'bg-amber-50 text-amber-700 ring-amber-100', dot: 'bg-amber-500', rail: 'bg-amber-500' }; +}; +--- +
+
+ +
+
+
+ + Changelog + + + + + + + + Shipping weekly + +
+

+ The latest from Warmbly. +

+

+ New features, behavioural changes, and fixes, in the order they reached production. Every entry is dated, tagged, and traceable to a commit. +

+
+ + + View full changelog + + +
+ + +
    + + + + {releases.map((r) => { + const s = categoryStyle(r.category); + return ( +
  1. + + + +
    + + + +
    + + {r.version} + + + {r.date} + + + + {r.category} + +
    + +

    + {r.title} +

    + +
      + {r.bullets.map((b) => ( +
    • + + {b} +
    • + ))} +
    +
    +
  2. + ); + })} +
+ + +
+ Older releases and the full history + + + Read the full changelog + +
+
+