Open to interesting problems

Engineer, game developer, always building something.

I build software that ships: mobile apps, web platforms, real-time 3D. I also make games, which is where most of this started.

01

Project Chronicles

  • 3D Indoor Navigation & Map Editor

    Production

    Media Gallery

    3D Indoor Navigation & Map Editor

    Problem
    Indoor spaces have no satellite view and no street layer, so wayfinding inside a large venue has to be built rather than borrowed. That means two products at once: a navigable 3D map for visitors, and an authoring tool good enough that producing a new venue is a day's work rather than a project.
    Architecture
    A 3D map visitors navigate in the browser, and the editor used to author it. Proprietary commercial software, so what follows describes the shape of the work and my part in it rather than how any of it is built.
    • TypeScript
    • Three.js
    • React
    • WebGL
  • Yalla Aloha

    In Development

    Media Gallery

    Yalla Aloha

    Problem
    A travel platform with two web front ends over one API, where the schema changes constantly because the product is still being discovered. The risk is not writing the code — it is the API and the two clients drifting apart quietly, and nobody noticing until a page breaks in front of a customer.
    Architecture
    A NestJS service on Fastify over PostgreSQL, whose OpenAPI document is generated, linted against a custom ruleset, and diffed against the previous version to catch breaking changes before they merge. Both React front ends generate their client from that document, and CI fails if the committed client no longer matches it.
    • TypeScript
    • React
    • NestJS
    • PostgreSQL
    • Bun
  • ziadgaser.sh

    Dual-view

    Media Gallery

    ziadgaser.sh

    Problem
    This site is two complete visual identities over one set of content, with a hidden terminal as the only door between them. The hard part is not the second skin — it is that both live in the same document at the same time, so every root-level assumption a page normally gets to make stops being true.
    Architecture
    One Tailwind theme whose token values are overridden under a `data-view` attribute, so the same utility classes re-skin at runtime. The default view is static HTML with no framework on the page; the second mounts from a lazy chunk on transition. Shared behaviour lives in framework-agnostic DOM modules both sides call, so neither view has to adopt the other's runtime.
    • Astro
    • Svelte 5
    • Tailwind v4
    • TypeScript
    • Docker
  • Safaria Travel Platform

    Production

    Media Gallery

    Safaria Travel Platform

    Problem
    Two audiences with almost nothing in common — travellers browsing and booking trips, agencies building and selling them — but one product, one API and one design language. Building them as separate apps duplicates everything; building them as one app serves neither well.
    Architecture
    Two Flutter apps over a private shared package that carries the design system, networking and domain layer, consumed through a package registry at a pinned version rather than a branch. Behind them a NestJS service whose OpenAPI document generates the typed Dart client both apps call, so a contract change surfaces at compile time instead of in production.
    • Flutter
    • Dart
    • NestJS
    • MongoDB
    • Docker
    Visit Safaria
  • Duetwo

    Procedural

    Media Gallery

    Duetwo

    Problem
    Duet's obstacle course is hand-authored and finite. Rebuilding that feel as an endless runner meant generating the course at runtime instead — every chunk guaranteed passable, never visibly repeating, and steadily harder, with no level designer in the loop.
    Architecture
    Weighted prefab pools pick each chunk, placed against the previous chunk's measured world extents so spacing stays clearable, and spawned only once the previous one enters frame. One speed scalar drives fall rate, rotation, difficulty mix and scoring together. The HUD is the screen border itself — a line tracing the edge, its legs proportioned from real screen dimensions so a point of health costs the same pixels on any aspect ratio.
    • Unity
    • C#
    • URP 2D
    • DOTween
  • A Fragment of Time

    Roguelike

    Media Gallery

    A Fragment of Time

    Problem
    Time manipulation is usually a cutscene or a rewind button. Here it is the verb you play with — the thing you spend, plan around and can break. Making that legible on a hex grid, turn by turn, is the whole design problem.
    Architecture
    A step-based strategy roguelike in Unity on a custom hexagonal tile system, where each action advances the world one step and time itself is the resource being manipulated. Pixel art iterated live through an Aseprite hot-reload pipeline.
    • Unity
    • C#
    • Aseprite
    Play the Demo
  • CMD Hero Fights

    Tactics

    Media Gallery

    CMD Hero Fights

    Problem
    A one-versus-one tactical duel where nothing is left to chance: no dice, no shuffled draw order, no hidden randomness. Both players see the same board and the same options, so a loss is always a decision rather than a roll — which puts all the design weight on the cost of each move.
    Architecture
    A deterministic card duel on a grid, built in TypeScript. Every attack, card and ability spends from one shared pool of move points, so a turn is an allocation puzzle rather than a sequence of free actions, and each hero runs on a different resource entirely.
    • TypeScript
    Play the Demo
  • Blocky Runner

    Endless Runner

    Media Gallery

    Blocky Runner

    Problem
    An endless runner needs endless level, and hand-placing platforms one at a time does not scale past the first minute of play. The interesting problem was not the running — it was building the tools that make laying out track fast enough to be worth doing.
    Architecture
    A 3D endless runner in Unity where the level scrolls continuously past the player, built alongside a set of custom Unity editor tools for authoring track — placing platforms, slicing and combining them, and generating spreads.
    • Unity
    • C#
    Play the Demo
  • Geomagnetic Storm Forecasting

    Forecasting

    Media Gallery

    Geomagnetic Storm Forecasting

    Problem
    Geomagnetic storms disturb satellites, navigation and power grids, and the warning available is short. Forecasting the Kp index a day ahead from solar wind measurements is a noisy, heavily imbalanced sequence problem — quiet hours vastly outnumber stormy ones, and the storms are the only part anyone cares about getting right.
    Architecture
    A stacked GRU trained on decades of hourly OMNI2 solar-wind data, reading a 24-hour window and emitting the next 24 hours of Kp in one shot. Which of the dataset's columns it reads was itself decided by particle swarm optimisation — the subject of the IEEE paper. Exported to TensorFlow Lite so inference runs from a small runtime, and served behind Flask to a React front end that charts the forecast alongside the conditions that produced it.
    • TensorFlow
    • Python
    • Flask
    • React
    • Docker
  • Fruit-Sorting Robot Arm

    Robotics

    Media Gallery

    Fruit-Sorting Robot Arm

    Problem
    Closing the loop from a camera frame to physical motion, on hardware with no feedback of its own. A vision model can say which fruit is ripe; a six-servo arm can only be told angles. Everything between those two facts had to be built, wired and powered.
    Architecture
    Three stages joined by a serial link: a Python front end that finds the arm by handshaking every serial port on the machine, a hosted vision model that classifies each captured frame, and an Arduino state machine that turns a single command byte into a sequenced pick-and-place. Poses are declared as named angle constants and motions compose them, so the arm's vocabulary is data rather than control flow.
    • Arduino
    • Python
    • OpenCV
    • Roboflow
  • Egyptian Car Plate Recognition

    Computer Vision

    Media Gallery

    Egyptian Car Plate Recognition

    Problem
    Reading Egyptian number plates, which are set in Arabic letters and Arabic-Indic digits rather than Latin characters. No off-the-shelf dataset existed, and the alphabet turned out to be a harder problem than the model — the same digit has two Unicode code points that render identically.
    Architecture
    A convolutional trunk over a 128x64 grayscale crop, splitting into seven parallel softmax heads — one per character position, with a blank class for plates shorter than seven. Fixed-width classification rather than sequence decoding, which suits a format whose length is bounded and whose characters never touch.
    • TensorFlow
    • Keras
    • OpenCV
    • Python
