Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
5e106fe
Lake 1: design token layer - surfaces, semantic + categorical + data-…
aurph Jul 2, 2026
61837c6
Lake 1: migrate CatalystTracker, SupplyChain, TheStack, Compute Front…
aurph Jul 2, 2026
e611d79
Lake 1: complete token migration + alpha-capable token colors
aurph Jul 2, 2026
cf9a174
Dev compat: only set reusePort on Linux (macOS listen throws ENOTSUP)
aurph Jul 2, 2026
6c652d7
Lake 2: rebuild Neocloud price history chart on visx
aurph Jul 3, 2026
7b7f6ea
Neocloud: grid (small multiples) is the default chart view - owner pi…
aurph Jul 3, 2026
54326e1
Lake 3: The Stack - honest sparklines, three density views, virtualiz…
aurph Jul 3, 2026
3cfbd0c
Lake 4 (A,C,D,E): compact header strip, semantic sector chips, NPI ti…
aurph Jul 3, 2026
011d3be
Lake 4B: catalyst dedup - calendar with hover popovers + one list (ow…
aurph Jul 3, 2026
f81ac87
Lake 5: Power Map - marker encoding, clustering, linked operator table
aurph Jul 3, 2026
70a8222
Lake 6: Backlog - est. flags on fallback constants, no empty tooltips
aurph Jul 3, 2026
8c7fd77
Lake 6: Scenario Calculator - preset ramp off-by-one, honest custom r…
aurph Jul 3, 2026
c4d22f0
Lake 6: Catalyst Tracker - honest section label, designed error state…
aurph Jul 3, 2026
064ea08
Lake 6: Supply Chain - frame-throttled drag, skeleton, reduced motion…
aurph Jul 3, 2026
27cb88c
Lake 6: Portfolio Overlay - copy matches axes, sort fix, Stack links
aurph Jul 3, 2026
4232fa8
Lake 6: GPU Economics - cheapest-compute badge pinned to the actual m…
aurph Jul 3, 2026
61930c6
Lake 6: Compute Frontier - build timeline sorts years numerically, n/…
aurph Jul 3, 2026
ad5c0ab
Lake 7 core: focus-visible, reduced motion, ticker controls, trust pr…
aurph Jul 3, 2026
e24099a
Lake 7 sweep: freshness, error+retry, sr chart tables, responsive acr…
aurph Jul 3, 2026
6ae6a83
Lake 8: unit tests for every chart transform + state snapshots + toke…
aurph Jul 3, 2026
7d38df1
Consolidation 1/5: GPU Prices = Neocloud Intel + GPU Economics (Plan B)
aurph Jul 3, 2026
c49232a
Consolidation 2/5: Power = Map + Deals + Queue tabs
aurph Jul 3, 2026
ba9f095
Consolidation 3/5: Analyze = Portfolio Overlay + Scenario Calculator …
aurph Jul 3, 2026
b462514
Consolidation 4/5: The Buildout Brief folds into Analysis
aurph Jul 3, 2026
206e1b1
Consolidation 5a/5: routing, sidebar, shortcuts, 301s, SEO for the 7-…
aurph Jul 3, 2026
1c1bc7e
Consolidation 5b/5: Supply Chain folds into The Stack as the flow view
aurph Jul 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 26 additions & 42 deletions client/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Switch, Route } from "wouter";
import { Switch, Route, Redirect } from "wouter";
import { queryClient } from "./lib/queryClient";
import { QueryClientProvider } from "@tanstack/react-query";
import { Toaster } from "@/components/ui/toaster";
Expand All @@ -13,21 +13,15 @@ import ComputeFrontierMethodology from "@/pages/ComputeFrontierMethodology";
import ComputeFrontierCompare from "@/pages/ComputeFrontierCompare";
import ComputeFrontierDetail from "@/pages/ComputeFrontierDetail";
import NeocloudIntel from "@/pages/neocloud-intel";
import GpuEconomics from "@/pages/gpu-economics";
import PowerDeals from "@/pages/power-deals";
import BriefPage from "@/pages/brief";
import TheTrade from "@/pages/TheTrade";
import PortfolioOverlay from "@/pages/PortfolioOverlay";
import Analyze from "@/pages/Analyze";
import CatalystTracker from "@/pages/CatalystTracker";
import StockPage from "@/pages/StockPage";
import SectorPage from "@/pages/SectorPage";
import RegionPage from "@/pages/RegionPage";
import OperatorPage from "@/pages/OperatorPage";
import BlogIndex from "@/pages/BlogIndex";
import BlogPost from "@/pages/BlogPost";
import SupplyChain from "@/pages/SupplyChain";
import Subscribe from "@/pages/Subscribe";
import Queue from "@/pages/Queue";
import AdminDatacenters from "@/pages/AdminDatacenters";
import AdminSocial from "@/pages/AdminSocial";
import { NewsTicker } from "@/components/NewsTicker";
Expand All @@ -49,36 +43,24 @@ const PAGE_TITLES: Record<string, string> = {
"/": "GridTilt",
"/overview": "Tilt Overview",
"/stack": "The Stack",
"/power-map": "Power Map",
"/power-map": "Power",
"/compute-frontier": "Compute Frontier",
"/neocloud-intel": "Neocloud Intel",
"/gpu-economics": "GPU Economics",
"/power-deals": "AI Power Deals",
"/brief": "The Buildout Brief",
"/supply-chain": "Supply Chain",
"/trade": "Scenario Calculator",
"/portfolio": "Portfolio Overlay",
"/neocloud-intel": "GPU Prices",
"/analyze": "Analyze",
"/catalysts": "Catalyst Tracker",
"/queue": "Interconnection Backlog",
"/blog": "Analysis",
"/subscribe": "Subscribe",
};

