Pre-launch — Gluecron is in final validation. Public signups and git hosting for non-owner users open after launch review.
CodeIssuesPull RequestsActionsSecurityInsightsSettings
✨ AI
More
Blame · Line-by-line history

app.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.

app.tsxBlame195 lines · 1 contributor
79136bbClaude1import { Hono } from "hono";
2import { logger } from "hono/logger";
3import { cors } from "hono/cors";
05b973eClaude4import { compress } from "hono/compress";
79136bbClaude5import { Layout } from "./views/layout";
3ef4c9dClaude6import { requestContext } from "./middleware/request-context";
7import { rateLimit } from "./middleware/rate-limit";
79136bbClaude8import gitRoutes from "./routes/git";
9import apiRoutes from "./routes/api";
10import authRoutes from "./routes/auth";
11import settingsRoutes from "./routes/settings";
7298a17Claude12import settings2faRoutes from "./routes/settings-2fa";
79136bbClaude13import issueRoutes from "./routes/issues";
14import repoSettings from "./routes/repo-settings";
15import compareRoutes from "./routes/compare";
0074234Claude16import pullRoutes from "./routes/pulls";
17import editorRoutes from "./routes/editor";
c81ab7aClaude18import forkRoutes from "./routes/fork";
19import webhookRoutes from "./routes/webhooks";
20import exploreRoutes from "./routes/explore";
21import tokenRoutes from "./routes/tokens";
43de941Claude22import contributorRoutes from "./routes/contributors";
3ef4c9dClaude23import notificationRoutes from "./routes/notifications";
24import dashboardRoutes from "./routes/dashboard";
25import askRoutes from "./routes/ask";
26import releaseRoutes from "./routes/releases";
27import gateRoutes from "./routes/gates";
28import insightsRoutes from "./routes/insights";
29import searchRoutes from "./routes/search";
30import healthRoutes from "./routes/health";
ad6d4adClaude31import hookRoutes from "./routes/hooks";
6fc53bdClaude32import themeRoutes from "./routes/theme";
33import auditRoutes from "./routes/audit";
34import reactionRoutes from "./routes/reactions";
24cf2caClaude35import savedReplyRoutes from "./routes/saved-replies";
36import deploymentRoutes from "./routes/deployments";
6563f0aClaude37import orgRoutes from "./routes/orgs";
2df1f8cClaude38import passkeyRoutes from "./routes/passkeys";
058d752Claude39import oauthRoutes from "./routes/oauth";
40import developerAppsRoutes from "./routes/developer-apps";
79136bbClaude41import webRoutes from "./routes/web";
42
43const app = new Hono();
44
3ef4c9dClaude45// Request context (request ID, start time) runs before everything else
46app.use("*", requestContext);
05b973eClaude47// Middleware — compression first (wraps all responses)
48app.use("*", compress());
49// Logger only on non-git routes to avoid overhead on clone/push
50app.use("*", async (c, next) => {
51 if (c.req.path.includes(".git/")) return next();
52 return logger()(c, next);
53});
79136bbClaude54app.use("/api/*", cors());
3ef4c9dClaude55// Rate-limit API + auth endpoints (generous default)
56app.use("/api/*", rateLimit({ windowMs: 60_000, max: 120 }));
57app.use("/login", rateLimit({ windowMs: 60_000, max: 20 }));
58app.use("/register", rateLimit({ windowMs: 60_000, max: 10 }));
79136bbClaude59
60// Git Smart HTTP protocol routes (must be before web routes)
61app.route("/", gitRoutes);
62
3ef4c9dClaude63// Health + metrics
64app.route("/", healthRoutes);
65
ad6d4adClaude66// Inbound API hooks (GateTest callback + backup PAT-authed /api/v1/gate-runs)
67app.route("/", hookRoutes);
68
79136bbClaude69// REST API
70app.route("/", apiRoutes);
71
72// Auth routes (register, login, logout)
73app.route("/", authRoutes);
74
75// Settings routes (profile, SSH keys)
76app.route("/", settingsRoutes);
77
7298a17Claude78// 2FA / TOTP settings (Block B4)
79app.route("/", settings2faRoutes);
80
2df1f8cClaude81// WebAuthn / passkey routes (Block B5)
82app.route("/", passkeyRoutes);
83
058d752Claude84// OAuth 2.0 provider (Block B6)
85app.route("/", oauthRoutes);
86app.route("/", developerAppsRoutes);
87
6fc53bdClaude88// Theme toggle (dark/light cookie)
89app.route("/", themeRoutes);
90
91// Audit log UI
92app.route("/", auditRoutes);
93
94// Reactions API (issues, PRs, comments)
95app.route("/", reactionRoutes);
96
24cf2caClaude97// Saved replies (per-user canned comment templates)
98app.route("/", savedReplyRoutes);
99
100// Environments + deployment history UI
101app.route("/", deploymentRoutes);
102
6563f0aClaude103// Organizations + teams (Block B1)
104app.route("/", orgRoutes);
105
c81ab7aClaude106// API tokens
107app.route("/", tokenRoutes);
108
3ef4c9dClaude109// Notifications inbox
110app.route("/", notificationRoutes);
111
112// Dashboard (/dashboard)
113app.route("/", dashboardRoutes);
114
115// AI assistant — /ask + /:owner/:repo/ask
116app.route("/", askRoutes);
117
118// Global search
119app.route("/", searchRoutes);
120
79136bbClaude121// Repo settings (description, visibility, delete)
122app.route("/", repoSettings);
123
c81ab7aClaude124// Webhooks management
125app.route("/", webhookRoutes);
126
79136bbClaude127// Compare view (branch diffs)
128app.route("/", compareRoutes);
129
130// Issue tracker
131app.route("/", issueRoutes);
132
0074234Claude133// Pull requests
134app.route("/", pullRoutes);
135
c81ab7aClaude136// Fork
137app.route("/", forkRoutes);
138
0074234Claude139// Web file editor
140app.route("/", editorRoutes);
141
43de941Claude142// Contributors
143app.route("/", contributorRoutes);
144
3ef4c9dClaude145// Releases
146app.route("/", releaseRoutes);
147
148// Gates (history + settings + branch protection)
149app.route("/", gateRoutes);
150
151// Insights + milestones
152app.route("/", insightsRoutes);
153
c81ab7aClaude154// Explore page
155app.route("/", exploreRoutes);
156
79136bbClaude157// Web UI (catch-all, must be last)
158app.route("/", webRoutes);
159
160// Global 404
161app.notFound((c) => {
162 return c.html(
163 <Layout title="Not Found">
164 <div class="empty-state">
165 <h2>404</h2>
166 <p>Page not found.</p>
167 <a href="/" style="margin-top: 12px; display: inline-block">
168 Go home
169 </a>
170 </div>
171 </Layout>,
172 404
173 );
174});
175
176// Global error handler
177app.onError((err, c) => {
178 console.error("[error]", err);
179 return c.html(
180 <Layout title="Error">
181 <div class="empty-state">
182 <h2>Something went wrong</h2>
183 <p>An unexpected error occurred.</p>
184 {process.env.NODE_ENV !== "production" && (
185 <pre style="margin-top: 16px; text-align: left; font-size: 12px; color: var(--red)">
186 {err.message}
187 </pre>
188 )}
189 </div>
190 </Layout>,
191 500
192 );
193});
194
195export default app;