# Ahmed Mamdouh — Senior Full-Stack & AI Engineer

> Ahmed Mamdouh is a senior full-stack and AI engineer in Cairo, Egypt, with 10+ years of production work in TypeScript, Node.js, NestJS, React and Next.js. He has built real-time platforms with 100K+ concurrent connections, fintech transaction systems, and AI agents, MCP servers and RAG pipelines that run in production.

- Location: Cairo, Egypt (UTC+3), remote worldwide
- Availability: Available for new projects — https://www.xerk.io/hire
- Contact: gm.xerk@gmail.com
- Profiles: [Upwork](https://www.upwork.com/freelancers/~01280a86be4e6101db), [LinkedIn](https://dub.sh/xerk-linkedin), [GitHub](https://github.com/xerk), [X](https://dub.sh/xerk-x)
- CV: [HTML](https://www.xerk.io/cv), [PDF](https://www.xerk.io/ahmed-mamdouh-cv.pdf)
- Full text for LLMs: https://www.xerk.io/llms-full.txt

## Case studies
- [Real-time device platform](https://www.xerk.io/work/realtime-device-platform): Ahmed Mamdouh designed a real-time device management backend on NestJS, Socket.io and MongoDB that holds more than 100,000 concurrent device connections.
- [AI agent + MCP server](https://www.xerk.io/work/ai-agent-mcp): Ahmed Mamdouh built a production AI agent on the Anthropic and OpenAI APIs, with tool use and guardrails, and an MCP server that gives LLM clients controlled access to internal systems.
- [Zerocash](https://www.xerk.io/work/zerocash): Zerocash is an e-wallet platform whose transaction system — architected by Ahmed Mamdouh as tech lead at Technocloud — processes thousands of daily payments with audit trails and reconciliation.
- [SweepSouth](https://www.xerk.io/work/sweepsouth): SweepSouth is Africa's largest on-demand home-services platform; Ahmed Mamdouh built and scaled its Node.js and NestJS services for 100k+ active customers and shipped its mobile-first booking flows.
- [UptimeRobot](https://www.xerk.io/work/uptimerobot): At Itrinity, Ahmed Mamdouh built high-throughput Node.js and NestJS services for UptimeRobot — a monitoring SaaS with 2.1M+ users — running millions of website checks a day, plus a GraphQL API that cut client network overhead by ~35%.
- [Mall of Arabia](https://www.xerk.io/work/mall-of-arabia): Ahmed Mamdouh built the website for Mall of Arabia, Egypt's largest mall, with Next.js / Nuxt 3 and Tailwind CSS.

## Services
- AI agent & automation: An agent or AI feature inside your product or your ops, with tool use, retrieval over your data, guardrails and evals.
- Real-time platform or SaaS: From spec to production with NestJS or Next.js, WebSockets, queues, payments and an admin dashboard.
- Fractional tech lead: A senior engineer on your team for architecture, code review, CI/CD and hiring, who still writes code.

## Blog
- [Watch queue depth trend, not the current number](https://www.xerk.io/blog/watch-queue-depth-trend-not-the-current-number) (2026-09-13): Track queue depth over time from day one. The current number says little; the slope tells you whether you have twenty minutes or two.
- [The systems I am proud of are built from boring parts](https://www.xerk.io/blog/the-systems-i-am-proud-of-are-built-from-boring-parts) (2026-09-12): The systems I'm proudest of use Postgres, a queue and a cache with a written invalidation rule. The real engineering was in the failure handling.
- [Scaling 100k WebSocket connections: the reconnect storm](https://www.xerk.io/blog/scaling-100k-websocket-connections-the-reconnect-storm) (2026-09-12): At 100k+ concurrent sockets the count is easy. The reconnect storm is what breaks, and jittered backoff, load shedding and resumable sessions fix it.
- [MCP went stateless, and that matters](https://www.xerk.io/blog/mcp-went-stateless-and-that-matters) (2026-09-11): The July MCP revision went stateless with OAuth 2.0 and OpenID Connect, so MCP servers can now run behind load balancers and serverless.
- [npm v12 blocks install scripts by default](https://www.xerk.io/blog/npm-v12-blocks-install-scripts-by-default) (2026-09-10): npm v12 no longer runs preinstall, install or postinstall scripts unless you approve them, closing a common supply chain attack path.
- [Node.js moves to one major release a year](https://www.xerk.io/blog/nodejs-moves-to-one-major-release-a-year) (2026-09-10): From Node 27, Node.js ships one major a year and every release becomes LTS, ending the odd/even split most teams already ignored.
- [How an endpoint got 45 percent faster with no clever code](https://www.xerk.io/blog/how-an-endpoint-got-45-percent-faster-with-no-clever-code) (2026-09-09): Twenty minutes with a profiler beat a week of guessing. An N+1, a missing index and a useless cache made an endpoint 45 percent faster.
- [What actually breaks when AI agents go to production](https://www.xerk.io/blog/what-actually-breaks-when-ai-agents-go-to-production) (2026-09-08): Production agents fail on state, partial failure and knowing when to stop. Those are distributed systems problems, and prompts won't fix them.
- [Claude output is now watermarked](https://www.xerk.io/blog/claude-output-is-now-watermarked) (2026-09-08): Claude output now carries watermarks and signed provenance by default. Tell your users, and never treat a missing watermark as proof.
- [Splitting a monolith: what it actually bought us](https://www.xerk.io/blog/splitting-a-monolith-what-it-actually-bought-us) (2026-09-07): Split a monolith for failure isolation and team ownership. If speed is the goal, profile first; the cause is usually a missing index.
- [Handle SIGTERM or every deploy is a small outage](https://www.xerk.io/blog/handle-sigterm-or-every-deploy-is-a-small-outage) (2026-09-07): A Node service that ignores SIGTERM drops in-flight requests on every deploy. A fifteen-line graceful shutdown handler fixes it.
- [What I stopped doing by hand with AI coding tools](https://www.xerk.io/blog/what-i-stopped-doing-by-hand-with-ai-coding-tools) (2026-09-06): AI tools took over my boilerplate, regex and first-draft tests. I ship faster but learn narrower, and I'm working on the second part.
- [Mongo or Postgres is the wrong first question](https://www.xerk.io/blog/mongo-or-postgres-is-the-wrong-first-question) (2026-09-06): Pick a database by your known access patterns. If you don't know them yet, pick Postgres, because it forgives wrong guesses best.
- [In RAG, retrieval is the product](https://www.xerk.io/blog/in-rag-retrieval-is-the-product) (2026-09-05): Most bad RAG answers I've debugged were retrieval failures. Structural chunking, metadata filters and a 50-question eval set fixed more than model upgrades.
- [Build at night, decide in the morning](https://www.xerk.io/blog/build-at-night-decide-in-the-morning) (2026-09-05): My best code comes late at night and my best decisions come in the morning, so I build at night and decide after some sleep.
- [The hard part of passkeys is not WebAuthn](https://www.xerk.io/blog/the-hard-part-of-passkeys-is-not-webauthn) (2026-09-04): WebAuthn was the easy part of shipping passkeys. Account recovery and deciding whether a password fallback stays took the real work.
- [Caching mistakes I keep debugging](https://www.xerk.io/blog/caching-mistakes-i-keep-debugging) (2026-09-04): Before adding a cache, decide what invalidates it, measure first, set a TTL, and cache the expensive part instead of the whole result.
- [When GraphQL is worth it and when it is not](https://www.xerk.io/blog/when-graphql-is-worth-it-and-when-it-is-not) (2026-09-03): GraphQL pays off when many different clients need different slices of the same data. With one web client, REST usually wins on total effort.
- [Laravel ships the primitives Node developers rebuild by hand](https://www.xerk.io/blog/laravel-ships-the-primitives-node-developers-rebuild-by-hand) (2026-09-03): Laravel ships primitives like debounced listeners and model-scoped locks that Node teams keep rebuilding by hand. That's a culture difference.
- [Why I still write code as a tech lead](https://www.xerk.io/blog/why-i-still-write-code-as-a-tech-lead) (2026-09-02): Leads should keep coding on the work nobody prioritizes and stay off the critical path, so their judgment stays sharp without blocking the team.
- [Green flags that someone is genuinely senior](https://www.xerk.io/blog/green-flags-that-someone-is-genuinely-senior) (2026-09-02): Two signals I trust: the candidate brings up a decision they got wrong without being asked, and asks about on-call before the tech stack.
- [Use satisfies before you reach for as in TypeScript](https://www.xerk.io/blog/use-satisfies-before-you-reach-for-as-in-typescript) (2026-09-01): Every `as` in TypeScript tells the compiler to stop checking. `satisfies` checks the shape and keeps the narrow type, so try it first.
- [At-least-once delivery means at least once](https://www.xerk.io/blog/at-least-once-delivery-means-at-least-once) (2026-09-01): Every queue consumer eventually runs twice. Give each one an idempotency key from the message and check it before doing the work.
- [Auto mode made code review the last human gate](https://www.xerk.io/blog/auto-mode-made-code-review-the-last-human-gate) (2026-08-23): Claude Code's auto mode is now the default, so the approval prompt no longer protects you. Code review is the human check that's left.
- [Multi-tenancy with Laravel](https://www.xerk.io/blog/multi-tenancy-with-laravel) (2024-12-25): One way to run a multi-tenant Laravel app: a database per tenant, a connection per database, a Tenant model, and middleware that switches connections.
