Skip to content
Currently at Bawq TelecomCairo, EgyptOpen to backend work

I build backends from the wire up — binary device protocols at one end, API contracts at the other, and fifty-six million events a day moving between them.

Software Engineer II on a fleet-tracking platform, working across service boundaries rather than inside one. I own the API gateway, the real-time layer and the event pipelines that hold a fifteen-service Docker Swarm stack together — device management, alarms, notifications, reporting.

Most of what goes wrong in a distributed system goes wrong at a boundary: two services disagreeing on a contract, a publisher that never reconnects after the broker restarts, a badge count that quietly scans a collection. Those are the parts I like.

The wire end of that is the unusual part for a web backend engineer: Teltonika Codec 8, 8E and 12 and Gator M528 frames parsed off the socket, cold-chain temperature records under EN 12830 where the correctness bar is legal rather than aesthetic, and a self-hosted Valhalla routing service, with tiles built from OpenStreetMap extracts, that I set up and that now runs in our production cluster.

Years shipping backend
4Years shipping backend
Services in the production stack
15Services in the production stack
GPS events ingested daily
56M+GPS events ingested daily
Services one feature spanned
4Services one feature spanned

⌘K or / opens a jump list, if you would rather not scroll.

Career

Two roles and a degree, on one axis. Click a bar to read the detail.

202120222023202420252026

The overlap is real: the last two years of the degree ran alongside client work, and Bawq started a month before graduation.

  • Own and evolve the platform API gateway: request routing and proxying to the backend services behind it, JWT and API-key authentication middleware, and a Socket.IO real-time layer scaled horizontally with a Redis adapter.
  • Shipped an end-to-end API-key management feature spanning four services — issue, list, revoke, delete — giving customers secure programmatic access to live device data with full audit logging.
  • Built event-driven services processing 56 million+ daily GPS events over RabbitMQ pub/sub and WebSocket pipelines, cutting device-event delivery latency by 40%.
  • Designed a queue-based report worker on BullMQ and Redis that renders Excel and PDF artefacts, uploads them to S3 and emails a link — keeping heavy work off user-facing APIs.
  • Co-architected the migration of a legacy monolith into decoupled services, accelerating deployments by 50%, applying domain-driven design to keep the seams maintainable.
  • Hardened inter-service messaging with RabbitMQ connection-recovery logic and Redis failure handling after diagnosing critical production anomalies.
  • Built a scheduled S3 cold-storage archiver for historical telemetry, slowing hot-database growth and query cost.
  • Wrote the nightly MongoDB backup job the platform runs on: two dump cadences in one cron entry, atomic archive writes, offsite copies to S3, and retention pruned on the date in the filename rather than on mtime.
Node.jsTypeScriptMongoDBRedisRabbitMQBullMQSocket.IODockerDocker SwarmAWS S3

The work, measured

Three results and three measures of scale, each attributed to the role it came from.

device-event latency cut
40%
Bawq Telecom
faster deployments after the split
50%
Bawq Telecom
database & app performance gained
35%
Freelance
GPS events ingested per day
56M+
Bawq Telecom
services in the Docker Swarm stack
15
Bawq Telecom
alarm types on live telemetry
9
Bawq Telecom

Selected work

Told as architecture — the code is in a private repository.

Fleet customers want speeding reports. But "speeding" means nothing without the legal limit on the road the vehicle was actually on, which means resolving a limit for every point in a continuous telemetry stream. Commercial roads APIs bill per lookup, and that model does not survive contact with thousands of devices reporting all day.

So we stopped buying lookups. I set up Valhalla, the open-source routing engine, built its routing tiles from an OpenStreetMap extract of the operating region, and queried it for the speed limit on the road segment each point matched to. It did not stay a prototype: it runs today as its own service in our Docker Swarm stack, next to the services that call it. Readings are enriched at ingest time, so a report reads a stored number instead of making a network call per row.

The interesting part is the blast radius. It touched ingest-time enrichment in device management, a shared internal package for the lookup, contract validation at the gateway, new report types and scheduling fields in reporting, and the column layout in the worker that renders the file — including making an estimated limit visually distinct from a posted one, because a compliance-minded customer will absolutely ask which is which. It shipped, broke on a misconfigured routing endpoint and an under-provisioned instance, got reverted across every service rather than patched forward, and went back out four days later once timing instrumentation found the real cause.

Would revisit

Enrichment at ingest is cheap to read and expensive to correct. Re-deriving limits for historical rows after an OSM update is still a batch job I would rather not run.

ValhallaOpenStreetMapDocker SwarmNode.jsMongoDB

Stack, by how well I know it

Grouped by evidence rather than enthusiasm. Pick a level to narrow it.

Languages

JavaScriptTypeScriptSQLGoJavaPythonCDart

