Professional Work

Software built for real operations, not just games.

Alongside CirclesGames, I work as an ICT Officer and build production business software — from a solo-engineered multi-tenant SaaS platform to a custom staff intranet used daily by a real pharmaceutical company. This page exists mainly for schools and employers who want to see the software-engineering side, not just the game-dev side.

HealthCore + PharmaCore

Type: Multi-tenant SaaS (clinical + pharmacy operations) Role: Solo full-stack developer Stack: PHP 8.2, Laravel 12, Filament 4, Livewire 3, PostgreSQL/MySQL
In development — local build, not yet deployed

HealthCore + PharmaCore is a multi-tenant SaaS platform that merges two systems small-to-mid healthcare businesses usually run separately: an outpatient clinical system (patient triage, doctor consultations, e-prescriptions) and a pharmaceutical inventory and supply-chain system (batch and expiry tracking, manufacturing, point-of-sale). The gap I was targeting is the handoff between a doctor writing a prescription and a pharmacist filling it — in most small clinics that handoff still happens on paper or over a phone call, which is exactly where medication errors, stock discrepancies, and billing mismatches creep in.

Architecture

Built as a modular monolith rather than a microservice mesh: one deployable Laravel application split into clean internal module boundaries (app/Services/HealthCore, Inventory, Manufacturing, Finance), with two panels sitting on top of the same codebase — a Platform panel (/admin) for managing tenant companies, plans, and subscriptions, and a Company panel (/company) where clinical and pharmacy staff do their actual work. I chose a monolith deliberately: for a solo-maintained product, transactional consistency across modules matters far more than the independent scaling a microservice split would buy me, and a single codebase is something one person can actually keep in their head.

Patient triage & registration

Patient is registered and queued; a collision-proof clinical ID is generated automatically.

Doctor consultation & e-prescription

Structured SOAP notes with vitals, then an electronic prescription tied to real product formulations and dosages.

Dispensing & FEFO stock deduction

The prescription becomes a dispensing order; stock is pulled from the batch with the earliest expiry date, automatically.

Invoice & cashier settlement

One invoice is generated from the visit, then settled at the cashier across cash, card, transfer, or wallet — idempotently.

Multi-tenancy without running hundreds of databases

Rather than a database-per-tenant (painful to migrate at scale) or a fully shared schema with no guardrails (one bug away from a cross-tenant data leak), every business model uses a BelongsToCompany trait that registers a global query scope on boot — every query is automatically filtered to the authenticated user's company, with no per-controller "don't forget to scope this" discipline required:

static::addGlobalScope('company', function (Builder $builder) {
    if (auth()->check() && !auth()->user()->is_platform_admin) {
        $builder->where('company_id', auth()->user()->company_id);
    }
});

Branch-level restriction stacks on top of that: a user flagged restrict_to_branch only sees records under their own branch, while a company-wide manager sees across all of them.

Feature areas

Clinical (HealthCore)

Patient triage and queueing, doctor rosters with overlap prevention, SOAP consultation notes, and electronic prescriptions linked to real product formulations.

Pharmacy & supply chain (PharmaCore)

FEFO batch allocation, import landed-cost calculation, inter-branch stock transfers, and a manufacturing module with Bill-of-Materials and mandatory QC quarantine gating before any batch is sellable.

Finance & point of sale

Cashier workspace for unpaid orders, multi-channel settlement (cash, transfer, card, USSD, wallet), idempotent payment handling, and sequential receipts.

Platform & access control

Tenant/plan/subscription management, granular permission gating per action via Spatie Permission, and full row-level tenant and branch isolation.

Engineering problems I actually had to solve

Two cashiers, one batch, at the same time. In a busy pharmacy, two people could sell from the same expiring batch simultaneously and oversell it. Batch queries take a database-level pessimistic lock (lockForUpdate()) inside a transaction, so batches are claimed in expiry order without a race condition.

Stock getting deducted twice. If both the clinical dispensing step and the sales/billing step tried to reduce inventory, the ledger would corrupt. I settled on a Single Stock Authority pattern: the dispensing service prepares and validates the item list but always delegates the actual stock movement to one sales-workflow service — never two paths writing to inventory.

A cashier double-tapping "Settle" on a bad connection. Unstable networks mean people retry. Every settlement carries a deterministic operation_key, and a compound unique index on (company_id, operation_key) means a retried request is silently absorbed instead of creating a second payment record.

Verification

