From e9ef1ebfb8178287c1bcb0a7dc083137b392d8cc Mon Sep 17 00:00:00 2001 From: Matthew Meszaros Date: Tue, 9 Jun 2026 10:03:18 +0000 Subject: [PATCH] feat: remove roadmap page and ground changelog in real history Delete the public roadmap page and every reference to it (footer, open-source showcase, about, changelog, trust). The roadmap was built from seeded, fabricated items. Rebuild the changelog from the real git history. The previous entries were self-described seeded fabrications and contradicted the codebase (claiming SAML SSO and BYOK shipped, which they have not). There are no releases, tags, or CHANGELOG.md, so the commit log is the source of truth. Group the work into a handful of milestone entries rather than one per release, mirror them on the homepage changelog showcase, and drop the invented version numbers. Fix the broken links the old page carried: the dead /changelog/feed.xml RSS feed and the non-existent CHANGELOG.md now point at the real commit history. Relabel the trust page's 'roadmap' posture state to 'planned' so SOC 2 and ISO 27001 stay honestly marked as not yet in place. --- site/src/components/ChangelogShowcase.astro | 53 ++- site/src/components/Footer.astro | 1 - site/src/components/OpenSourceShowcase.astro | 5 +- site/src/pages/about.astro | 28 +- site/src/pages/changelog.astro | 139 +++----- site/src/pages/roadmap.astro | 355 ------------------- site/src/pages/trust.astro | 14 +- 7 files changed, 95 insertions(+), 500 deletions(-) delete mode 100644 site/src/pages/roadmap.astro diff --git a/site/src/components/ChangelogShowcase.astro b/site/src/components/ChangelogShowcase.astro index f91ba2ee..e708792a 100644 --- a/site/src/components/ChangelogShowcase.astro +++ b/site/src/components/ChangelogShowcase.astro @@ -5,7 +5,7 @@ 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 + * real entries on /changelog/ (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. * @@ -16,56 +16,52 @@ import Icon from './Icon.astro'; */ 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. +// Latest releases, taken from /changelog/ (which is derived from the real +// git history) and split into 2-3 bullet lines. const releases: Release[] = [ { - version: 'v1.9', - date: '2026-05-26', + date: '2026-06-09', category: 'New', - title: 'BYOK envelope encryption for self-host', + title: 'Automation builder', 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.', + 'Build branching flows in a visual graph builder.', + 'Launch automations straight from a campaign.', + 'Execution safeguards protect every live flow.', ], }, { - version: 'v1.8', - date: '2026-05-22', + date: '2026-06-08', category: 'New', - title: 'SAML SSO for Business plans', + title: 'Reply classification and campaign branching', 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.', + 'Inbound replies are classified by intent.', + 'Sequences branch on what a reply actually says.', + 'New campaigns stop on reply by default.', ], }, { - version: 'v1.7', - date: '2026-05-20', + date: '2026-06-08', category: 'New', - title: 'API keys dashboard', + title: 'Two-factor auth and notifications', bullets: [ - 'Per-key scopes, last-used timestamps, and one-click rotation.', - 'Existing keys auto-migrated to full-access scope.', + 'Two-factor authentication, required at login once on.', + 'A realtime notification center with per-member preferences.', ], }, { - version: 'v1.6', - date: '2026-05-15', - category: 'Improved', - title: 'Per-mailbox health bands', + date: '2026-06-07', + category: 'New', + title: 'CRM, unified inbox, and integrations', 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.', + 'Server-driven CRM with a deals board and team tasks.', + 'Reworked unified inbox routing and seen-state.', + 'Integrations and meetings dashboard.', ], }, ]; @@ -136,9 +132,6 @@ const categoryStyle = (c: Release['category']) => {
- - {r.version} - {r.date} diff --git a/site/src/components/Footer.astro b/site/src/components/Footer.astro index f1dd18b9..b5ae66c8 100644 --- a/site/src/components/Footer.astro +++ b/site/src/components/Footer.astro @@ -14,7 +14,6 @@ const groups: { title: string; links: { label: string; href: string }[] }[] = [ { label: 'API & Webhooks', href: '/developers/' }, { label: 'Integrations', href: '/integrations/' }, { label: 'Changelog', href: '/changelog/' }, - { label: 'Roadmap', href: '/roadmap/' }, ], }, { diff --git a/site/src/components/OpenSourceShowcase.astro b/site/src/components/OpenSourceShowcase.astro index 207284e6..eb7b577b 100644 --- a/site/src/components/OpenSourceShowcase.astro +++ b/site/src/components/OpenSourceShowcase.astro @@ -12,7 +12,7 @@ const facts = [ { value: '100%', label: 'Open source' }, { value: 'Apache 2.0', label: 'Fork it, ship it' }, { value: '$0', label: 'To self-host' }, - { value: 'Public', label: 'Roadmap and issues' }, + { value: 'Public', label: 'Issues and pull requests' }, ]; const lines = [ @@ -35,7 +35,7 @@ const layers = [ const contribute = [ { label: 'Browse good first issues', href: 'https://github.com/warmbly/warmbly/labels/good%20first%20issue' }, { label: 'Read the contributing guide', href: 'https://github.com/warmbly/warmbly/blob/main/CONTRIBUTING.md' }, - { label: 'Follow the public roadmap', href: '/roadmap/' }, + { label: 'Follow the changelog', href: '/changelog/' }, { label: 'Open a discussion or RFC', href: 'https://github.com/warmbly/warmbly/discussions' }, ]; const selfhost = [ @@ -47,7 +47,6 @@ const selfhost = [ const links = [ { label: 'Docs', href: '/developers/' }, { label: 'Architecture', href: '/trust/' }, - { label: 'Roadmap', href: '/roadmap/' }, { label: 'Changelog', href: '/changelog/' }, { label: 'Apache 2.0 license', href: 'https://github.com/warmbly/warmbly/blob/main/LICENSE' }, ]; diff --git a/site/src/pages/about.astro b/site/src/pages/about.astro index 74bf3c5b..86169f14 100644 --- a/site/src/pages/about.astro +++ b/site/src/pages/about.astro @@ -85,8 +85,8 @@ const positioning = [ closed: 'Undocumented. You find out when your reputation is gone.', }, { - label: 'Roadmap', - warmbly: 'Public board. Shipped, in progress, researching.', + label: 'Changelog', + warmbly: 'Public, dated changelog. Every entry maps to a commit.', closed: 'Internal. Released on announcement cadence.', }, { @@ -117,16 +117,16 @@ const surface = [ const involve = [ { label: 'GitHub', href: 'https://github.com/warmbly/warmbly', note: 'Source, issues, pull requests.', icon: 'arrowUpRight' }, { label: 'Developers', href: '/developers/', note: 'API, webhooks, scopes, idempotency.', icon: 'arrowRight' }, - { label: 'Roadmap', href: '/roadmap/', note: 'Shipped, in progress, researching.', icon: 'arrowRight' }, { label: 'Changelog', href: '/changelog/', note: 'Every release, dated, plain wording.', icon: 'arrowRight' }, + { label: 'Trust', href: '/trust/', note: 'Encryption, subprocessors, security.', icon: 'arrowRight' }, ]; ---
@@ -136,7 +136,7 @@ const involve = [ About - Open source. Apache 2.0. Public roadmap. + Open source. Apache 2.0. Public changelog.

@@ -191,7 +191,7 @@ const involve = [

- We are a small team with a public roadmap. We do not hide what we are working on. We do not invent metrics. We do not pretend to be larger than we are. The product gets better in public. + We are a small team building in public. We do not hide what we are working on. We do not invent metrics. We do not pretend to be larger than we are. The product gets better in public.

@@ -319,7 +319,7 @@ const involve = [

- Comparison reflects how Warmbly is built. We do not speak for any other vendor's roadmap or pricing. + Comparison reflects how Warmbly is built. We do not speak for any other vendor's plans or pricing.

@@ -366,7 +366,7 @@ const involve = [
The team

- Small team. Public roadmap. Open source. + Small team. Built in public. Open source.

@@ -378,14 +378,14 @@ const involve = [ Because the team is small, the constraints we put on the codebase have to do the heavy lifting. Safe defaults, conservative warmup, layered abuse controls, encryption everywhere we touch user secrets. We would rather ship one fewer feature than ship a feature that puts your sending reputation at risk.

- You can follow the work in public. Open issues, pull requests, the roadmap board, the changelog. Everything that matters is visible. + You can follow the work in public. Open issues, pull requests, and the changelog. Everything that matters is visible.

- -
Roadmap
-
What is next
-
Shipped, in progress, researched.
+
+
Trust
+
How it is secured
+
Encryption, subprocessors, posture.
Changelog
diff --git a/site/src/pages/changelog.astro b/site/src/pages/changelog.astro index 751e1bd5..41d88ead 100644 --- a/site/src/pages/changelog.astro +++ b/site/src/pages/changelog.astro @@ -4,81 +4,41 @@ import HeroAtmosphere from '../components/HeroAtmosphere.astro'; import Icon from '../components/Icon.astro'; import CTA from '../components/CTA.astro'; -// Seeded entries (from the prior changelog) plus 3 new ones grounded -// in the real codebase / CLAUDE.md (SOC 2 in progress, BYOK / KMS, -// SSO, worker assignment, tracking edge, warmup token validation). +// Entries are grounded in the real git history of warmbly/warmbly. There are +// no published releases or tags yet, so the commit log is the source of truth. +// We do not log every release: each entry groups the related work that shipped +// a milestone, dated when it landed on main. Add an entry here when a feature +// area is worth telling customers about, not for every commit. const entries = [ { - date: '2026-05-26', - title: 'BYOK envelope encryption for self-host', + date: '2026-06-09', + title: 'Automation builder', tag: 'shipped', - body: 'Self-hosted deployments can now register their 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 continue to live only in the Redis cache with a bounded TTL.', + body: 'Build branching automation flows in a visual graph builder, launch them straight from a campaign, and run multi-step graphs with conditional expressions. Live flows are protected by execution safeguards, and delete conflicts are surfaced before they break a running automation.', }, { - date: '2026-05-22', - title: 'SAML SSO for Business plans', + date: '2026-06-08', + title: 'Reply classification and campaign branching', tag: 'shipped', - body: 'Workspace owners on Business can connect Okta, Azure AD, or any SAML 2.0 IdP. Just-in-time provisioning is on by default and admins can pin a default role for new sign-ins.', + body: 'Inbound campaign replies are classified by intent and stored against the campaign, so a sequence can branch on what a reply actually says. Reply branches fire instantly off tracking events, new campaigns stop on reply by default, and reporting surfaces the winning A/B variant per step.', }, { - date: '2026-05-20', - title: 'API keys dashboard', + date: '2026-06-08', + title: 'Two-factor auth and in-app notifications', tag: 'shipped', - body: 'New API keys page in Settings. Per-key scopes, last-used timestamps, and one-click rotation. Existing keys auto-migrated to full-access scope. Rotate when you can.', + body: 'Members can enable two-factor authentication from security settings, required at login once it is on. A new notification center surfaces account and workflow events in realtime, with per-member preferences and a dedicated channel for security events.', }, { - date: '2026-05-15', - title: 'Per-mailbox health bands', + date: '2026-06-08', + title: 'Deliverability dashboard', tag: 'shipped', - body: 'Mailboxes now surface a health band: healthy, watch, quarantined, or blocked. Bands are driven by rolling placement, complaint, and bounce signals. Pool selection skips anything not healthy.', + body: 'A dedicated deliverability dashboard with expanded metrics: placement, complaints, bounces, and warmup health, surfaced per mailbox.', }, { - date: '2026-05-05', - title: 'Contacts power tools', + date: '2026-06-07', + title: 'CRM, unified inbox, and integrations', tag: 'shipped', - body: 'CSV, XLSX, and JSON export with a field picker and a scope toggle. A CSV / XLSX import wizard handles column mapping, dedup, and category assignment. Categories replace Tags in the contact model.', - }, - { - date: '2026-04-25', - title: 'Recovery pool', - tag: 'shipped', - body: 'Quarantined mailboxes move to a separate recovery pool, isolated from the main paid pool. 7-day cooldown plus a 20-delivery probation window before any re-entry into premium warmup traffic.', - }, - { - date: '2026-04-18', - title: 'SOC 2 Type I in progress', - tag: 'changed', - body: 'We engaged an external auditor for SOC 2 Type I. Trust center now lists subprocessors, the data flow, and the encryption model. Type II observation window starts after the Type I report lands.', - }, - { - date: '2026-04-12', - title: 'Worker concentration warnings', - tag: 'shipped', - body: 'Workspace surfaces a warning when a shared worker is carrying too much active cold volume. We add workers and rebalance before forcing any one machine to do more.', - }, - { - date: '2026-04-01', - title: 'Plain-text default', - tag: 'changed', - body: 'New sequences default to plain text. HTML is opt-in per step. Existing sequences are untouched, but new templates inherit the plain-text default.', - }, - { - date: '2026-03-22', - title: 'Microsoft 365 OAuth refresh', - tag: 'fixed', - body: 'Resolved an intermittent token-refresh failure for Microsoft mailboxes with mandatory MFA. Affected mailboxes auto-reconnect on the next sync window with no manual reauth.', - }, - { - date: '2026-03-10', - title: 'Sequence A/B variants', - tag: 'shipped', - body: 'Up to four subject and body variants per step. Per-variant reply-rate reporting, with significance hints once each variant has enough sample.', - }, - { - date: '2026-03-01', - title: 'Tracking edge upgrade', - tag: 'changed', - body: 'The tracking edge now dedupes by task and IP at the edge, and again in the consumer. Drops a class of replay-driven noise from analytics without losing real engagement events.', + body: 'A server-driven CRM with a paged deals board, deal sequence actions, team task assignment, and searchable task types, wired into the unified inbox. Inbox routing and seen-state handling were reworked, and a new integrations and meetings dashboard can push contacts out to connected systems.', }, ]; @@ -96,10 +56,9 @@ const counts = { }; // Hoisted to avoid `<` / `<=` inside JSX expressions (Astro JSX parser is fragile). -const monthEntries = entries.filter(e => e.date.startsWith('2026-05')); -const monthCount = monthEntries.length; -const ytdEntries = entries.filter(e => e.date.startsWith('2026-')); -const ytdCount = ytdEntries.length; +const recentEntries = entries.slice(0, 3); +const recentCount = recentEntries.length; +const totalCount = entries.length; const shippedCount = counts.shipped; const changedCount = counts.changed; const fixedCount = counts.fixed; @@ -130,14 +89,14 @@ const fixedCount = counts.fixed;

@@ -150,21 +109,21 @@ const fixedCount = counts.fixed;
-
Shipped this month
+
Latest releases

The latest production work.

- {monthCount} entries in May 2026. Trust and infrastructure work led the month, with BYOK envelope encryption, SAML SSO, and a new API keys dashboard all landing within two weeks. + The {recentCount} most recent milestones. The automation builder, reply classification, and two-factor auth all landed in early June 2026.

- {monthCount} / {ytdCount} year to date + {recentCount} / {totalCount} total
- {monthEntries.map((e) => { + {recentEntries.map((e) => { const t = tagStyle(e.tag); return (
@@ -249,44 +208,44 @@ const fixedCount = counts.fixed;
- Older than 90 days? - CHANGELOG.md on GitHub + Want the full detail? + Commit history on GitHub - Every entry maps to a commit SHA. + Every entry maps to commits on main.
Follow along

- Get the changelog
in your reader. + Follow every
release as it ships.

- The feed updates within minutes of an entry going live. No email signup, no tracking pixels, no batching. Just a plain RSS feed and the public GitHub repository. + Every entry maps to commits on main. Watch or star the repository to hear about the next release, and open a discussion on what we build next. No email signup, no tracking pixels.

- - + +
- +
-
Public roadmap
+
Discussions

- What is shipping next, what is in flight, and what we are still thinking about. Open for comment. + Request a feature, report a bug, or open an RFC. We read every thread and respond in the open.

- /roadmap + /discussions
diff --git a/site/src/pages/roadmap.astro b/site/src/pages/roadmap.astro deleted file mode 100644 index a08541ca..00000000 --- a/site/src/pages/roadmap.astro +++ /dev/null @@ -1,355 +0,0 @@ ---- -import Layout from '../layouts/Layout.astro'; -import HeroAtmosphere from '../components/HeroAtmosphere.astro'; -import Icon from '../components/Icon.astro'; -import CTA from '../components/CTA.astro'; - -// Roadmap items are seeded from the previous version of this page, -// the actual codebase (CLAUDE.md), and the live changelog. -// Categories: Warmup · Inbox · API · Security · CRM · Workers · Pricing · Contacts · Deliverability · Platform - -const shipped = [ - { cat: 'API', tone: 'sky', title: 'Per-key API scopes and rotation', note: 'Per-key scopes, last-used timestamps, one-click rotation.', link: '/changelog/#api-keys-dashboard' }, - { cat: 'Deliverability',tone: 'sky', title: 'Per-mailbox health bands', note: 'Healthy, watch, quarantined, blocked. Pool selection skips anything below healthy.', link: '/changelog/' }, - { cat: 'Contacts', tone: 'sky', title: 'CSV, XLSX, and JSON contact export', note: 'Field picker and scope, with import wizard for column mapping and dedup.', link: '/changelog/' }, - { cat: 'Contacts', tone: 'sky', title: 'Categories on contacts', note: 'Reuses the existing categories group, deprecates Tags.', link: '/changelog/' }, - { cat: 'Warmup', tone: 'sky', title: 'Recovery pool for quarantined mailboxes', note: '7-day cooldown plus a 20-delivery probation before re-entry.', link: '/changelog/' }, - { cat: 'Workers', tone: 'sky', title: 'Per-worker concentration warnings', note: 'Surfaces when a shared worker is carrying too much active cold volume.', link: '/changelog/' }, - { cat: 'Workers', tone: 'sky', title: 'Worker rebalancing without downtime', note: 'Move accounts between workers as machines come and go.', link: '/changelog/' }, -]; - -const inProgress = [ - { cat: 'Security', tone: 'amber', title: 'SOC 2 Type II audit', note: 'Observation window underway. Report targeting Q3 2026.' }, - { cat: 'Security', tone: 'amber', title: 'Customer-managed KMS keys', note: 'Bring your own AWS KMS root for envelope encryption on Business plans.' }, - { cat: 'Security', tone: 'amber', title: 'SSO and SAML on Business plan', note: 'OIDC and SAML 2.0, with SCIM provisioning to follow.' }, - { cat: 'API', tone: 'amber', title: 'Tenant-scoped IP allowlist for the API', note: 'Per-key allowlist on top of scope-based authorisation.' }, - { cat: 'Inbox', tone: 'amber', title: 'Multi-workspace switcher in the inbox', note: 'Read every workspace you belong to without re-logging in.' }, - { cat: 'CRM', tone: 'amber', title: 'Attio and Folk integrations', note: 'Two-way contact sync with field mapping and change attribution.' }, -]; - -const researching = [ - { cat: 'Inbox', tone: 'slate', title: 'AI reply triage suggestions', note: 'Opt-in. Suggest disposition only, never auto-reply on the user\'s behalf.' }, - { cat: 'Deliverability', tone: 'slate', title: 'Predictive placement scores from warmup', note: 'Use warmup probe history to forecast cold-campaign placement.' }, - { cat: 'Deliverability', tone: 'slate', title: 'Seed-list inbox placement testing on demand', note: 'Trigger a fresh placement test before kicking off a sequence.' }, - { cat: 'Workers', tone: 'slate', title: 'Per-region dedicated workers in APAC', note: 'Mirror the existing US and EU dedicated-worker availability.' }, - { cat: 'Deliverability', tone: 'slate', title: 'BIMI and VMC tooling', note: 'Setup checks, status surfacing, and provider guidance.' }, -]; - -// Quarter strip. Counts represent shipped feature items recorded in the -// changelog and roadmap for each window. Q2 2026 includes May items. -const quarters = [ - { label: 'Q1 2026', range: 'Jan to Mar', shipped: 4, theme: 'Sequences, tracking edge, plain-text default' }, - { label: 'Q2 2026', range: 'Apr to Jun', shipped: 5, theme: 'Health bands, recovery pool, API keys', current: true }, - { label: 'Q3 2026', range: 'Jul to Sep', shipped: 0, theme: 'SOC 2, SSO, BYOK, integrations' }, - { label: 'Q4 2026', range: 'Oct to Dec', shipped: 0, theme: 'Researching items move into build' }, -]; - -// Cadence stats, computed from the seed lists above. -const specs = [ - { k: 'Items shipped in the last 90 days', v: String(shipped.length) }, - { k: 'Items currently in progress', v: String(inProgress.length) }, - { k: 'Items under active research', v: String(researching.length) }, - { k: 'Average weeks between releases', v: '~2 weeks' }, - { k: 'Roadmap items per quarter (median)',v: '4 to 6' }, - { k: 'Roadmap refresh cadence', v: 'Monthly' }, -]; - -// How we prioritise. -const priorities = [ - { n: '01', t: 'User-requested features', b: 'Feature requests from /contact, in-app feedback and our community channels are read weekly. Repeat requests rank highest.' }, - { n: '02', t: 'Deliverability incidents', b: 'Anything that protects shared pool reputation jumps the line. Quarantine bands and the recovery pool both shipped this way.' }, - { n: '03', t: 'Infrastructure debt', b: 'Worker rebalancing, concentration warnings, and tracking edge dedupe are debt items that paid for themselves within a quarter.' }, - { n: '04', t: 'Compliance and contracts', b: 'SOC 2 and SSO are gates for the customers we want next. They get sequenced ahead of new surface area while audits are open.' }, - { n: '05', t: 'Quality of life', b: 'Smaller items get bundled together. We do not let a quarter pass without at least one quality-of-life batch.' }, -]; - -const faq: Array<[string, string]> = [ - ['Why is the roadmap public?', 'Sales-driven secrecy makes it harder for customers to plan. If we are working on it, you can see it. If it stalls, you can see that too.'], - ['How often does the roadmap change?', 'Items rotate monthly. The full board is reviewed every quarter. Anything that ships moves to the changelog with the same wording.'], - ['Can I request a feature?', 'Yes. Use the request link, or open an issue if it is a bug. We read every request weekly and respond to common ones in the next roadmap pass.'], - ['Will you commit to dates?', 'We commit to quarters, not weeks. Security and audit items have firmer windows because partners gate on them. Everything else slips when reality demands it.'], -]; - -// Tone class lookup, kept simple to satisfy Astro’s JSX parser. -const tone = (t: string) => { - if (t === 'sky') return { dot: 'bg-emerald-500', chip: 'bg-emerald-50 text-emerald-700', rail: 'bg-emerald-500' }; - if (t === 'amber') return { dot: 'bg-amber-500', chip: 'bg-amber-50 text-amber-700', rail: 'bg-amber-500' }; - return { dot: 'bg-sky-500', chip: 'bg-sky-50 text-sky-700', rail: 'bg-sky-500' }; -}; - -const catChip = (c: string) => - 'inline-flex items-center h-5 px-1.5 rounded text-[10.5px] font-medium font-mono uppercase tracking-[0.08em] bg-[color:var(--surface-1)] text-foreground/70 ring-1 ring-[color:var(--border)]'; - -// Pre-compute column metadata so the JSX stays simple. -const columns = [ - { title: 'Shipped recently', sub: 'Past 90 days', items: shipped, dot: 'bg-emerald-500', chipTone: 'bg-emerald-50 text-emerald-700' }, - { title: 'In progress', sub: 'Q2 to Q3 2026', items: inProgress, dot: 'bg-amber-500', chipTone: 'bg-amber-50 text-amber-700' }, - { title: 'Researching', sub: 'Targeting H2 2026', items: researching, dot: 'bg-sky-500', chipTone: 'bg-sky-50 text-sky-700' }, -]; ---- - - -
- - -
-
- Roadmap - Public on purpose -
- -

- What is shipping,
and what is next. -

-

- No sales-driven secrecy. The whole board is here, including what is researched but not committed. If a feature matters to you, tell us, and it gets weighed against the rest. -

- - -
-
- - -
-
-
-
Live board
-

- Three columns. Updated monthly. -

-

- Everything we are working on, grouped by where it sits in the pipeline. Items move left as they ship, and the changelog gets the same wording. -

-
- -
- {columns.map((c) => ( -
-
-
- -
{c.title}
- {c.items.length} -
- {c.sub} -
- -
    - {c.items.map((it: any) => ( -
  • -
    - {it.cat} - {it.link ? ( - - log - - - ) : ( - queued - )} -
    -
    {it.title}
    - {it.note ? ( -

    {it.note}

    - ) : null} -
  • - ))} -
-
- ))} -
-
-
- - -
-
-
-
Quarter by quarter
-

- One year, four windows. -

-

- We size work in quarters. Anything smaller than a quarter is a ship, not a roadmap entry. Anything larger gets broken down before it lands on the board. -

-
- -
- {quarters.map((q) => ( -
-
-
-
-
{q.label}
- {q.current ? ( - Now - ) : ( - {q.range} - )} -
- -
- {q.shipped} - shipped -
- -

{q.theme}

-
-
- ))} -
- -
- Counts pull from /changelog. Future quarters fill as items ship, not when they are scheduled. -
-
-
- - -
-
-
-
Cadence
-

- The shape of how we ship. -

-

- Steady, boring, and visible. Most weeks see something land. Most months see a roadmap update. Most quarters see one larger piece complete end to end. -

-
- -
- {specs.map((d, i) => ( -
-
- {String(i + 1).padStart(2, '0')} · {d.k} -
-
-
{d.v}
-
-
- ))} -
- -
- Source: this roadmap and /changelog. Refreshed each month. -
-
-
- - -
-
-
-
How we pick
-

- Five inputs decide the next quarter. -

-

- We weigh user requests, deliverability incidents, infrastructure debt, compliance commitments, and quality of life. No single input wins by default, and we publish the result on this page. -

- - Request a feature - - -
- -
    - {priorities.map((s) => ( -
  1. - {s.n} -
    -
    {s.t}
    -

    {s.b}

    -
    -
  2. - ))} -
-
-
- - -
-
-
-
Roadmap FAQ
-

- Four questions about how this works. -

-

- Want a feature considered? Tell us. -

-
- -
- {faq.map(([q, a]) => ( -
- -
-
-

{a}

-
-
-
- ))} -
- - -
-
- - -
diff --git a/site/src/pages/trust.astro b/site/src/pages/trust.astro index 830841b7..ea2179df 100644 --- a/site/src/pages/trust.astro +++ b/site/src/pages/trust.astro @@ -18,13 +18,13 @@ import CTA from '../components/CTA.astro'; - internal/repository/pg_warmup.go Tone: factual. No fake compliance badges. No fake metrics. - No customer quotes. Roadmap items marked as roadmap. + No customer quotes. Planned items are marked as planned, not shipped. Astro parser quirk: any `<` or `<=` comparison inside `{}` blocks breaks the parser. Hoist them up here. ----------------------------------------------------------------- */ -// Posture badges. Honest about what is shipped vs roadmap. +// Posture badges. Honest about what is shipped vs planned. // `state` drives the dot color in the JSX below. const posture = [ { @@ -50,12 +50,12 @@ const posture = [ { label: 'SOC 2 Type II', note: 'Controls in place. Audit window opens with our auditor.', - state: 'roadmap', + state: 'planned', }, { label: 'ISO 27001', note: 'Under evaluation. No certification claimed today.', - state: 'roadmap', + state: 'planned', }, ]; @@ -221,7 +221,7 @@ const disclosure = [

- We do not claim certifications we do not hold. SOC 2 and ISO 27001 are listed as roadmap items because they are honestly roadmap items. + We do not claim certifications we do not hold. SOC 2 and ISO 27001 are listed as planned because they are honestly not in place yet.