ZH - Zaid Haddadin, home

Software engineerAmman, Jordan

Software that works past the demo.

I’m Zaid Haddadin. At PwC Middle East I build enterprise web applications for large organisations in the region, from requirements through to delivery. One of those projects was an AI assistant interface: responses that stream in as they are generated, conversation history that survives a refresh, and previews of the documents and spreadsheets it produces. I work on what sits underneath as well - authentication across React and Python, Azure storage, and the deployment configuration nobody notices until it breaks. I have also built and shipped two products on my own.

Where I work

  1. 01Requirements
  2. 02Interface
  3. 03Integration
  4. 04Services
  5. 05Data & cloud
  6. 06Delivery

Six layers between a requirement and a user. The argument of this site is that I work across all of them - and each case study says exactly how much of each was mine.

Selected work

Built alone, top to bottom

These are products I built by myself, which is why what I own at each layer can be stated exactly rather than implied. Client work is listed under experience rather than dressed up as a case study.

  1. Solo product · Deployed on the web

    Settle

    Money that has to reconcile to the cent, offline, from one codebase

    A bilingual expense-splitting app for groups. It records who paid for what, then works out a short set of payments that makes everyone even. One Expo codebase targets web, iOS and Android; the web build is live, works with no network at all, and syncs when it can.

    A single dropped group member silently breaks the zero-sum invariant - and then shows everyone confidently wrong amounts.

    • One codebase, three platforms
    • Works offline
    • Postgres row-level security
  2. Solo product · Personal finance

    Qirsh

    Modelling the machinery a bank actually runs, not the spending you already did

    A personal-finance app built around debt mechanics: credit-card statement cycles, grace periods, carried balances, instalment plans and loans - modelled properly, so the number on screen is the number you will be charged.

    A loan advertised at “6% flat” really costs about 11.3% a year. The app solves for that and says so.

    • Statement cycles modelled
    • Exact-decimal money
    • GraphQL, Prisma, Postgres
Experience

What I have shipped for clients

Separate engagements, listed separately. Each item is one piece of work rather than a programme assembled after the fact.

  1. Senior Associate Software Developer

    PwC Middle EastJul 2023 - PresentAmman, Jordan

    • Promoted to Senior Associate in Oct 2026, after joining as an Associate in Jul 2023. The work below spans both grades.
    • Built an enterprise portal on Next.js and GraphQL with Apollo, mixing server and client rendering, and contributed the shared UI and data utilities the rest of the team builds on.
    • Delivered a learning management system and a connected assessment platform in React, Chakra UI and Node.js, including reusable chart components and role-based workflows.
    • Created an interactive diagramming feature with React Flow - node creation, grouping, tables and connections - with high-resolution image, PDF and presentation export.
    • Built an AI assistant interface: responses streamed over Server-Sent Events, conversation and session history that survives a refresh, suggested prompts, response feedback, and inline Excel and document previews with zoom, loading and error states.
    • Implemented Microsoft Entra ID and MSAL across React frontends and the Python services behind them - token acquisition, propagation to protected APIs, and the expiry paths that only appear once real people leave tabs open.
    • Worked inside Python services on conversation handling, token-aware chunking with per-chunk error handling, and error logging that makes a failure traceable across a service boundary.
    • Integrated Azure Blob Storage with upload and download flows and signed URLs of bounded lifetime, supported Cosmos DB configuration, and changed CI triggers and deployment configuration to make releases behave.
    • Contributed to a large Adobe Experience Manager and React programme - component dialogs in XML, support for Java model changes, responsive and accessible components - and built an event site on Strapi and Next.js with Zod-validated API handling.
    • Tuned Next.js SSR and ISR caching strategy to make page delivery more predictable across locales.
  2. Intern Software Developer

    PwC Middle EastJan 2023 - Jul 2023Amman, Jordan

    • Prototyped AI-assisted PDF summarisation with a digital-human interface, shaped around specific business use cases.
    • Implemented a React and Node.js dashboard for wheat prices and food-crisis indicators, visualising simulated outcomes from user inputs with Chart.js.
  3. Junior Software Developer

    PenguinInOct 2022 - Jan 2023Amman, Jordan

    • Shipped React and TypeScript features - filters, rule configuration and map views - for an indoor navigation and asset-tracking platform.
    • Built and integrated .NET Web APIs, and used Kafka with Confluent tooling to implement producers and consumers for business-rule tracking and background jobs.
Expertise

Grouped by what I do with it

