Adnan / AI & software

MD Abdul Jabbar AdnanAI & software engineerMelbourne, Australia

I build software for places it never reached.

Founder and lead engineer of PulseNote, a patient owned health record, and PulseAI, the clinical assistant inside it, both in daily use on a paediatric haematology and oncology ward at Bangladesh Medical University. Before that, Travista OS, which runs my family’s business end to end.

Live · Pulse AI on the ward

The assistant clinicians open every morning. It reads the record and answers, or refuses. Invented sample data.

Pulse AISample data
Rania K.P100414yFBed 3
Summarise the last few visits
Pulse AI09:12
SummaryHide ▾

Rania K., 4 years 2 months, female, blood group O+, PIN P10041.

Admission status: current inpatient. Unit: Haematology / Oncology, Bed 3.

Overview of history: most recent documented phase is induction, cycle 3, recorded 12 Apr. Diagnosis of lymphoma was confirmed 8 Feb. First recorded visit is 2 Mar; most recent visit is 12 Apr. Four visits are documented, with haemoglobin, platelets and neutrophils all trending down over the final six days.

Summary· last 4 visits
  1. Cycle 3 start2 Mar

    Chemotherapy cycle 3 commenced. Counts stable, afebrile, weight on track.

  2. Routine review22 Mar

    Mild weight loss, WAZ −1.3. Protocol continued, no new symptoms.

  3. Pre-cycle bloods9 Apr

    Hb and platelets drifting down, ANC 1.1. Flagged for close follow-up.

  4. Admitted febrile12 Apr

    Fever 38.7 °C, pancytopenia. Empirical antibiotics and G-CSF started.

Red flags
Pulse AILocal09:12
Red flags · 3
  • Hb 6.4 g/dLflagged, falling12 Apr
  • ANC 0.4severe neutropenia12 Apr
  • Temp 38.7 °Cfebrile overnight13 Apr
Is this child clear?
Pulse AI09:12
I cannot answer that. This tool has no state that means clear, and nothing in this record would support one.
Ask about Rania…

Pulse AI can make mistakes. Verify clinically critical answers.

01 The stack

What I actually build with.

Split by how well I know it, because a list that does not distinguish between shipped and tried is not information.

Shipped and running in production

Languages
TypeScriptJavaScriptSQL
Frontend
ReactNext.jsReact NativeTailwind
Backend
NodeAzure FunctionsREST APIsserver actionsPrisma
Data
PostgresFirestoreSupabasetransactional writesoffline first sync
AI
PulseAI (designed and built)retrieval augmented generationlongitudinal summarisationdocument extractiondeterministic rule enginescitation groundingAzure AI SearchLLM hosted in Azure
Cloud and ops
AzureAWSGitHub Actions CI/CDgitleaks secret scanningTurborepo monorepoCloudflare
Security
Role based access controlserver side authorizationhash chained auditgranular consentfield level encryption
Clinical
FHIR R4HL7 v2WHO growth standards and z-scorespaediatric dosing

Worked with, not my deepest

Also
Pythondata analytics and reportingDockerFigma

Everything in the first list is in a system that is either serving clinicians every morning or running a business. I have put nothing in it that I could not open and walk you through.

The year so far

1,265 contributions in 2026, almost all of them in private repositoriesgithub.com/ajadnan1
02 The folder

I did not read about this problem. I carried it.

My family kept our medical history in a folder. Every appointment started the same way. Hand over the paper, watch the doctor turn it over, and then answer from memory anyway, because there was not time to read it and half of it was missing.

My parents got sicker and the folder got thicker. A cardiologist did not know what the endocrinologist had changed. Nobody had the picture. Not because anyone was careless, but because there was no picture to have. What had been prescribed two years ago was whatever we remembered, and we did not remember.

For years I thought this was our problem. It is not. Almost the entire health system runs this way. A hundred and seventy million people carrying their own medical history in their hands, or not carrying it at all.

7doctors per 10,000 people in Bangladesh. Australia has 41.
Shortestaverage primary care consultation of any country ever measured, out of 67 studied.

A consultation that short is not enough time to read a page, let alone a decade. The history is physically in the room and it still does not exist.

Physician density: World Bank / WHO Global Health Workforce Statistics, 2023.Consultation length: Irving et al., International variations in primary care physician consultation time, BMJ Open 2017. 67 countries, 28.5 million consultations.

03 Why now

I moved to Melbourne to study, and watched the constraint quietly disappear.

For years I assumed the fix was digitising the paper. It is not, and that is why nobody had solved it. Digitise a decade of records and you have the same problem with better formatting. A bigger pile is still a pile, and the consultation is still too short to read it.

Storage was never the bottleneck. Compression was. The record does not need to be available, it needs to arrive already read.

