Skip to content
OJ

Omeonu JoshuaLagos, Nigeria

I build the softwarethat businessesactually run on.

I'm a full-stack engineer in Lagos. For the last three years I've been shipping production systems — retail distribution, property management, learning platforms — for teams who notice within minutes when something breaks.

Currently at TechMinte, building Comtrova — and on the Hardeverse learning platform at Harde Business School.

Name
Omeonu Joshua
Role
Full-stack engineer
Base
Lagos, Nigeria · WAT — UTC+1
Shipping since
2022
Status
Open to full-time and contract work
Scroll

01/Story

How I got here

Seven years, one detour through mechanical engineering, and a slow education in what production software actually costs.

Joshua Omeonu
Ikeja, Lagos2026

2019

I learned to build things that had to fit

I studied Mechanical Engineering at Nigeria Maritime University. Most of what I remember isn't thermodynamics — it's the discipline of tolerances. A part is either within spec or it isn't. You can't argue a shaft into a bearing.

That turned out to be the most useful thing I took into software.

2022

The first thing I built that other people used

I wrote my first serious interface in my final years of school and immediately preferred it to everything else I was studying. The feedback loop was instant. Something either rendered or it didn't, and when it didn't, that was on me.

I taught myself React the slow way — building, breaking, rebuilding — until I could put something in front of a stranger without flinching.

2023

SalesUnbox, and what production really costs

SalesUnbox was my first real production system: a retail platform used by hundreds of Nigerian SMEs, with merchant dashboards, inventory, orders and payments through Paystack and Flutterwave.

It taught me the part nobody warns you about. Shipping a feature is maybe 40% of the work. The rest is the states you didn't plan for — the failed charge, the duplicate submit, the merchant on a 3G connection in Aba whose token expired mid-checkout.

2023—now

TechMinte: many clients, one habit

At TechMinte I've worked across a lot of surfaces — an LMS, a marketing site, an AI dashboard, a media platform — usually as the person who takes a Figma file and a half-finished API and makes them agree with each other.

The habit I picked up here is boring and it's the one I'd bring anywhere: read the API response before you design the state. Almost every frontend mess I've had to untangle started as an assumption about data that nobody checked.

2025

Hardeverse, and APIs you don't control

I joined Harde Business School to work on Hardeverse, their learning platform — course delivery, quizzes, certificates, and four different programmes running off one codebase. I'm still there.

The enrolment flow is where I learned the most. The backend didn't return an application ID after payment, which meant a learner could pay and end up in no programme at all. Rather than wait for a fix, I built an unreconciled-payment path that records the charge and resolves it later. You rarely get to choose the API you're handed — only whether your app degrades or dies when it misbehaves.

2025

Comtrova, and owning something hard

Comtrova is a property management platform — multi-estate, role-based, money moving through it. Facility managers, estate admins and residents all see a different product built from the same data, which meant building two front-ends against one API and keeping them honest as it changed underneath me.

It's the first codebase where I've been responsible for the architecture rather than just the screens, and the first where getting a permissions boundary wrong has consequences that aren't visual.

2026

RadCare, and state that arrives on its own

Every app I'd built until then fetched its state. RadCare pushes it — patients and caregivers messaging over a socket while the same data sits in an RTK Query cache that thinks it knows better.

Reconciling those two is the hardest bug class I've worked on. A cache and a socket will always disagree eventually; the design question is what happens when they do. I now reach for that question before I write the first subscription.

2026

Kabs Diner, and finally owning the whole thing

Every system before this one had a backend somebody else wrote. Kabs Diner is a restaurant platform where I designed the schema, the auth and the payment verification myself — supper-club bookings, an online store, one admin dashboard behind both.

The lesson arrived in the first week: I put payment verification in the browser, realised anyone could mark an unpaid booking as confirmed, and moved it into an edge function. Anything a user can benefit from lying about has to be decided by the server. Obvious in hindsight, which is how most of the good ones land.

02/Work

Selected work

Work I can talk about for an hour. Different domains, but a recurring problem each time: several front-ends, one API, and a permission model deciding what each person is allowed to see. The last entry isn't finished — its build status is listed with it.

01Property management platform2025—now

Comtrova

Frontend lead · two clients

A multi-estate management platform running two separate front-ends against one API: an admin panel for estate managers and facility staff, and Mello, the resident app. Same data, different permissions, genuinely different products. Service charges and utility payments move through it, so the failure modes are financial rather than cosmetic.

  • Built both clients — the estate admin panel (React Router 7, TanStack Query, shadcn/ui) and the Mello resident app — and kept them honest against a single evolving API contract.
  • Designed the permission model that decides what renders: route-level guards plus an isFacilityManager discriminator read from the login response, separating facility-manager and estate-admin experiences inside one authenticated session.
  • Wrote a centralised apiFetch layer handling token attachment and session expiry, and a query-key factory so cache invalidation stays consistent across roughly twenty feature areas instead of being reinvented per page.
  • Built estate onboarding as a long branching form that saves each step independently, using React Hook Form and Zod — resumable, because setup rarely finishes in one sitting.
  • Integrated Paystack and Monnify with a redirect-safe session strategy, so a user returning from their bank lands back in the state they left.
  • Rebuilt the portfolio dashboard mobile-first after finding most estate managers open it on a phone.
  • React 19
  • TypeScript
  • React Router 7
  • TanStack Query
  • TanStack Table
  • Zod
  • Tailwind v4
  • shadcn/ui
  • Recharts
