Head of Software Engineering · FutureGate Cairo · UTC+3 · —:— local

Adham
Eissa

I build the technical core of consumer products — ML systems, Go backends, production infra. Thirteen shipped; two run solo, end to end.

Websites, mobile apps, and browser games — and the ML, backend, and infrastructure underneath them. Not a generalist who skims every layer: the person the hard layer gets handed to.

80msRanking deadline with automatic fallback
≈5%Of uploads need an LLM. 95% resolve locally
40,000+Simulated hands behind the Tarneeb AI
13Products shipped — web, mobile, ML and games
6+Years shipping production software across backend, mobile and ML
01

Selected work

Thirteen shipped products. The first two get full teardowns further down — the hard problem, the constraint, the architecture, and the number that proves it worked.

  1. Talentify

    Beta on TestFlight · pre-launch

    Case study ↓
    TestFlight ↗

    Short-form video and talent discovery. A two-tower PyTorch recommender served behind an 80 ms deadline, and a multi-modal moderation pipeline that resolves 95% of uploads on local models.

    Go (Gin, GORM) · PyTorch · LightGBM · FastAPI · gRPC · PostgreSQL · Redis · Cloudflare R2 · MinIO · HLS · FFmpeg · BullMQ · Paymob · React Native/TS (Expo, EAS) · React · Docker · Nginx · systemd · Hetzner

  2. Tarneeb

    Shipped · one file · zero dependencies

    Case study ↓

    A Pan-Arab multiplayer card game cloning the Jawaker experience, in a single self-contained HTML file. Correct 7–13 bid scoring, a three-tier strategic AI, a coin economy, tournament flows, and synthesised audio. Monetisation is layered: AdMob, coin packs on region-appropriate payment rails, and tournament rake.

    HTML · CSS · JavaScript · Web Audio · localStorage — no build step

  3. MotorData OBD ELM

    Live · App Store

    App Store ↗

    A car diagnostics app. It talks to an OBD-II/ELM adapter over the car's diagnostic port to read live engine telemetry and fault codes — a real-time protocol problem wearing a consumer app's clothes, since the adapter answers slowly and the UI cannot.

  4. Meso Foods

    Live · e-commerce

    mesofoods.quickzu.com ↗

    Food ordering e-commerce with an accounting system built in. Catalogue, cart and checkout on the customer side; on the other, the ledger that has to agree with every order placed — which is the part of an e-commerce build that actually has to be right.

    Freelance client delivery · custom theming · payment gateway integration

  5. Zero Tech

    Live · e-commerce

    zerotechstores.com ↗

    A second storefront, built on what the first one taught me: catalogue, cart and checkout for a consumer electronics retailer.

  6. Neon Velocity

    Live · playable in browser

    neon-velocity.pages.dev ↗

    A video game that runs in a browser tab. Heavily stylised neon visuals rendered in real time, with no engine, no plugin and no download between the player and the first frame — the frame budget is the whole design constraint.

    JavaScript · WebGL · Web Audio · Cloudflare Pages

  7. Ghassan Ktait

    Live · editorial

    ghassan-ktait.com ↗

    An educational blog for an international professor of human rights, publishing on human rights and on raising children. Editorial layout, long-form reading, and a publishing flow the author can run without me.

    Freelance client delivery · custom theming · performance optimisation

  8. Win 10 Times

    In development

    An app for beating procrastination. In progress — the interesting problem is that the product only works if it changes behaviour, which makes the measurement harder than the build.

Also shipped

02

What I build

Three surfaces, one person. The systems work below is what makes the products on top of it hold up.

Websites Front-ends and full products — hand-written HTML and CSS through to Next.js applications, deployed and operated rather than handed off.
Apps Cross-platform mobile in React Native and Flutter, written against APIs I also own. Submitted to the App Store and Google Play.
Browser games Real-time game loops, WebGL rendering and Web Audio, running in a plain browser tab with no engine and no plugins.
Languages
Go · Python · JavaScript · TypeScript · HTML · CSS
Backend
Gin · Node.js · FastAPI · gRPC · PostgreSQL · Redis
Frontend
Next.js · React · WebGL · Web Audio
Mobile
React Native · Flutter
Cloud & infra
AWS · Azure · Hetzner · Docker · Cloudflare R2
Machine learning
PyTorch · NudeNet · faster-whisper · Detoxify
03

