Oluwayimika.

Lagos, Nigeria

Oluwayimika
Ojo-Bello

I build the backend of business software: ledgers, permissions and multi-tenant data for schools, clinics and small businesses in Nigeria.

Oluwayimika Ojo-Bello
Now: Cavidel and Mattobell by day. Proctora by night.
clinics running EMR software I work on
9
clinics running EMR software I work on
permissions across 14 roles in the RBAC system I led
80
permissions across 14 roles in the RBAC system I led
engineers I led to ship Business Health Checker
3
engineers I led to ship Business Health Checker
first commit on GitHub
2019
first commit on GitHub

Selected work

Six systems from the past year. Pick one to see the screens and the decisions behind them.

Brookstone Schools Portal

Invoicing & receivables

Building

Backend / full-stack · team of two · Apr 2026 – now

Fee billing, payments and a per-student subledger for a group of Nigerian schools. Every rule that touches money is enforced inside MySQL, so a buggy action, seeder or tinker session can't corrupt the ledger. I own notifications, audit logging, the guardian portal and the approval path into finance.

Receivables by account

1 / 6

Decisions worth explaining

  1. Amounts are integer minor units plus an ISO-4217 code, wrapped in an immutable value object that refuses cross-currency maths. The currency CHECK runs under utf8mb4_bin, because the default collation happily accepts 'ngn'.

  2. A CHECK (submitted_by <> decided_by) on every approval table, a route gate built from the permission catalog, and a carve-out that keeps *.approve away from super_admin. Platform staff can raise a credit note but never sign one off.

  3. no_update and no_delete triggers make the subledger append-only, so voiding a charge writes a reversal. Balances are a projection updated with an atomic balance = balance + :delta upsert, under lockForUpdate on the invoice.

  4. reconcile-accounts rebuilds balances from the ledger. audit-ledger-coherence has no --fix flag on purpose: a void with no reversal has two consistent explanations, and picking one would write money on a guess.

  5. school_id is the only tenant boundary. super_admin skips authorization, never isolation. Jobs enter a school only through runFor($schoolId), and CI fails any code that reads the actor's own school_id.

  • Laravel 13
  • PHP 8.3
  • MySQL 8
  • React 19
  • Inertia
  • TypeScript
  • AWS SES + SNS

Try to break the ledger

A small model of the money rules in the Brookstone finance module, running in your browser. Switch users and try to get away with something.

The real system checks each rule in more than one place. Turn on skip the app layer to send actions straight to the database and see which rules still hold.

  1. As Ada, raise a credit note and approve it yourself
  2. Turn on “skip the app layer” and try that again
  3. Delete or edit a ledger row
  4. Approve something as the platform admin
  5. Get a credit note approved the proper way

0 of 5 tried

Acting as Ada (Bursar), who can raise credit notes and void charges.

Chidera Okafor

JSS 2 Gold · student account

Balance owed

₦185,000

  • #1Tuition, first term₦150,000
  • #2Lunch plan₦45,000
  • #3Payment, bank transfer−₦10,000

Credit notes

No credit notes yet. Raise one as Ada.

server log

  1. Waiting for something to happen…

Experience

Product engineering on ERP, EMR and education software. Mostly backend, mostly the parts that handle money, records or access.

  1. Cavidel Ltd

    Dec 2024 – now

    Software Engineer

    • Build and maintain ERP and EMR features used every day by 9 clinics.
    • Led a team of 3 to deliver Business Health Checker, a multi-tenant platform that scores how loan-ready an SME is.
    • Rewrote legacy modules on modern frameworks, which made the slowest workflows faster and the code easier to work in.
  2. Mattobell Ltd

    Mar 2025 – now

    Backend Developer, contract

    • Build the NestJS backend for Simpool, an ERP for small businesses.
    • Ship features with automated tests around the core accounting and inventory paths.
  3. Dellyman Nigeria Ltd

    Mar 2025 – Sep 2025

    Backend Developer, contract

    • Moved a legacy PHP codebase onto Laravel without stopping the business that ran on it.
    • Built and tested the REST endpoints that replaced the old ones.

How I got here

Mostly from my public GitHub.

  1. 2019

    Opened a GitHub account

    Started at university in Ghana. The early repos are coursework and experiments.

  2. 2021

    Password manager, three ways

    A Node + MongoDB API, a React web client and a React Native app. My first full-stack project.

  3. 2022

    A year of Java

    Spring Boot with Spring Security, plus small OOP models: a convenience store, a library, a config parser.

  4. 2023

    Found Laravel

    A blog site, then the Mattobell company website. Laravel has been my main tool since.

  5. 2024

    Graduated, started working

    B.Sc. Computer Engineering, University of Ghana. Built an algo-trading bot in Python on the side, then joined Cavidel in December.

  6. 2025

    Contracts and certification

    Backend contracts with Mattobell and Dellyman. Google AI Essentials.

  7. 2026

    Brookstone, Proctora, Workers Institute

    The three systems featured above. Two are still in progress.

Also built

Cavidel

Business Health Checker

Survey platform that tells lenders how ready an SME is for a loan. RBAC, configurable dashboards, separate auth per user type, and 2FA.

Laravel · SQL Server

Brookstone Schools

Brookstone public sites & CMS

Application portal, page builder, and events and news management for primary, secondary and foundation schools.

Laravel · React · Inertia

JafoFinance

Street News

CMS for a local news site, with view analytics, support tickets, contact tracking and newsletters.

Laravel · React

Oluwayimika Ojo-Bello

About

I studied Computer Engineering at the University of Ghana and started writing software for other people before I finished. Most of what I build now is Laravel or NestJS on the back, React on the front, and a relational database doing more work than people expect.

The work I enjoy most is the part where a bug costs real money or exposes the wrong school's records. I'd rather a rule live in a database constraint than in a code review comment, and I write the test that proves it before I trust it.

Right now I'm learning how to put LLMs into production systems properly: retrieval, embeddings, structured outputs. I want them to earn a place in software like the systems I already build, not just look good in a demo.

Off the clock

Football
I play for a local team. It's the one part of the week with no keyboard in it.
Running & the gym
Mostly for the same reason I like append-only ledgers: small consistent entries add up.
Teaching
I volunteer as a programming teacher and lead the technical team at my church, getting kids and teenagers writing their first code.

What I work with

Every day

What I'd use on a new project tomorrow

  • PHP
  • Laravel
  • TypeScript
  • NestJS
  • React
  • Inertia
  • MySQL
  • PostgreSQL
  • Pest

Comfortable

Used in production, reach for when it fits

  • Next.js
  • Node.js
  • SQL Server
  • Redis
  • TypeORM
  • Docker
  • Tailwind
  • React Native
  • Playwright
  • AWS SES/SNS
  • Paystack

Learning now

Working on these outside client work

  • Python
  • Embeddings & RAG
  • pgvector
  • Structured LLM output
  • Tool calling

Earlier

Where I started

  • Java
  • Spring Boot
  • MongoDB
  • Express

Say hello.

I'm open to remote engineering roles and a small number of client projects. If you're building something where correctness matters, I'd like to hear about it.