That is the thing that changed while I was doing my degree. A model can now take thirty visits, years of labs, every medication change and every growth measurement, and hand back the picture in a paragraph a doctor can absorb in the time they actually have. Not a search box. A briefing. Alongside that, document models got good enough to pull structure out of a photographed prescription, so the decade of paper already sitting in people's houses becomes an input instead of a dead end.

So the shape of the answer inverted. Not a database that holds everything and hopes someone reads it. A system that reads everything and hands over what matters, in the ninety seconds that exist rather than the thirty minutes that do not.

I built it, and I found out immediately that the hard part is none of the above.

04 PulseNote

The hard part is deciding what the software is not allowed to say.

One record per patient, on their phone, readable by any doctor they trust. I founded it and I lead the engineering.

Morning rounds
Welcome backDr. AdnanBMU · Paediatric Haematology & Oncology
New1
Continuing2
To discharge0
By stageBy wardBy bed
New1
Continuing2
Ready to discharge0

Nothing flagged for discharge

Open a patient record, then read down to Pulse AI. It answers only from that record and cites the source. On the third child, ask whether she is clear and it will not answer.
Interface rebuilt for this page with invented patients. No real patient data appears anywhere on this site.
pulse-note.com · Android on Google Play

Built withTypeScript · React · Next.js · React Native · Node · Azure Functions · PulseAI (RAG, Azure AI Search, LLM hosted in Azure) · Firestore · FHIR R4 · HL7 v2 · GitHub Actions

We piloted in the hardest department we could get into: paediatric haematology and oncology at Bangladesh Medical University. Children with cancer, thirty visits deep, growth curves that carry clinical meaning, and drugs that are dangerous at the wrong dose. If a record holds there it holds anywhere.

PulseAI: rules first, model last

PulseAI is the clinical assistant inside PulseNote, and it is not a language model with a prompt on top. A deterministic rules engine runs first and evaluates anthropometric z-scores and haemoglobin, platelet and absolute neutrophil count thresholds. The model is only called when no rule matches.

That ordering pays twice. Red flags, last medications and lab trends are computed from the record and returned instantly at zero model cost, which matters when the deployment is in a hospital that is not paying Western software prices. And the answers that matter most in a hurry are the ones no model touched.

Every question and every answer is written into that patient's audit log. If PulseAI told a clinician something, there is a record of it that cannot be quietly edited later.

Dosing is arithmetic, not generation

The dose engine is a pure function. Mosteller body surface area, then weight based, BSA based, fixed and volume per kilogram dosing, with hard caps at adult maximum single and daily dose. If a high alert drug is missing its safety bounds the engine refuses rather than estimating, and high alert drugs additionally require a second clinician to confirm, which is written to the audit log.

The calldose engine
The failure I designed against
A language model states a child's chemotherapy dose and nothing checked it.
The price I pay for it
A drug with incomplete rules is unavailable until someone curates it.

No model anywhere in that path. It costs curation time and a refusal clinicians have to work around. It is worth it.

The short read, and why it has to cite

A summary spans up to thirty past visits and turns years of labs, medication changes and growth data into something readable in the time a consultation actually lasts. It runs on two separate search indexes: an institutional knowledge base the doctors curate themselves, and the patient's own record. Every factual statement must carry its source, and the model is barred from stating a drug dose that is not traceable to a retrieved document. A summary a doctor cannot check is worse than no summary, because it is faster to trust.

Privacy by design, not privacy by policy

A privacy policy is a promise. I wanted the guarantees to be structural, so that doing the wrong thing requires going out of your way rather than merely forgetting. Consent is granular and it belongs to the patient, three tiers, live on web and on mobile. Roles are resolved server side, never from anything the client can edit. And there is exactly one path to a full patient record: a single authorization gated server side join. One door, so consent, purpose of use and audit happen in one place or they do not happen at all.

Two details that matter more than they sound. Errors from upstream are redacted before they are returned, because a stack trace is a data leak wearing a different hat. And access is written to a hash chained ledger, so the log can be verified rather than trusted, which is the difference between an audit trail and a list.

The callone gateway

Every app that opens a full record goes through one checked door.

The failure I designed against
If every app talked to the record directly, each would carry its own permission and audit checks. One falls behind and stops checking. A record gets opened without permission and nobody notices.
The price I pay for it
One shared door is slower. Every full record read goes through the same single point.

So there is one door. Every read passes one place that checks permission and logs why. One door you can watch beats many you have to trust.

Building for a standard nobody is asking me for yet

Nobody in Bangladesh is currently asking for FHIR. I built the export pipeline anyway. The problem I set out to solve was one patient's history being unreadable, but a record that only works inside my system recreates the same trap one layer up, with the paper folder replaced by a vendor. So the internal model maps to FHIR R4 across Patient, Condition, Encounter, Observation and MedicationRequest, behind an authenticated, rate limited endpoint with 55 tests gating every deploy, plus an inbound HL7 v2 path sharing the same mappers.

