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
- 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



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.
Next case study
NoEndPrintArabic-first website · Lead generationHave a similar product in mind?
Tell us what you are building. We will tell you honestly whether we are the right team for it.