AS Saint-Rogatien website
The club’s public website, replacing a WordPress site: pages generated ahead of time with Nuxt, content in JSON, and no database.
In productionPrivate source code
- Nuxt 4
- Vue 3
- TypeScript
- Tailwind 4
- Docker
- nginx
- Coolify
Context
The club’s site is a showcase for people discovering the club, and a source of information for its members. It replaces the WordPress site the club used from 2020 to 2026, and it has been live on the official domain since October 2026.
What I did
- A pre-rendered Nuxt 4 site: pages are built once, at build time, then served as-is by nginx.
- No database and no admin area: all the content (teams, schedules, articles) fits in a few JSON files versioned with the code.
- Migration of the articles from the old WordPress site.
- A small service that forwards the site’s forms by email, protected against bots without a captcha.
- Automatic deployment: three Docker images, built by Coolify on every push to
main.
Two decisions
- Publish without rebuilding the site. The content is read at build time, then re-read at runtime from a dedicated nginx image: updating a meeting time doesn’t mean rebuilding everything, and the build’s copy serves as a fallback.
- A single script writes the content, and it checks before writing: the team exists, the meeting time comes before the match, the article has a minimum length. A wrong time can send a team to the wrong gym, so the script refuses it.
Safeguards
TypeScript typing and checks at publication time.
// For my 2026 projects, I work with AI agents (Claude Code): I frame the need, write the specification, then review and validate the code.