Pedri
Multilingual artist portfolio with a custom CMS, an artist-run dashboard, and WCAG accessibility scoring gated in CI.

TL;DR
- Four fully-translated locales (EN · NL · FR · DE) from one codebase.
- Artist-run dashboard: Lexical editor + gallery uploader, no dev needed.
- Supabase Postgres + Storage with row-level security.
- Statically rendered, revalidated on publish — fast and cheap to run.
- Pa11y / WCAG-AA accessibility scoring as a CI build gate.
- Light / dark theme, filterable gallery with search, and per-work pages.
Architecture
One codebase, four languages. The public gallery renders statically and revalidates on publish; the artist's dashboard writes through a NextAuth-gated CMS into Supabase Postgres + Storage.
Problem
Peter — 'Pedri' — is a painter in Lede whose work runs from quiet portraits to restless abstraction. He needed a home for the whole oeuvre that felt like an artist's space rather than a SaaS template, spoke four languages to a European audience (EN / NL / FR / DE), and — crucially — that he could run himself: add a new work, open an exhibition, publish a blog post, without ever calling a developer.
Approach
A single Next.js 16 App Router codebase serving four locales through next-intl. The public gallery, collections, exhibitions, blog and FAQ are statically rendered and revalidated on publish, so the site stays fast and cheap while the content stays live. Behind a NextAuth-gated dashboard, a Lexical rich-text editor and a gallery uploader write through to Supabase — Postgres for structured content, Storage for the artwork images — with row-level security. Accessibility is a build gate, not an afterthought: Pa11y runs WCAG checks in CI and a failing score blocks the deploy. A light/dark theme and an experimental voice-assistant tour round it out.
Deep dive
A dashboard the artist actually runs
The real deliverable wasn't the public site — it was leaving Peter with something he could operate alone. The dashboard pairs a Lexical rich-text editor with a gallery uploader, so a new work (image, title, medium, collection, translated captions) or a new exhibition goes live in a few minutes, no deploy and no developer. Everything he touches is scoped by NextAuth and Supabase row-level security, so the admin surface never leaks into the public build.
Four languages, one source of truth
next-intl drives locale-aware routing (/en, /nl, /fr, /de) over a single App Router codebase. UI strings and content both translate, the language switcher preserves your place, and the sitemap emits every locale so each language is independently indexable. The alternative — four copies of the site — was exactly the maintenance trap the brief needed to avoid.
The gallery is the product
Artwork lives in Supabase Storage; structured metadata (collections, media, dimensions, captions) lives in Postgres. The public gallery is filterable by technique with search and multiple view modes, and every piece has its own page. Images are served through Next's image pipeline so a wall of paintings still loads fast on gallery Wi-Fi.
Accessibility as a build gate
Pa11y runs WCAG checks in CI and a regression fails the build — accessibility can't quietly rot between releases. Keyboard navigation, focus order, alt text on every work, and contrast in both light and dark themes are part of 'done', not a later audit.
Fast and cheap to keep alive
Public pages render statically and revalidate on publish, so the running cost of an artist's portfolio stays near zero while the content stays current. The result is a site that behaves like a static page for visitors and like a CMS for its owner — which is the whole point.
Outcome
Live at pedri.art and operated by the artist without developer involvement after launch — new works and exhibitions go up in minutes. Four fully-translated locales, WCAG-AA clean in CI, SEO with a locale-aware sitemap and RSS, and a page that opens fast on a phone in a gallery as readily as on a desktop.
Related
More in web.

MindMetrics
Personal psychometric platform. Ten instruments on a plugin engine, procedurally generated cognitive tests, practice effects modelled instead of ignored.

Agrilog — real-time agricultural platform
Full-stack work on interface performance and backend scalability for an agricultural-tech platform in Québec. Under NDA — stack and shape only.
Covered by an NDA — no internal material shown, nothing available on request.
