All work
Delivered projectBilingual directory · Web platform

Differeg

Differeg is a curated directory of Egyptian brands and the creators behind them, published in English and Arabic. We rebuilt it as a Next.js App Router site where search visibility, not client-side interactivity, drives the architecture.

differeg.comVisit the live site
Differeg home page — “The Home of Egyptian Brands” with an Explore Brands call to action
Type
Delivered project
Languages
English + Arabic (RTL)
Scope
Rebuild, SEO architecture, reviews backend
Platform
Web

The challenge

A directory only works if search engines can read it. The previous build was a client-rendered single-page app, which meant the content that mattered — brand descriptions, categories, reviews and ratings — arrived after JavaScript, in one language, on one URL.

It also had to be genuinely bilingual: Arabic is not a translation layer bolted onto an English site, it needs its own URLs, its own metadata, and a right-to-left layout that does not look like a mirrored afterthought.

The solution

We ported the app to the Next.js App Router with locale-prefixed routes (`/en/…`, `/ar/…`). `lang` and `dir` are baked into the static HTML response, with hreflang alternates for both locales plus `x-default`, and bilingual metadata on every route.

Reviews are read in a Server Component, so the review list and the aggregate rating ship inside the initial HTML. That is what makes the Product + AggregateRating + Review JSON-LD legitimate — the markup describes content a crawler can actually see.

Writes go through a Server Action rather than an API route: Zod validation, a Cloudflare Turnstile check, then an insert with the service-role key that never leaves the server. Row-level security allows public reads only.

Content lives in typed TypeScript modules behind accessor functions, which was a deliberate call — no CMS bill while the catalogue is small, and swapping one in later touches the data files, not the routes.

Key capabilities

Locale-prefixed bilingual routing

Separate English and Arabic URL trees with hreflang alternates, RTL layout, and locale detection from cookie then Accept-Language.

Brand and creator pages

Statically generated pages with incremental revalidation, plus a filterable, sortable directory.

Reviews with ratings

Server-rendered review lists and aggregate ratings backed by Supabase PostgreSQL, written through a validated Server Action.

Spam protection

Cloudflare Turnstile verification enforced server-side on submission.

Structured data

Organization, WebSite, Product, AggregateRating, Review, Person and BreadcrumbList JSON-LD across the relevant page types.

Per-brand social images

Dynamic Open Graph images generated per brand at the edge.

Screens

Differeg brand directory with category filters and sorting
The directory is filter- and sort-driven, so it renders dynamically while brand pages stay static.
A Differeg brand page with description, gallery and customer reviews
Brand pages are statically generated with 60-second revalidation and fetch live reviews on the server, so ratings ship in the initial HTML.
Differeg home page on a phone-sized viewport

Technology

  • Next.js 16 (App Router)
  • React 19
  • TypeScript
  • Tailwind CSS v4
  • Supabase (PostgreSQL)
  • Server Actions
  • Zod
  • Cloudflare Turnstile
  • Vercel

Confirmed from the project’s own codebase.

What we built

  • A live bilingual platform on Vercel where every route ships a title, description, canonical URL, Open Graph and Twitter metadata, hreflang alternates and topical JSON-LD.
  • A reviews backend that is one table and one aggregate view — no API layer, no ORM, no background jobs — with reads and writes separated by row-level security.
  • A content model that renders correctly with seeded data even when Supabase is unconfigured, so previews and local development never break.
  • We are not publishing traffic or ranking figures for Differeg; we have not verified them.

Have a similar product in mind?

Tell us what you are building. We will tell you honestly whether we are the right team for it.