The full test suite currently passes 64 tests across 166 assertions, 0 failures, covering the parts that actually worried me: FEFO batch allocation picking the correct expiry order, the prescription-to-dispensing handoff not double-deducting stock, cashier settlement idempotency under duplicate submissions, manufacturing yield/QC gating, and branch-level data isolation.

HealthCore + PharmaCore login screen
Platform admin dashboard — tenants, subscriptions, support tickets
Platform admin — companies list
This is a solo, local-environment build rather than a deployed commercial product — there are no real clinics or paying tenants on it yet. What's actually verifiable, and what I'd want to defend in an interview, is the engineering underneath it: the concurrency handling, the tenancy model, and a passing automated test suite — not a market-sizing exercise.

StockMata

Type: Multi-tenant commerce, POS & inventory platform Role: Solo full-stack developer Stack: WordPress (public site) + Node.js/NestJS 11, Prisma ORM, React 19/Vite, PostgreSQL (backend engine)
In development

StockMata is a multi-tenant B2B commerce, inventory, POS, and accounting platform, built for retail, supermarket, distributor, and restaurant/hospitality businesses. The deliberate architectural choice here is a split most tutorials never mention: WordPress stays as the public-facing, searchable, content-editable front of the site, while a completely separate NestJS + React backend handles the actual transactional work — POS, inventory, ledger, sync. It's a pairing chosen for a real reason: WordPress gives indexable pages and easy content editing for free, which a single-page React app doesn't, without forcing the transactional engine itself to live inside WordPress's constraints.

Offline-first, on purpose

The standout piece of this build is the sync engine: sales happen through a React 19 client backed by browser-native IndexedDB, so a cashier can keep ringing up sales through a total network dropout. Each offline sale gets a client-generated UUID and queues locally; once the connection returns, the queue pushes to the backend inside a database transaction. Every operation is checked against its UUID before it's applied — a retried or duplicated push returns the already-synced result instead of double-charging or double-deducting stock.

Feature areas

POS & sales

Multi-payment split settlement (cash, transfer, card, credit, mixed), automatic debtor accounts when a sale isn't paid in full, and point-in-time cost snapshots on every line item so historical profit doesn't get rewritten when supplier prices change later.

Accounting

A double-entry general ledger that automatically maps sales, expenses, and debt settlements into a standard chart of accounts — assets, liabilities, income, expenses, and cost of goods sold.

Hospitality

Dine-in, takeaway, and delivery order types, with a kitchen status lifecycle (new → preparing → ready → served) tied to table numbers.

Multi-branch retail

Business-level tenant scoping with role-based access (owner, manager, cashier, accountant, inventory officer), built for chains running more than one location.

Engineering problems worth mentioning

Duplicate transactions from retried sync requests. The same fix as any idempotency problem, applied to an offline-first context: every synced operation carries a UUID, checked inside the same transaction that would apply it, before it's applied.

Profit distortion when supplier costs change. Naive reporting recalculates old sales against today's cost price, which quietly erases historical profit. Every sale line stores its own cost-price snapshot at the moment of sale, so a price change next month can't retroactively rewrite last month's numbers.

StockMata WordPress admin menu

StockMata Commercial

Type: Standalone enterprise ERP/POS webapp — a separate build, no WordPress Role: Solo full-stack developer Stack: NestJS 11, Prisma ORM 6, React 19/Vite, PostgreSQL 16, IndexedDB
In development — release candidate

A separate, larger project sharing the StockMata name and some DNA with the WordPress-fronted version above, but built as its own standalone enterprise webapp — no WordPress anywhere in this one. Its own tagline sums up the intent better than I could: "Sales, stock, debts, and reports for African SMEs." Where the first StockMata is a commerce/POS platform, this one grows into a genuine light-ERP: manufacturing, HR, multi-tier approvals, and per-tenant customization sit alongside the same POS and inventory core.

Onboarding that adapts to the business

Rather than one fixed feature set for everyone, a sector-preset engine provisions different module bundles, role templates, and default departments depending on what kind of business is signing up — retail, pharmacy, restaurant, manufacturing, distributor — gated further by a commercial tier (community/pro/advanced/erp). A pharmacy gets batch and expiry tracking by default; a restaurant gets kitchen-display routing; a manufacturer gets Bills of Materials. Same core platform, different provisioned shape.

Feature areas

Light manufacturing

Bill-of-Materials formulations, production orders with material reservation, and actual-vs-theoretical yield tracking to isolate wastage.

Regulated batch tracking

