Next.js (App Router) marketing site for the skills collection.
Live (production): https://junerdd-skills.vercel.app
npm install
npm run devOpen http://localhost:3000.
The site is structured as a CMS-ready content app. UI routes and components read
skills through src/lib/content/provider.ts instead of importing the static
catalog directly.
Current provider:
src/lib/content/static-provider.tsreads the existing in-repo catalog fromsrc/lib/skills-data.ts.src/lib/content/types.tsowns the public skill data shape used by pages and components.src/lib/content/urls.tsowns lightweight constants and URL/install helpers that are safe for client components.
When replacing the static catalog with a headless CMS, add a new provider beside
static-provider.ts and switch the exports in provider.ts. Keep the page and
component props stable so the UI remains provider-agnostic.
This app lives in the monorepo subdirectory web/. In Vercel, the project Root Directory must be web, not the repository root.
- Import the Git repository into Vercel.
- Set Root Directory →
web, Framework Preset → Next.js (auto-detected). - Production environment variable:
NEXT_PUBLIC_SITE_URL= your canonical production URL without a trailing slash (must match the Production primary domain, includinghttps://). Copy from.env.example. - Deploy. Previews will use the generated
VERCEL_URLwhenNEXT_PUBLIC_SITE_URLis unset; Production should always setNEXT_PUBLIC_SITE_URLonce the domain is finalized.
vercel.json in this folder sets framework metadata and conservative security headers.
After production is live:
- GitHub → repository Settings → General → Website → paste the same production URL used in
NEXT_PUBLIC_SITE_URL.
The site already links out to the GitHub repository from the header and hero CTAs.
The app uses next-intl with an unprefixed default English locale and a
prefixed Chinese locale:
- English:
/,/skills/<slug> - Chinese:
/zh-CN,/zh-CN/skills/<slug> - Routing config:
src/i18n/routing.ts - Request messages:
src/i18n/request.ts - Locale negotiation proxy:
src/proxy.ts - Shared UI dictionaries and skill catalog overrides:
src/lib/i18n/
Keep user-facing pages under src/app/[locale]/ so metadata, navigation, and
static generation stay locale-aware.