Skip to content

Streamline Epoch 1000 UX#1672

Merged
h4rkl merged 8 commits into
mainfrom
codex/streamline-epoch1000-ux
Jul 10, 2026
Merged

Streamline Epoch 1000 UX#1672
h4rkl merged 8 commits into
mainfrom
codex/streamline-epoch1000-ux

Conversation

@h4rkl

@h4rkl h4rkl commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • tighten Epoch 1000 metadata and page/hero copy
  • simplify live status, countdown, and wallet checker messaging
  • clean up timeline grid labeling and remove extra footer copy

Testing

  • pnpm --filter solana-com lint
  • pnpm --filter solana-com check-types (no check-types script for selected package)

@h4rkl h4rkl requested review from ZYJLiu and jacobcreech as code owners July 9, 2026 23:39
@vercel

vercel Bot commented Jul 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
solana-com Ready Ready Preview, Comment Jul 10, 2026 12:18am
solana-com-accelerate Ready Ready Preview, Comment Jul 10, 2026 12:18am
solana-com-breakpoint-2 Ready Ready Preview, Comment Jul 10, 2026 12:18am
solana-com-docs Ready Ready Preview, Comment Jul 10, 2026 12:18am
solana-com-media Ready Ready Preview, Comment Jul 10, 2026 12:18am
templates Ready Ready Preview, Comment Jul 10, 2026 12:18am

Request Review

@greptile-apps

greptile-apps Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR streamlines the Epoch 1000 feature's UX: copy across the hero, live-status bar, wallet checker, and OG card image is tightened, and the card page is substantially upgraded to use i18n for all visible strings (with rich-text support) and a new branded layout. A TierId union type is introduced in tiers.ts for type-safe i18n key lookups.

  • Card page (/epoch1000/card) is rebuilt with a new hero header, animated Reveal sections, and two CTA buttons; all copy is now driven by next-intl translations including rich-text component tags.
  • OG image route gains a custom message-resolver (getCardMessage) backed by a module-level locale cache, replacing the inline SVG Solana mark with a PNG, and redesigning the card layout to show a "since epoch / tier" badge row.
  • Epoch1000Experience, ThousandGrid, and WalletChecker have string literals simplified and the footer info block removed; the live-status area is restyled from a single line to a three-pill grid layout.

Confidence Score: 5/5

Safe to merge — all changes are copy simplification and UI polish with no logic mutations to data fetching, wallet lookup, or auth.

The diff is narrowly scoped to string literals, layout styling, and a new i18n layer for the card page. The new getCardMessage cache in the OG route uses a well-understood module-level promise pattern; the only edge case (caching a rejected promise) is a minor resilience concern, not a correctness bug. All translation keys introduced in common.json are consumed by the updated components, and the TierId union keeps the key-path construction type-safe.

No files require special attention beyond the locale message cache in route.tsx.

Important Files Changed

