From cdfe175f7be2955b31e773d6a203ecbf8c6d7475 Mon Sep 17 00:00:00 2001 From: Rowee13 Date: Fri, 17 Apr 2026 08:53:33 +0800 Subject: [PATCH 01/18] docs(landing): add landing page design doc Design for /feat/landing-page: dark hero + light sections, server-component shell with Framer Motion client islands, GitHub Discussions wishlist via cached GraphQL, Try Demo CTA moved from login to landing. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/plans/2026-04-17-landing-page-design.md | 479 +++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 docs/plans/2026-04-17-landing-page-design.md diff --git a/docs/plans/2026-04-17-landing-page-design.md b/docs/plans/2026-04-17-landing-page-design.md new file mode 100644 index 0000000..546b240 --- /dev/null +++ b/docs/plans/2026-04-17-landing-page-design.md @@ -0,0 +1,479 @@ +# Landing Page Design + +**Date:** 2026-04-17 +**Branch:** `feat/landing-page` +**Status:** Design approved, pending implementation plan + +## Purpose + +Replace the current `/` route (which redirects to `/dashboard`) with a proper landing page that: + +- Showcases My Dev Deck as an open-source personal dev tool deck +- Leads users to `Try Demo` as the primary conversion path +- Highlights DevInbox as the first tool in the deck +- Invites community feature suggestions via a live GitHub Discussions wishlist +- Replaces the `Try Demo` button currently on the login page + +This is an OSS showcase with a hint of multi-tool pitch — not a roadmap (there are no concrete future features yet), but a wishlist where brainstorming can happen. + +## Scope + +In scope: + +- New landing page at `/` +- Removal of `Try Demo` button from the login page +- "My Dev Deck" wordmark on login page becomes a link back to `/` +- Middleware update to treat `/` as public +- New env vars for GitHub integration + +Out of scope: + +- Docs site link (docs app not yet deployed) +- Full dark mode across the dashboard +- Authenticated feature voting in-app (deferred; GitHub handles voting) +- SEO beyond basic meta tags and OG image + +## Architecture overview + +- Next.js 16 App Router, Server Components as default +- Client islands only where interactivity or animation requires it (`'use client'`) +- Framer Motion for scroll-triggered reveals and entrance animations +- GitHub GraphQL API for Discussions data, fetched server-side with 5-minute cache +- No new backend endpoints — the NestJS API is untouched + +## File structure + +``` +apps/web/ +├── app/ +│ └── (landing)/ # Route group for layout scoping, no URL segment +│ ├── layout.tsx # Header +
{children}
+ Footer +│ └── page.tsx # Composes section components +├── components/ +│ └── landing/ +│ ├── Header.tsx # Sticky top bar +│ ├── HeroSection.tsx # Dark gradient, headline, CTAs +│ ├── ToolShowcaseSection.tsx # DevInbox card with screenshot +│ ├── ValuePropsSection.tsx # 3 cards: OSS / self-hostable / growing deck +│ ├── FeatureWishlistSection.tsx # Server component, fetches GitHub Discussions +│ ├── FeatureWishlistItem.tsx # Per-item hover effects +│ ├── Footer.tsx # Minimal footer +│ ├── TryDemoButton.tsx # Extracted from login page +│ └── BrowserFrame.tsx # Decorative frame for screenshot +├── lib/ +│ └── github.ts # Server-only GraphQL client +└── public/ + └── landing/ + └── devinbox-preview.png # Static screenshot (captured manually) +``` + +Modified files: + +- `apps/web/proxy.ts` — add `/` to `publicPaths` +- `apps/web/app/login/page.tsx` — remove demo button, make wordmark a link +- `apps/web/.env.example` — add GitHub env vars + +## Page composition + +**`app/(landing)/layout.tsx`:** + +```tsx +import { Header } from '@/components/landing/Header'; +import { Footer } from '@/components/landing/Footer'; + +export default function LandingLayout({ children }: { children: React.ReactNode }) { + return ( + <> +
+
{children}
+