Case 03 / 10
A four-language seafood site with its own CMS
Epic has sold premium frozen seafood since 1970. Through DLVX I built their new site from Nemesis Studio's design, end to end: a React front end in four languages with translated URLs, a custom CMS on Supabase for products, recipes and articles, and pre-rendered pages so search engines read every language in full.
- Role
- Full-Stack Developer
- Client
- Epic Seafood, via DLVX
- Design
- Nemesis Studio
- Year
- 2026
- Stack
- React, Vite, Supabase, i18next, Vercel
4
languages, each with its own URLs
193
URLs in the sitemap, linked across languages
41
recipes the team publishes from the CMS
2.5×
Google clicks from Belgian searches, May to September 2026
Clicks as reported by DLVX from Google Search Console.
Key contributions
-
01
Four languages, translated URLs
Built the React front end from Nemesis Studio's design in English, Dutch, French and German, each with its own slugs and hreflang links between every version.
-
02
A CMS the team runs itself
Built Epic CMS on Supabase for products, recipes, articles, pages and more, with every field in four languages, enquiries collected under Submissions, a website guide and a change-request form.
-
03
Found in every language
Crawlers get pre-rendered pages with canonical, hreflang and structured data, and a sitemap lists all 193 URLs. Google clicks from Belgian searches grew 2.5× between May and September 2026.
Screens
(opens in a new tab)
(opens in a new tab)
(opens in a new tab)
(opens in a new tab)


Screens from epic.be, October 2026. The home page plays a background video; the screenshot shows a frame from it.
Four languages, one site
Belgian buyers read Dutch or French, export buyers English or German. Every page exists in all four, and every language has its own URLs instead of a parameter: the assortment lives at /assortment, /nl/assortiment, /fr/assortiment and /de/sortiment, and recipes at /recipe, /nl/recept, /fr/recette and /de/rezept.
(opens in a new tab)
(opens in a new tab)
(opens in a new tab)
(opens in a new tab)
The assortment page in each language. Navigation, buttons and page text switch with it.
Search engines see the full page
A single-page app sends browsers an almost empty HTML file and builds the page with JavaScript. That is fast for people, but crawlers may index the shell. So the server answers crawlers with the finished page instead.
- 1 A browser gets the 3 KB app shell, then React renders the page and loads content from Supabase. A crawler gets the rendered page, about 100 KB of HTML with the text, title, canonical, hreflang and structured data.
- 2Each page points to its versions in the other languages, and the sitemap lists all 193 URLs with the same links.
<!-- What Googlebot gets for /assortment -->
<title>Epic Assortment: Over 350 Premium Frozen Products</title>
<link rel="canonical" href="https://epic.be/assortment">
<link rel="alternate" hreflang="en" href="https://epic.be/assortment">
<link rel="alternate" hreflang="nl" href="https://epic.be/nl/assortiment">
<link rel="alternate" hreflang="fr" href="https://epic.be/fr/assortiment">
<link rel="alternate" hreflang="de" href="https://epic.be/de/sortiment">
<link rel="alternate" hreflang="x-default" href="https://epic.be/assortment">
From the live site, fetched as Googlebot. The page also carries JSON-LD structured data.
Epic CMS
The team runs the site from a CMS built into the same app, on Supabase. It covers products, recipes, articles, pages, page text, social links, certifications, job positions, authors, form submissions and admin users. Every text field has a box per language, products can be reordered by dragging and marked as featured, and changes go live in seconds.
(opens in a new tab)
(opens in a new tab)
(opens in a new tab)
(opens in a new tab)
Epic CMS, October 2026. Contact details are hidden.
“It's a dream for any branding and UI team to have such a partner.”