Full batch lifecycle (quarantine → released → expired → recalled) with mandatory QC clearance before a batch can ever reach sellable stock — the same quarantine-gating principle as the pharmacy work in HealthCore + PharmaCore, arrived at independently in a different codebase.

Governance

A generic, entity-agnostic multi-tier approval engine (purchase orders, write-offs, refunds) and an event-driven workflow-rules engine for automatic escalations and low-stock alerts.

HR & payroll-lite

Staff profiles, attendance logging, and a payroll run that posts straight into the general ledger as a salary liability — no separate reconciliation step.

Extending the schema without migrations

Enterprise tenants inevitably need fields the core schema never anticipated — a NAFDAC number, a license plate, a doctor's license ID. Rather than bolting on a migration per tenant request, custom fields are stored using an EAV-inspired pattern in typed PostgreSQL JSONB columns, so a business can define its own typed, validated fields at runtime.

StockMata Commercial dashboard for a demo tenant business
Still a release candidate, not a shipped commercial product — no live paying tenants yet. The demo dashboard shown here uses a test business set up for development, not a real deployment.

KCC Intranet

Type: Custom staff intranet Role: Sole developer (as ICT Officer) Stack: WordPress, PHP, MySQL — custom plugin architecture
Live — internal deployment at KCC Pharmaceuticals

KCC Pharmaceuticals needed a single place for staff to handle HR requests, internal communication, compliance, and company records. Rather than deploying an off-the-shelf intranet plugin and working around its limits, I built a custom WordPress plugin (kcc-intranet) on a child theme, which gave full control over the access logic and workflows the company actually needed.

Designed around a real constraint: Nigerian office networks

Connectivity and power aren't guaranteed in the office, so that shaped the build from the start rather than being patched in afterward — an offline mode caches static assets and saves local drafts for forms like leave requests, so a dropped connection mid-form doesn't cost someone their work.

Access & security

A five-level staff clearance system (Staff → Manager → HR/Admin → Executive → WordPress-administrator override) controls both page access and content visibility, with visibility further scoped by department. Login runs through a custom email-OTP flow rather than a generic two-factor plugin, and a built-in Network Access Control module supports IP/CIDR allow- and block-listing for locking the intranet to office or VPN ranges. On top of that sits a mandatory policy-acknowledgment gate: a staff member who hasn't signed off on the current Privacy Notice, Acceptable Use Policy, and Data Subject Rights notice gets redirected there on every page load until they do — with the acknowledgment page itself whitelisted so nobody gets stuck in a redirect loop.

WordPress's default search doesn't know about any of this clearance logic — out of the box it would happily show a low-clearance employee the title of a restricted executive announcement. So search results are filtered through the same visibility rules as everything else before they ever reach the page, meaning a search box can't be used to route around the access model it sits inside.

HR & compliance

A full leave-request workflow with HR approval, a formal Data Subject Rights (compliance) request-and-response system, and an HR panel giving one view over pending leave, compliance requests, and remote-staff activity.

Secure document bank

Files live outside the public uploads directory and stream through an authenticated download handler rather than a direct URL, so a guessed or shared link doesn't bypass clearance. Documents carry version numbers, effective/expiry dates, and an optional password on top of the normal access check.

Remote work tracking

A REST endpoint lets a companion mobile client log clock-in/clock-out events and periodic location pings for staff working off-site, feeding the "Remote Staff" view in the HR panel. Location history past the retention window is purged automatically by a daily cron rather than kept indefinitely.

Everyday staff tools

Org chart, staff directory, file bank, announcements feed, a company calendar, and real-time staff messaging, all wrapped in one consistent UI so nobody has to leave the intranet to talk to a colleague.

On the operability side: an audit log records who did what — logins, downloads, permission changes, DSR requests — with actor, IP, and a bit of context, stored in its own table with automatic retention cleanup rather than growing forever. Built-in diagnostics (URL health, broken-media detection, page health, shortcode health) mean I can catch a broken link or a missing asset without manually clicking through every page, and page assets only load on the pages that actually use them rather than on every request.

KCC Intranet staff dashboard
KCC Intranet login with email OTP
Custom KCC Intranet plugin admin menu
Leave request workflow
HR panel
Event creation and DSR compliance requests
Staff directory with full site navigation
Internal staff messaging inbox
Staff account center
Built with AI collaboration throughout — genuinely more than a month of solo development time saved. AI helped with architecture and edge cases; the judgment calls (what the company actually needed, what "good enough for real staff to trust" looks like, and how to design around Nigeria-specific reliability problems) were mine.