Relaunch: app shell, feed, create flow, onboarding, live search#1331
Draft
NiallJoeMaher wants to merge 70 commits into
Draft
Relaunch: app shell, feed, create flow, onboarding, live search#1331NiallJoeMaher wants to merge 70 commits into
NiallJoeMaher wants to merge 70 commits into
Conversation
Shift positioning from 'the free web developer community' / 'Ireland's largest web developer community' to 'Codú — the community for AI builders & indie hackers' across the homepage, app layouts, hero, newsletter CTA, structured data (website + organization JSON-LD), manifest, RSS feed, the advertise page, and the profile/volunteer title metadata. Also refocus SEO keywords away from generic web-dev/React terms toward the AI-builder / indie-hacker stack (LLM apps, agents, RAG, prompt engineering, vibe coding, SaaS, MVP, bootstrapping), and reconcile the advertise metrics by dropping the contradictory '100,000+' and the 'Ireland' geography claim. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New server-rendered About page reusing the Sponsorship visual system: hero with the positioning line, a 'What Codú is for' manifesto, a 'What you get' card grid (tutorials, feed, newsletter, Discord), a small honest founder note (not a flex), and a closing CTA. Add /about to the sitemap's indexed routes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Build the job board from the existing create-form stub: - job table + job_type/job_status enums + migration 0020 (AI-native tagging, featured/paid tier, full lifecycle, payment columns for a future provider) - tRPC jobRouter: create (+ admin email), public list (remote/AI-native/type filters, featured-first, keyset pagination) + getBySlug, owner getById/myJobs, admin adminList/moderate/setFeatured, and a markPaid payment stub - wire the create form to the mutation; add AI-native toggle + tags input - /jobs listing + /jobs/[slug] detail pages - flag-gated Jobs nav link in the sidebar (+ the /about nav link) Positioned for AI developer roles (employment), not indie hackers (self-employed builders aren't job-seeking). Jobs UI is gated behind FEATURE_FLAGS.JOBS (auto-on in dev, dark in prod until the PostHog flag is enabled). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Expand the content aggregator toward the AI-builder positioning: add 26 RSS-verified AI sources (Latent Space, Simon Willison, Ahead of AI, Import AI, Eugene Yan, Lilian Weng, Chip Huyen, Hamel Husain, Jay Alammar, Interconnects, One Useful Thing, AI Snake Oil, The Gradient, Google DeepMind, Microsoft AI, AWS ML, NVIDIA, Together AI, Replicate, Ollama, LlamaIndex, Roboflow, fast.ai, Answer.AI, BAIR, Apple ML) to drizzle/seed-sources.ts. Takes the 'ai' category from 6 to 32 sources. Additive only — existing web-dev sources are kept (web-dev content stays, just no longer the headline). Seed is idempotent (insert-by-url), so re-running only adds the new feeds. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A dev-gated (NODE_ENV) design canvas at /kitchen-sink for iterating on the redesign. Proposes a fresh, editorial direction — cool dark canvas, Bricolage Grotesque display, Hanken Grotesk body, JetBrains Mono micro-labels — and drops the orange/pink gradient entirely. Renders four fresh accent options (Mint, Lime, Sky, Iris) side-by-side plus tokens, buttons, form controls, tags, a job card, and an applied hero so we can lock a theme before touching real pages. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s living design system - Load Bricolage Grotesque / Hanken Grotesk / JetBrains Mono via next/font in the root layout and expose them as --font-display / --font-sans / --font-mono. - Rebuild /kitchen-sink as the canonical, dev-only LIVING design system: Mint accent locked, cool-dark tokens, organized Foundations / Components / Patterns to grow as we build real pages. - Apply the anti-trope direction researched this session: editorial 'number + hairline + display-title' section headers instead of the common '// label' dev-tool convention, hairline rules over soft shadows, no bento/blobs. - Include a side-by-side section-label comparison (code-comment vs slash vs editorial) to decide the structural device. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the prototype's inline styles with a real system:
- Add CSS-variable-driven design tokens (canvas/surface/elevated/hairline/fg/
muted/faint/accent) in styles/globals.css (dark-first via .dark) and register
them in tailwind.config.js with opacity support, plus font-display/sans/mono.
- Restyle global .primary-button / .secondary-button / .focus-style to the Mint
accent — removes the orange→pink gradient app-wide.
- Add reusable components/ds: Eyebrow ('// label' mono, the approved convention)
and Tag (default/accent/soft pills).
- Refactor /kitchen-sink to consume theme classes + ds components (no inline
colors/fonts), wrapped in 'dark' so it always shows the canonical palette.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nnel) Start the growth-driven page rebuild: - New NewsletterCapture ds component (inline + compact) with real on-site beehiiv capture via a subscribeNewsletter server action (degrades gracefully in dev). Replaces the old blue->pink gradient NewsletterCTA on the homepage rail. - Rebuild the Hero as a token-driven server component: editorial dotted-grid atmosphere (no gradient/starfield), Bricolage display H1 with the accent on 'AI builders', mono eyebrow, single primary CTA (Join free) + Browse feed. - Rework the post-hero band from a clashing light-gray duplicate CTA into a dark, on-system 'the community / build in public' beat with one CTA. No vanity metrics (social proof deferred per owner). Funnel: cold -> subscribe, warm -> join free. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Stop re-skinning the old app shell — give the front door its own layout. - Force dark-only (next-themes forcedTheme + html.dark). - New (marketing) route group: top-nav + footer shell (no app sidebar), full-bleed, with the org JSON-LD and a footer newsletter capture. - Rebuild the homepage from scratch as an editorial landing: hero (accent glow + dotted grid), a real 'Fresh from the feed' proof-of-life grid (live AI posts), a numbered 'why Codú' value grid, and a community beat — all token-driven, no vanity metrics. Move it out of the (app) sidebar layout. - The (app) sidebar shell stays for the logged-in app pages. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make 'Fresh from the feed' read as clickable articles, not an info box: - pull post cover images and render them as CSS background images (external feed domains aren't allowed by next/image), with an on-brand dotted fallback when a post has no cover - switch from the seamless gap-px grid to separated cards with hover-lift, accent border on hover, and a 'Read ›' affordance Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…existing logo - Move get-started into a new (auth) route group with a bare layout (no nav, no sidebar, no footer) for a zero-distraction sign-in/sign-up. - Rebuild the auth UI on the new tokens: mono eyebrow, Bricolage heading, clean bordered GitHub/GitLab buttons (no orange/pink gradient), terms/privacy note. - Use the existing Codú wordmark logo (/images/codu.png) in the auth header, marketing nav, and footer instead of a text wordmark (new logo is a later task). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move /about out of the app sidebar layout into (marketing), rebuilt token-driven (editorial hero, manifesto, what-you-get cards, small founder note, CTA) — drop the old orange/pink Sponsorship-style sections and retire components/About. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…letter card sitewide - App sidebar: canvas bg + hairline border + mint active icons (was bg-black / neutral); footer + socials to tokens. - Swap the old blue->pink NewsletterCTA for the token-driven NewsletterCapture on /feed and /articles, and delete the dead NewsletterCTA component. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- De-bootstrap the nav: animated accent underline on links, refined spacing. - Capture competitive learnings from IndieHackers (right-rail conversion hub with Submit-a-Post/Advertise, the Build Board leaderboard, content-forward layout) in the growth doc as the next-build backlog. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ct form - Move /advertise into (marketing), rebuilt token-driven: hero, 'ways to partner' offering cards (newsletter/jobs/events/content), real past-partner logos kept as legit proof, dropped the vanity metrics + generic testimonial. - Recolor the 3-step sponsor ContactForm from orange/pink to mint tokens. - Retire the old (app)/advertise route + unused Sponsorship section components (keep ContactForm). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Recolor every remaining orange/pink utility to the mint accent across ~55 app + component files (feed, jobs, admin, editor, comments, badges, search, 404, etc.). Archived /letters posts left untouched. - Homepage feed cards: remove the jump-on-hover; keep a subtle image zoom + chevron slide. Same de-jump applied to /about cards. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New ConversionHub ds component (Write a post / Post a job / Advertise) surfaced at the top of the feed sidebar, and retoken the 'About the Feed' card. Gives content pages a clear contribute/monetise hub like IH's right rail. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
WS3 v1, built safely (engagement never breaks core actions): - Schema + migration: append-only point_event (with dedupe/anti-gaming index) and per-user user_streak. - server/lib/engagement: award() (never throws) + recordDailyActivity() (idempotent daily streak roll-forward). - Award points on post publish + comment create; roll the daily streak in the app layout for signed-in users. - engagement tRPC router: myStats (streak + points) and leaderboard (week/all). - UI: StreakBadge (🔥) in the app header for signed-in users; BuildBoard weekly leaderboard in the feed rail — flag-gated (FEATURE_FLAGS.BUILD_BOARD) and hidden while empty to avoid a ghost-town board. - Fix the header Create button contrast (black on mint). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y + engagement-plan doc - Kill remaining grey: retokenize UnifiedContentCard, the inline /articles ArticleCard + skeleton, SavedItemCard, PopularTagsSidebar, legacy ArticlePreview, and the feed Filters dropdowns to the design tokens (surface/canvas, hairline, fg/muted/faint, accent hover). - Simplify taxonomy: remove the redundant rail 'Sources' filter (it duplicated the Topics dropdown via source category); sources remain as card attribution. Relabel the dropdown to 'Topics'. - Add codu-relaunch/04-community/engagement-plan.md (shipped / building / deferred / last). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- New HeroBackdrop: refined mint aurora glows, a deterministic twinkling constellation, and occasional shooting stars — restrained, reduced-motion aware (motion-safe only). Replaces the flat dotted-grid+blur hero backdrop. - Add reusable keyframes/animations to the Tailwind theme (twinkle/aurora/drift/ shoot/rise) and a staggered load reveal on the hero eyebrow/H1/sub/CTAs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…play) - Schema + migration: badge + user_badge (unique per user/badge). - engagement.ts: BADGE_RULES + checkBadges() (runs after award; first post, 7/30-day streak, 100/500 points; connector wired in the referral step) + getUserBadges(). - Seed 6 starter badges (drizzle/seed-badges.ts). - Display badge pills on the profile header. - Reference + AI design prompt: codu-relaunch/04-community/badges.md; auto-mod plan: ai-moderation-plan.md (deferred). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… aurora - Add ogl + a themed GradientBlinds component (reactbits-derived) — animated mint gradient blinds with a cursor spotlight, reduced-motion aware (single static frame). - Use it as the homepage hero backdrop with a readability scrim; retire HeroBackdrop. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Schema + migration: user.referralCode (unique) + user.invitedBy; add 'referral' to the point_action enum. - engagement.ts: ensureReferral() (lazy code-gen + cookie attribution → award the referrer 'referral' points + checkBadges → Connector badge); wire real referral count into the connector badge rule. - /get-started captures ?ref into a cookie; the app layout attributes it on next visit (idempotent, never throws). - engagement.myReferral query; ReferralCard (invite link + count) in Settings → 'Invite friends'. - Backfill referral codes for existing users (drizzle/seed-referral-codes.ts). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…first, composer
- Schema + migration: follow table (follower/following, unique pair, indexes).
- follow tRPC router: follow / unfollow / isFollowing / counts.
- Feed: 'following' filter in content.getFeed (+ fix the previously-unused tag
filter) and a For-you / Following tab on /feed (signed-in), with an empty state.
- Profiles: FollowButton (Follow/Following, optimistic invalidation) + follower/
following counts in the header.
- Feed-first: signed-in users are redirected from / to /feed (marketing stays for
logged-out + SEO).
- Inline composer ('What are you building?') at the top of the feed.
- Datastore note: recommend staying on Postgres over a Mongo migration
(codu-relaunch/01-platform/datastore-consideration.md).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…llowing lists - Follow notifications: NEW_FOLLOWER type, created on a new follow; widen the notification read filters (type 0/1/2, drop the postId-not-null requirement) and render 'started following you' in the notifications list. - Achievements section on profiles (engagement.profileEngagement): current/longest streak, points, and the full badge set with earned + LOCKED states + criteria (the 'potential awards' view). Replaces the simple header pills. - Followers / Following lists: follow.getFollowers/getFollowing + clickable counts that reveal the list (with avatar, name, Follow button per row). Verified logged-in: Follow → Following toggle, live count, followers list, and the achievements panel all work. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Phase 0 of the design-handoff recreation. Treat the handoff at design_handoff_codu/ as the source of truth. - styles/globals.css: full token set (surface ladder hover/inset, border-strong, on-accent, status colors success/warning/danger/info), fix dark --color-faint #5b6472 -> #757e8c for WCAG AA, align fg/accent-soft to handoff hexes, add focus-ring/shadow ladder CSS vars - globals base layer: global mint :focus-visible ring, display-font headings, .eyebrow/.slash + .card utilities, reconcile primary/secondary/ghost buttons to handoff (on-accent text, radius-md, press translate), drop dead .old-input - tailwind.config.js: expose new colors + washes (opacity modifiers), radii scale, boxShadow, container maxWidth, fontSize/letterSpacing scale, motion tokens, bg-grid-lines - components/ds: Tag/FollowButton text-black -> text-on-accent - kitchen-sink: full color ladder + status + elevation/radii + toggle refs Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Phase 1. Replace the single-sidebar layout with the handoff shell. - components/Layout/AppShell: sticky TopBar over the .app-main 3-column grid (LeftRail / center / RightRail) + ⌘K palette + logged-out SignInBar; global ⌘K/Esc keydown handling - TopBar: logo→/feed, search-button styled like an input (opens palette), Feed/Discussions/Jobs nav, Write + avatar menu / Log in + Join free - LeftRail: primary nav (+ Notifications/Saved/Profile when authed), Your topics tags, bottom-pinned Privacy/Conduct/Advertise/About footer - RightRail (now global on every page): ProgressCard (points+streak+next milestone from engagement.myStats) / JoinCard → trending tags → ConversionHub / NewsletterCapture - CommandPalette: quick actions + live tag search (tag.search); posts/people via Algolia is a follow-up - styles/globals.css: .app-topbar/.app-main/.app-leftrail/.app-rightrail grid with bespoke 1080/720 breakpoints - feed/_client: drop internal rail+grid (rails are global now), render center column only; text-black→text-on-accent on the composer CTA - (app)/layout: render AppShell; drop Algolia sidebar wiring Old SidebarAppLayout/sidebar-layout/MinimalHeader/AppSidebar now unused. Note: /discussions nav target lands in Phase 6. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Phase 2. Per the handoff, the feed is the landing surface; there is no marketing homepage. - (marketing)/page.tsx: 308 permanentRedirect / -> /feed (canonical home). Drop the GradientBlinds hero / value-prop / feed-preview landing (the GradientBlinds component stays for reuse on /about). - Logged-out visitors land on the public, indexable feed (getFeed is a publicProcedure) with the shell's sign-in bar + Join free. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tion kinds Phase 3. - schema: add `til` + `question` to the post_type enum (migration 0025_normal_nuke); extend ContentTypeSchema + toDbType/toFrontendType so QUESTION maps to a real `question` kind and TIL is first-class - UnifiedContentCard: rebuilt as an editorial row — kind chip (Article/TIL/ Question/Discussion/Link), author + @handle · time (· via source), display title with ↗ for links, 2-line excerpt, OG thumb / striped placeholder, mono #tag metadata, reaction bar (▲ helpful · replies · Save · Share with copy-link). Vote/bookmark/click mutations preserved; drop legacy chevron/ bookmark-icon body and dead URL helpers - feed: dismissible OnboardingBanner (first-win 3 steps, useSyncExternalStore) + low-bar Composer (Tip/Ask/Share/Write chips → /create?kind=) - FeedFilters: add TIL option; feed type validation accepts `til` Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Phase 4. Visual restyle of the three reader clients (user article, curated
link, user link) under app/(app)/[username]/[slug]/ — functionality, data,
voting/bookmark/share, FollowButton, and the comments component preserved.
- ‹ Back to feed ghost link, // eyebrow (tag/source · meta), large display
title, author row + Follow, cover in a hairline frame / grid-dots placeholder
- mono editorial reaction footer; "Discussion {count}" header above comments
- swap all hardcoded neutral/blue/green/red + dark: colors for design tokens;
text on accent is text-on-accent
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Per the AWS-native stack (matches SES). server/lib/rateLimit.ts now has one
async API over two backends:
- DynamoDB (when RATE_LIMIT_TABLE is set): atomic fixed-window counters with
native TTL; fail-open on errors so a misconfigured table can't take the site
down. AWS SDK clients added (@aws-sdk/client-dynamodb + lib-dynamodb).
- in-memory sliding window for local dev / fallback.
Helper `enforceRateLimit({ key, limit, windowMs, message })` throws
TOO_MANY_REQUESTS; search / content.create / sponsor.submit now await it.
CDK: StorageStack provisions the rate-limit DynamoDB table (pk + ttl,
PAY_PER_REQUEST, retain on prod) and publishes its name to SSM
/env/rate-limit-table + a CfnOutput. App env needs RATE_LIMIT_TABLE = that name
and dynamodb:UpdateItem on the table.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- top loading bar: orange→pink HolyLoader gradient → mint (accent→accent-soft) - prism code highlighting: .token.function/.class-name text-pink-500 → text-accent-soft (the last visible pink in the app) - feed card: render the thumbnail only when a real image loads — no grey dotted placeholder box when an image is missing or fails to load Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- feed card: preview image moved to the top-right (aligned with the header), matching the design — header+title+excerpt now share a left column with the thumbnail as a top-aligned sibling - focus states: Catalyst primitives' blue focus outlines/rings → mint (accent); listbox/dropdown active item → bg-accent/text-on-accent - contrast: --color-faint #757e8c → #868f9b (clears WCAG AA >=5.2:1; old was 4.49:1); feed filter "·" separators border-strong → faint Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…odu-code#3) - settings: Profile · Notifications · Account tabs replace the stacked mono eyebrow sections (tabs stay mounted so RHF state survives); sticky save bar - profile: drop the gradient banner + About tab — header is avatar + name + Top-helper + @handle, a mono meta row (joined/location/website), bio, and the user's topics as tags (wired via user.topics); Posts · Achievements only - auth: cap the split-screen to a centered max-w-[1080px] on ultrawide; "or with email" divider no longer wraps Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- feed filters: drop the "·" separators, swap the ▾ triangle for a proper down-chevron SVG - onboarding banner: real completion via engagement.onboardingWins (topics set / 3 follows / first post) — done steps show a mint check + strikethrough + progress rail; banner hides once all three are done; steps open the topics/ compose modals (work on mobile too) - engagement gaps closed in content.* (the relaunch compose/vote path never awarded): upvote_received → post author (idempotent per voter), post_published on content.create (publish) and content.publish (first publish). daily_active (streaks), comment_created, referral already wired; checkBadges runs after each. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… (diff codu-code#4) - TopBar: mobile hamburger (.nav-burger ≤720px) + flexible grid (auto/1fr/auto) so the centered search shrinks instead of overflowing; ⌘K kbd hidden ≤560px - NavDrawer (new): left slide-out drawer (panel + fading backdrop, Esc/backdrop/ link-close) holding nav + Your topics + footer links — replaces the left rail ≤720px. Removed the bottom MobileNav tab bar (+ .app-mobilenav CSS); sign-in bar shows on mobile again - Settings: Topics editor in the Profile tab (chips + Edit → TopicsModal) so topics are reachable on mobile - Auth: split collapses to one column ≤860px (brand panel hidden, logo above form) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…cing - Catalyst input/textarea/select: dark styles → tokens (bg-inset, border-hairline /strong, text-fg, placeholder text-faint) so form fields match the design instead of the washed-out white/5 default - settings: drop the trailing section divider (last:border-b-0) so it no longer doubles up with the sticky save bar; remove the light/dark theme toggle (the app is dark-only) + its now-unused imports/group label - feed tabs: more breathing room (gap-x-7, flex-wrap), aria-current on the active tab, clear gap before the card list Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… Link tab - ComposeModal: title is truly borderless (no browser-default box); URL/body/tags use bg-inset + hairline, mint focus, no harsh outlines - Link tab: feed-card-style preview — OG header image over the title, then domain + the user's take. Reuses the existing /api/fetch-metadata via useLinkMetadata (debounced); placeholder when none yet - editor (/create): removed the redundant Write/Link tab switcher — links are created in the compose modal now; opens straight into the article editor. Article flow (TipTap, preview, tags, canonical, publish/moderation) intact Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- new app/(app)/page.tsx renders the feed at "/"; removed the (marketing)/page.tsx redirect; /feed now 308s to "/" preserving query (?tag/?type/?view/?sort) - repoint all homepage links (logo, Home nav, For-you/Following tabs, filters, ⌘K "Go to Feed", marketing nav, back-to-feed, tag chips) from /feed → "/"; /feed/[sourceSlug] detail routes unchanged - NavDrawer (mobile): drop "Your topics" (editable in Settings on mobile); tidy isActive Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Old light-mode classes (red-50/neutral-* + dark: pairs) replaced with tokens; the loading skeleton now mirrors the real card (header + title/excerpt left, preview top-right) using bg-elevated bars. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
my-posts, draft preview, auth/verify, forbidden, metrics, speakers — swap light-mode neutral/white/black/red + dark: pairs for design tokens (bg-surface/ canvas, text-fg/muted/faint, border-hairline, text-danger, font-display). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Restyle the comments thread (DiscussionArea + WYSIWYG editor/toolbar) to the
relaunch design — token-styled comments, reply composer, nested replies; drop
DiscussionArea's own heading so the reader's single "Discussion {N}" header
stands (no more double header). Functionality (create/edit/delete/vote/replies)
preserved.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… theme Restyle the full Catalyst primitive set to design-system tokens (bg-surface/ elevated/canvas/inset, text-fg/muted/faint, border-hairline/strong, status washes, mint accent): dialog, dropdown, listbox, alert, badge, pagination, table, fieldset, heading, text, divider, description-list, avatar, navbar, sidebar, sidebar/stacked-layout. Form controls (checkbox/radio/switch) now default to a mint checked state; button/outline text uses cool text-fg, not pure white. Structure/props/Headless wiring unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reader action bars (ArticleActionBar + ContentDetail ActionBar/MetaHeader/ SourceInfoCard/TypeBadge), the global ReportModal + PromptDialog, the source-feed + job detail pages, and the speaker/volunteer forms — swap light-mode neutral/ white/black + blue/red/green + dark: pairs for design tokens (bg-surface/inset/ elevated, text-fg/muted/faint, border-hairline/strong, mint accent, status washes). Helpful/upvote → success/accent, bookmark-active → accent, report/ destructive → danger. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The relaunch superseded a cluster of components that now have zero live importers — removing them as a follow-up to the restyle: - old shell/nav/search: components/Nav, components/Header (MinimalHeader), components/ui/Search, components/Layout/SidebarAppLayout - legacy feed/content: components/Content (ContentCard), components/Feed AggregatedItem/VoteButtons/Composer/PopularTagsSidebar, components/PopularTags - superseded by the new surfaces: components/Comments (→ DiscussionArea), components/ArticleSearch + components/ArticleMenu (→ ⌘K palette / new reader), PostEditor PostEditor.tsx + tabs/LinkTab + components/UrlMetadataPreview (route uses WriteTab; links go through the compose modal) - app/(app)/articles/_client.tsx (the /articles route now redirects to /?type=article) Barrels (Feed/index.ts, PostEditor/index.ts) pruned to the surviving exports. tsc + eslint clean; / · /discussions · /jobs · /speakers · /volunteer all 200. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- AppShell: /speakers + /volunteer render rail-less (centered single column) — they're standalone forms, not feed reading surfaces - radios on those forms now tint mint via a dedicated .accent-mint utility (Tailwind's arbitrary accent-[...] inference was unreliable for accent-color; verified computed accent-color = rgb(45 212 191)) - playwright: default to Desktop Chrome locally (~4× faster); full cross-browser + mobile matrix runs on CI or with ALL_BROWSERS=1 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- e2e: feed-is-home — "/" renders the feed (no redirect), /feed→/; get-started authed → "/"; feed/create specs use "/"; notifications card class → border-hairline - radios: fully custom appearance:none control (mint ring + dot, mint focus outline). accent-color is ignored by Chrome under color-scheme:dark, so the native control kept painting UA blue regardless of value. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Wait for the "Add to the discussion…" composer (the redesigned DiscussionEditor trigger) instead of a "Discussion (N)" heading, and post via it. The reader that renders user-authored posts has no discussion section header — noted for review. All 37 relaunch feature specs green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ofile Seed (e2e/setup.ts): a published discussion + question by user one (with a top-level comment + nested reply), user two → user one follow, and user one's topics / experience / referral code / point events. All cleaned via the user-delete cascade. New specs: - discussions.spec: discussions listing + Start CTA; thread renders the post + seeded comment/reply; signed-in reply composer opens - follow.spec: Following feed surfaces followed users' posts; profile follower/ following stats; follow control reflects the existing relationship - profile.spec: name + interest tags + Posts/Achievements tabs (no About); Achievements surfaces points/streak Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Seed marks user one onboarded, so /welcome bounces to the feed homepage; widen the URL assertion to accept "/". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- editor.spec: delete the obsolete Link-tab + tab-switching + link-publish/ validation blocks (the editor lost its Link tab; links go via the compose modal). Fix the article-editor tests for the no-tabs editor; publish flow accepts the in_review redirect (MODERATION_ENABLED in e2e) - articles.spec: point at "/?type=article"; drop tests now covered by feed.spec or asserting the removed sidebar; keep article-detail nav, comment/cannot- comment, write-and-publish (via compose → Article → editor) - saved.spec: bookmark via the feed-card Save action + reader Save; new empty- state copy; serial + retries to absorb shared-bookmark-state parallel flake Full suite: 117 passed on Desktop Chrome. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Draft PR for the relaunch work. Code + DB migrations only (no docs). Opening as
draft for review.
What's in here
Design system & shell
.eyebrow/.card, mint focus ring); WCAG-AA--text-faint.avatar), left rail (text nav + "Your topics"), global right rail, ⌘K command
palette, logged-out sign-in bar, and a mobile bottom nav (≤720px).
Feed & content
flat Type · Sort · Topic filters, onboarding nudge.
til+questionadded;discussion/question/tilrender viathe article reader.
modal (Discussion/Link publish immediately; Article → editor). Restyled
article editor.
Members
/welcome(interests/experience/focus) → saved touser.topics; signups routed here. Editable "Your topics" modal.saved / settings, split-screen auth.
Search (replaces Algolia)
search.everythingtRPC endpoint (posts + people + tags), debounced in thepalette, with LIKE-escaping, result caps, and a per-user/IP rate limiter.
Backend
MODERATION_ENABLED(default off).EMAIL_AUTH_ENABLED(dev-on);GitHub/GitLab always on.
content.create(publish) and publicsponsor.submit.contact modal; newsletter price removed.
0025–0027.Notes
default.
Playwright suite needs the
ENV=E2Eharness + seeded DB to run in CI.cross-instance limits on serverless.
🤖 Generated with Claude Code