Filename Overview
apps/web/src/app/api/epoch1000/og/route.tsx OG image route redesigned: replaces inline SVG logo with a PNG loaded from disk (cached via module-level promise), adds a locale-aware custom message resolver with a per-locale promise cache, and reworks the card layout. The promise cache stores rejected promises permanently — a transient file-read failure would break that locale indefinitely until restart.
apps/web/src/app/[locale]/epoch1000/card/page.tsx Card page substantially overhauled with i18n, Reveal animations, and a two-CTA layout; logic is correct and all translation key paths exist in common.json.
apps/web/src/components/epoch1000/Epoch1000Experience.tsx Live-status bar refactored from a single compressed line into a three-pill grid; footer block and grid caption removed; heading copy simplified — no functional regressions.
packages/i18n/messages/web/en/common.json Adds the full epoch1000.card namespace covering meta, og, summary, and tier strings; all keys referenced in code have corresponding entries.
apps/web/src/lib/epoch1000/tiers.ts Adds a TierId literal union and id field to each tier, enabling type-safe i18n key construction — clean, backward-compatible addition.
apps/web/src/components/epoch1000/WalletChecker.tsx Loading messages and result labels tightened; tweet copy simplified; capped-wallet note shortened — all changes are deliberate copy simplification with no logic changes.
apps/web/src/components/epoch1000/ThousandGrid.tsx Default readout and hint text tightened; no logic changes.
apps/web/src/components/index/campaigns/epoch1000/Epoch1000Hero.tsx Removes the absolute slot-number display from the live bar, removes slotLabel i18n key usage (removed from JSON too), and adjusts spacing — consistent, intentional simplification.
apps/web/src/app/[locale]/epoch1000/page.tsx Removes the eyebrow label from the page header, leaving only the wallet checker link — minor layout simplification.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant User
    participant CardPage as /epoch1000/card
    participant OGRoute as /api/epoch1000/og
    participant i18n as i18n messages
    participant Logo as solanaLogo.png

    User->>CardPage: "GET /epoch1000/card?s=500&fe=200&l=en"
    CardPage->>i18n: getTranslations(locale, epoch1000.card)
    i18n-->>CardPage: t()
    CardPage->>CardPage: build ogQuery(sp, locale)
    CardPage-->>User: HTML with img src pointing to OGRoute

    User->>OGRoute: "GET /api/epoch1000/og?s=500&fe=200&l=en"
    OGRoute->>i18n: loadMergedMessages (cached per locale)
    i18n-->>OGRoute: MessageTree
    OGRoute->>Logo: readFile solanaLogo.png (cached)
    Logo-->>OGRoute: base64 data URI
    OGRoute->>OGRoute: render JSX via ImageResponse
    OGRoute-->>User: PNG 1200x630
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant User
    participant CardPage as /epoch1000/card
    participant OGRoute as /api/epoch1000/og
    participant i18n as i18n messages
    participant Logo as solanaLogo.png

    User->>CardPage: "GET /epoch1000/card?s=500&fe=200&l=en"
    CardPage->>i18n: getTranslations(locale, epoch1000.card)
    i18n-->>CardPage: t()
    CardPage->>CardPage: build ogQuery(sp, locale)
    CardPage-->>User: HTML with img src pointing to OGRoute

    User->>OGRoute: "GET /api/epoch1000/og?s=500&fe=200&l=en"
    OGRoute->>i18n: loadMergedMessages (cached per locale)
    i18n-->>OGRoute: MessageTree
    OGRoute->>Logo: readFile solanaLogo.png (cached)
    Logo-->>OGRoute: base64 data URI
    OGRoute->>OGRoute: render JSX via ImageResponse
    OGRoute-->>User: PNG 1200x630
Loading

Reviews (4): Last reviewed commit: "refactor(epoch1000): enhance metadata ge..." | Re-trigger Greptile

Comment thread packages/i18n/messages/web/en/common.json
@vercel vercel Bot temporarily deployed to Preview – solana-com-media July 9, 2026 23:50 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-docs July 9, 2026 23:50 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-breakpoint-2 July 9, 2026 23:50 Inactive
@vercel vercel Bot temporarily deployed to Preview – templates July 9, 2026 23:50 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-accelerate July 9, 2026 23:50 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-media July 9, 2026 23:52 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-breakpoint-2 July 9, 2026 23:52 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-docs July 9, 2026 23:52 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com July 9, 2026 23:52 Inactive
@vercel vercel Bot temporarily deployed to Preview – templates July 9, 2026 23:52 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-accelerate July 9, 2026 23:53 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-media July 10, 2026 00:01 Inactive
@vercel vercel Bot temporarily deployed to Preview – templates July 10, 2026 00:01 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-breakpoint-2 July 10, 2026 00:01 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-docs July 10, 2026 00:01 Inactive
@vercel vercel Bot temporarily deployed to Preview – solana-com-accelerate July 10, 2026 00:01 Inactive
@h4rkl h4rkl merged commit 473c044 into main Jul 10, 2026
23 checks passed
@h4rkl h4rkl deleted the codex/streamline-epoch1000-ux branch July 10, 2026 01:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants