<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Omar Albeik</title><description>Software engineer · product designer · digital transformation advisor</description><link>https://omaralbeik.com</link><language>en</language><atom:link href="https://omaralbeik.com/en/rss.xml" rel="self" type="application/rss+xml"/><atom:link href="https://omaralbeik.com/ar/rss.xml" rel="alternate" type="application/rss+xml" hreflang="ar" title="عمر البيك"/><lastBuildDate>Mon, 21 Sep 2026 00:00:00 GMT</lastBuildDate><item><title>Cloudflare Workers: from a request to a running application</title><link>https://omaralbeik.com/en/blog/series/cloudflare/understanding-cloudflare-workers</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/series/cloudflare/understanding-cloudflare-workers</guid><description>Understand the Workers runtime, build a bilingual reading-time API with Hono, and follow it through local development, deployment, bindings, costs, and debugging.</description><pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate><category>infrastructure</category></item><item><title>Cloudflare DNS: from buying a domain to a working website</title><link>https://omaralbeik.com/en/blog/series/cloudflare/understanding-cloudflare-dns</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/series/cloudflare/understanding-cloudflare-dns</guid><description>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.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><category>infrastructure</category></item><item><title>An introduction to Cloudflare&apos;s ecosystem</title><link>https://omaralbeik.com/en/blog/series/cloudflare/introduction-to-cloudflare</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/series/cloudflare/introduction-to-cloudflare</guid><description>How Cloudflare&apos;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.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><category>infrastructure</category></item><item><title>Drawing link previews that work in Arabic</title><link>https://omaralbeik.com/en/blog/link-previews-that-work-in-arabic</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/link-previews-that-work-in-arabic</guid><description>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.</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><category>typography</category><category>tooling</category><category>software</category><category>engineering</category></item><item><title>Syria is off the list</title><link>https://omaralbeik.com/en/blog/syria-is-off-the-list</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/syria-is-off-the-list</guid><description>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&apos;m happy, and still angry.</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><category>syria</category><category>politics</category></item><item><title>Why AI gets Arabic calligraphy wrong</title><link>https://omaralbeik.com/en/blog/why-ai-gets-arabic-calligraphy-wrong</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/why-ai-gets-arabic-calligraphy-wrong</guid><description>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.</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><category>calligraphy</category><category>typography</category><category>ai</category><category>software</category><category>engineering</category></item><item><title>Binding libVLC directly from Swift 6</title><link>https://omaralbeik.com/en/blog/binding-libvlc-directly-from-swift-6</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/binding-libvlc-directly-from-swift-6</guid><description>Four and a half months, twenty-five patches carried against VLC&apos;s own source, and one feature I still cannot ship. What it takes to own a C engine instead of consuming one.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><category>swift</category><category>open-source</category><category>software</category><category>engineering</category></item><item><title>Namespace your Swift extensions</title><link>https://omaralbeik.com/en/blog/namespace-your-swift-extensions</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/namespace-your-swift-extensions</guid><description>Add a member to a type you do not own and it lands in that type&apos;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.</description><pubDate>Sat, 19 Feb 2022 00:00:00 GMT</pubDate><category>swift</category><category>api-design</category><category>open-source</category><category>software</category><category>engineering</category></item><item><title>Enforce SSH instead of HTTPS for Git operations</title><link>https://omaralbeik.com/en/blog/enforce-ssh-instead-of-https-for-git-operations</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/enforce-ssh-instead-of-https-for-git-operations</guid><description>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&apos;s submodules and lockfiles.</description><pubDate>Mon, 23 Aug 2021 00:00:00 GMT</pubDate><category>tooling</category><category>software</category><category>engineering</category></item><item><title>Three comparisons the standard library already does</title><link>https://omaralbeik.com/en/blog/let-the-standard-library-compare</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/let-the-standard-library-compare</guid><description>first(where:) instead of filter().first. Comparable tuples instead of nested comparisons. indices.contains instead of a hand-rolled range check.</description><pubDate>Mon, 16 Dec 2019 00:00:00 GMT</pubDate><category>swift</category><category>software</category><category>engineering</category></item><item><title>Property observers already give you the old and new value</title><link>https://omaralbeik.com/en/blog/property-observers-old-and-new-value</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/property-observers-old-and-new-value</guid><description>willSet and didSet already hand you newValue and oldValue without being asked. Then there are three situations where neither observer runs at all.</description><pubDate>Fri, 06 Dec 2019 00:00:00 GMT</pubDate><category>swift</category><category>software</category><category>engineering</category></item><item><title>A typealias can take a type parameter</title><link>https://omaralbeik.com/en/blog/generics-in-typealias</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/generics-in-typealias</guid><description>Name a completion signature once and spell it Handler&lt;Post&gt; at every call site. Readable, and a single place to change the error type. Documentation the compiler spell-checks, and nothing more.</description><pubDate>Thu, 05 Dec 2019 00:00:00 GMT</pubDate><category>swift</category><category>api-design</category><category>software</category><category>engineering</category></item><item><title>When to use a safe collection subscript</title><link>https://omaralbeik.com/en/blog/safe-collection-subscript</link><guid isPermaLink="true">https://omaralbeik.com/en/blog/safe-collection-subscript</guid><description>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.</description><pubDate>Fri, 12 Jul 2019 00:00:00 GMT</pubDate><category>swift</category><category>api-design</category><category>software</category><category>engineering</category></item></channel></rss>