← All commits
AI · claude-opus-4-7radosukalacb3dd94Our-One/our-one

Homepage Phase 2A+2B: visual storytelling — terminal hero, ship strip, product cards

+5,984 / 12913 filesscreenshot pending

Files changed

Diff

Lines reveal in sequence as you scroll. First 20 lines per file shown — expand for the rest.

new filesrc/app/hall/admin/commits/page.tsx+264 / 0tsx
@@ -0,0 +1,264 @@
+import Link from "next/link";
+import { desc, eq, and, lte } from "drizzle-orm";
+import { getDb } from "@/shared/db/client";
+import { commits } from "@/shared/db/schema/commits";
+import { PRODUCTS } from "@/shared/products/registry";
+import { updateCommitFeaturedAction } from "@/shared/commits/featured-actions";
+ 
+export const metadata = { title: "Commits — featured overrides (admin)" };
+export const dynamic = "force-dynamic";
+ 
+const dateFmt = new Intl.DateTimeFormat("en-US", {
+ month: "short",
+ day: "numeric",
+ hour: "numeric",
+ minute: "2-digit",
+});
+ 
+async function listRecentCommits(limit = 50) {
+ const db = getDb();
new filesrc/marketing/components/commit-ticker.tsx+153 / 0tsx
@@ -0,0 +1,153 @@
+"use client";
+ 
+import { useEffect, useState } from "react";
+import { usePulse, type ClientPulseEvent } from "@/shared/hooks/use-pulse";
+import type { PulseCommitPayload } from "@/shared/db/schema/pulse-events";
+ 
+interface Props {
+ initial: ClientPulseEvent[];
+ /** Max commits to show. Default 5. */
+ max?: number;
+}
+ 
+interface CommitRow {
+ id: string;
+ sha: string;
+ shortMessage: string;
+ isAi: boolean;
+}
+ 
modifiedsrc/marketing/components/homepage.tsx+96 / 55tsx
@@ -21,6 +21,8 @@ import { NamedBetrayalBeat } from "./named-betrayal-beat";
import { RealHumanBeat } from "./real-human-beat";
import { OfferBeat } from "./offer-beat";
import { ProductsStrip } from "./products-strip";
+import { CommitTicker } from "./commit-ticker";
+import { RecentShipsStrip } from "./recent-ships-strip";
 
// COMMITMENTS rendered with their canonical numbers from the constitution.
// ROLES section was removed from homepage in the living-organism rewrite —
@@ -109,13 +111,18 @@ export async function Homepage() {
spotsRemaining,
}}
/>
<ThreeBeatHero
+ <Hero
aiCommitsEver={aiCommitsEver}
stripeCheckoutEnabled={stripeEnabled}
+ initialPulse={initialPulse}
/>
+ <RecentShipsStrip />
new filesrc/marketing/components/horizontal-scroll.tsx+129 / 0tsx
@@ -0,0 +1,129 @@
+"use client";
+ 
+import { useEffect, useRef, useState } from "react";
+ 
+interface Props {
+ children: React.ReactNode;
+ /** ARIA label for the scrollable region. */
+ ariaLabel?: string;
+ /** How much to scroll on each arrow click, as a fraction of the visible width. Default 0.85. */
+ scrollFraction?: number;
+}
+ 
+/**
+ * Reusable horizontal scroll container, used across the homepage for
+ * "what we just shipped", "what we build", and "what we refuse" strips.
+ *
+ * - Mobile: native horizontal scroll with snap-to-card, no arrows.
+ * - Desktop: arrows fade in on hover, JS-controlled scroll. Native scroll
+ * still works (touchpad swipes, scrollbar).
modifiedsrc/marketing/components/products-strip.tsx+178 / 74tsx
@@ -1,86 +1,190 @@
import Link from "next/link";
import { PRODUCTS, type ProductEntry } from "@/shared/products/registry";
+import { HorizontalScroll } from "./horizontal-scroll";
 
const STATUS_LABEL: Record<ProductEntry["status"], string> = {
live: "Live",
"in-build": "In build",
planning: "Planning",
};
 
const STATUS_TAG_CLASS: Record<ProductEntry["status"], string> = {
live: "bg-emerald-50 text-emerald-700 border-emerald-200",
"in-build": "bg-amber-50 text-amber-800 border-amber-200",
planning: "bg-stone-100 text-stone-700 border-stone-300",
+const STATUS_BADGE: Record<ProductEntry["status"], string> = {
+ live: "border-emerald-200 bg-emerald-50 text-emerald-700",
+ "in-build": "border-amber-200 bg-amber-50 text-amber-800",
+ planning: "border-stone-300 bg-stone-100 text-stone-700",
};
new filesrc/marketing/components/recent-ships-strip.tsx+121 / 0tsx
@@ -0,0 +1,121 @@
+import Link from "next/link";
+import { getFeaturedShips, type FeaturedShip } from "@/shared/commits/featured-queries";
+import { getProductBySlug } from "@/shared/products/registry";
+import { HorizontalScroll } from "./horizontal-scroll";
+ 
+function timeAgo(date: Date): string {
+ const ms = Date.now() - date.getTime();
+ const mins = Math.floor(ms / 60000);
+ if (mins < 1) return "just now";
+ if (mins < 60) return `${mins}m ago`;
+ const hrs = Math.floor(mins / 60);
+ if (hrs < 24) return `${hrs}h ago`;
+ const days = Math.floor(hrs / 24);
+ if (days < 7) return `${days}d ago`;
+ const weeks = Math.floor(days / 7);
+ return `${weeks}w ago`;
+}
+ 
+function ShipCard({ ship }: { ship: FeaturedShip }) {
new filesrc/shared/db/migrations/meta/0008_snapshot.json+4854 / 0json
No patch available. Binary or large/binary file — see the file on GitHub ↗.
modifiedsrc/shared/db/migrations/meta/_journal.json+7 / 0json
@@ -56,6 +56,13 @@
"when": 1777299790558,
"tag": "0007_ai_notes",
"breakpoints": true
+ },
+ {
+ "idx": 8,
+ "version": "7",
+ "when": 1777464249507,
+ "tag": "0008_commits_featured_overrides",
+ "breakpoints": true
}
]
}
\ No newline at end of file
modifiedsrc/shared/db/schema/commits.ts+14 / 0typescript
@@ -43,6 +43,16 @@ export const commits = pgTable(
publicAt: timestamp("public_at", { withTimezone: true }).notNull(),
featuredAt: timestamp("featured_at", { withTimezone: true }),
redactedPublic: boolean("redacted_public").notNull().default(false),
+ // Operator overrides for the homepage "What we just shipped" strip.
+ // Default behavior: the most-recent N non-excluded public commits
+ // auto-feature with their commit message as the headline. Operator can
+ // per-commit: exclude (featuredExcluded=true), replace the headline,
+ // attach a polished screenshot URL, or tag the commit as scoped to a
+ // specific product slug for the strip's grouping.
+ featuredExcluded: boolean("featured_excluded").notNull().default(false),
+ featuredHeadline: text("featured_headline"),
+ featuredScreenshotUrl: text("featured_screenshot_url"),
+ featuredForProduct: text("featured_for_product"),
},
(table) => [
uniqueIndex("commits_repo_sha_uniq").on(table.repo, table.sha),
@@ -52,6 +62,10 @@ export const commits = pgTable(
index("commits_product_idx").on(table.productSlug),
index("commits_post_idx").on(table.postId),
modifiedsrc/shared/products/registry.ts+16 / 0typescript
@@ -40,6 +40,18 @@ export interface ProductEntry {
version?: string;
/** ISO date when this product entered its current status. Used to show "shipped 2 days ago" etc. */
statusSince?: string;
+ /**
+ * Screenshot URL for the product card visual. If null, the card renders
+ * a stylized brand-mark mockup (giant NO. + incumbent name for planning
+ * products, abstract gradient for in-build/live products).
+ */
+ screenshotUrl?: string;
+ /**
+ * Visual accent — used for the brand-mark fallback when no screenshot is
+ * available. "emerald" for live, "amber" for in-build, "stone" for
+ * planning. Default falls back to status.
+ */
+ accent?: "emerald" | "amber" | "stone";
}
 
export const PRODUCTS: ProductEntry[] = [
@@ -54,6 +66,7 @@ export const PRODUCTS: ProductEntry[] = [