Mohamed Melki.

Backend engineer · Technical lead Tunis, Tunisia Java since 2014

I build the parts of a system that are not allowed to be wrong.

Now
Technical Lead — iObeya NextGen, since October 2024
Base
Tunis, Tunisia · GMT+1 · remote across Europe
Working in
Java 21 · Quarkus · Spring Boot · PostgreSQL · Redis Streams · TimescaleDB · Kubernetes

Ledgers, audit trails, schedulers, reconciliation, time series. Eleven years inside Java backends — lately leading them — and two products carried from an empty repository to production on my own.

Open to freelance and contract work:
backend architecture, event-driven systems,
and the occasional rescue.
Answers in English, French or Arabic.

01 Selected work

Five products. Two of them I designed, built and shipped alone. Where there is a screenshot, it is of a system that runs — not a mockup.

01 Carini 2026 Freelance, solo Design, backend, frontend, infrastructure

Carini

A marketplace of care plans for the Tunisian diaspora.

Someone working in Paris, Montreal or Dubai buys a plan for a parent who stayed in Tunisia. Carini dispatches the nurse, the laboratory, the clinic — and then proves to the buyer that the visit actually happened.

The hard part was never the marketplace. It is that the person paying is not the person whose medical record it is. Tunisian law puts the beneficiary in charge of their own data, so consent is a first-class object: a son can arrange his mother's care and still not read a word of it until she agrees. The API answers 404 rather than 403, because “there is a plan here” is itself a leak.

Money moves through an append-only double-entry ledger whose balance is enforced by the database. Cash arriving is not revenue — it is an obligation to deliver care, drawn down one visit at a time.

Java 21 · Quarkus · Gradle multi-module · PostgreSQL + Flyway · Keycloak (OIDC + PKCE) · Vue 3 · Tailwind v4 · Docker Compose · Traefik

Carini's public landing page: the headline “Your parents are there. You are here.” beside an illustration of a nurse visiting an elderly woman at home.
Carini — the shop window. Four questions, no account needed.
A running care plan seen by the family: what the plan covers, remaining allowance, and each visit's progress from requested to confirmed.
The same plan, told to a family in four milestones.

02 DocDock 2026 Freelance, solo Live, in daily clinical use

DocDock's dashboard: cash-flow chart, payment status rings, appointment-type breakdown and missed appointments.
DocDock — the practice's month, in one screen.

DocDock

A dental clinic runs on this, with no application server at all.

Patients, appointments, consultations, documents and the practice's money. I built it first as a Quarkus service with hexagonal layering — and then deleted the backend.

What replaced it: PostgREST over the same PostgreSQL, a handful of Postgres functions for the parts that were genuinely business logic, hosted auth for sessions, and row-level security as the single authorisation boundary. The anonymous key in the bundle is public by design; what a caller may read is decided by policy, in one place, next to the data.

Porting a working system is the honest way to find out what it really did. Three defects came out of the migration that the Java version had been quietly hiding.

Vue 3 · Pinia · TanStack Query · Supabase (PostgreSQL, PostgREST, Auth, Storage) · row-level security · Cloudflare Pages

DocDock's week calendar: half-hour appointment slots across seven columns, colour-coded by status.
Half-hour slots, because that is how a chair is actually booked.

03 Nyaradzo Client work Southern Africa

Nyaradzo

Funeral services, at national scale.

A funeral-management platform used across South Africa and the surrounding region — among the most-used web applications of its kind there. Policies, plans, and the logistics of a burial, for the families who need them and for the branches that serve them.

Software for grief has one unusual requirement: nothing may be ambiguous. The deadline is a funeral, and there is no second attempt at getting it right.

Detail available on request.

04 MathTutor Client work Accessibility

MathTutor

A mathematics book editor for people who work with their eyes.

An authoring environment for mathematics textbooks, with its interface rebuilt for eye-gaze input: targets sized for a dwell click, nothing that needs a steady hand, nothing that punishes a blink.

Accessibility of that kind cannot be added at the end. It decides the layout, the size of every target, and the order in which things can be reached — which makes it an architecture problem wearing a design costume.

Detail available on request.

05 eXo Platform 2014 — 2015, and after Several clients

eXo Platform

Social intranets, bent to fit each client.

Customisation work on eXo Platform for several clients: portal extensions, portlets, JCR content, themes, and the integrations each intranet turned out to need. Before that, a year inside eXo itself on support and core modules — other people's production incidents, which is where you learn what a platform actually promises.

Java/JEE · Portlets · JCR · Red Hat middleware · performance work

02 Practice

Five things I do not negotiate about. Each of them costs time at the start and gives it back the first time something goes wrong at three in the morning.

01

Boundaries the compiler enforces.