const SHORTCUTS = [
{ keys: ["G", "1"], description: "Go to Tilt Overview", path: "/overview" },
{ keys: ["G", "2"], description: "Go to The Stack", path: "/stack" },
{ keys: ["G", "3"], description: "Go to Power Map", path: "/power-map" },
{ keys: ["G", "4"], description: "Go to Supply Chain", path: "/supply-chain" },
{ keys: ["G", "5"], description: "Go to Portfolio Overlay", path: "/portfolio" },
{ keys: ["G", "6"], description: "Go to Scenario Calculator", path: "/trade" },
{ keys: ["G", "7"], description: "Go to Catalyst Tracker", path: "/catalysts" },
{ keys: ["G", "3"], description: "Go to Power", path: "/power-map" },
{ keys: ["G", "4"], description: "Go to Compute Frontier", path: "/compute-frontier" },
{ keys: ["G", "5"], description: "Go to GPU Prices", path: "/neocloud-intel" },
{ keys: ["G", "6"], description: "Go to Catalyst Tracker", path: "/catalysts" },
{ keys: ["G", "7"], description: "Go to Analyze", path: "/analyze" },
{ keys: ["G", "8"], description: "Go to Analysis", path: "/blog" },
{ keys: ["G", "9"], description: "Go to Interconnection Backlog", path: "/queue" },
{ keys: ["G", "0"], description: "Go to Compute Frontier", path: "/compute-frontier" },
{ keys: ["G", "N"], description: "Go to Neocloud Intel", path: "/neocloud-intel" },
{ keys: ["G", "D"], description: "Go to AI Power Deals", path: "/power-deals" },
{ keys: ["G", "B"], description: "Go to The Buildout Brief", path: "/brief" },
{ keys: ["G", "E"], description: "Go to GPU Economics", path: "/gpu-economics" },
{ keys: ["?"], description: "Show this keyboard shortcuts panel", path: null },
];

