22
33[ ![ CI] ( https://github.com/Alexis-Gontier/algont-ier.com/actions/workflows/ci.yml/badge.svg )] ( https://github.com/Alexis-Gontier/algont-ier.com/actions/workflows/ci.yml )
44
5- Personal portfolio built with ** Next.js 16** (App Router) and ** React 19** , deployed on ** Vercel** .
5+ Personal portfolio built with ** Next.js 16** (App Router) and ** React 19** , deployed as a
6+ ** static export** over ** FTP** to OVH shared hosting.
67
78## Stack
89
@@ -22,7 +23,7 @@ Personal portfolio built with **Next.js 16** (App Router) and **React 19**, depl
2223## Requirements
2324
2425- [ Node.js] ( https://nodejs.org ) 22+
25- - [ pnpm] ( https://pnpm.io ) 10+
26+ - [ pnpm] ( https://pnpm.io ) 11+ (pinned via ` packageManager ` in [ ` package.json ` ] ( package.json ) )
2627
2728## Getting started
2829
@@ -44,6 +45,7 @@ Open [http://localhost:3000](http://localhost:3000).
4445| ` pnpm lint ` | Biome check (lint + format) |
4546| ` pnpm format ` | Auto-format with Biome |
4647| ` pnpm typecheck ` | Type-check with ` tsc ` |
48+ | ` pnpm knip ` | Find unused files, dependencies and exports |
4749| ` pnpm test ` | Run unit tests (Vitest) |
4850| ` pnpm test:watch ` | Vitest in watch mode |
4951| ` pnpm test:e2e ` | Run E2E tests (Playwright) |
@@ -109,8 +111,21 @@ or default locale.
109111
110112## Deployment
111113
112- Deployed on Vercel — pushes to ` main ` deploy to production, pull requests get
113- preview deployments automatically. CI ([ ` .github/workflows/ci.yml ` ] ( .github/workflows/ci.yml ) )
114- runs lint, type-check, unit and E2E tests on every push and PR.
115-
116- Remember to set ` NEXT_PUBLIC_SITE_URL ` to your production domain in the Vercel project settings.
114+ Production is a ** static export** hosted on ** OVH shared hosting** , served over FTP — there is
115+ no Node server in production. The build and upload live on the dedicated
116+ [ ` static-export-ftp ` ] ( https://github.com/Alexis-Gontier/algont-ier.com/tree/static-export-ftp )
117+ branch, which sets ` output: "export" ` in [ ` next.config.ts ` ] ( next.config.ts ) so ` pnpm build `
118+ emits a fully static ` out/ ` directory. See [ ` DEPLOY-FTP.md ` ] ( DEPLOY-FTP.md ) on that branch for
119+ the full procedure (WinSCP/FTP upload, ` .htaccess ` headers, root locale redirect).
120+
121+ - ** CI** ([ ` .github/workflows/ci.yml ` ] ( .github/workflows/ci.yml ) ) runs lint, type-check, unit
122+ and E2E tests on every push and PR.
123+ - ** Deploy** ([ ` .github/workflows/deploy-ftp.yml ` ] ( .github/workflows/deploy-ftp.yml ) on the
124+ ` static-export-ftp ` branch) builds the static export and uploads ` out/ ` to OVH via FTP on
125+ every push to that branch.
126+
127+ Because the export is static, the i18n middleware ([ ` src/proxy.ts ` ] ( src/proxy.ts ) ) is dropped
128+ in favour of static ` [locale] ` segments plus a root redirect, and security headers move from
129+ ` next.config.ts ` to ` .htaccess ` . Set ` NEXT_PUBLIC_SITE_URL ` (build-time) to your production
130+ domain so absolute URLs in the sitemap, robots and Open Graph tags are correct — it is read
131+ from the ` SITE_URL ` repository secret in the deploy workflow.
0 commit comments