Software Engineer — Cairo / Abu Dhabi

MarwanAbudaif

Software Engineer, METI · Computer Engineering senior, AUC · Graduating Dec 2026

I like the problems that only surface under load — frame budgets, packet loss, query counts, and race conditions that depend on how fast your screen refreshes.

Status
Open to SWE rolesAvailable from Jan 2027
In production
18 monthsFour products shipped
Specialism
Two geospatial platformsAqtar + GuloGulo, both shipped
Solo build
MVS Client PortalSole engineer, Laravel + Next.js
Authorization
Egypt + UAE residencyTwo markets, no sponsorship
Hiring for

Station 01 — Record

Eighteen months of production work

RoboGarden is a subsidiary of Micro Engineering Tech, a Calgary software and geomatics firm — which is where the geospatial specialism comes from.

Jun 2025 —present
Remote · Canada

Software Engineer

METI Software (Micro Engineering Tech) — promoted from Frontend Intern

Four products delivered back-to-back — from a ten-engineer Jira and Bitbucket process on one, to sole ownership of the entire stack on another.

MVS Client PortalAug–Sep 2026 · solo
Sole engineer on a multi-tenant Laravel 12 + Next.js 16 product — nine features across three roles, 30 migrations and 49 test classes. Engagement health is computed on read, never stored — a stored score is a score that can go stale — which collapsed a naive per-screen implementation from 21 queries to 3.
naive
21
shipped
3

Unauthorized clients get a 404, not a 403, and the role check runs first so nothing leaks through the error itself.

AqtarOct 2025–Jan 2026 · ~10 eng
Saudi-facing B2B geospatial services marketplace — topographic, hydrographic and aerial data. Owned the Ratings & Reviews module, content reporting and moderation end-to-end, admin user management, and the EN/AR localisation layer. 195 commits across the engagement, third-largest contributor on the team.
GuloGulo DMTMay–Sep 2026 · team of 7
Geospatial AI platform on Laravel + PostGIS. Owned chat, datasets and settings — 8 merged pull requests — including a resumable multipart upload engine for 40 GiB archives behind a hand-written SSE parser that degrades to polling under full-jitter backoff.
AI Author ToolMar–Apr 2026 · Angular
Parses uploaded documents into structured courses. Shipped the Lesson → Sections → Bricks hierarchy, drag-and-drop reordering, content bricks, three phases of EN/AR localisation with RTL, and the SSE course-generation progress stream.
Aug 2026
Cairo, Egypt

Software Engineering Intern

Pulse (formerly Giza Systems) — BOOKSHELF

Four-week placement. Sole author of the delivered Angular 22 application — ~3.8k lines of signals-based state, typed reactive forms and route guards over a six-route access matrix — then wrote the API spec the team would build against: a versioned /api/v1 contract, a consistent error envelope, and an optimistic-concurrency version field.

Aug 2025
Cairo, Egypt

Fixed Networks R&D Intern

Nokia & WE Telecom

An exploratory placement on predictive diagnostics for FTTH optical networks — Python time-series work against the team's network simulator.

Jan–Jun 2025
Cairo, Egypt

Technical Curriculum Lead & Instructor

RoboGarden — a Micro Engineering Tech (METI) company

50+ hours of curriculum across Python, JavaScript and web fundamentals, with auto-grader scripts and lab scaffolding. 100% pilot-cohort satisfaction.

Station 02 — Instrument 01

Why you don't check every pair

The uniform spatial hash GeoFighters uses for enemy separation, running live below. Flip it to the naive all-pairs sweep and watch the check counter — and the frame budget — go.

I-01 Broadphase
Agents
560
Pair checks / frame
—
Sim time / frame
—
Frame rate
—
Occupied cells
—

Shipped detail. The real engine pairs this with an allocation-free circle-versus-AABB path — collideAABB takes a caller-owned scratch object, so the hot path allocates nothing and the convenience wrapper is documented as one-off-only. Broadphase alone isn't the win; broadphase that doesn't produce garbage is.

Station 03 — Selected work

Selected work

Use the lens at the top of the page to re-rank these for the role you're filling.

GEM Tours — Project Horus

Solo

Next.js 16 · Vertex AI · Firestore vector index · Capacitor

Point a phone at an artifact in the Grand Egyptian Museum and hear its history in your language. 18k lines across 72 modules. Multimodal embeddings in a 1408-dimension vector index identify it in under 300 ms.