02

Technical Arsenal

Frontend & Mobile

  • TypeScript
  • React
  • Next.js
  • Astro
  • Svelte
  • Flutter
  • Dart
  • Tailwind CSS

Backend & Data

  • NestJS
  • Prisma ORM
  • PostgreSQL
  • MongoDB
  • Flask
  • Bun

Games, 3D & Graphics

  • Unity
  • C#
  • Three.js
  • WebGL

ML, Vision & Embedded

  • Python
  • TensorFlow
  • Keras
  • OpenCV
  • Arduino

Infrastructure & DevOps

  • Docker
  • Nginx
  • AWS
  • CI/CD Pipelines

APIs & Messaging

  • OpenAPI
  • REST
  • WebSockets
  • Redis
03

What I do

Product Engineering

Shipping complete products rather than features — mobile, web, and the services behind them, from first commit to store listing.

Real-Time 3D

Interactive 3D on the web and in engines: navigation, rendering, and the authoring tools that make content for it.

Games & Design

Designing and building games — mechanics first, with tooling so the content pipeline keeps up with the ideas.

04

The Narrative

Games came first. I wanted to make the things I was playing, which meant learning to program — and that turned into work that keeps widening: mobile apps, web platforms, machine learning, a robot arm, 3D indoor navigation.

Looking at my own projects, I notice I keep ending up on the whole problem rather than one layer of it. I wired the arm and trained the model that told it what to pick up. I build the map editor and then use it to build the maps. It isn't a strategy — the interesting part is usually the seam between two things nobody owns.

The next thing on that list is a Master's in Computer Science. Most of what I know came from building things, and I would rather have the theory underneath that than keep deriving it as I go.

Outside of the digital void, you can find me exploring the physical world through outdoor photography,reading a book, or immersed in the complex rhythms of metal music.

05

Initiate Protocol

Got something you want built?

No pitch needed — a rough idea is enough to start.