Pre-launch — Gluecron is in final validation. Public signups and git hosting for non-owner users open after launch review.
CodeIssuesDiscussionsWikiPull RequestsProjectsCommitsActionsReleasesContributorsPulse● GatesSecuritySettingsDeploymentsPipelineInsightsAgents✨ Explain✨ Ask AI✨ Workspace✨ Spec✨ Tests▓ Debt Map✨ NL Search🏛 Archaeology
Blame · Line-by-line history

changelog.tsx

Each line is annotated with the commit that last touched it. Click any SHA to jump to that commit and see the surrounding change.

changelog.tsxBlame262 lines · 1 contributor
e1fc7dbClaude1/**
2 * /changelog — manually curated list of recent platform releases.
3 * Public, no auth required.
4 */
5
6import { Hono } from "hono";
7import type { FC } from "hono/jsx";
8import { Layout } from "../views/layout";
9import { softAuth } from "../middleware/auth";
10import type { AuthEnv } from "../middleware/auth";
11
12const changelog = new Hono<AuthEnv>();
13changelog.use("*", softAuth);
14
15changelog.get("/changelog", (c) => {
16 const user = c.get("user");
17 return c.html(
18 <Layout
19 title="Changelog — gluecron"
20 description="What's new in gluecron — recent feature releases, improvements, and platform updates."
21 user={user}
22 >
23 <ChangelogPage />
24 </Layout>,
25 );
26});
27
28// ---------------------------------------------------------------------------
29// Data
30// ---------------------------------------------------------------------------
31
32interface ChangelogEntry {
33 title: string;
34 description: string;
35}
36
37interface ChangelogMonth {
38 month: string;
39 entries: ChangelogEntry[];
40}
41
42const RELEASES: ChangelogMonth[] = [
43 {
44 month: "June 2026",
45 entries: [
46 {
47 title: "AI Trio Review",
48 description:
49 "Three-model parallel PR review running Security, Correctness, and Style passes simultaneously — faster feedback, broader coverage.",
50 },
51 {
52 title: "Spec-to-Live progress UI",
53 description:
54 "Watch your spec become a merged PR in real time: a live progress stream shows each agent step from spec parse to gate green to merge.",
55 },
56 {
57 title: "Pack-content ruleset enforcement",
58 description:
59 "Block bad commits at push time with pack-content rulesets — enforce file-size limits, banned extensions, and content patterns before the push lands.",
60 },
61 {
62 title: "Customer deploy targets",
63 description:
64 "SSH deploy to your own server directly from a merge. Register a server target in repo settings and autopilot handles the rsync.",
65 },
66 {
67 title: "Workflow cache SAVE",
68 description:
69 "CI runs warm from the second run. Workflow jobs can now persist dependency caches between runs, cutting install time on hot paths by up to 80%.",
70 },
71 {
72 title: "Push Watch",
73 description:
74 "A pulsing Live indicator appears in the repo header whenever a push is in flight — gate runs, AI review, and deploy status update without a page reload.",
75 },
76 ],
77 },
78 {
79 month: "May 2026",
80 entries: [
81 {
82 title: "Branch preview URLs with auto-expiry cleanup",
83 description:
84 "Every PR branch gets an isolated preview URL. Autopilot tears down stale previews 24 hours after the branch is merged or closed.",
85 },
86 {
87 title: "Dashboard AI activity widget",
88 description:
89 "A compact widget on /dashboard surfaces the last hour of autopilot actions across all your repos — repairs, reviews, deploys, and digest sends at a glance.",
90 },
91 {
92 title: "Health score badge on repo header",
93 description:
94 "A colour-coded health score (0–100) appears in the repo header, computed from gate pass rate, stale PR count, and recent deploy success.",
95 },
96 ],
97 },
98];
99
100// ---------------------------------------------------------------------------
101// View
102// ---------------------------------------------------------------------------
103
104const ChangelogPage: FC = () => (
105 <>
106 <style dangerouslySetInnerHTML={{ __html: changelogCss }} />
107 <div class="cl-root">
108 <header class="cl-hero">
109 <div class="cl-hero-inner">
110 <p class="cl-eyebrow">Platform updates</p>
111 <h1 class="cl-title">What's New in Gluecron</h1>
112 <p class="cl-subtitle">
113 Recent features, fixes, and improvements shipped to the platform.
114 </p>
115 <a href="/settings/notifications" class="cl-cta">
116 Subscribe to updates &rarr;
117 </a>
118 </div>
119 </header>
120
121 <div class="cl-content">
122 {RELEASES.map((rel) => (
123 <section class="cl-month" key={rel.month}>
124 <h2 class="cl-month-heading">{rel.month}</h2>
125 <ul class="cl-entries">
126 {rel.entries.map((entry) => (
127 <li class="cl-entry" key={entry.title}>
128 <span class="cl-entry-dot" aria-hidden="true" />
129 <div class="cl-entry-body">
130 <strong class="cl-entry-title">{entry.title}</strong>
131 <p class="cl-entry-desc">{entry.description}</p>
132 </div>
133 </li>
134 ))}
135 </ul>
136 </section>
137 ))}
138 </div>
139 </div>
140 </>
141);
142
143// ---------------------------------------------------------------------------
144// Styles (dark-theme aware, uses CSS custom properties from layout.tsx)
145// ---------------------------------------------------------------------------
146
147const changelogCss = `
148.cl-root {
149 max-width: 760px;
150 margin: 0 auto;
151 padding: 48px 24px 80px;
152}
153
154/* Hero */
155.cl-hero {
156 margin-bottom: 56px;
157 text-align: center;
158}
159.cl-hero-inner {
160 display: flex;
161 flex-direction: column;
162 align-items: center;
163 gap: 12px;
164}
165.cl-eyebrow {
166 font-size: 12px;
167 font-weight: 600;
168 letter-spacing: 0.1em;
169 text-transform: uppercase;
170 color: var(--accent);
171 margin: 0;
172}
173.cl-title {
174 font-size: clamp(28px, 5vw, 40px);
175 font-weight: 700;
176 color: var(--text-strong);
177 margin: 0;
178 line-height: 1.2;
179}
180.cl-subtitle {
181 font-size: 16px;
182 color: var(--text-muted);
183 margin: 0;
184 max-width: 520px;
185 line-height: 1.6;
186}
187.cl-cta {
188 display: inline-block;
189 margin-top: 8px;
190 padding: 10px 20px;
191 background: var(--accent);
192 color: #fff;
193 border-radius: 8px;
194 font-size: 14px;
195 font-weight: 600;
196 text-decoration: none;
197 transition: opacity 0.15s;
198}
199.cl-cta:hover { opacity: 0.85; text-decoration: none; }
200
201/* Month groups */
202.cl-content {
203 display: flex;
204 flex-direction: column;
205 gap: 48px;
206}
207.cl-month {}
208.cl-month-heading {
209 font-size: 18px;
210 font-weight: 700;
211 color: var(--text-strong);
212 margin: 0 0 24px;
213 padding-bottom: 12px;
214 border-bottom: 1px solid var(--border-subtle, rgba(255,255,255,0.08));
215}
216
217/* Entry list */
218.cl-entries {
219 list-style: none;
220 margin: 0;
221 padding: 0;
222 display: flex;
223 flex-direction: column;
224 gap: 20px;
225}
226.cl-entry {
227 display: flex;
228 gap: 16px;
229 align-items: flex-start;
230}
231.cl-entry-dot {
232 flex-shrink: 0;
233 margin-top: 6px;
234 width: 8px;
235 height: 8px;
236 border-radius: 50%;
237 background: var(--accent);
6fd5915Claude238 box-shadow: 0 0 8px rgba(91,110,232,0.5);
e1fc7dbClaude239}
240.cl-entry-body {
241 flex: 1;
242}
243.cl-entry-title {
244 display: block;
245 font-size: 15px;
246 font-weight: 600;
247 color: var(--text-strong);
248 margin-bottom: 4px;
249}
250.cl-entry-desc {
251 margin: 0;
252 font-size: 14px;
253 color: var(--text-muted);
254 line-height: 1.6;
255}
256
257@media (max-width: 600px) {
258 .cl-root { padding: 32px 16px 64px; }
259}
260`;
261
262export default changelog;