Talentify

Short-form video and talent discovery — a recommender problem wearing a consumer app’s clothes.

Final pre-launch · submitted to both app stores

The problem

A discovery feed is the product. If the first thirty seconds are boring, nothing else in the app matters. But at launch there is no engagement history, no labelled data, and no traffic to learn from — the classic cold start, except the thing that needs bootstrapping is also the thing users judge you on immediately.

Running underneath it is a second problem with a much sharper edge. User-generated video is a trust-and-safety liability from the first upload: one unmoderated clip is not a bad metric, it is an app store removal — and a removal before launch is indistinguishable from never having launched at all.

The constraint
  1. The submission date does not move. A neural ranker is not allowed on the critical path to shipping.
  2. The feed request has a latency budget that a Python model process cannot be trusted with unconditionally.
  3. No ML platform and no GPU serving budget. Everything runs on infrastructure I provision myself.
  4. One engineer owns the model, the API, the pipeline, the client, and the servers.

The ranking system had to be replaceable at runtime, not at deploy time. One person cannot ship a neural ranker and a launch on the same date — so a heuristic ranker carries the MVP while the two-tower model rolls in behind the same interface. Worst case is slightly worse ordering, never no feed.

The architecture

Three pieces follow from that constraint: a serving path that can degrade inside a single request, a retrieval model cheap enough to train without traffic, and a moderation pipeline whose cost does not scale with upload volume. The whole surface it runs on is below.

Surface area owned A five-layer stack — React Native client, Go Gin API, Python ML services, PostgreSQL/Redis/R2 data stores, and Hetzner infrastructure — all designed, built and operated by a single engineer. CLIENT API ML DATA INFRA React Native · TypeScript iOS + Android · submitted to both stores Go · Gin — HTTP API auth · feed · uploads · wallet · moderation orchestration interface-shaped seams · runtime-swappable rankers FastAPI · PyTorch two-tower retrieval gRPC · 80 ms deadline Moderation pipeline frames · audio · text composite score → escalation PostgreSQL system of record Redis hot paths · cache Cloudflare R2 video objects Hetzner · Docker provisioned · deployed · operated
Fig. 01 — Surface area Talentify's whole stack, and every layer of it is one I designed, built, and operate. There is no platform team beneath this diagram and no ML team beside it — which is the condition the three figures that follow were designed under.

Detail Hover, tap or focus any layer to read its note here.

The serving path

The Go service owns the request end to end. Ranking is an interface with two implementations: a heuristic ranker that runs in-process, and a neural ranker that calls the Python service over gRPC. The neural path gets an 80 ms deadline. Deadline exceeded, transport error, and malformed response all resolve the same way — fall back inside the same request, no retry, no queue. The user gets a feed.

Feed serving path Client to Go API to candidate generation to a ranker interface, which attempts a neural ranker over gRPC with an 80 millisecond deadline and falls back to an in-process heuristic ranker on timeout, transport error or malformed response. Client React Native Go · Gin API owns the request Candidate gen corpus → shortlist Ranker interface Rank(ctx, user, cands) Neural ranker · gRPC FastAPI · two-tower → LightGBM Heuristic ranker in-process Go · zero network Ranked feed one response shape primary route · 80 ms deadline · no retry fallback · same request · in-process timeout · rpc error or malformed response → degrade, never fail
Fig. 02 — Feed serving path Black is the primary route; the accent is the exception. The 80 ms deadline is a hard budget rather than a target — past it the request has already fallen back, so the ranking stage is bounded by the timeout and not by the model behind it.

Detail Hover, tap or focus any element to read its note here.

The retrieval model

Two towers, trained jointly. UserTower and VideoTower are separate networks, but they read from the same category embedding table — a user’s taste for a category and a video’s membership in it are literally the same vectors. That is not a parameter-count optimisation; it removes an entire class of alignment problem and behaves far better when the interaction data is sparse, which pre-launch it always is.

Training uses in-batch InfoNCE: every other item in the batch acts as a negative, so a batch of N yields N−1 negatives per positive at no labelling cost. That is what makes the model trainable at the data volume a product actually has before it launches.