Comtrova interface
02Care coordination platform2025—now

RadCare

Frontend engineer · client app + admin consoleIn private beta

A platform connecting patients with caregivers — scheduling, real-time messaging, care plans and billing on the patient side; credential verification, assignment management and vendor oversight on the admin side. The first thing I've built where the state isn't just fetched, it arrives.

  • Built the real-time chat between patients and care providers on Socket.io — message threading, delivery state and history — and reconciled the live socket stream with RTK Query's cache so the two never disagree.
  • Structured the client app around eleven RTK Query slices (auth, care requests, chat, billing, wallet, complaints, ratings, notifications, profile) sharing one cache and one invalidation strategy.
  • Integrated Paystack inline for wallet top-ups and service billing, including the reconciliation path for charges that clear at the bank but fail on callback.
  • Built the admin console: caregiver credential verification workflows, calendar-based care assignment scheduling, and patient and vendor management with filtering and pagination over large lists.
  • Kept both apps on CSS Modules with a shared component vocabulary, including mobile modal behaviour with body scroll locking.
  • React 19
  • TypeScript
  • Redux Toolkit
  • RTK Query
  • Socket.io
  • React Router 7
  • CSS Modules
  • Chart.js
  • Paystack
RadCare interface
03Internal enterprise systems2025—now

Nutrition International

Frontend engineer · contractInternal — no public link

Two internal systems for a global nutrition organisation: a procurement and approval portal, and a card reconciliation tool. Corporate environment — staff sign in against the organisation's directory, finance data comes from their ERP, and the app ships through a containerised pipeline rather than to a static host.

  • Built the purchase requisition and PRF workflows across three routing variants — with contract, with P-REQ, and with neither — each carrying its own approval chain and role permissions.
  • Wired authentication to Azure AD through MSAL so staff use existing organisational credentials, and mapped directory roles onto in-app approval rights.
  • Built the admin layer — staff and role management, approval route configuration, notification settings — so the workflow can be reconfigured by an administrator instead of a deploy.
  • Surfaced NetSuite finance data inside requisition views, putting budget context in front of approvers at the moment of decision rather than in a separate system.
  • Built the card reconciliation tool for matching card transactions against internal records.
  • Worked inside a Docker and Kubernetes delivery pipeline, with environment configuration handled per deployment target.
  • React
  • TypeScript
  • Redux Toolkit
  • RTK Query
  • Azure AD / MSAL
  • NetSuite
  • Styled Components
  • Docker
  • Kubernetes
04Bookings & storefront2026

Kabs Diner

Full-stack · sole engineer

A restaurant platform built end to end: a ticketed supper-club booking system, an online food store, and one admin dashboard behind both. The only project where I designed the database rather than consuming someone else's.

  • Modelled the Supabase schema myself — events, bookings, waitlist, products, orders, order_items — including the constraints that stop two people buying the same last seat.
  • Verified Paystack payments inside a Supabase edge function rather than the browser, so booking and order status can only be written by the server after a charge actually clears.
  • Built the reservation flow with per-guest details and dietary notes, plus an automatic waitlist when an event sells out.
  • Built the storefront cart with variant-level stock validation and localStorage persistence that normalises on read, so a stale or malformed cart can't break checkout.
  • Put the admin dashboard behind Supabase Auth with protected routes and a session hook: events, products, variants, stock levels, bookings and orders in one place.
  • React 19
  • TypeScript
  • Supabase
  • PostgreSQL
  • Edge Functions
  • React Router 7
  • Paystack
  • Vite
Kabs Diner interface
05Learning platform2025—now

Hardeverse

Frontend engineer · learner portal + admin

The platform behind Harde Business School — course delivery, assessment and certification for learners, with an admin dashboard for the people running the programmes. Four programme types share one codebase, which is most of the interesting problem.

  • Built the BLEP enrolment and payment module on Paystack's inline flow, including an unreconciled-payment fallback for when the backend doesn't return an application ID.
  • Shipped the quiz engine — dynamic question rendering, shuffling, automatic scoring — and jsPDF certificate generation on completion.
  • Built the admin revenue dashboard: transaction tables, filtering, Recharts breakdowns, and export to CSV, Excel, PDF and Word from the same data layer.
  • Handled cross-domain auth with cookie-based tokens and interceptor-attached headers, keeping learner, instructor and admin views on a shared component layer.
  • Next.js
  • React
  • TypeScript
  • Chakra UI
  • TanStack Query
  • Recharts
  • TipTap
  • Paystack