A module's internals are not exported, so reaching into them does not compile. Architecture that lives in a wiki is a suggestion; architecture that fails the build is a rule. Tests over the dependency graph cover what the build cannot see — layering direction, framework leakage, and which package is allowed to know that a vendor SDK exists at all.

02

Money is never a floating-point number.

A currency-aware value object that refuses cross-currency arithmetic and rounds only when you hand it a rounding mode. Allocation is lossless: split a sum three ways and all of it is still there. The Tunisian dinar has three decimal places — exactly the kind of detail a double loses quietly, in production, at the end of a month.

03

Nothing is published outside its transaction.

No “commit, then send”. Domain events go into an outbox inside the caller's transaction and leave from there: at-least-once, with backoff and a dead-letter queue. That makes every handler idempotent by obligation rather than by hope — a redelivered event must not dispatch a second nurse.

04

A state machine is exhaustive, or it is decoration.

Ten states, every transition tested — including the ones that must throw. The test I care about is not “the happy path works”, it is “nothing can get stuck”. A request that quietly stays where it is, is a person nobody visits.

05

An audit trail nobody can edit afterwards.

Append-only, hash-chained, and bound to the transaction that caused it. An audit entry cannot survive a rolled-back action, and cannot exist without one. Invariants like this belong in the database as well as the code, so they hold against a psql session and not only against our own services.

03 Path

Eleven years, five teams, mostly one language. Finance, workflow automation and collaboration platforms — all of them systems where somebody notices if a number is wrong.

2024 —

iObeya

Technical Lead — NextGen

Technical lead on iObeya NextGen, a visual collaboration platform for enterprise Agile and operational management. I own the time-series and KPI services: aggregation, consolidation, and frequency models that all have to agree with each other. Event-driven throughout, and close enough to DevOps to be responsible for what happens after the merge.

Redis Streams · TimescaleDB · Kubernetes · Helm · Kong · Keycloak

2022 — 2024

ADAD

Backend Engineer & Scrum Master

A platform for airline financial reconciliation, architected from scratch. ETL, matching and featurisation, KPI components. Also the Scrum Master, which in practice meant protecting the team's ability to finish things and coaching the juniors on clean code.

DDD · Microservices · TDD · Spring Boot · PostgreSQL · MongoDB · AWS

2019 — 2021

Marjory

Senior Java/JEE Engineer

A configurator of business processes for marketplaces, on top of workflow engines. Processes deployed dynamically into AWS sandboxes, a migration to microservices and publish/subscribe, feature teams — and Gatling scripts written to find out where it fell over before a customer did.

jBPM · Pub/Sub · Spring Boot · Docker · Gatling · AWS

2015 — 2019

iObeya

R&D Engineer

Brainstorming and animation features, an ACL security model applied at every level of the platform, and an in-house CQRS and event-sourcing implementation when the read side stopped keeping up. Proofs of concept for the paths nobody had explored yet, and third-party integrations such as Jira.

SAFe · Spring · Hibernate · MySQL · Oracle · JBoss · AngularJS

2014 — 2015

eXo Platform

Java Support & Development Engineer

Core platform modules, and the production incidents of everyone running them. Diagnosis, fixes, automated tests to stop the same regression coming back, and performance work with product and QA.

Java/JEE · Portlets · JCR · Red Hat suite · performance

Education

  • National Engineering School of TunisComputer Science Engineering · 2011–2014
  • IPEST, TunisMathematics & Physics · 2009–2011

Awards

  • Best Final Year ProjectNational Engineering School of Tunis · 2014
  • Top 10%, national and regionalACM ICPC · 2013
  • First prize, Tunisia JUG DayJava User Group community · 2014

Certifications

  • AWS Cloud PractitionerAmazon Web Services
  • CCNACisco
  • IELTSBritish Council

Languages

  • ArabicNative
  • FrenchProfessional
  • EnglishProfessional
Mohamed Melki, photographed outdoors in sunglasses and a straw hat.

Eleven years in, still writing Java on purpose.

I live in Tunis. I have been writing Java since 2014 — long enough to have opinions, and to have been wrong about a few of them in production, which is the only place the lesson sticks.

Most of my work sits in the unglamorous middle of a system: the part that reconciles, schedules, aggregates, or refuses. I like problems where correctness is checkable and the cost of being wrong is somebody's money or somebody's appointment. It is also why I take the boring things seriously — migrations, idempotency, audit trails — because they are what let a product be changed later without fear.

Away from the keyboard: tennis, padel, ping pong, running, and a piano I am still not good at. I competed in the ACM ICPC as a student, where I learned that the fastest solution is usually the one you can still understand an hour later.

Mohamed Melki · Tunis · Arabic, French, English

Something that has to be right?

Good fit
Backend architecture, event-driven systems, data correctness, and platforms that have grown faster than their design.
Poor fit
Pixel-perfect marketing sites. I know several people who are better at that than I am.
Availability
Selected freelance work alongside a full-time technical lead role.