Honest scope: server side API, no clinician facing export screen yet, not run against an official conformance suite. What exists is the pipeline, so the day a record has to move to another hospital, vendor or country, that is a configuration problem and not a rebuild. A record that cannot leave the system was never really the patient's record.

05 Onco Scanner

The feature I am proudest of is the one I deleted.

A tool that helps frontline doctors catch early signs of cancer in children from a routine blood test. I am building it with the head of paediatric haematology and oncology at Bangladesh Medical University, from that department's own research. It is in safety, integrity and quality validation. It is not in clinical use, and I will not say that it is.

Onco ScannerLeukemia decision support
Sample data

Pediatric Leukemia Check

Enter a child's CBC to see the level of suspicion and the next step.

Age5 yearsSexMale
High-alert flags
Blasts on film
SeenNot seen
WBC over 100,000
YesNo
WBC9.2x10^9/L
Hemoglobin10.4g/dL
Platelets112x10^9/L
Check

Invented sample case. No real patient data.

Built withTypeScript · zero dependency engine package · React · React Native · Vitest

The first version could tell a doctor a child looked fine. I removed that result. The department's own study of 223 children with childhood leukaemia found that some confirmed cases arrived with a blood count that looked unremarkable. So the tool has no way to say all clear. It flags a case for a doctor to look at, or it stays silent. It never reassures.

The callremoving the normal result
The failure I designed against
A child with leukaemia goes home reassured by my software.
The price I pay for it
A well child is referred, and the referral finds nothing.

The tool has no way to say a child is fine. False reassurance kills. Over referral costs a clinic visit. The asymmetry is not close.

I use AI heavily and I say so. Where an AI generated document disagreed with the department head's own instructions, the instructions won. The AI does not get to make the clinical call.

06 Travista OS

It was paper there too.

Travista is our family business. I grew up inside it, and it ran the way everything around me ran. Stock counted by hand into a ledger. Orders written on a pad. What was actually in the warehouse was whatever the last person to walk through it remembered, and by the time anyone noticed a number was wrong, the reason it went wrong was three weeks gone.

Travista OS · web portal

Select Workspace

Choose a workspace to continue

  • Web Portal ManagementManage website and analytics
  • CRMCustomer relationships, orders, and suppliers
  • POSPoint of sale and transactions
  • InventoryManage inventory and stock levels
  • Access ControlManage users, roles, and locations

travistabd.com

Built withTypeScript · Turborepo · Next.js · React Native · Postgres · Prisma · Supabase · Cloudflare · offline first sync

Same failure as the folder, different room. The information existed. It was just held in a form nobody could act on in time.

Travista OS runs the whole business now. Accounting, inventory, sales, corporate clients, all in one system. The things that used to eat a day, doing the books and knowing what was in stock, got easy, and the team gets more done in less time.

The part I am proudest of is who uses it. Nobody on the floor is technical. They open the Android app, scan an item and see its details, watch the day's sales, look after a corporate client, all from a phone. What took a ledger and a phone call now takes a scan.

It works because I built what they actually needed, not what I wanted to build. I was in the shop to see what that was.

Stock that cannot half happen

Goods receipt is one database transaction. All of it commits or none of it does, so stock never moves without something recording that it did.

Also

Everything above is my own. Alongside it, while finishing my degree, I took two internships. They are here for one reason. It is fair to ask whether I work as well inside someone else's codebase and someone else's conventions. I do.

  • During my degreeCogniBuildFull stack engineering
  • During my degreePrompcorpData analytics
07 The rooms

Same instinct, different room.

I do not build from a desk. Travista exists because I was in the shop. PulseNote exists because I was in the waiting room, and then in the ward. I was on Swinburne's Academic Senate because decisions were being made about students who were not in the room.

The Senate is the university's highest academic governance body. Vice Chancellors, Deputy Vice Chancellors, Deans. Most people there outranked me by thirty years.

I advocated for changes to how late submission was handled. Swinburne penalised it harder than other universities did, and there was no automatic extension when a student had a real reason to miss a deadline. I pushed for lighter late penalties and for automatic extensions, so the rule matched what students needed rather than what was easiest to administer. I was not the only person arguing for it, but I was one of them.

Some of it changed. Not all of it. I did not win everything I argued for and I am not going to pretend I did. By the time the new policies were in place I had graduated, so not one of them ever applied to me.

That is the part I am glad about. I argued for students who were not in the room, including the ones who were not there yet.

I was also president of the Islamic Society, one of the largest student organisations on campus, which was mostly operations. Budgets, rosters, rooms, and a few hundred people expecting something to work on a Friday.

Both are why the Bangladesh Medical University partnership works. Gathering requirements from a head of department is not a different skill from making a case to a Senate. You go to the room, and you listen before you build.