Inference cost treated as an architectural constraint: a three-tier cache ending in a shared Firestore store, so one visitor's generation serves every later visitor — ~$0.008 per visitor. Arabic-first, not retrofitted.

2026

GeoFighters 2.0

Solo

TypeScript · Three.js · Svelte 5 · Rapier WASM · miniplex ECS · WebRTC

A browser-native co-op 3D shooter, 45k lines of it. Host-star WebRTC topology with 30 Hz snapshots on unreliable, unordered SCTP channels — see Instrument 02. TURN on :443/TCP after finding CGNAT is the norm on Egyptian and UAE mobile carriers, which is exactly the Capacitor build's audience.

Frame limiter skips frames before any work while the clock keeps accumulating, so the simulation stays real-time: 160 → 59 fps.

CARRY — After Hours Bowling

Solo

Three.js · Rapier · Capacitor · esbuild

16.5k lines with 17 test suites — one of which exists because of the bug in Instrument 03. Stone pins are genuinely heavier and resist falling; Glass pins genuinely lighter and fly. The pocket read grades arrival position, angle, pace and first contact, and can never cost you anything: ignore the system and you score exactly what you would have before it existed.

2026

TELOS II — Senior Thesis

Siemens-sponsored · team of 7 · lead

FastAPI · Python · React · LLM evaluation · industry co-supervised

Measuring LLM sycophancy: can a recommendation adapt to evidence while resisting conversational pressure? The architecture's answer is that the model renders but never decides — action authority sits in a versioned, SHA-256-pinned YAML policy behind an independent decision guard, and the renderer gets a deep copy so it cannot mutate the decision.

Evaluation protocol is predeclared: 288 outputs per model per domain, with parse failures counted rather than silently discarded and a runtime fallback treated as a delivered outcome, not an exclusion. The README states plainly what it is not.

2026–

MVS Client Portal

METI · sole engineer

Laravel 12 · Next.js 16 · React 19 · MySQL · Playwright

A whole multi-tenant product, start to finish, alone. The interesting part is what it deliberately doesn't use: no data-fetching library, no form library, no client-state library, no schema-validation library — each decision written down in an ADR rather than defended after the fact.

2026

Smart Red-Light Detection

Solo

C · FreeRTOS 11.1 · TM4C123GXL Cortex-M4 · arm-none-eabi-gcc

Six tasks across four priority levels, communicating only through queues, in an 11 KB image. SensorTask polls at 50 Hz behind a 150–2000 ms dwell-time filter that rejects both fast swipes and parked objects; ViolationTask is a pure dispatcher fanning out to independent alert, camera and log consumers.

Concurrency reasoned about rather than reflexively locked: the shared light state is single-writer/single-reader and documented as safe unlocked on this core, while UART — genuinely contended by three tasks — is mutex-protected.

Indoor positioning without beacons

Inside GEM Tours

DeviceMotion API · IMU dead reckoning · QR drift reset

PedestrianTracker.ts — step detection over raw device motion (1.2 g threshold, 0.7 m stride, five-sample moving average) integrated with heading into a running position estimate, then dead-reckoning drift reset at QR checkpoints. No beacons, no infrastructure, no per-museum install. Paired with haptic proximity feedback.

2026

Pixel-Perfect

Solo

PyTorch · ESRGAN · RRDBNet · PSNR / SSIM / LPIPS

GAN super-resolution for pixel art over an ~89,000-image corpus, with a custom edge-aware sharpness loss. The decision worth the interview: training pairs are built by nearest-neighbour downsampling rather than bicubic, so the low-resolution input keeps blocky geometry instead of inventing smooth intermediates the model then learns to expect.

GymTrack

Solo

SwiftUI · SwiftData · Swift Charts · zero dependencies

Rewritten from a Next.js PWA to 7.3k lines of native Swift with no third-party packages at all. Personal records recognised on estimated 1RM, so heavier-for-fewer and lighter-for-more both count; kilograms are canonical in storage so switching units never rewrites history; unfinished sessions survive a force-quit and auto-close after twelve hours.

GitHub ↗2025–26

BMO — agent host

Solo

LiteLLM · MCP · launchd · Tauri · supply-chain audit

