diff --git a/src/components/NeonMotion.astro b/src/components/NeonMotion.astro
new file mode 100644
index 0000000..42060a3
--- /dev/null
+++ b/src/components/NeonMotion.astro
@@ -0,0 +1,48 @@
+---
+// Page motion for the neon design language (see "Neon design language" in
+// src/styles/global.css): blocks marked .nx-in move into place as they come
+// into view, .nx-tile surfaces light up under the pointer, and figures marked
+// data-count tick up while the page is visible. Everything reads the same
+// without it; with reduced motion only the pointer light stays.
+---
+
+
diff --git a/src/components/home/CompareEditions.astro b/src/components/home/CompareEditions.astro
index 891d780..04f90d6 100644
--- a/src/components/home/CompareEditions.astro
+++ b/src/components/home/CompareEditions.astro
@@ -12,19 +12,20 @@ const editions = [
const rows = ["runsAs", "builtFor", "status", "license"] as const;
---
-
-
+
+
+
diff --git a/src/components/home/HomeHero.astro b/src/components/home/HomeHero.astro
index 8b232b8..a665785 100644
--- a/src/components/home/HomeHero.astro
+++ b/src/components/home/HomeHero.astro
@@ -1,62 +1,118 @@
---
-import HeroVisual from "~/components/hero/HeroVisual.tsx";
+// Home hero: both products at a glance. Copy on the left with a door into each
+// product, a request typed through the gateway on the right.
import Terminal from "~/components/ui/Terminal.tsx";
import { getLang, localePath } from "~/i18n";
import { homeCopy } from "~/i18n/pages/home";
+import { getLatestLiteRelease, getLatestRelease } from "~/lib/github";
const lang = getLang(Astro);
const c = homeCopy[lang];
const zh = lang === "zh-CN";
+const lite = (await getLatestLiteRelease())?.tag.replace(/^v/, "") ?? null;
+const ent = (await getLatestRelease())?.replace(/^v/, "") ?? null;
---
-
-
-
-
-
-
diff --git a/src/components/home/LiteBand.astro b/src/components/home/LiteBand.astro
index 054f800..c8547f0 100644
--- a/src/components/home/LiteBand.astro
+++ b/src/components/home/LiteBand.astro
@@ -1,53 +1,114 @@
---
-// The Lite band on the home page. Each page shows the interface in its own
-// language; see LitePage.astro.
+// The Lite band on the home page: the local gateway, its four points, where it
+// runs, and a download, beside its overview screen. Each page shows the
+// interface in its own language; see LitePage.astro.
import { getLang, localePath } from "~/i18n";
import { homeCopy } from "~/i18n/pages/home";
import LiteDownload from "~/components/LiteDownload.astro";
+import TwMark from "~/components/TwMark.astro";
const lang = getLang(Astro);
const c = homeCopy[lang].lite;
const zh = lang === "zh-CN";
---
-
-
diff --git a/src/components/home/ThinkWatchBand.astro b/src/components/home/ThinkWatchBand.astro
index 94851c7..d7233a3 100644
--- a/src/components/home/ThinkWatchBand.astro
+++ b/src/components/home/ThinkWatchBand.astro
@@ -1,4 +1,7 @@
---
+// ThinkWatch Enterprise on the home page: what it is, its four pillars as
+// tiles, the six stages of a request as a pipeline a light runs along, the
+// console preview, and per-user identity for MCP.
import DashboardMock from "~/components/mocks/DashboardMock.tsx";
import LogExplorerMock from "~/components/mocks/LogExplorerMock.tsx";
import ProviderHealthMock from "~/components/mocks/ProviderHealthMock.tsx";
@@ -8,51 +11,56 @@ import { homeCopy } from "~/i18n/pages/home";
const lang = getLang(Astro);
const c = homeCopy[lang].tw;
+/** Line icons for the four pillars, in the order of the copy */
+const icons = [
+ '',
+ '',
+ '',
+ '',
+];
---
-
-
diff --git a/src/components/pages/CorePage.astro b/src/components/pages/CorePage.astro
index 9ace317..7b4b80f 100644
--- a/src/components/pages/CorePage.astro
+++ b/src/components/pages/CorePage.astro
@@ -1,11 +1,12 @@
---
// The /core page: ThinkWatch Core, the MIT-licensed Rust crates and the twcore
// binary. twcore is the gateway inside ThinkWatch Lite and also runs on its own
-// on a Linux server; ThinkWatch Enterprise depends on three of the crates.
+// on a Linux server; ThinkWatch Enterprise depends on four of the crates.
import Base from "~/layouts/Base.astro";
import SiteHeader from "~/components/SiteHeader.astro";
import SiteFooter from "~/components/SiteFooter.astro";
import CopyCommand from "~/components/CopyCommand.astro";
+import NeonMotion from "~/components/NeonMotion.astro";
import { getLang, localePath } from "~/i18n";
import { coreCopy } from "~/i18n/pages/core";
import { getLatestCoreRelease, getReleases } from "~/lib/github";
@@ -50,7 +51,12 @@ const sourceCommands = [
"cargo build --release -p twcore",
];
-const delay = (i: number) => `animation-delay: ${i * 90}ms;`;
+/** What twcore serve prints once it is up: illustrative lines for the hero terminal */
+const serveLog = [
+ 'ready gateway 127.0.0.1:8788 · control socket',
+ 'POST /v1/messages claude-code → anthropic 200 1.2 s',
+ 'POST /v1/responses codex → chatgpt 429 → relay 200',
+];
const eyebrow = "font-mono text-[11px] uppercase tracking-[0.08em] text-[var(--color-muted)] sm:text-[13px]";
const label = "m-0 font-mono text-[13px] uppercase tracking-[0.08em] text-[var(--color-muted)]";
const h2 = zh
@@ -64,90 +70,97 @@ const fileLink = "break-all text-[var(--color-brand-1)] transition-colors hover:
-
-
-
-
- {c.hero.eyebrow}
-
-
- {zh ? (
- // Kept on one line, so that the break falls before the highlight
- // rather than leaving "的" at the start of the second line.
- {c.hero.titleA.trimEnd()}{c.hero.titleA.endsWith(" ") && " "}
- ) : (
- c.hero.titleA
- )}{c.hero.titleHighlight}
+
+