Expand All @@ -92,7 +74,7 @@ function KeyboardShortcutsModal({ onClose }: { onClose: () => void }) {
<div className="relative bg-card border border-card-border rounded-lg p-6 shadow-2xl w-full max-w-sm mx-4">
<div className="flex items-center justify-between mb-5">
<div className="flex items-center gap-2">
<Keyboard className="h-4 w-4 text-[#F07800]" />
<Keyboard className="h-4 w-4 text-brand" />
<h2 className="text-sm font-semibold text-foreground">Keyboard Shortcuts</h2>
</div>
<button
Expand All @@ -110,19 +92,19 @@ function KeyboardShortcutsModal({ onClose }: { onClose: () => void }) {
<div className="flex items-center gap-1">
{sc.keys.map((k, j) => (
<span key={j} className="flex items-center gap-1">
<kbd className="px-1.5 py-0.5 text-[10px] font-mono font-semibold bg-muted border border-border rounded text-foreground">
<kbd className="px-1.5 py-0.5 text-10 font-mono font-semibold bg-muted border border-border rounded text-foreground">
{k}
</kbd>
{j < sc.keys.length - 1 && (
<span className="text-[10px] text-muted-foreground">then</span>
<span className="text-10 text-muted-foreground">then</span>
)}
</span>
))}
</div>
</div>
))}
</div>
<p className="text-[10px] text-muted-foreground/50 mt-4 pt-3 border-t border-border text-center">
<p className="text-10 text-muted-foreground/50 mt-4 pt-3 border-t border-border text-center">
Press Esc or click outside to close
</p>
</div>
Expand Down Expand Up @@ -169,14 +151,17 @@ function Router() {
<Route path="/compute-frontier/compare" component={ComputeFrontierCompare} />
<Route path="/compute-frontier/:id" component={ComputeFrontierDetail} />
<Route path="/neocloud-intel" component={NeocloudIntel} />
<Route path="/gpu-economics" component={GpuEconomics} />
<Route path="/power-deals" component={PowerDeals} />
<Route path="/brief" component={BriefPage} />
<Route path="/supply-chain" component={SupplyChain} />
<Route path="/trade" component={TheTrade} />
<Route path="/portfolio" component={PortfolioOverlay} />
{/* Consolidation: GPU Economics is now the economics tab of GPU Prices */}
<Route path="/gpu-economics">{() => <Redirect to="/neocloud-intel?tab=economics" replace />}</Route>
{/* Consolidation: Deals and Queue are tabs of Power; Brief lives in Analysis */}
<Route path="/power-deals">{() => <Redirect to="/power-map?tab=deals" replace />}</Route>
<Route path="/brief">{() => <Redirect to="/blog" replace />}</Route>
<Route path="/supply-chain">{() => <Redirect to="/stack?view=flow" replace />}</Route>
<Route path="/analyze" component={Analyze} />
<Route path="/trade">{() => <Redirect to="/analyze?tab=scenario" replace />}</Route>
<Route path="/portfolio">{() => <Redirect to="/analyze?tab=portfolio" replace />}</Route>
<Route path="/catalysts" component={CatalystTracker} />
<Route path="/queue" component={Queue} />
<Route path="/queue">{() => <Redirect to="/power-map?tab=queue" replace />}</Route>
<Route path="/stock/:ticker" component={StockPage} />
<Route path="/sector/:slug" component={SectorPage} />
<Route path="/region/:slug" component={RegionPage} />
Expand Down Expand Up @@ -249,9 +234,8 @@ function App() {
if (gPressed) {
const routes: Record<string, string> = {
"1": "/overview", "2": "/stack", "3": "/power-map",
"4": "/supply-chain", "5": "/portfolio", "6": "/trade",
"7": "/catalysts", "8": "/blog", "9": "/queue",
"0": "/compute-frontier", "n": "/neocloud-intel", "d": "/power-deals", "b": "/brief", "e": "/gpu-economics",
"4": "/compute-frontier", "5": "/neocloud-intel", "6": "/catalysts",
"7": "/analyze", "8": "/blog",
};
if (routes[e.key]) {
navigate(routes[e.key]);
Expand Down
Loading