Backend & APIs

Node.jsExpressREST API designMicroservicesAPI gateway designSocket.IOJWT authDomain-driven designGraphQLApolloSpring Boot

Messaging & jobs

RabbitMQBullMQRedis Pub/SubEvent-driven architectureQueue-based processingNATS Streaming

Data & search

MongoDBMongooseRedisIndexing & aggregationPostgreSQLPrismaElasticsearchSQLiteSupabaseMySQLNeo4j

Cloud & ops

DockerDocker SwarmDocker ComposeAWS S3PM2LinuxShell scripting (POSIX sh)crons3cmdGitHub ActionsFirebase / FCMSendGridPino (logging)KubernetesSkaffold

Geospatial & devices

PostGISTurf.jsValhallaOpenStreetMapTeltonika Codec 8/8E/12Gator M528EN 12830 cold chain

Testing & quality

JestSupertestTDDZodESLint

Frontend

ReactReact NativeExpoNext.jsAngularFlutter

Amber is daily production use. The fainter a chip is, the less I would claim about it — the bottom tier means I can read it, not that I know it.

Selected projects

Public code, so you can check the claims.

MAZ Realty

·Freelance

A real-estate product that actually shipped

Real-time chat and property-management workflows on a scalable Node.js backend, with end-to-end Stripe payments. Including a non-obvious piece: booking a lawyer for document verification. The interesting problems in property listings are rarely the listings.

Stripe paymentsReal-time chatPublished docs

Node.js · TypeScript · MongoDB · Redis · Socket.IO · React · Stripe

gh-visualizations

·Personal

The best-engineered thing I own publicly

Raw SQL with numbered migrations, Zod-validated config, lint-enforced conventions, husky gates, and its standards written down rather than assumed. Also: no AI-generated code in it.

Raw SQLNumbered migrationsNo AI-written code

TypeScript · SQLite · Express · Zod · Jest

ticketing

·Personal

Three services and a Next.js client on an event bus, orchestrated on Kubernetes

Optimistic concurrency control across services communicating over NATS Streaming, a published shared npm package, and test-driven development throughout. It started as a course build — worth saying so — but it is the distributed patterns I work with daily, in code I am allowed to show.

3 services + Next.js clientOptimistic concurrencyShared npm package

TypeScript · Next.js · NATS Streaming · Kubernetes · Skaffold · Jest

logs-monitoring

·Personal

Centralised logging for a microservice fleet

Producer services publish logs to RabbitMQ; a consumer indexes them into Elasticsearch for querying and monitoring. The small version of a problem every distributed system eventually has.

RabbitMQ transportElasticsearch indexDockerised

TypeScript · Node.js · RabbitMQ · Elasticsearch · Docker

rssagg

·Personal

An RSS aggregator in Go

chi, sqlc, goose, Postgres and a background scraper. Evidence that Go is something I have used rather than something I have listed.

Background scrapersqlc + goosePostgres

Go · chi · sqlc · PostgreSQL

Information-Retrieval-System

·University

A search index built from the spec, not the library

A positional index with phrase queries, TF-IDF weighting and cosine-similarity ranking, built from a specification and finished. Only the stemmer is a library; I like implementing the algorithm occasionally instead of importing it.

Positional indexTF-IDF weightingCosine similarity

TypeScript · Express

GitHub, right now

Fetched when you opened this page — profile and activity from the GitHub API, the calendar from a public mirror of it.

syncing…
Contributions / yr
—Contributions / yr
Public repos
—Public repos
Followers
—Followers
On GitHub since
—On GitHub since

Loading the last year…

Writing

Eighteen posts, mostly because explaining a thing is the fastest way to find out I don't understand it yet.

Certifications & teaching

  • Software Architecture FoundationsLinkedIn Learning
  • MEAN Stack DevelopmentInformation Technology Institute (ITI)
  • Web Development InstructorDigital Egypt Cubs Initiative (DECI)
  • Explore Web Development with Node.jsLinkedIn Learning

What I'm working on next

The two gaps I'd rather name than have you find.

Testing

The platform I work on has thin coverage. Where a service was new enough to allow it I added a proper suite — in-memory MongoDB, integration tests, the works — but retrofitting the older ones has not been mine to fix. So I am fixing it where it is: a genuine suite in my own public repositories, starting with the one I would want a reviewer to open.

Observability

I have leaned on ad-hoc logging far more than on structured metrics or tracing. It is the most common gap at my level and worth closing before someone asks me to debug a latency spike out loud.

Get in touch

Cairo, Egypt

Open to backend roles — distributed services, event pipelines, the parts that have to stay up. Tell me what you are building and what is hard about it, and you will get a real answer back.

Send a message

Opens a draft in your mail app.