I'm a software engineer based in Saudi Arabia. I build things end-to-end β from the database schema and the API to the UI and the infrastructure that runs it all. Most of what I make is either a production SaaS product or an AI tool that solves a specific, real problem.
A loyalty platform built for the Saudi market. Merchants issue and manage loyalty points through a branded portal; customers track their balance, tier status, and transaction history through a separate portal. The whole system runs on AWS β Fastify on Lambda, DynamoDB, CloudFront β managed with Terraform and deployed as a monorepo. I designed the data model, built both dashboards in Next.js, and wrote all the infrastructure.
A product discovery and aggregation platform for Saudi e-commerce. Merchants on Salla and Zid connect their stores and their products surface in a single unified shelf β searchable, filterable, and sorted by what's actually trending. The goal was to give small Saudi merchants the kind of visibility that usually requires a paid ad budget.
A developer tool for anyone using AI coding agents. It indexes every Claude Code session β every tool call, file edit, and decision β into a local SQLite database you can query however you like. The idea came from my own frustration of watching agents repeat the same mistakes across sessions with no memory of what went wrong last time.
An Arabic-speaking navigation assistant for visually impaired users, built with zero-shot vision-language models. The Arabic-first design was intentional β most accessibility tools in this space assume English. This started as a university project and ended up being something I was genuinely proud of shipping.
A RAG-powered support companion for drug awareness, using Llama 3.1. Built to feel like a conversation rather than a lookup table β the goal was approachability for people who wouldn't otherwise seek out information on their own.
Bug fixes and features shipped to production open-source projects:
| Project | What I fixed / added |
|---|---|
| pallets/click | Added missing skipif markers to surrogate-filename tests that failed on non-UTF-8 filesystems |
| scrapy/scrapy | Fixed pathlib.Path feed URIs being URL-encoded, breaking %-format specifiers in filenames |
| aio-libs/aiohttp | Fixed BodyPartReader.read() returning bytearray instead of bytes, breaking JSON serialization |
| marshmallow-code/marshmallow | Fixed get_value raising TypeError on out-of-range integer indexes instead of returning the default |
| open-telemetry/opentelemetry-js | Fixed timeInputToHrTime misclassifying epoch-ms timestamps as relative readings due to clock skew |
| open-webui/open-webui | Fixed silent failure when LLM calls a non-existent tool name β now returns structured error feedback |
| sveltejs/language-tools | Fixed optional properties completing without ? in the completion label |
| dask/distributed | Replaced wall-clock boundary in get_task_stream context manager with a monotonic append index |
| mozilla/pilo | Added inactivity timeout to LLM stream consumption, preventing silent hangs on stalled providers |
| Lightning-AI/litData | Fixed lexicographic chunk ordering in train_test_split corrupting datasets with 10+ chunks |
| elevenlabs/packages | Fixed PingEvent.ping_ms type to allow null; added missing Ping wrapper to exports barrel |
| excaliburjs/Excalibur | Fixed per-particle z config being ignored when ParticleTransform.Global is set |
| unjs/ofetch | Fixed instanceof guards running after value.buffer check in isJSONSerializable |
| apache/solr-orbit | Added fallback to Cores API when delete-collection runs against standalone (non-cloud) Solr |
| openwisp/openwisp-notifications | Fixed get_user_email_preference ignoring the notification type default for org-less shared targets |
| barebaric/rayforge | Fixed ValueError crash when deleting the currently active machine |
| snw-mint/fluent-new-tab | Fixed hardcoded English <title> not being wired into the extension's i18n system |
| go-via/via | Added reason label (client/shutdown/ttl) to the via.sse.disconnect metrics counter |
| NEAR-DevHub/trezu | Fixed bulk payment amounts ~1000Γ too small when input used comma as thousands separator |
| pewdiepie-archdaemon/odysseus | Added GET /api/history/stats endpoint for zero-config token and session usage aggregation |
| 0b01001001/spectree | Fixed NameError crash on TYPE_CHECKING-only return annotations in annotations=True mode |
| OWASP/cve-lite-cli | Added 100% test coverage for validate.ts; extracted pluralize utility across 8 files |
| repowise-dev/repowise | Fixed structlog output polluting --format json stdout |
| 404-PF/commit-echo | Fixed git error swallowing, dollar-sign corruption in prompt expansion, bullet-list parsing |



