The site had drifted ~6 months behind the product. Three problems
addressed in one push:
1. Timeline ("Shipped, not promised") topped out at v0.6–0.8 and
claimed "66 npm releases" — both stale. Adds a v0.9 → 1.34 tier
covering daemon, multi-mesh, multi-session correctness train,
refuse-to-kick on control-plane, env-var fallback. Updates count
to "120+ npm releases through v1.34.15." Rewrites the "next"
block from the now-shipped "Daemon redesign · per-topic
encryption" to the actually-pending "HKDF cross-machine identity
· session capabilities · A2A interop · self-host packaging ·
federation."
2. Hero subhead leaned into the original "Claude Code peer mesh"
framing, which is undercut by Anthropic Agent Teams (Feb 2026,
single-machine native mailbox). Now reframes claudemesh as the
encrypted backbone where Claude Code sessions, autonomous
agents, and humans coordinate "across machines, across users,
across organizations" — the four words that distinguish the
product from anything Anthropic structurally can ship from
inside Claude Code.
3. /changelog had three entries from April 2026 (v0.1.2 → v0.1.4)
and was 70+ versions out of date. Replaced with a curated
16-entry timeline from v0.1.0 → v1.34.15, hand-picked to tell
the story (load-bearing ships, not every patch). Adds links
back to docs/roadmap.md, .artifacts/specs/, and GitHub Releases.
New module: apps/web/src/modules/marketing/home/changelog-data.ts
holds the curated entries as a single source of truth. Imported by
both the /changelog page and a new home-page component
LatestReleases (compact 5-entry strip, slotted between Timeline
and Pricing) so they never disagree.
Misc fixes pulled in:
- timeline.tsx had glyph="layers" which isn't in SectionIcon's
valid set; switched to "grid" (changelog-data.ts uses same).
- changelog data extracted to a non-route module so Next.js's
route-export validator stops complaining about exporting
CHANGELOG_ENTRIES from app/.../changelog/page.tsx.
Pre-existing typecheck noise in packages/ui/web/sidebar.tsx
(csstype version mismatch) + billing modules unrelated to this
change. My files all typecheck clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
142 lines
5.5 KiB
TypeScript
142 lines
5.5 KiB
TypeScript
import Link from "next/link";
|
|
|
|
import {
|
|
CHANGELOG_ENTRIES,
|
|
CHANGELOG_TYPE_COLOR,
|
|
CHANGELOG_TYPE_LABELS,
|
|
} from "./changelog-data";
|
|
import { Reveal, SectionIcon } from "./_reveal";
|
|
|
|
/**
|
|
* Compact recent-releases strip for the home page. Pulls the top N entries
|
|
* from the same data source as the full /changelog page so they never
|
|
* disagree.
|
|
*/
|
|
export const LatestReleases = ({ count = 5 }: { count?: number }) => {
|
|
const recent = CHANGELOG_ENTRIES.slice(0, count);
|
|
|
|
return (
|
|
<section className="border-b border-[var(--cm-border)] bg-[var(--cm-bg-elevated)] px-6 py-24 md:px-12 md:py-28">
|
|
<div className="mx-auto max-w-[var(--cm-max-w)]">
|
|
<Reveal className="mb-6 flex justify-center">
|
|
<SectionIcon glyph="grid" />
|
|
</Reveal>
|
|
|
|
<Reveal delay={1}>
|
|
<p
|
|
className="text-center text-[11px] uppercase tracking-[0.2em] text-[var(--cm-fg-tertiary)]"
|
|
style={{ fontFamily: "var(--cm-font-mono)" }}
|
|
>
|
|
release log · last {count} ships
|
|
</p>
|
|
</Reveal>
|
|
|
|
<Reveal delay={2}>
|
|
<h2
|
|
className="mt-3 text-center text-[clamp(1.75rem,3.5vw,2.5rem)] font-medium leading-[1.15] text-[var(--cm-fg)]"
|
|
style={{ fontFamily: "var(--cm-font-serif)" }}
|
|
>
|
|
What shipped this week
|
|
</h2>
|
|
</Reveal>
|
|
|
|
<Reveal delay={3}>
|
|
<p
|
|
className="mx-auto mt-3 max-w-xl text-center text-[14px] leading-[1.65] text-[var(--cm-fg-secondary)]"
|
|
style={{ fontFamily: "var(--cm-font-sans)" }}
|
|
>
|
|
Every release is in production on{" "}
|
|
<span
|
|
className="text-[var(--cm-fg)]"
|
|
style={{ fontFamily: "var(--cm-font-mono)" }}
|
|
>
|
|
wss://ic.claudemesh.com
|
|
</span>{" "}
|
|
within minutes. The CLI publishes to npm; the broker auto-deploys.
|
|
</p>
|
|
</Reveal>
|
|
|
|
<Reveal delay={4}>
|
|
<ol className="mx-auto mt-12 max-w-3xl space-y-4">
|
|
{recent.map((entry, idx) => (
|
|
<li key={entry.version + entry.date}>
|
|
<Link
|
|
href="/changelog"
|
|
className="group block rounded-[var(--cm-radius-md)] border border-[var(--cm-border)] bg-[var(--cm-bg)] p-5 transition-colors hover:border-[var(--cm-clay)]/40"
|
|
>
|
|
<div className="flex flex-wrap items-baseline gap-x-3 gap-y-1">
|
|
<span
|
|
className="rounded-[3px] px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wider"
|
|
style={{
|
|
fontFamily: "var(--cm-font-mono)",
|
|
backgroundColor: CHANGELOG_TYPE_COLOR[entry.type],
|
|
color: "var(--cm-gray-900)",
|
|
}}
|
|
>
|
|
{CHANGELOG_TYPE_LABELS[entry.type]}
|
|
</span>
|
|
<span
|
|
className="text-[16px] font-medium text-[var(--cm-fg)]"
|
|
style={{ fontFamily: "var(--cm-font-serif)" }}
|
|
>
|
|
v{entry.version}
|
|
</span>
|
|
<time
|
|
dateTime={entry.date}
|
|
className="text-[11px] text-[var(--cm-fg-tertiary)]"
|
|
style={{ fontFamily: "var(--cm-font-mono)" }}
|
|
>
|
|
{new Date(entry.date).toLocaleDateString("en-US", {
|
|
year: "numeric",
|
|
month: "short",
|
|
day: "numeric",
|
|
})}
|
|
</time>
|
|
{idx === 0 && (
|
|
<span
|
|
className="rounded-full bg-[var(--cm-clay)]/15 px-2 py-0.5 text-[10px] font-medium uppercase tracking-wider text-[var(--cm-clay)]"
|
|
style={{ fontFamily: "var(--cm-font-mono)" }}
|
|
>
|
|
latest
|
|
</span>
|
|
)}
|
|
</div>
|
|
<h3
|
|
className="mt-2.5 text-[15px] font-medium text-[var(--cm-fg)] transition-colors group-hover:text-[var(--cm-clay)]"
|
|
style={{ fontFamily: "var(--cm-font-sans)" }}
|
|
>
|
|
{entry.title}
|
|
</h3>
|
|
<p
|
|
className="mt-2 line-clamp-2 text-[13px] leading-[1.6] text-[var(--cm-fg-secondary)]"
|
|
style={{ fontFamily: "var(--cm-font-sans)" }}
|
|
>
|
|
{entry.summary}
|
|
</p>
|
|
</Link>
|
|
</li>
|
|
))}
|
|
</ol>
|
|
</Reveal>
|
|
|
|
<Reveal delay={5}>
|
|
<div className="mt-10 flex justify-center">
|
|
<Link
|
|
href="/changelog"
|
|
className="group inline-flex items-center gap-2 text-[13px] font-medium text-[var(--cm-fg-secondary)] transition-colors hover:text-[var(--cm-clay)]"
|
|
style={{ fontFamily: "var(--cm-font-sans)" }}
|
|
>
|
|
<span className="border-b border-dashed border-[var(--cm-fg-tertiary)] pb-0.5 transition-colors group-hover:border-[var(--cm-clay)]">
|
|
Read the full changelog
|
|
</span>
|
|
<span className="transition-transform duration-300 group-hover:translate-x-1">
|
|
→
|
|
</span>
|
|
</Link>
|
|
</div>
|
|
</Reveal>
|
|
</div>
|
|
</section>
|
|
);
|
|
};
|