Skip to content
ع
All projects

Portfolio

This site: a bilingual, content-first case-study portfolio.

Portfolio: This site: a bilingual, content-first case-study portfolio.
Role
Solo: content, design and engineering
Year
2026
Status
Live
Category
Web

A bilingual (English/Arabic) portfolio built as a content layer first and a design second: every project is written up once in both languages, then rendered as a card, a case study, and a search-engine record from the same source.

Overview

Most portfolios are a design with some text poured into it, which is why they are impossible to translate and go stale the moment a project ships. I inverted it: the whole site reads from one typed content layer where every string exists in English and Arabic, and the pages are just views over it.

That made a second language a rendering concern instead of a rewrite. The same project record produces the card, the case study, the Open Graph tags and the sitemap entry, in either direction, without a duplicated copy to keep in sync.

It is built with Astro, ships almost no JavaScript, and pulls live GitHub and WakaTime figures at build time so the activity numbers are not a screenshot from last year.

Built with

  • Astro
  • TypeScript
  • React
  • Tailwind CSS
  • Playwright
  • Vitest
  • i18n
  • RTL
  • SEO

Where to find it

Challenges

Arabic that is typeset, not just translated

Problem

Flipping a layout to RTL with a direction attribute gets the columns right and everything else wrong: Latin stack names invert inside Arabic sentences, numeric axes read backwards, and a Latin display face applied to Arabic text looks like a fallback.

Solution

Arabic gets its own face, Thmanyah Sans, with the salt alternates enabled on headings. Logical CSS properties handle the mirroring, and the parts that must stay Latin, code identifiers, chart axes, URLs, are pinned to LTR inside an RTL page.

Forty case studies without forty templates

Problem

Forty projects that each get a real write-up, in two languages, is 80 documents. Hand-authoring pages would guarantee that half of them drift out of date and the other half quietly lose a field.

Solution

One TypeScript type describes a project, including the bilingual fields, so a missing Arabic paragraph is a compile error rather than a blank section in production. Every page is generated from that array.

Results

  • 41 projects, each with a full case study in both languages.
  • Complete Arabic and English routes, mirrored down to the fonts and charts.
  • Live GitHub and WakaTime activity, with a frozen fallback so a third-party outage cannot fail the build.