Selected work

Systems you can operate right now, from inside this page

Eleven pieces of work, each with a simplified version that actually runs: the buttons respond, the numbers move, the accounting entry is written in front of you. These are not screenshots of interfaces, they are the interfaces, smaller, and in Arabic and English just like the systems themselves.

OWL ERP OWL Delivery Elite Platform Juzdani OWL Master Audit and plan Campaign manager Group site Print agent Events platform Health cover
01
Business operating system

OWL ERP

One system that holds the whole business: selling, inventory, purchasing, double entry accounting, the online store, and reporting. And the same system wears its trade: a pharmacy runs on batches and expiry dates, a phone shop on device numbers and instalments, a clinic on appointments and patient files, a restaurant on tables and a QR menu.

  • A trade is not a skin. Changing the trade changes what is tracked, what is blocked and what gets printed, not the colours on screen.
  • Every sale writes its entry. No button moves money without it appearing in the ledger.
  • The storefront and the stockroom are one. What sells on the site comes off the same balance the counter sees, in the same instant.
Next.jsTypeScriptPostgreSQLSupabase Row Level SecurityCloudflare
Switch the trade, then move between the dashboard, the counter and the store
erp.owlplatform.net
O

Simplified · four trades and three screens, and the stock and the ledger really move

02
Delivery and logistics

OWL Delivery

One order, three accounts: the merchant creates it, the office assigns and follows it, the driver carries it. Each side sees only its own part, and the cash travels with them until it comes back to the shop. The problem in delivery is not the map, it is who is holding the money right now.

  • Three accounts on one order. Switch the account at the top and watch the same order through other eyes.
  • Custody moves by a scan. The driver scans the order code, and responsibility moves with a name and a timestamp.
  • Every dinar has an owner at every moment. What the driver collects is his debt until the office receives it, and what the office receives is owed to the merchant until it is transferred.
Next.jsPostgreSQLRealtimeRow Level Security Desktop app
Start at the merchant, then the office, then the driver
D

Simplified · one order, and all three accounts see it at the same moment

♛

Simplified · a booking shows up in your portfolio and in the payout schedule

03
Investment platform

Elite Platform

A platform that connects an investor to a project: the opportunity, booking shares, the monthly payout schedule, and an account where each investor sees only their own money. I rebuilt it end to end while keeping the mark and the name, because the existing investors recognise the app by them.

  • A rebuild under live investors. The old system kept running right up to the moment everyone moved across.
  • Three languages in one app. Arabic, Kurdish and English, with the same design across all three.
  • An account that sees nothing else. Permissions at the row level, not at the screen level.
ReactTypeScriptSupabaseRow Level Security
04
Mobile app

Juzdani

A personal wallet that works with no account and no internet. You log a spend in three taps, move money between your wallets, read your monthly report, and keep photos of your official documents with a reminder before they expire. Everything lives on the device, and the backup is entirely optional.

  • Three wallets from first launch. Cash, Qi Card and ZainCash, which is what people here actually use.
  • A transfer is neither income nor an expense. It leaves one wallet and enters another, and never touches the monthly report.
  • The document number is masked by default. It is only revealed in full behind a PIN or a fingerprint.
React NativeExpoSQLiteOffline first
Log a spend, then open the reports and watch it land

Simplified · four screens, and the report is computed from your own entries

05
Platform desk

OWL Master

The desk I run the platform itself from: the subscribed companies, their plans and limits, suspending an account and bringing it back, and a trail that records who did what and when. A plan is not a price on a page, it is a limit enforced inside the database.

  • The limit is enforced in the database. Upgrading a plan opens branches and users in the same instant.
  • Suspend, never delete. A suspended account keeps its whole history, because old operations hang off it.
  • No change without a name. Every upgrade and suspension is written to the trail with who did it and when.
Next.jsPostgreSQLSQL functionsAudit trail
Change a plan or suspend a company, then open the trail
master.owlplatform.net
M

Simplified · limits move with the plan, and the trail records every change

06
Marketing and operations

An audit and a thirty day plan

Not everything I hand over is a screen. For several companies: an audit that scores each axis and says why, then a day by day plan for thirty days where every day has an owner and a measure. Delivered as a document to execute, not a deck to read once and forget.

  • A score and a reason. Every axis gets a number and the finding that earned it, so no judgement is left to taste.
  • Every day has an owner and a measure. A line with nobody carrying it and no number to judge it never gets done.
  • Then a fixed rhythm. After the first week the plan becomes a weekly habit that repeats without a meeting.
