ITQAN LAB
Design & Technology Studio
Get in Touch Available Now
How We Built the ItqanLab Website — Brand, Stack, and Everything In Between

How We Built the ItqanLab Website — Brand, Stack, and Everything In Between

A behind-the-scenes look at building our own marketing website: how we chose the name, designed the brand, picked Astro over Next.js, implemented bilingual support, and set up SEO from day one.

Building your own company website is a different kind of challenge. There’s no client brief to follow. No external deadline forcing decisions. Every choice is yours — which means every choice needs to be intentional.

Here’s how we built itqanlab.com, and why we made the decisions we did.

Starting with the Name

The name came before everything else. We wanted something that:

  1. Means something in Arabic — we’re based in Cairo, and Arabic identity matters
  2. Works internationally — pronounceable and memorable for English speakers
  3. Reflects our values — not just what we do, but how we do it

“Itqan” (إتقان) means mastery, precision, excellence in craftsmanship. It’s a word with deep roots in Arabic culture — the idea that work should be done with the highest possible quality. “Lab” adds the experimental, technical dimension.

Together: a studio where mastery meets experimentation.

Designing the Brand

The Color System

Most tech agencies default to blue. It’s safe, it signals trust, and it’s forgettable. We went with amber (#d97706) as our primary accent — warm, confident, and impossible to confuse with the competition.

But we didn’t stop at one color. We built a multi-theme system with five options:

  • Amber (default) — warm, confident
  • Blue — classic, technical
  • Rose — bold, distinctive
  • Emerald — fresh, growth-oriented
  • Violet — creative, premium

Visitors can switch themes freely. It’s a small interaction that signals something important: we care about details, and we build things that go beyond the minimum.

Typography Choices

Font selection reveals how much a team thinks about design:

  • Outfit for headings — geometric sans-serif with character. Modern without being cold.
  • Inter for body text — the industry standard for screen readability. We didn’t try to be clever here; Inter just works.
  • JetBrains Mono for code snippets — because if you’re going to show code, it should look like code.
  • IBM Plex Sans Arabic for Arabic text — specifically designed for Arabic on screens. Not an afterthought Arabic font — a purpose-built one.

Four fonts sounds like a lot. But each serves a distinct role, and they never compete with each other.

Choosing the Tech Stack

Why Astro (and Not Next.js)

This is a marketing site. It needs to be fast, SEO-friendly, and easy to maintain. It doesn’t need:

  • Server-side rendering
  • API routes
  • Complex client-side state
  • A React runtime

Astro 5 gives us exactly what we need: static HTML output with zero JavaScript by default. Components are rendered at build time and shipped as plain HTML. When we need interactivity (the Three.js hero, the theme switcher), we add it surgically — only the scripts that page needs.

The result: pages that load in milliseconds, perfect Lighthouse scores, and a codebase that’s simple to reason about.

If this were a web app with authentication, real-time features, or complex client interactions, we’d choose Next.js. But for a marketing site, Astro is the right tool. We wrote about this framework of thinking in How to Choose the Right Tech Stack.

The Rest of the Stack

  • HTML/CSS — no Tailwind, no CSS-in-JS. Just well-organized CSS custom properties and scoped styles. For a site this size, that’s all you need.
  • Vanilla JavaScript — for the language toggle, theme switcher, and scroll animations. No framework overhead for interactions that are fundamentally simple.
  • Three.js — for the homepage hero. Loaded asynchronously, doesn’t block rendering.
  • GSAP — for scroll-triggered animations. Lightweight, performant, battle-tested.

Infrastructure

  • Dokploy (self-hosted) — full control over our deployment pipeline
  • GitHub auto-deploy — push to main, site updates automatically
  • Cloudflare — CDN, DNS, and SSL. Proxy enabled with Full SSL mode
  • Nixpacks — handles the build without Docker configuration overhead

Total monthly cost for hosting: essentially zero beyond the VPS we already run.

Building Bilingual Support

This was one of the more interesting engineering challenges. The site needed to support English and Arabic with:

  • Instant language switching — no page reload
  • Full RTL layout — not just text direction, but mirrored layouts
  • Native-sounding Arabic — not translated, but written
  • System language detection — detect the browser’s language on first visit

How It Works

Every translatable element gets a data-i18n attribute. A single JavaScript module (i18n.js) contains all translations in an object with en and ar keys. When the language toggles:

  1. All data-i18n elements get their translated text
  2. The <html> element gets dir="rtl" (or back to ltr)
  3. The preference is saved to localStorage
  4. On first visit, the system detects the browser language

The Arabic content isn’t run through Google Translate. Every string was written to sound natural in Arabic — proper grammar, cultural context, and tone. When you read the Arabic version, it should feel like the site was built Arabic-first.

Handling RTL

CSS custom properties and logical properties (margin-inline-start vs margin-left) handle most of the RTL layout automatically. For edge cases like the hero animation and specific grid layouts, we use [dir="rtl"] selectors.

SEO from Day One

We didn’t bolt on SEO after launch. It was built into the architecture from the start:

Structured Data

Every page type has its own JSON-LD schema:

  • Homepage: Organization + WebSite + FAQPage
  • Blog posts: BlogPosting with author, publisher, dates
  • Projects: CreativeWork with creator, industry, keywords
  • Service pages: Service with provider and area served

This isn’t just for Google. Structured data helps AI systems (ChatGPT, Perplexity, Google AI Overviews) understand and cite your content correctly.

Meta & Open Graph

Every page has unique:

  • Title and description (not auto-generated templates)
  • Open Graph image (custom SVG converted to PNG)
  • Canonical URL
  • Hreflang alternates for both languages

Performance as SEO

Google’s Core Web Vitals directly impact rankings. By choosing Astro’s static output with zero default JavaScript, we start with a massive advantage:

  • LCP (Largest Contentful Paint): fast, because there’s no framework hydration
  • CLS (Cumulative Layout Shift): minimal, because fonts are preloaded and images have dimensions
  • INP (Interaction to Next Paint): excellent, because interactions are lightweight vanilla JS

The Interactive Details

A marketing site needs personality. Templates feel like templates because they lack intentional details. Here’s what we added:

Three.js Particle Hero

The homepage hero isn’t a static image or a gradient. It’s an interactive 3D particle field that responds to cursor movement. It loads asynchronously — the page renders instantly, and the canvas initializes after.

Custom Cursor

A dot + ring cursor that grows when hovering over interactive elements. Subtle, but it makes the site feel handcrafted.

Scroll Progress

A thin progress bar at the top of the viewport. Useful on long pages, and it adds a sense of momentum.

Theme Persistence

When you pick a theme, it persists across sessions via localStorage. Return tomorrow, and it remembers your preference.

Content Architecture

Blog posts and project case studies are Markdown files managed through Astro Content Collections. Each has a TypeScript-enforced schema:

src/content/
  blog/
    building-itqanlab.md    ← you're reading this
    choosing-tech-stack.md
    ...
  projects/
    itqanlab.md
    searchcraft.md
    ...

No CMS. No database. No API. Just Markdown files in a Git repo. Adding a new post means creating a file with the right frontmatter and pushing to main.

For projects, we support bilingual content: the English body is standard Markdown, the Arabic body is HTML in a body_ar frontmatter field. Both render on the same page and toggle with the language switcher.

What We Learned

1. Build Your Own Site Like a Client Project

It’s tempting to cut corners on your own work. Don’t. Your site is the first thing potential clients see. If it feels rushed or templated, that’s what they’ll expect from working with you.

2. Bilingual is Harder Than It Looks

RTL support isn’t just direction: rtl. It’s mirrored layouts, cultural adaptation of copy, font selection that works for both scripts, and testing every component in both directions. Budget real time for it.

3. Performance is a Feature

Zero-JS defaults with surgical script loading isn’t just a technical choice — it’s a business choice. Fast sites convert better, rank higher, and feel more professional.

4. SEO is Architecture, Not Afterthought

Structured data, semantic HTML, proper meta tags — these should be in your component templates from day one, not bolted on before launch.

5. Details Compound

The custom cursor, the theme switcher, the particle hero, the scroll progress bar — individually, each is small. Together, they create the feeling that every pixel was considered. That feeling is what separates craft from commodity.


This is the kind of work we do for our clients. If you want a website built with this level of intentionality, let’s talk.

Related: See the full ItqanLab project case study and learn about our approach to Brand Identity and Web Development.

بناء موقع شركتك تحدي مختلف. مفيش بريف من عميل تمشي عليه. مفيش ديدلاين خارجي يفرض قرارات. كل اختيار بتاعك — يعني كل اختيار لازم يكون مقصود.

هنا كيف بنينا itqanlab.com، وليه اخدنا القرارات دي.

البداية بالاسم

الاسم جه قبل أي حاجة تانية. كنا عايزين حاجة:

  1. ليها معنى بالعربي — إحنا في القاهرة، والهوية العربية مهمة
  2. بتشتغل دوليًا — سهلة النطق وبتتحفظ للمتحدثين بالإنجليزية
  3. بتعكس قيمنا — مش بس إيه بنعمل، لكن إزاي بنعمله

"إتقان" كلمة عربية معناها التمكّن، الدقة، التميّز في الصنعة. كلمة ليها جذور عميقة في الثقافة العربية — فكرة إن الشغل لازم يتعمل بأعلى جودة ممكنة. "Lab" بتضيف البُعد التجريبي والتقني.

مع بعض: استوديو الإتقان بيقابل التجريب.

تصميم الهوية البصرية

نظام الألوان

أغلب وكالات التكنولوجيا بتروح للأزرق. آمن، بيوصّل ثقة، وبيتنسي. إحنا رحنا لـ الكهرماني (#d97706) كلون أساسي — دافي، واثق، ومستحيل يتلخبط مع المنافسين.

لكن ما وقفناش عند لون واحد. بنينا نظام ثيمات متعدد بخمس خيارات:

  • كهرماني (افتراضي) — دافي، واثق
  • أزرق — كلاسيكي، تقني
  • وردي — جريء، مميز
  • زمردي — منعش، نمو
  • بنفسجي — إبداعي، فاخر

الزوار يقدروا يغيّروا الثيم بحرية. تفاعل صغير بيوصّل حاجة مهمة: إحنا بنهتم بالتفاصيل، وبنبني حاجات أبعد من الحد الأدنى.

اختيارات الخطوط

اختيار الخط بيكشف قد إيه الفريق بيفكر في التصميم:

  • Outfit للعناوين — خط هندسي بدون حواف بشخصية. حديث من غير ما يبقى بارد.
  • Inter للنص الأساسي — المعيار في قراءة الشاشات. ما حاولناش نبقى أذكياء هنا؛ Inter بيشتغل وخلاص.
  • JetBrains Mono للأكواد — لأن لو هتعرض كود، لازم يبان كود.
  • IBM Plex Sans Arabic للنص العربي — مصمم خصيصًا للعربي على الشاشات. مش خط عربي متضاف كفكرة لاحقة — خط مبني لغرض محدد.

أربع خطوط بتبان كتير. لكن كل واحد ليه دور مختلف، وعمرهم ما بيتنافسوا مع بعض.

اختيار الـ Tech Stack

ليه Astro (ومش Next.js)

ده موقع تسويقي. محتاج يبقى سريع، صديق لمحركات البحث، وسهل الصيانة. مش محتاج:

  • Server-side rendering
  • API routes
  • حالة معقدة على الـ client
  • React runtime

Astro 5 بيدينا بالظبط اللي محتاجينه: مخرجات HTML ثابتة بصفر JavaScript افتراضيًا. المكونات بتترندر وقت البناء وبتتبعت كـ HTML عادي. لما نحتاج تفاعل (هيرو الـ Three.js، مبدّل الثيم)، بنضيفه جراحيًا — بس السكريبتات اللي الصفحة محتاجاها.

النتيجة: صفحات بتحمّل في ملي ثانية، درجات Lighthouse مثالية، وكود بسيط ومفهوم.

لو ده كان تطبيق ويب بمصادقة، ميزات لحظية، أو تفاعلات معقدة، كنا هنختار Next.js. لكن لموقع تسويقي، Astro هي الأداة الصح. كتبنا عن طريقة التفكير دي في إزاي تختار الـ Tech Stack المناسب.

باقي الـ Stack

  • HTML/CSS — لا Tailwind، لا CSS-in-JS. مجرد CSS custom properties منظمة و scoped styles. لموقع بالحجم ده، ده كل اللي محتاجه.
  • Vanilla JavaScript — لمبدّل اللغة، مبدّل الثيم، وأنيميشن السكرول. لا framework overhead لتفاعلات بسيطة في جوهرها.
  • Three.js — لهيرو الصفحة الرئيسية. بيتحمّل بشكل غير متزامن، مش بيعطّل الرندر.
  • GSAP — لأنيميشن السكرول. خفيف، كفء، ومُجرّب.

البنية التحتية

  • Dokploy (self-hosted) — تحكم كامل في خط النشر
  • GitHub auto-deploy — ادفع لـ main، الموقع بيتحدث تلقائيًا
  • Cloudflare — CDN وDNS وSSL. البروكسي مفعّل مع وضع Full SSL
  • Nixpacks — بيتعامل مع البناء بدون تعقيدات إعداد Docker

التكلفة الشهرية للاستضافة: عمليًا صفر غير الـ VPS اللي شغالين عليه أصلاً.

بناء الدعم ثنائي اللغة

ده كان من أمتع التحديات الهندسية. الموقع كان محتاج يدعم الإنجليزية والعربية مع:

  • تبديل لغة فوري — بدون إعادة تحميل الصفحة
  • تخطيط RTL كامل — مش بس اتجاه النص، لكن تخطيطات معكوسة
  • عربي بيبان طبيعي — مش مترجم، لكن مكتوب
  • كشف لغة النظام — كشف لغة المتصفح في أول زيارة

إزاي بيشتغل

كل عنصر قابل للترجمة بياخد خاصية data-i18n. موديول JavaScript واحد (i18n.js) فيه كل الترجمات في كائن بمفاتيح en وar. لما اللغة بتتبدل:

  1. كل عناصر data-i18n بتاخد النص المترجم
  2. عنصر <html> بياخد dir="rtl" (أو يرجع لـ ltr)
  3. التفضيل بيتحفظ في localStorage
  4. في أول زيارة، النظام بيكشف لغة المتصفح

المحتوى العربي مش ممرّر من Google Translate. كل نص اتكتب عشان يبان طبيعي بالعربي — قواعد سليمة، سياق ثقافي، ونبرة مناسبة. لما تقرأ النسخة العربية، المفروض تحس إن الموقع اتبنى عربي أولاً.

التعامل مع RTL

CSS custom properties و logical properties (زي margin-inline-start بدل margin-left) بتتعامل مع أغلب تخطيط RTL تلقائيًا. للحالات الخاصة زي أنيميشن الهيرو وتخطيطات الشبكة المحددة، بنستخدم سيلكتورات [dir="rtl"].

SEO من اليوم الأول

ما ركّبناش الـ SEO بعد الإطلاق. اتبنى في المعمارية من البداية:

البيانات المنظمة

كل نوع صفحة ليه JSON-LD schema خاص:

  • الصفحة الرئيسية: Organization + WebSite + FAQPage
  • مقالات المدونة: BlogPosting بالكاتب والناشر والتواريخ
  • المشاريع: CreativeWork بالمبتكر والصناعة والكلمات المفتاحية
  • صفحات الخدمات: Service بالمقدم والمنطقة المخدومة

ده مش بس لجوجل. البيانات المنظمة بتساعد أنظمة الذكاء الاصطناعي (ChatGPT، Perplexity، Google AI Overviews) تفهم وتستشهد بمحتواك صح.

Meta و Open Graph

كل صفحة ليها:

  • عنوان ووصف فريد (مش قوالب مولّدة تلقائيًا)
  • صورة Open Graph (SVG مخصص متحول لـ PNG)
  • رابط Canonical
  • بدائل Hreflang للغتين

الأداء كـ SEO

Core Web Vitals بتاعة جوجل بتأثر مباشرة على الترتيب. باختيار مخرجات Astro الثابتة بصفر JavaScript افتراضي، بنبدأ بميزة ضخمة:

  • LCP (Largest Contentful Paint): سريع، لأن مفيش framework hydration
  • CLS (Cumulative Layout Shift): أقل حاجة، لأن الخطوط محمّلة مسبقًا والصور ليها أبعاد
  • INP (Interaction to Next Paint): ممتاز، لأن التفاعلات vanilla JS خفيفة

التفاصيل التفاعلية

موقع تسويقي محتاج شخصية. القوالب بتبان قوالب لأنها بتفتقر التفاصيل المقصودة. هنا اللي ضفناه:

هيرو Three.js بالجسيمات

هيرو الصفحة الرئيسية مش صورة ثابتة أو تدرج لوني. ده حقل جسيمات 3D تفاعلي بيستجيب لحركة الماوس. بيتحمّل بشكل غير متزامن — الصفحة بتترندر فورًا، والكانفاس بيتهيّأ بعدها.

مؤشر مخصص

مؤشر نقطة + حلقة بيكبر لما يمر على عناصر تفاعلية. خفيف، لكن بيخلي الموقع يحسّسك إنه مصنوع يدويًا.

شريط تقدم السكرول

شريط تقدم رفيع أعلى نافذة العرض. مفيد في الصفحات الطويلة، وبيضيف إحساس بالزخم.

حفظ الثيم

لما تختار ثيم، بيتحفظ عبر الجلسات من خلال localStorage. ارجع بكره، وهيفتكر تفضيلك.

معمارية المحتوى

مقالات المدونة ودراسات حالة المشاريع هي ملفات Markdown مدارة من خلال Astro Content Collections. كل واحدة ليها schema معروف بـ TypeScript:

src/content/
  blog/
    building-itqanlab.md    ← بتقرأ ده
    choosing-tech-stack.md
    ...
  projects/
    itqanlab.md
    searchcraft.md
    ...

لا CMS. لا قاعدة بيانات. لا API. مجرد ملفات Markdown في Git repo. إضافة مقال جديد يعني إنشاء ملف بالـ frontmatter الصح والدفع لـ main.

للمشاريع، بندعم محتوى ثنائي اللغة: النص الإنجليزي هو Markdown عادي، والنص العربي هو HTML في حقل body_ar في الـ frontmatter. الاتنين بيترندروا على نفس الصفحة وبيتبدلوا مع مبدّل اللغة.

إيه اللي اتعلمناه

1. ابني موقعك زي مشروع عميل

مغري تقصّر في شغلك. ما تعملش كده. موقعك هو أول حاجة العملاء المحتملين بيشوفوها. لو حاسس إنه متسرّع أو قالب، ده اللي هيتوقعوه من الشغل معاك.

2. ثنائي اللغة أصعب مما يبان

دعم RTL مش بس direction: rtl. ده تخطيطات معكوسة، تكييف ثقافي للنصوص، اختيار خطوط بتشتغل للنظامين، واختبار كل مكون في الاتجاهين. حطّله وقت حقيقي.

3. الأداء ميزة

صفر JavaScript افتراضي مع تحميل سكريبتات جراحي مش بس اختيار تقني — ده اختيار بيزنس. المواقع السريعة بتحوّل أحسن، بتترتب أعلى، وبتحسّسك بالاحترافية.

4. الـ SEO معمارية، مش فكرة لاحقة

البيانات المنظمة، HTML الدلالي، علامات meta السليمة — دول لازم يبقوا في قوالب المكونات من اليوم الأول، مش يتركّبوا قبل الإطلاق.

5. التفاصيل بتتراكم

المؤشر المخصص، مبدّل الثيم، هيرو الجسيمات، شريط تقدم السكرول — كل واحد لوحده صغير. مع بعض، بيخلقوا الإحساس إن كل بكسل اتدرس. الإحساس ده هو اللي بيفصل الحِرَفية عن السلعة.


ده نوع الشغل اللي بنعمله لعملائنا. لو عايز موقع مبني بالمستوى ده من القصدية، كلّمنا.

مقالات متعلقة: شوف دراسة حالة مشروع إتقان لاب الكاملة واعرف عن نهجنا في الهوية البصرية وتطوير الويب.

Written by

Abdelrahman Ahmed

Software Engineer & Founder at ItqanLab

Software engineer based in Cairo, Egypt. Building digital products with mastery — from frontend systems to full-stack platforms.

LinkedIn

Have a project in mind?

Tell us what you're building. No sales deck — a real person responds within 24 hours with an honest take on whether we're the right fit.

hello@itqanlab.com
New Cairo, Egypt — Working globally Clear scope · No surprises Available Now