Not a list of everything I have touched. These are the things I am actually relied on for, with the depth marked.

  • Enterprise AI interfaces

    The user-facing half of an AI system is where most of its credibility is won or lost. My work is what happens while an answer is still arriving, when it arrives only partly, and when it does not arrive at all - and what the screen says in each case. The interface and the service boundary behind it are mine; the model and the quality of what it retrieves are not.

    • React
    • TypeScript
    • Server-Sent Events
    • Conversation state

    RAG · OpenAI API · Document and data assistants

  • Full-stack delivery

    I am a frontend engineer by depth and a software engineer who works across the stack. When a feature needs a route, a query, a schema change and a background job to work properly, I would rather build all four than file four tickets.

    • Next.js
    • Node.js
    • Python

    .NET Core · REST · GraphQL · Prisma · Zod

  • Secure access

    Enterprise features are gated before they are useful, and the gate is where the production-only problems live: whether a token is still valid by the time the request is finally made, whether an expiry fails in a way the user can act on, and the difference between a route that is merely hidden and one that is genuinely protected.

    • Microsoft Entra ID
    • MSAL
    • Token handling

    Protected API access · Role-aware interfaces

  • Cloud, data and persistence

    Where a file or a record lives changes what the interface is allowed to promise. The judgement is in the join: how long a signed URL should live and what it should be permitted to do, what belongs in a database rather than in object storage, and which settings have to match across environments before a deployment behaves the same way twice.

    • Microsoft Azure
    • Azure Blob Storage

    Cosmos DB · PostgreSQL · Prisma · SAS URL generation

  • Getting it into production, and keeping it there

    Shipping means owning the result past the pull request, and the specifics are unglamorous: which setting differs between staging and production, what a pipeline does on a re-run rather than a first run, and how to tell a broken deployment from a broken build.

    • CI/CD
    • Production troubleshooting

    Environment configuration · Release integration

Approach

How I work a problem

The same habits show up in everything above, and they are the reason the work crosses layers rather than stopping at the first boundary.

  1. Requirements

    Start where the requirement is still vague

    The expensive misunderstandings happen before any code exists. I would rather ask the awkward question early - what happens when this document is 400 pages, what does this user see when they lack the role - than discover the answer in a production incident. Raising a risk early is cheaper than being right about it later.

  2. Interface

    Design the interface around its failure states

    A demo shows the happy path. Real use is mostly everything else: empty, loading, partial, expired, too large, offline. I build those states first because they determine the component structure, and a feature that has not been designed for failure is not finished.

  3. Integration

    Follow the problem across the boundary

    Most difficult bugs live between two systems that each look correct alone. Being able to read the React component, the request, the Python handler and the storage policy in one sitting is not heroics - it is what stops a defect turning into three weeks of handoffs between teams.

  4. Delivery

    Treat the release as part of the feature

    Configuration, pipelines and environments decide whether work reaches anyone. I keep them in scope: fixing the trigger, correcting the deployment configuration, reconciling branches from parallel streams, and staying with a release until it is genuinely stable.

The six layers, in full

  1. Requirements

    Turning a business requirement into something buildable, and saying early when it will not work.

  2. Interface

    The React and TypeScript application people actually touch - architecture, state, and what it does when something fails.

  3. Integration

    Streaming, authentication, file transfer and the contracts between the client and everything behind it.

  4. Services

    Backend logic in Python and Node - conversation handling, chunking, error paths.

  5. Data & cloud

    Persistence and cloud storage: schemas, blobs, access policies, signed URLs.

  6. Delivery

    Pipelines, environment and deployment configuration, releases, and diagnosing production when it breaks.

About

How I got here, and why it shows

Mechanical engineering taught me to read a system before changing it

I studied mechanical engineering and spent four years learning to model things that fail - where load concentrates, which assumption breaks first, and why the answer is usually at an interface between two parts rather than inside either one. Then I moved into software, which turned out to reward exactly the same instinct.

That is why I do not stay inside one layer. When a document preview renders blank for one group of users, the cause might be the component, the token on the request, the chunking in a Python service, or a storage policy in Azure - and finding it means being willing to read all four. Most of what I have shipped has involved crossing at least one of those boundaries.

The two products I built on my own exist for the same reason. Both started as my own idea, and in both I held every decision from the product definition through to what happens on a bad network - which is how I found out what I actually believed about building software when nobody else was making the call.

I work in Arabic and English, and I am based in Amman.

Zaid Haddadin

Education

  • ICT Upskilling Program (ASP.NET C#)

    Al Hussein Technical University · Jun 2022 - Sep 2022

    340 hours of technical and professional training.

  • B.Sc. Mechanical Engineering

    Balqa Applied University · Sep 2017 - Feb 2022

    Simulation work in ANSYS; contributed to papers with supervising faculty.

Contact

Get in touch

I am glad to talk about any of this - how one of these was built, a decision you would have made differently, or a problem that crosses more layers than it comfortably should.

Based in Amman, Jordan. Works in Arabic and English.