But InfoNCE alone gives you ranking — relative order — and nothing else. So there is a BCE auxiliary head on explicit interaction labels, which gives calibration: an absolute probability of engagement. You need both. Relative order tells you what to show first; a calibrated score tells you whether an item belongs in the feed at all.

The towers are the retrieval half. A LightGBM ranker sits behind them and does the ordering: retrieval narrows a corpus to a shortlist cheaply, and a gradient-boosted model — which handles heterogeneous tabular signals far better than an embedding dot product — decides what actually goes first. Both stages live inside the same 80 ms budget.

The heuristic that carries the cold start is not a placeholder either: it scores on quality, recency and affinity, then applies diversity re-ranking so a new user's first feed is varied rather than five clips from one creator.

Two-tower retrieval model A UserTower and a VideoTower both read one shared category embedding table, are L2-normalised, and meet at a dot product supervised by in-batch InfoNCE plus a BCE auxiliary head. In-batch InfoNCE relative order BCE auxiliary calibration u · v cosine on L2-normalised vectors L2 normalise UserTower MLP User features identity · history · affinity L2 normalise VideoTower MLP Video features category · engagement · creator Shared embeddings category table batch of N ⇒ N−1 negatives per positive, free read by both towers — the same parameters, not a copy
Fig. 03 — Two-tower retrieval The accent path is the shared category embedding table feeding both towers — the same parameters rather than two copies, which is what makes the model behave under sparse interaction data. Two losses meet at the top: InfoNCE for order, BCE for calibration.

Detail Hover, tap or focus any element to read its note here.

The moderation pipeline

Every upload fans out across three modalities before it can be published: sampled frames through NudeNet, audio through faster-whisper and then Detoxify on the transcript, and text — caption, title, description — through Detoxify directly. Those become a composite weighted score rather than three independent vetoes, because one channel at 0.6 is a genuinely different situation from three channels sitting at 0.5.

Then the part that matters: two thresholds, not one. A clear pass publishes, a clear fail rejects, and the band in between — roughly 5% of uploads — escalates to the Claude API for a judgement with context. A single threshold on a single model either over-blocks, which kills creator supply on a product that has none yet, or under-blocks, which gets you removed from a store. The band buys both, and it bounds cost by construction: the expensive call only ever sees the ambiguous tail.

Moderation pipeline An upload fans out to frame, audio and text lanes, which combine into a composite weighted score and are gated into publish, reject, or escalation to an LLM for the roughly five percent of uploads that fall between the two thresholds. Upload gated Frame sampler video → frames NudeNet visual channel Audio track demuxed faster-whisper ASR Detoxify audio channel Caption · title description Detoxify text channel Composite score weighted · 3 channels Publish auto Escalate · Claude API ≈5% of uploads Reject auto score < low between thresholds → residual to human queue score > high
Fig. 04 — Moderation Three modalities collapse into one weighted score, gated by two thresholds rather than one. The accent marks everything that is not the ordinary case: the escalation band and the hard reject.

Detail Hover, tap or focus any element to read its note here.

The rest of the system

The feed is the part worth drawing, but it is not the part that took the most time. The same service also carries:

  1. A coin economy with real money in it. Paymob integration, atomic transactional writes, idempotency keys, a signed ledger, and KYC-gated creator withdrawals. A wallet that double-spends once is a wallet nobody trusts again.
  2. A user reporting system spanning the Go backend, the React Native client, and a Python LightGBM scoring service — automated triage, an admin review queue, and a reporter trust score that feeds back into how much weight a report gets.
  3. Dynamic video watermarking built on FFmpeg filtergraphs, orchestrated through BullMQ and Redis queue workers so encoding never blocks a request.
  4. Auth across three providers. Google OAuth 2.0 with PKCE, Apple Sign-In, and cross-provider account linking on a shared email — the case that quietly creates duplicate accounts if you do not handle it deliberately.
  5. Storage and streaming. Cloudflare R2 for zero-egress video, MinIO, PostgreSQL for metadata, Redis for hot caching, HLS for delivery.
  6. A React and TypeScript admin dashboard covering analytics, user management, video moderation, challenges and wallet operations — because a moderation pipeline with no review surface is only half a moderation pipeline.
  7. Store compliance. iOS EAS build and TestFlight upload, plus App Store and Google Play review covering Apple IAP, UGC moderation commitments, age gating and KYC withdrawal flows.