Hardeverse interface
06REST API2026

NMU Alumni API

Backend · sole engineerIn progress

A REST API for my university's alumni network, and the first backend I'm writing by hand rather than consuming. Authentication, the role model and validation are being built rather than configured — that's the layer every other project on this page let somebody else own.

  • Modelling alumni, profile and connection data as Mongoose schemas with validation defined at the model, rather than trusting whatever arrives in the request body.
  • Writing JWT issuance and refresh with bcrypt password hashing directly, so the auth flow I've consumed a dozen times is one I've also implemented.
  • Building role middleware that separates alumni from administrator, and validation middleware that rejects malformed input before it reaches a controller.
  • Keeping error shapes consistent across every endpoint — inconsistent error responses are the thing I've most often had to work around as a client.

Build status

  • Project structure and MVC layoutComplete
  • MongoDB connection and data layerComplete
  • JWT auth endpointsIn progress
  • Profile CRUD with ownership checksIn progress
  • Deployed with a public base URLPlanned
  • Node.js
  • Express 5
  • TypeScript
  • MongoDB
  • Mongoose
  • JWT
  • bcrypt

03/Craft

How I work

Not a process diagram. Three things I actually believe, learned the expensive way.

Ship the boring version first

The unglamorous implementation that works on Monday beats the elegant one that lands in three weeks. I'd rather put something real in front of users and let their behaviour tell me where the complexity actually needs to go.

Read the API before you design the state

Most frontend messes I've inherited started as an assumption about the shape of a response. I check the payload first, model the state around what the server actually sends, and raise the gap with the backend team on day one rather than patching around it for a month.

The last ten percent is the product

Loading states, empty states, the error message when the network drops halfway through a payment. Users never see your architecture. They see what happens when things go wrong, and that's the part that decides whether they trust the software.

Toolkit

Every day

  • React
  • TypeScript
  • Next.js
  • Tailwind CSS
  • REST APIs
  • Git

Regularly

  • Node.js
  • Express
  • RTK Query
  • TanStack Query
  • React Hook Form
  • Zod
  • Recharts
  • MongoDB
  • PostgreSQL

Have shipped with

  • Paystack
  • Flutterwave
  • Monnify
  • WebSockets
  • GitHub Actions
  • AWS S3
  • Jest
  • Figma

04/Next

Where I'm heading

Three things I'm pointed at, and an honest account of how far along each one is.

01Shipped the surface

AI inside products, not bolted onto them

I built the dashboards for Magent, an AI marketing platform, which meant designing UI around model output — streaming responses, partial states, results that arrive wrong sometimes. What I want next is the layer underneath: structured extraction, tool calling, and the evaluation loop that tells you whether a prompt change made things better or just different.

StandingComfortable building interfaces over an AI backend. Now working through the integration layer myself.

02Already doing it

Automating the work people currently do by hand

Most of what I've built replaces a spreadsheet and a WhatsApp thread — approval routing at Nutrition International, card reconciliation against internal records, multi-format export at Harde, payment verification in a Supabase edge function. It's the part of the job I like most, because the before-and-after is measured in someone's afternoon.

StandingExtending into scheduled jobs, webhook-driven reconciliation and background processing rather than user-triggered actions.

03Building now

Owning the server, not just the schema

Every production system on this page is me consuming an API someone else designed. Kabs Diner got me closer — I modelled that Postgres schema and moved payment verification into an edge function — but Supabase handles the parts I most want to understand. So I'm writing one properly: an Express and MongoDB API for my university's alumni network, with the auth, role model and validation layer built by hand rather than configured.

StandingStructure and database layer are in place; auth and profile endpoints are what I'm writing now. It goes in the work section above once it serves requests, not before.

04Early

React Native

Almost everyone using what I build is on a phone. I rebuilt the Comtrova portfolio dashboard mobile-first after finding estate managers never opened it on a laptop, and Mello is a resident app people check between other things. Responsive web goes a long way, but push notifications, offline reads and camera capture don't.

StandingLearning it now. Nothing shipped yet — I'd rather say that than imply otherwise.

What I want alongside all of this is a team with real users and engineers more senior than me to argue with. I've built the same problem three times now — several clients, one API, permissions deciding what each person sees — and I'd rather go deeper on one product than wider across six.

04/References

People I've built with

Josh takes a design and an unfinished API and makes them agree with each other. He surfaces the gaps early instead of quietly working around them, which saves the whole team time.
Oladunjoye Mayowa
Co-founder, SalesUnbox International
Detail-oriented and fast to understand the business behind the feature. He asks the question the rest of us should have asked.
Daniel Adeneye
Software Engineer, TechMinte

06/Contact

If you are building something that has to work, lets talk.

I read everything and reply within a day. A sentence about what you are building is enough to start.

joshuaomeonu@gmail.com