Case · Site
Multi-page legal services website
A delivered website for a legal and expert-appraisal firm built with Nuxt 4: 65 server-rendered pages, JSON-LD markup and 301 redirects from the previous site. Lead requests go through a server endpoint that checks Origin, caps body size and rate-limits clients.
- Nuxt 4
- Vue 3
- TypeScript
- Bootstrap 5
- Zod
- Vitest
- Playwright
- Docker
- GitHub Actions
01 · How it looks
Screenshots


02 · About
What it is and why
A delivered website for a legal and expert-appraisal firm built with Nuxt 4: 65 server-rendered pages, JSON-LD markup and 301 redirects from the previous site. Lead requests go through a server endpoint that checks Origin, caps body size and rate-limits clients.
Limitations
This is a client site: the client name and contacts are not used in the card text; screenshots show the site itself.
Screenshots were taken from a local build with placeholder env values; no forms were submitted.
Figures and claims from the site content belong to the client and are not quoted in the card.
The local repository copy was shown, not the latest version.
What is inside
- 65 SSR routes, generated sitemap.xml and robots.txt; indexing is switched on by an explicit env flag
- Lead form: server endpoint with Origin check, 10 KB body cap, 3 requests per 10 minutes per IP, honeypot and optional captcha
- JSON-LD: LegalService, WebSite, BreadcrumbList
- Single-hop 301 redirects from legacy URLs and trailing slashes, security headers (CSP, HSTS)
- CI/CD: lint, typecheck, Vitest, build, Playwright; then a Docker image and server deploy
- 210 unit tests in 13 files and 4 e2e spec files
03 · How to run
Run it locally
npm install && npm run build && node .output/server/index.mjs
# placeholder env values: NITRO_PRESET=node-server PORT=3310 NUXT_ALLOWED_ORIGIN=http://localhost:3310 NUXT_BITRIX_WEBHOOK_URL=http://127.0.0.1:9/ ; for development: npm run dev04 · Code
The repository is private
The source lives in a private repository. I will grant access on request: write to me and I will send an invitation.
Request the code