diff --git a/index.html b/index.html
index 2d693ec..834f66a 100644
--- a/index.html
+++ b/index.html
@@ -4,7 +4,7 @@
-
+
diff --git a/package.json b/package.json
index adbeba6..8d3bde9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "amerc-site",
- "version": "0.51.0-skel",
+ "version": "0.52.0-changelog",
"private": true,
"type": "module",
"scripts": {
diff --git a/src/Scene2D.jsx b/src/Scene2D.jsx
index df100ee..83e5a97 100644
--- a/src/Scene2D.jsx
+++ b/src/Scene2D.jsx
@@ -7,7 +7,7 @@ import Account from './Account.jsx';
import TavernGame from './TavernGame.jsx';
import { api } from './api.js';
-const RELEASE = '0.51.0-skel';
+const RELEASE = '0.52.0-changelog';
const NAV = [
{ id: 'home', label: 'Tavern' },
@@ -15,7 +15,7 @@ const NAV = [
{ id: 'mansion', label: 'Mansion' },
{ id: 'booth', label: 'My Booth' },
];
-const VALID_ROUTES = ['home', 'agents', 'mansion', 'booth', 'account', 'admin', 'signin', 'status'];
+const VALID_ROUTES = ['home', 'agents', 'mansion', 'booth', 'account', 'admin', 'signin', 'status', 'changelog'];
function useHashRoute() {
const normalize = () => {
@@ -273,7 +273,7 @@ function Footer({ setRoute }) {
Platform
Git
@@ -383,6 +383,42 @@ function StatusPage() {
);
}
+const CHANGELOG = [
+ { v: '0.51', date: 'Jun 2026', title: 'Loading skeletons', notes: ['Browse shows shimmer skeletons while the roster loads', 'Fixed an empty-state flash on cold load'] },
+ { v: '0.50', date: 'Jun 2026', title: 'Sharper hero', notes: ['Clear value proposition and Browse / Publish calls-to-action on the home hero'] },
+ { v: '0.49', date: 'Jun 2026', title: 'Live session preview', notes: ['An animated chatbox on the home page shows what a hired agent does'] },
+ { v: '0.48', date: 'Jun 2026', title: 'Findable', notes: ['robots.txt, sitemap.xml and Organization / WebSite structured data'] },
+ { v: '0.47', date: 'Jun 2026', title: 'Architecture flow', notes: ['Animated You → amerc edge → your users diagram on the home page'] },
+ { v: '0.46', date: 'Jun 2026', title: 'System status', notes: ['A live status page probing the tavern, API, docs, git and webagent'] },
+ { v: '0.45', date: 'Jun 2026', title: 'Motion', notes: ['Scroll-reveal feature cards and count-up statistics'] },
+ { v: '0.44', date: 'Jun 2026', title: 'Roster storefront', notes: ['Browse became a storefront with category chips and a publish-your-own card'] },
+ { v: '0.43', date: 'Jun 2026', title: 'Lean + onboarding', notes: ['Dropped 68 MB of dead assets and moved to atomic deploys', 'First-run onboarding in My Booth'] },
+ { v: '0.42', date: 'Jun 2026', title: 'The Gatehouse', notes: ['A split join page that leads with the value proposition'] },
+ { v: '0.41', date: 'Jun 2026', title: 'The Mansion', notes: ['A vivid services hall with the Showcase reverse proxy front and centre'] },
+ { v: '0.40', date: 'Jun 2026', title: 'Installable', notes: ['amerc is a PWA — branded app icons, offline shell, add to home screen'] },
+ { v: '0.39', date: 'Jun 2026', title: 'Public docs', notes: ['docs.amerc.ai opened to everyone with quickstart and reference guides'] },
+ { v: '0.30', date: 'Jun 2026', title: 'The tavern opens', notes: ['The 2D RPG tavern, the agent platform, the Showcase reverse proxy, and single sign-on across every *.amerc.ai'] },
+];
+function ChangelogPage() {
+ return (
+
+
Changelog
+
amerc ships continuously — one focused improvement at a time. Here's the trail.
+
+ {CHANGELOG.map((r, i) => (
+
+
+
+
v{r.v}{r.title}{r.date}
+
{r.notes.map((n, j) => - {n}
)}
+
+
+ ))}
+
+
+ );
+}
+
function Page({ children, setRoute }) { return
; }
function Scene({ route, setRoute, auth }) {
@@ -392,6 +428,7 @@ function Scene({ route, setRoute, auth }) {
if (route === 'booth') return
;
if (route === 'account') return
;
if (route === 'status') return
;
+ if (route === 'changelog') return
;
if (route === 'signin') return
;
if (route === 'admin') return
diff --git a/src/styles.css b/src/styles.css
index f2f95dd..818ca24 100644
--- a/src/styles.css
+++ b/src/styles.css
@@ -1369,3 +1369,21 @@ button {
.ap-skel-foot i { height: 9px; width: 30%; }
@keyframes sk-shimmer { 0% { background-position: 100% 0; } 100% { background-position: 0 0; } }
@media (prefers-reduced-motion: reduce) { .sk-av, .sk-tt i, .sk-p, .ap-skel-foot i { animation: none; } }
+
+/* changelog timeline (0.52) */
+.cl { max-width: 720px; margin: 0 auto; }
+.cl-title { font-family: Georgia, "Times New Roman", serif; font-size: 26px; color: #fff; margin: 0 0 6px; }
+.cl-lead { color: #b6a7d4; font-size: 14px; margin: 0 0 26px; line-height: 1.6; }
+.cl-timeline { position: relative; padding-left: 26px; }
+.cl-timeline::before { content: ''; position: absolute; left: 5px; top: 8px; bottom: 8px; width: 2px; background: linear-gradient(180deg, #46c8e0, #46c8e0 30%, #2e2440); border-radius: 2px; }
+.cl-item { position: relative; margin-bottom: 16px; }
+.cl-dot { position: absolute; left: -26px; top: 17px; width: 12px; height: 12px; border-radius: 50%; background: #14101e; border: 2px solid #46c8e0; box-shadow: 0 0 8px rgba(70,200,224,0.5); }
+.cl-item:first-child .cl-dot { background: #46c8e0; }
+.cl-card { background: linear-gradient(180deg, #160f24, #120c1d); border: 1px solid #2a1f3e; border-radius: 12px; padding: 14px 16px; transition: border-color .15s, transform .15s; }
+.cl-card:hover { border-color: #46c8e0; transform: translateX(2px); }
+.cl-card-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
+.cl-ver { font-family: ui-monospace, monospace; font-size: 11px; font-weight: 700; color: #06222f; background: linear-gradient(180deg, #5fe6ff, #27d8ff); padding: 2px 8px; border-radius: 999px; }
+.cl-card-head strong { color: #fff; font-size: 15px; }
+.cl-date { margin-left: auto; color: #7a6a98; font-size: 12px; }
+.cl-card ul { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 5px; }
+.cl-card li { color: #b6a7d4; font-size: 13px; line-height: 1.5; }