The Problem
Clients want a quick way to spin up a polished landing page that can be deployed independently, yet share a consistent design language and technology stack. They need a folder‑per‑site structure that avoids cross‑project dependency bleed and allows each team to iterate on its own brand assets, routes, and build scripts.
What This Does
The repo contains four self‑contained Next.js 16 projects (ficelle, passeline, aparte, ecrin). Each project has its own package.json, lockfile, and Tailwind + shadcn/ui setup. The showcase/ folder holds preview images that link to the live Vercel deployments. The top‑level README.md explains how to clone, run, and add new projects.
The aparte subproject is a good example. It ships a full‑stack Next.js app with:
app/page.tsx– the home page layout.app/for‑merchants/page.tsx– a merchant signup form.app/for‑merchants/actions.ts– a server action that receives the submittedFormData, validates it, and forwards it to the backend API.components/edito/*– reusable UI fragments (header, footer, FAQ accordion).app/(legal)/privacy/page.tsx– static legal pages.
All assets (fonts, icons, CSS) are stored under app/. The project uses a single next.config.ts for routing tweaks and a globals.css for Tailwind global styles.
How It Is Wired
Execution starts in Next.js’s server runtime when a request is routed to a page component. For /, the runtime loads app/layout.tsx → app/page.tsx. Rendering proceeds through the component tree, pulling in components/edito/site-header.tsx and components/edito/site-footer.tsx. No external database is touched; data is either hard‑coded or fetched from an API via fetch.
When a merchant submits the form on /for‑merchants, the browser sends a POST to the server action exported from app/for‑merchants/actions.ts. That function runs on the server, parses FormData, calls await fetch('https://api.lndev.me/partners', {method: 'POST', body: formData}), and returns a JSON response. The client then redirects or shows a success message. This single function is the only place in the repo that reaches out over the network; all other files are purely UI or static content.
The app/(legal)/ pages are static; they are built into the site bundle and served from the public directory. No runtime logic touches them after build.
How To Use It
- Clone ``
bash git clone https://github.com/moses-y/landing-pages cd landing-pages/ficelle # or passeline, aparte, ecrin`` - Install – each folder uses pnpm. ``
bash pnpm install`` - Run locally – the dev server starts on
http://localhost:3000. ``bash pnpm dev`TheREADME.md` in each folder lists any optional environment variables (none exist for the current projects).
- Deploy – on Vercel, import the repo and set Root Directory to the chosen folder. No extra configuration is required.
Real‑World Use
A marketing team can copy the ficelle folder, rename it (my‑product), adjust the app/ contents (logo, colors, text), and add a new showcase/my‑product.jpg. The updated README and package.json allow them to spin up a new landing page in minutes and push it to Vercel with a single click. The same process applies to any of the other projects.
Code Health & Issues
- Severity (Medium) – No test files – 0 test files across 410 files.
- Severity (Medium) – No CI/CD pipeline – no
.github/orci/folder. - Severity (Low) – No environment variables – no
.envorenv.examplefiles. - Severity (Low) – No documentation beyond README – only 6 doc files, all generic.
The repository has no linting or type‑checking errors reported by a static analysis tool, but the lack of automated tests and CI creates a risk for regressions when adding new features.
The Bottom Line
The repo is a clean, folder‑per‑project template that lets teams generate marketing sites quickly with Next.js, Tailwind, and shadcn/ui. It excels at modularity and ease of deployment. However, it lacks automated testing and CI, so teams should add those pipelines before using it in production or scaling it across many projects.