Audit Execution plan Budget split Measurement
Open an axis to read its finding, then tick a day off the plan

Simplified · a document to execute, not a deck to read

07
Internal tool

Ad campaign manager

A tool that runs on your machine alone: it opens any Meta ad account, reads its numbers, diagnoses what is burning the budget, and discusses the result with you in the same window. I built it because one of my own campaigns was spending on a network with no customers in it, and no ready made report showed me that.

  • Diagnosis before opinion. It reads how spend is split across placements and points at the one eating the budget with nothing to show.
  • And it fixes, not just describes. One button redistributes the placements, and the cost per result moves in front of you.
  • Your keys never leave it. It runs on your machine, opens no port, and the analysis only ever sees aggregate numbers, never the account token.
PythonMeta Marketing APIOAuth Local UI
Open the diagnosis, hit apply, and watch the cost per result
127.0.0.1:8733
A

Simplified · demo data, and the fix really recomputes the cost

08
Site and identity

A holding group site

A group of six companies in different sectors, each wanting its own page. I built it a site with a dark identity and a single metal accent, a page per company inside the same structure, and motion that accompanies the scroll instead of interrupting it. Designed and built from scratch with no template.

  • One colour carries the identity. Brass on a warm black, and no second colour competes with it anywhere.
  • Six companies, one structure. The company changes and its content with it, the layout does not.
HTMLCSSMotion Designed from scratch
Move between the sections, then switch the company
group.example

Simplified · the identity and the structure, without the client name

O

Simplified · cut the internet and sell, then bring it back and sync

09
Desktop app

The print agent and working offline

A desktop build of the business system and of the delivery system, running on the counter machine: it prints invoices and barcode labels through a local agent, and keeps selling when the internet drops, then uploads what piled up when it returns. Because a shop cannot afford to stop.

  • A dropout does not stop the till. The sale is written locally and enters a numbered queue, and not one of them is lost.
  • Printing goes through an agent on the machine. A browser cannot reach a thermal printer, so the agent stands between them.
  • And a lesson that cost me a day. Chrome hides 127.0.0.1 behind a local network permission, and the refusal reads exactly like the agent not being installed.
ElectronPrint agent Local queueESC/POS
Hit offline, make a few sales, then reconnect
10
Events platform

Events by acceptance, not open sale

An event organiser who chooses their own crowd: anyone who wants a ticket applies, the organiser reads the request and decides, then the accepted guest pays and receives a ticket with a code that scans once at the door. I built the whole journey as an interactive prototype with four roles, so the client tries it with their own hands before a single line is written on the server.

  • Acceptance comes in three forms. For this event only, or always so the guest skips review at every future event, or a refusal with a reason written once and kept on record.
  • Acceptance alone does not hold a seat. The accepted guest has 48 hours to pay, and after that the seat goes back on the list.
  • The door screen has only three outcomes. Valid, already used, or saved offline and uploaded when the line returns. Each one in a colour you can read from across the room.
Interactive prototype Google sign in QR tickets Offline door
Apply, accept it from the organiser account, then pay and scan the ticket at the door
◆

Simplified · three accounts and the request really moves between them, without the client name

11
Health cover system

Family health cover contracts

A company sells health cover at a fixed price, and every paper contract carries a code that never repeats. The subscriber scans it and registers themselves and four family members with their ID photos, the reviewer accepts or rejects each person with a reason, and the contracted health centre scans the contract at every visit and records who used it. Three sites, for the subscriber, the office and the centres, built and tested and waiting for launch.

  • Protection comes from matching the person, not the paper. The centre sees the name, age, relation and the last four digits of the document, and never sees the ID photo.
  • The reviewer corrects instead of rejecting. A typo in a name gets fixed and accepted, and the old value stays on record under the name of whoever fixed it.
  • The discount is computed, not typed. Each centre has an agreed rate per service, so no discount drifts away from the contract.
  • 98 end to end checks and 206 security checks, all passing. Every role tries what it is not allowed to do, and the system refuses.
Next.jsSupabasePostgreSQLRow Level Security Phone OTP sign in
Scan and send the contract, review it and fix the name, then record a visit at the centre
cover.example
+

Simplified · three sites and the decision really reaches the centre, without the client name

You have seen the work. Now tell me your problem.

Two lines are enough for me to see where your time or your money is leaking, and I will come back with a written plan before we start.