The proof
80msHard deadline on the model hop. Past it the request has already fallen back, so the ranking stage is bounded by the timeout — not by the model.
≈5%Of uploads reach LLM escalation. The other 95% resolve on local models at effectively zero marginal cost.
3Modalities scored on every upload — frames, audio, text — before anything becomes publicly visible.
2Ranker implementations behind one interface. Swapping them is configuration, not an app store release.
0Managed ML platforms, GPU serving bills, or platform engineers. It runs on infrastructure I provisioned myself.
04

Tarneeb

A Pan-Arab multiplayer card game cloning the Jawaker experience — in one self-contained HTML file.

Shipped · one file · zero dependencies

The problem

Tarneeb is the trick-taking partnership game of the Gulf, the Levant and Egypt, and the interesting part is the bid: a commitment of 7 to 13 made under partial information, with scoring that punishes you for missing it. Cloning Jawaker means matching the scoring people already know — an audience that has played thousands of hands will find a rules discrepancy in minutes, and once they do, nothing else about the app gets the benefit of the doubt.

The harder problem is specific to partnership games: your partner is a bot. A weak opponent is a boring game. A weak partner is a broken game — the player loses hands they played correctly, blames the software, and is right to.

The constraint

One self-contained HTML file. No server, no build step, no package manager, no external assets. That rules out audio files, sprite sheets and frameworks — and, most consequentially, it rules out learning anything from real players before shipping. There is no telemetry endpoint and no A/B infrastructure to lean on.

With no way to observe live play, correctness had to be established offline, before release. The deliverable was not just the game — it was a simulation harness credible enough to be the only evidence the AI works.

The architecture

The game is a state machine — deal, bid, thirteen tricks, score the contract, settle the economy — with all state in plain objects and no framework mediating anything. Rendering is a function of state, persistence is localStorage, and every sound is synthesised on demand through the Web Audio API, so the asset payload is exactly zero bytes.

On top of the hand loop sit tournament flows and a layered monetisation model: AdMob, coin packs on region-appropriate payment rails, and tournament rake. The rails matter more than the model — a Gulf player and an Egyptian player do not reach for the same payment method, and a game that only takes one of them has quietly halved its own market.

The three difficulty levels differ in how much information the bot reasons over, not in how often it is told to play badly: hand strength for the bid, then suit and void tracking through play, then inference about what a partner’s plays imply about their hand. Randomised mistakes produce a bot that is weak and incoherent, which players read as broken rather than easy.

Tarneeb hand loop and simulation harness A hand loop of deal, bid, trick play, contract scoring and economy settlement, driven by a three-tier AI, wrapped by a simulation harness that played over forty thousand bot-versus-bot hands to measure a 54 percent Hard-difficulty win rate. Simulation harness — headless, bot vs bot 40,000+ hands · the game loop with the UI removed Deal Bid 7 – 13 Trick play × 13 Score contract Jawaker-compatible Economy coins · XP · achievements Strategic AI — L1 / L2 / L3 reasoning depth, not error injection Hard difficulty ≈ 54% win rate measured over 40,000+ hands next hand drives bidding and card selection the only evidence available pre-launch
Fig. 05 — Hand loop and harness The loop, the AI that drives it, and the harness wrapped around both. With no players to observe, the harness is the instrument — and the measured result is the only evidence that existed before release.

Detail Hover, tap or focus any element to read its note here.

The proof

40,000+ hands, bot against bot. Hard difficulty converges to a ≈54% win rate — and the interesting thing about that number is that 54 is the target, not a ceiling I failed to clear. In a partnership game dealt at random, the deal is most of the variance. A bot winning 90% of its hands is not strong, it is peeking. 54% against the tier below it means the difficulty ladder is real, the AI is genuinely applying skill, and the game is still a game — which is the actual product requirement.

40,000+Simulated hands, played headlessly to verify the rules engine and the AI without a single live player.
≈54%Hard-difficulty win rate — high enough to prove skill, low enough that the game stays a game.
3Difficulty tiers, separated by reasoning depth rather than injected randomness.
1File. No build step, no package manager, no server, no CDN.
0External assets — every sound is synthesised at runtime through the Web Audio API.
05

Method

