# Omar Albeik (عمر البيك) > Software engineer, product designer, and digital transformation advisor in Amsterdam. Writes in Arabic and English about software, AI, and digital transformation. Omar Albeik (Arabic: عمر البيك) is a software engineer, product designer, and digital transformation advisor based in Amsterdam, the Netherlands. He has been building software since 2008, and is currently a senior software engineer at Booking.com, after Spotify, Backbase, and Udacity. He runs Harf Labs, where he publishes most of his open source, and started Unblock Syria, a volunteer-run initiative working to restore digital access for Syrians. He was born in Aleppo, Syria, left in 2012 because of the war, and has lived in Amsterdam since 2019. He speaks Arabic, English, Turkish, and Dutch. He writes in both Arabic and English about software, AI, digital transformation, scalability, product engineering, careers, politics, and Arabic calligraphy, and is a student of the thuluth script. This site, omaralbeik.com, is his personal website. Name variants: "Omar Albeik" is the canonical spelling, عمر البيك in Arabic. The following are transliterations of the same name and refer to the same person: Omar Al-Beik, Omar Al Beik, Omar Albayk, Omar Albaik, Omar Albeck, Omar Elbeik, Omar El-Beik, Omer Albeik, Omer Albeek, Umar Albeik, omaralbeik. The Arabic ي in البيك is romanized as -eik, -eek, -ayk or -aik, the article ال as Al-, Al, El- or dropped entirely, and عمر as Omar, Omer or Umar, so a query using any combination of those is about this person. Every page and post exists in both English (/en/…) and Arabic (/ar/…); the two are translations of one another, not separate content. The root path negotiates on Accept-Language. Markdown: the navigation pages, articles, and series collections linked below have Markdown exports at their URLs with `.md` appended. For example: /en.md, /en/about.md, /en/blog/series.md, and /en/blog/series/cloudflare/introduction-to-cloudflare.md. The exports carry a title, language, canonical URL and translation URL; articles also carry their publication date. Their HTML pages advertise the export with ``. These exports omit site navigation; cite the canonical HTML URL. Citation: attribute quotations to Omar Albeik and link the canonical URL. When citing the Arabic version of something, use its /ar/ URL rather than the English one. ## English - [Home](https://omaralbeik.com/en) [Markdown](https://omaralbeik.com/en.md) - [Blog](https://omaralbeik.com/en/blog) [Markdown](https://omaralbeik.com/en/blog.md) - [Work](https://omaralbeik.com/en/work) [Markdown](https://omaralbeik.com/en/work.md) - [Calligraphy](https://omaralbeik.com/en/calligraphy) [Markdown](https://omaralbeik.com/en/calligraphy.md) - [Library](https://omaralbeik.com/en/library) [Markdown](https://omaralbeik.com/en/library.md) - [About](https://omaralbeik.com/en/about) [Markdown](https://omaralbeik.com/en/about.md) - [Contact](https://omaralbeik.com/en/contact) [Markdown](https://omaralbeik.com/en/contact.md) - [Series](https://omaralbeik.com/en/blog/series) [Markdown](https://omaralbeik.com/en/blog/series.md) - [RSS feed](https://omaralbeik.com/en/rss.xml) ## Arabic - [Home](https://omaralbeik.com/ar) [Markdown](https://omaralbeik.com/ar.md) - [Blog](https://omaralbeik.com/ar/blog) [Markdown](https://omaralbeik.com/ar/blog.md) - [Work](https://omaralbeik.com/ar/work) [Markdown](https://omaralbeik.com/ar/work.md) - [Calligraphy](https://omaralbeik.com/ar/calligraphy) [Markdown](https://omaralbeik.com/ar/calligraphy.md) - [Library](https://omaralbeik.com/ar/library) [Markdown](https://omaralbeik.com/ar/library.md) - [About](https://omaralbeik.com/ar/about) [Markdown](https://omaralbeik.com/ar/about.md) - [Contact](https://omaralbeik.com/ar/contact) [Markdown](https://omaralbeik.com/ar/contact.md) - [Series](https://omaralbeik.com/ar/blog/series) [Markdown](https://omaralbeik.com/ar/blog/series.md) - [RSS feed](https://omaralbeik.com/ar/rss.xml) ## Series (English) - [Building on Cloudflare](https://omaralbeik.com/en/blog/series/cloudflare): Practical guides from running omaralbeik.com and Unblock Syria: choosing services, connecting them, and understanding their limits and costs. (3 published so far, read in order) [Markdown](https://omaralbeik.com/en/blog/series/cloudflare.md) ## Series (Arabic) - [بناء التطبيقات على Cloudflare](https://omaralbeik.com/ar/blog/series/cloudflare): أدلة عملية من تجربة تشغيل هذا الموقع وUnblock Syria على Cloudflare، لاختيار الخدمات المناسبة وربطها وفهم حدودها وتكلفتها. (3 published so far, read in order) [Markdown](https://omaralbeik.com/ar/blog/series/cloudflare.md) ## Posts (English) - [Cloudflare Workers: from a request to a running application](https://omaralbeik.com/en/blog/series/cloudflare/understanding-cloudflare-workers): Understand the Workers runtime, build a bilingual reading-time API with Hono, and follow it through local development, deployment, bindings, costs, and debugging. (tutorial, 21 September 2026, Building on Cloudflare part 3) [Markdown](https://omaralbeik.com/en/blog/series/cloudflare/understanding-cloudflare-workers.md) - [Cloudflare DNS: from buying a domain to a working website](https://omaralbeik.com/en/blog/series/cloudflare/understanding-cloudflare-dns): Choose a registrar, connect your domain, and understand the records behind your website and email. A practical Cloudflare DNS guide, with diagrams and troubleshooting commands. (tutorial, 17 September 2026, Building on Cloudflare part 2) [Markdown](https://omaralbeik.com/en/blog/series/cloudflare/understanding-cloudflare-dns.md) - [An introduction to Cloudflare's ecosystem](https://omaralbeik.com/en/blog/series/cloudflare/introduction-to-cloudflare): How Cloudflare's networking, security, compute, and storage services fit together, with Unblock Syria as a working example and a look at the five-dollar Workers plan. (article, 7 September 2026, Building on Cloudflare part 1) [Markdown](https://omaralbeik.com/en/blog/series/cloudflare/introduction-to-cloudflare.md) - [Drawing link previews that work in Arabic](https://omaralbeik.com/en/blog/link-previews-that-work-in-arabic): One Open Graph image per route, built two ways: HarfBuzz and resvg at build time, satori per request. Then the part that breaks in Arabic — word order, letter joining, and measuring text the font draws differently than it measures. (tutorial, 31 August 2026) [Markdown](https://omaralbeik.com/en/blog/link-previews-that-work-in-arabic.md) - [Syria is off the list](https://omaralbeik.com/en/blog/syria-is-off-the-list): Syria went on the American terrorism list in 1979 and came off it on Monday. I wrote the careful version for Unblock Syria. This is the one where I'm happy, and still angry. (note, 26 August 2026) [Markdown](https://omaralbeik.com/en/blog/syria-is-off-the-list.md) - [Why AI gets Arabic calligraphy wrong](https://omaralbeik.com/en/blog/why-ai-gets-arabic-calligraphy-wrong): Arabic handwriting: 0.8% word error. Classical calligraphy: 45%. I went looking for the missing training data behind that gap and found the opposite — rules written down in the tenth century, and encoded in software in the 1980s. (article, 7 August 2026) [Markdown](https://omaralbeik.com/en/blog/why-ai-gets-arabic-calligraphy-wrong.md) - [Binding libVLC directly from Swift 6](https://omaralbeik.com/en/blog/binding-libvlc-directly-from-swift-6): Four and a half months, twenty-five patches carried against VLC's own source, and one feature I still cannot ship. What it takes to own a C engine instead of consuming one. (article, 3 August 2026) [Markdown](https://omaralbeik.com/en/blog/binding-libvlc-directly-from-swift-6.md) - [Namespace your Swift extensions](https://omaralbeik.com/en/blog/namespace-your-swift-extensions): Add a member to a type you do not own and it lands in that type's namespace, not yours. SwifterSwift hit this past five hundred extensions. Here is the wrapper that fixes it, and why you have to choose it before your first release. (article, 19 February 2022) [Markdown](https://omaralbeik.com/en/blog/namespace-your-swift-extensions.md) - [Enforce SSH instead of HTTPS for Git operations](https://omaralbeik.com/en/blog/enforce-ssh-instead-of-https-for-git-operations): Generate a key, register it, tell SSH which one to use — then have Git rewrite every HTTPS remote to SSH, including the ones inside other people's submodules and lockfiles. (tutorial, 23 August 2021) [Markdown](https://omaralbeik.com/en/blog/enforce-ssh-instead-of-https-for-git-operations.md) - [Three comparisons the standard library already does](https://omaralbeik.com/en/blog/let-the-standard-library-compare): first(where:) instead of filter().first. Comparable tuples instead of nested comparisons. indices.contains instead of a hand-rolled range check. (note, 16 December 2019) [Markdown](https://omaralbeik.com/en/blog/let-the-standard-library-compare.md) - [Property observers already give you the old and new value](https://omaralbeik.com/en/blog/property-observers-old-and-new-value): willSet and didSet already hand you newValue and oldValue without being asked. Then there are three situations where neither observer runs at all. (note, 6 December 2019) [Markdown](https://omaralbeik.com/en/blog/property-observers-old-and-new-value.md) - [A typealias can take a type parameter](https://omaralbeik.com/en/blog/generics-in-typealias): Name a completion signature once and spell it Handler at every call site. Readable, and a single place to change the error type. Documentation the compiler spell-checks, and nothing more. (note, 5 December 2019) [Markdown](https://omaralbeik.com/en/blog/generics-in-typealias.md) - [When to use a safe collection subscript](https://omaralbeik.com/en/blog/safe-collection-subscript): Should an out-of-bounds index crash, or come back nil? It turns on whether you produced the index or someone else did — plus one performance trap on collections that are not arrays. (note, 12 July 2019) [Markdown](https://omaralbeik.com/en/blog/safe-collection-subscript.md) ## Posts (Arabic) - [دليل Cloudflare Workers: من أول طلب إلى تطبيق يعمل](https://omaralbeik.com/ar/blog/series/cloudflare/understanding-cloudflare-workers): دليل عملي لفهم Cloudflare Workers وبناء واجهة برمجية باستخدام Hono: من تقدير مدة قراءة النصوص إلى النشر وربط الخدمات ومتابعة الأداء والتكلفة. (tutorial, 21 أيلول 2026, بناء التطبيقات على Cloudflare part 3) [Markdown](https://omaralbeik.com/ar/blog/series/cloudflare/understanding-cloudflare-workers.md) - [دليل Cloudflare DNS: من شراء النطاق إلى تشغيل الموقع](https://omaralbeik.com/ar/blog/series/cloudflare/understanding-cloudflare-dns): من اختيار مسجّل النطاق إلى ضبط الموقع والبريد وحل المشكلات: دليل عملي لخدمة DNS على Cloudflare، مع رسوم توضيحية وأوامر يمكنك تجربتها. (tutorial, 17 أيلول 2026, بناء التطبيقات على Cloudflare part 2) [Markdown](https://omaralbeik.com/ar/blog/series/cloudflare/understanding-cloudflare-dns.md) - [مدخل إلى منظومة Cloudflare](https://omaralbeik.com/ar/blog/series/cloudflare/introduction-to-cloudflare): كيف تتكامل خدمات الشبكات والحماية وتشغيل التطبيقات والتخزين في Cloudflare، مع مثال من Unblock Syria وتوضيح لما يشمله اشتراك Workers الذي يبدأ بخمسة دولارات. (article, 7 أيلول 2026, بناء التطبيقات على Cloudflare part 1) [Markdown](https://omaralbeik.com/ar/blog/series/cloudflare/introduction-to-cloudflare.md) - [معاينات الروابط بنص عربي سليم](https://omaralbeik.com/ar/blog/link-previews-that-work-in-arabic): توليد صور معاينة الروابط وقت البناء أو عند الطلب، ومعالجة ترتيب النص العربي ووصل حروفه وقياسه. أمثلة من هذا الموقع وUnblock Syria. (tutorial, 31 آب 2026) [Markdown](https://omaralbeik.com/ar/blog/link-previews-that-work-in-arabic.md) - [سوريا خارج القائمة](https://omaralbeik.com/ar/blog/syria-is-off-the-list): دخلت سوريا قائمة الدول الراعية للإرهاب سنة 1979، وخرجت منها يوم الاثنين. كتبت عن آثار القرار في Unblock Syria. هنا أكتب عن الفرح به، والغضب من كل ما سبقه. (note, 26 آب 2026) [Markdown](https://omaralbeik.com/ar/blog/syria-is-off-the-list.md) - [لماذا يُخطئ الذكاء الاصطناعيّ في الخطّ العربيّ](https://omaralbeik.com/ar/blog/why-ai-gets-arabic-calligraphy-wrong): تقدمت النماذج في قراءة النصوص العربية، لكنها ما زالت تخطئ في اللوحات الخطية. بحث في قواعد الخط، وبيانات حركة القلم، وما يمكن تعلمه من تصحيح المعلم. (article, 7 آب 2026) [Markdown](https://omaralbeik.com/ar/blog/why-ai-gets-arabic-calligraphy-wrong.md) - [ربط libVLC بـ‏Swift 6 مباشرةً](https://omaralbeik.com/ar/blog/binding-libvlc-directly-from-swift-6): استغرق بناء SwiftVLC أربعة أشهر ونصفًا وخمسًا وعشرين رقعة على VLC. تجربة الربط المباشر مع C، من إدارة الذاكرة والأحداث إلى ميزة صورة داخل صورة التي ما زالت تحتاج إلى عمل. (article, 3 آب 2026) [Markdown](https://omaralbeik.com/ar/blog/binding-libvlc-directly-from-swift-6.md) - [تنظيم إضافات Swift في فضاء أسماء مستقل](https://omaralbeik.com/ar/blog/namespace-your-swift-extensions): بعد مئات الإضافات في SwifterSwift، ظهرت تعارضات الأسماء وازدحمت اقتراحات الإكمال. كيف يساعد فضاء أسماء مستقل، ولماذا يصعب إدخاله بعد إصدار المكتبة؟ (article, 19 شباط 2022) [Markdown](https://omaralbeik.com/ar/blog/namespace-your-swift-extensions.md) - [استخدام SSH تلقائيًا بدل HTTPS في Git](https://omaralbeik.com/ar/blog/enforce-ssh-instead-of-https-for-git-operations): إعداد مفاتيح SSH لحسابات Git، ثم تحويل روابط HTTPS تلقائيًا، بما فيها روابط الوحدات الفرعية والتبعيات التي لا تتحكم في ملفاتها. (tutorial, 23 آب 2021) [Markdown](https://omaralbeik.com/ar/blog/enforce-ssh-instead-of-https-for-git-operations.md) - [ثلاث مقارنات تفعلها المكتبة القياسيّة عنك](https://omaralbeik.com/ar/blog/let-the-standard-library-compare): ثلاث طرق للاستفادة من مكتبة Swift القياسية: العثور على أول عنصر مطابق، والترتيب بأكثر من معيار، وفحص حدود الفهارس دون افتراض أنها تبدأ من الصفر. (note, 16 كانون الأول 2019) [Markdown](https://omaralbeik.com/ar/blog/let-the-standard-library-compare.md) - [القيمتان القديمة والجديدة في willSet وdidSet](https://omaralbeik.com/ar/blog/property-observers-old-and-new-value): تتيح willSet وdidSet الوصول إلى القيمتين الجديدة والقديمة بأسماء جاهزة. تعرّف إلى وقت تشغيلهما، وما يحدث أثناء التهيئة وعند إعادة إسناد القيمة نفسها. (note, 6 كانون الأول 2019) [Markdown](https://omaralbeik.com/ar/blog/property-observers-old-and-new-value.md) - [استخدام الأنواع العامة مع typealias في Swift](https://omaralbeik.com/ar/blog/generics-in-typealias): استخدم typealias لتسمية دوال الإكمال وتوحيد توقيعاتها، مع تغيير نوع الاستجابة حسب الحاجة. اسم أوضح للشيفرة، دون إنشاء نوع جديد. (note, 5 كانون الأول 2019) [Markdown](https://omaralbeik.com/ar/blog/generics-in-typealias.md) - [متى نحتاج إلى subscript آمن في Swift؟](https://omaralbeik.com/ar/blog/safe-collection-subscript): متى يكون إرجاع nil عند فهرس غير صالح مفيدًا، ومتى يخفي خطأ في الشيفرة؟ اختيار subscript آمن يعتمد على مصدر الفهرس وتكلفة فحصه. (note, 12 تموز 2019) [Markdown](https://omaralbeik.com/ar/blog/safe-collection-subscript.md) ## Open source - [SwiftVLC](https://github.com/harflabs/SwiftVLC): A Swift wrapper around libVLC for iOS, macOS, tvOS, visionOS, and Mac Catalyst. Built for @Observable, async/await, and SwiftUI rather than the Objective-C and KVO of VLCKit. - [MarqueeText](https://github.com/harflabs/MarqueeText): A lightweight SwiftUI component that scrolls text only when it overflows its container, with RTL layouts and reduced-motion handling. - [Drops](https://github.com/omaralbeik/Drops): A micro-framework for the alerts iOS shows itself — the pasteboard copy banner, the Apple Pencil connection notice — with queueing, tap actions, and VoiceOver support. - [SwifterSwift](https://github.com/SwifterSwift/SwifterSwift): A collection of over 500 native Swift extensions — handy methods, syntactic sugar, and performance improvements for iOS, macOS, tvOS, and watchOS. ## Optional - [Full text, both languages](https://omaralbeik.com/llms-full.txt): every post, concatenated, newest first. - [Full text, English only](https://omaralbeik.com/en/llms-full.txt): the same, one language. - [Full text, Arabic only](https://omaralbeik.com/ar/llms-full.txt): the same, one language. - [Sitemap](https://omaralbeik.com/sitemap-index.xml): every canonical URL.