Built around its security posture — localhost-only, scoped writes, every dependency version-pinned because the host refetches unpinned npm plugins on every start. A maintainer-to-repository audit caught two namesquatted packages before they ran. Mail and screen contents are treated as data, never as instructions.

2026

GuloGulo DMT

METI · team of 7

Next.js 16 · Laravel 13 · PostgreSQL + PostGIS · SSE · S3

Designed the visualization contract: a chart may never cost the reader the reply — the array is optional, each entry validates in isolation, nothing throws — and only data crosses the boundary. No HTML, script, style, colour, URL or chart config. It enforces the agent schema's own ceilings down to the GeoJSON property-key pattern, and reconciles a documented gap between two generated API specs.

2026

Digital Alarm Clock

Coursework

Verilog · Vivado · AUC Digital Design II

882 lines across 15 modules — including a two-flop synchronizer for the asynchronous button inputs, a debouncer and a rising-edge detector, with the control-path and datapath diagrams to match.

2026

Station 04 — Instrument 02

The same throw, the same seed, a different score

A real bug from CARRY. settled() is not monotone — a knocked pin can roll, go quiet, then hit something else. The shot end was polled once per rendered frame, so a 120 Hz phone stopped inside quiet windows a 30 Hz laptop stepped straight over, and read the rack at a different simulation step.

I-02 Determinism
Display ratePolls the predicateConcluded settled atPins readScore
Seed
—
True final score
—
Agreement across rates
—
Sweep: divergent throws
not run

The fix, and the honest footnote. Latch the shot end inside Alley.step() on the simulation clock, and give Alley.run() ownership of step batching — the render rate stops being an input to the score. Both divergent throws are kept verbatim as regression tests. The panel above reconstructs the failure mode; in the project's own test suite, 2 of 250 legal throws scored differently at 30, 60 and 120 Hz.

Station 05 — Instrument 03

Why ordering hurts

GeoFighters negotiates one channel per peer pair, id 0, ordered:false, maxRetransmits:0. At 30 Hz only the newest snapshot matters, so a lost packet should cost you one frame — not stall every frame behind it. Drag the loss up and watch the reliable lane stutter.

I-03 Transport
Reliable — stalls
0
Reliable — worst freeze
0 ms
Unreliable — worst gap
0 ms
Snapshots dropped
0
Superseded, discarded
0

What stays on the reliable path. Not everything wants this trade. Low-rate traffic that must arrive exactly once — shoot events, chest opens, revives, game-over — deliberately stays on the socket.io relay. And when ICE fails, which it does on roughly 10–15% of networks without TURN, the channel simply never opens and that one peer keeps using the relay. The design degrades per-peer, not per-session.

Station 06 — Toolkit

Toolkit

Highlighted items are the ones carrying production weight day to day.

Programming languages

  • TypeScript
  • PHP 8.3
  • Python
  • Swift
  • C
  • C++
  • SQL
  • Kotlin
  • Verilog

Frontend

  • React 19 / Next.js 16
  • Angular 22
  • Svelte 5
  • Tailwind v4
  • Base UI / shadcn
  • Three.js
  • SwiftUI

Backend & data

  • Laravel 12/13
  • FastAPI
  • Node / socket.io
  • PostgreSQL + PostGIS
  • MySQL
  • SwiftData
  • Firestore

Protocol & transport

  • SSE (hand-written parser)
  • WebRTC / SCTP
  • ICE · STUN · TURN
  • S3 multipart
  • OpenAPI contracts
  • Laravel Echo / Pusher

Testing & quality

  • Playwright
  • PHPUnit
  • Vitest
  • Pytest
  • Determinism harnesses
  • Route × role sweeps

AI & infra

  • LLM evaluation design
  • Vertex AI · Gemini
  • Vector search
  • MCP tooling
  • PyTorch / GAN training
  • Docker
  • Bitbucket Pipelines
  • AWS

Education & certification

  • AZ-900 Azure Fundamentals
  • GPA 3.48 / 4.0 — AUC
  • Study abroad: UC3M Madrid

Spoken languages

  • Arabic — native
  • English — fluent
  • Four bilingual EN/AR products shipped

Station 07 — Contact

Get in touch

Graduating December 2026 and available from January 2027, in Egypt, the UAE, or remote across EMEA.

Work authorization for both Egypt and the UAE, with a full military-service exemption — no visa dependency in either market. The CV is one page and sits at cv.pdf — longer versions for research or referral on request.