The two systems have almost nothing in common as products. They have a great deal in common as engineering, because both were built under the same condition: one person, no team to absorb a mistake, and no room for an architecture that needs supervision.

  1. Put the seam where the risk is

    The thing most likely to be late, wrong, or slow gets an interface around it before it is written. Ranking was the least certain part of Talentify, so ranking became the one component with two implementations and a runtime switch — which is why a launch date and a neural model stopped competing for the same calendar.

    Evidence — Fig. 02
  2. Give every remote call a deadline and a defined way to be wrong

    A call across a process boundary has three outcomes, not two: right, wrong, and never. The 80 ms deadline exists so that “never” is bounded, and the in-process fallback exists so that “wrong” is survivable. Neither is a retry, because a retry spends the budget twice on a path that already failed once.

    Evidence — Fig. 02
  3. Spend the expensive resource only on the ambiguous tail

    Cheap local models handle the clear cases; the costly judgement is reserved for the band between the thresholds. That is what keeps a per-upload LLM call from becoming a per-upload LLM bill, and it generalises well past moderation — most classification problems have a confident majority and an expensive minority.

    Evidence — Fig. 04 · ≈5% of uploads
  4. When you cannot measure in production, build the instrument

    Tarneeb had no players to learn from and Talentify had no traffic. In both cases the answer was to construct the measurement rather than wait for it: a headless harness for one, in-batch negatives standing in for a labelled corpus in the other. Shipping without evidence is a choice, and it is usually avoidable.

    Evidence — Fig. 05 · 40,000+ hands
  5. Treat cost as a design input, not a post-mortem

    Object storage picked on egress rates, ASR picked for CPU throughput because there is no GPU budget, frames sampled rather than scored exhaustively, servers provisioned rather than rented through a platform. None of these were optimisations made later; each one changed what got built.

    Evidence — Fig. 01 · Fig. 04
06

Background

Six-plus years of production work. The systems above are the current end of a line that starts with client sites in 2019.

  1. FutureGate

    Head of Software Engineering · 2024 – present · remote

    Lead engineering for a remote-first product studio delivering Talentify and Tarneeb. Direct architecture, backend, mobile and ML across both, and personally own the machine learning stack.

  2. Freelance

    Software engineer · 2019 – present · remote

    Responsive websites and e-commerce stores for a range of clients — custom theming, performance optimisation, third-party integrations and payment gateway setup. Most of the “Also shipped” list above comes from this.

    HTML · CSS · JavaScript · WordPress · Shopify

  3. SBEGY Skateshop

    Founder · 2019 – present · Cairo

    Founded and operate Egypt’s first local skateboarding brand and retail shop, and launched the first fully Egyptian-manufactured complete skateboard. Product design, manufacturing coordination, brand strategy and community programming — the parts of shipping a product that have nothing to do with code.

  4. Education

    BSc · 2021

    Bachelor of Business Information Systems, IAEMS — Cairo.

    CS50 (Harvard) · Ethical Hacking Nanodegree (Udacity) · Cisco Networking Academy: Python, Data Science, Cybersecurity, Modern AI, Operating Systems · iOS Developer Professional (Apple, in progress) · UX Design Certificate (Google, in progress)

Languages

  • ArabicNative.
  • EnglishFluent — C1.
07

Hire me

Senior or staff. Fully remote. US or Europe.

FutureGate is a Cairo-based, remote-first studio. As Head of Software Engineering I lead technical development on Talentify and Tarneeb, and currently run engineering solo: architecture, implementation, deployment, and the calls about what does not get built — which, running two products with one engineer, is the decision made most often and the one that matters most.

The work I am best at is the part where a product’s hardest technical assumption has not been tested yet — recommenders and ranking, real-time backends, and the infrastructure underneath them. I am comfortable owning that, and I have done it without a team to fall back on.

Email
adhameissa129@gmail.com
Work
adham@talentifyapp.com
Phone
+20 10 3242 2581
CV
Download (DOCX)
Based
Cairo, Egypt · UTC+3 — overlapping US and European hours

Colophon — Hand-written HTML, CSS and JavaScript. No framework, no build step, no dependencies, no web fonts, no third-party requests. The five figures are inline SVG whose line is drawn with stroke geometry on first view; there is no looping animation anywhere, and all motion is disabled under prefers-reduced-motion.