Archive

Everything worth keeping — learning platforms, marketplaces, and the odd weekend build. Expand a row for the detail.

Projects

11

Live

9

Span

2022 — 2026

ALLProjectsClick a row to expand
Ajo screenshot

Ajo brings the familiar rotating savings circle online: members fund individual wallets, contribute on a set schedule, and receive the full pot when it is their turn. The product keeps every movement traceable without asking one member to hold the group's money.

What it does

  • —Naira wallets with card and bank-transfer top-ups through Paystack
  • —Double-entry ledger with balances derived from immutable entries
  • —Scheduled contribution collection and rotating payout rounds
  • —Shareable circle invites with membership and schedule visibility
  • —Idempotent payment and ledger writes to prevent duplicate charges
  • —Transparent missed-payment records for every circle member

The hard part

Money movement needs to remain correct when a payment is retried, a webhook is delivered twice, or a scheduled round runs more than once. Idempotency keys and database transactions ensure each movement is settled exactly once or not at all.

What it taught me

For a financial product, the ledger is the source of truth. Deriving balances from matching debit and credit entries makes both the system and its audit trail easier to trust.

Built with

TypeScriptPostgreSQLPaystackDouble-entry Ledger
Debsphere Academy screenshot

A learning platform built for a training academy, covering enrolment, course delivery, and cohort management. I led the engineering side: shaping the data model, standing up the job queue for anything slow enough to hurt a request, and setting the conventions the rest of the team built against.

What it does

  • —Course and cohort management with role-based access
  • —Queue-backed background jobs for email and media processing
  • —Prisma schema covering enrolment, progress, and payments
  • —Redis-backed caching on the heaviest read paths

The hard part

Keeping request latency flat as the heavy work grew. Moving media processing and transactional email onto BullMQ workers meant the API stayed fast while the slow work drained in the background.

What it taught me

Leading a team is mostly deciding what not to build yet, and writing the conventions down before anyone needs them.

Built with

Next.jsNode.jsPrismaPostgreSQLRedisBullMQ
Learnpally screenshot

One product, two clients: a React web app and a React Native mobile app sharing a single Express API. I worked across the whole stack, from the course player to the payment reconciliation behind it.

What it does

  • —Shared Express API serving both web and React Native clients
  • —Paystack checkout with webhook-driven reconciliation
  • —Background workers for transactional email and video processing
  • —PostHog instrumentation across the signup and purchase funnels

The hard part

Payment webhooks arrive out of order and sometimes twice. Making enrolment idempotent — keyed on the provider reference rather than the request — was what made the flow trustworthy.

What it taught me

Instrument the funnel before launch, not after someone asks why conversion is low.

Built with

ReactReact NativeNode.jsExpressMongoDBPaystack

A two-sided rental marketplace. Listings had to be indexable, so the app runs through a hand-rolled Vue 3 + Vite SSR pipeline rather than a framework that ships one out of the box.

What it does

  • —Custom Vue 3 server-rendering pipeline on Vite
  • —Booking flow with date-range availability and pricing rules
  • —Google Maps location search and radius filtering
  • —Listing management for owners, with media upload

The hard part

Hydration mismatches on any component that touched dates or the user's locale. Pinning formatting to a single timezone on both sides of the render was the fix.

What it taught me

SSR is a lot of machinery to own yourself — worth it for SEO-critical pages, rarely worth it for anything behind a login.

Built with

Vue 3Vite SSRNode.jsGoogle Maps API
EkoPages screenshot

An edtech platform using SDG-themed children's literature to teach environmental and sustainability topics, delivered both online and through physical workshops in schools.

What it does

  • —SDG-themed children's literature library
  • —Interactive e-learning modules
  • —Blended learning — online modules plus physical workshops
  • —Publisher platform for emerging writers
  • —School partnership programme

The hard part

Building an interface that works for very young readers. Most of the decisions came down to reducing the number of things on screen at once.

What it taught me

Culturally relevant content matters more than the feature list when the audience is children.

Built with

Next.jsTypeScriptDjangoTailwind
UniLMS screenshot

A learning management system built around the way a university term actually runs: courses, enrolment, assignments with deadlines, assessments, and progress visible to both students and staff.

What it does

  • —Course delivery with structured modules and materials
  • —Assignment submission with deadline handling
  • —Assessments and automatic grade rollup
  • —Separate student and lecturer views over the same data

The hard part

Access control. Every query needed to answer 'who is asking' before 'what did they ask for', which pushed the permission checks down into the data layer rather than the UI.

What it taught me

Model permissions once, at the boundary. Scattering role checks through components is how data leaks.

Built with

Next.jsTypeScriptPrismaTailwind
McTechy screenshot

What it does

  • —Course catalogue across five programmes
  • —Testimonial section with graduate stories
  • —Lead capture forms routed to career advisors
  • —Newsletter subscription and partner showcase

The hard part

Keeping a long, animation-heavy marketing page fast enough that it did not undo the conversion work.

What it taught me

On a landing page, the structure of the content does more for conversion than the motion layered on top of it.

Built with

ReactTailwindFramer Motion
ShibaYC screenshot

A launch site for an NFT collection, built around a timed reveal and an in-page minting flow.

The hard part

Wallet connection state is genuinely hostile — accounts switch, chains switch, and the page has to survive both without a reload.

What it taught me

Treat the wallet as an external system that can change underneath you at any moment, not as app state you own.

Built with

ReactWeb3CSS
GitHub User Finder screenshot

What it does

  • —Search any GitHub user by username
  • —Avatar, bio, followers, following, and public repo counts
  • —Copy username to clipboard
  • —Fully responsive layout

The hard part

The GitHub API rate-limits unauthenticated requests aggressively, so the failure state had to be a real part of the design rather than an afterthought.

What it taught me

Error and empty states are most of the work in anything backed by a public API.

Built with

Next.jsTypeScriptGitHub APITailwind

What it does

  • —Email generation from a natural-language prompt
  • —Tone selection — professional, friendly, formal
  • —Sends directly over SMTP
  • —Email history stored per user, with JWT authentication

The hard part

Getting consistent formatting out of a generative model. Constraining the output shape in the prompt did more than any amount of post-processing.

What it taught me

Prompt design, SMTP delivery, and how much of an AI feature is really just careful error handling.

Built with

Next.jsExpress.jsMongoDBNodemailerTailwind
Dogify screenshot

What it does

  • —100+ breeds listed alphabetically
  • —One-click breed navigation
  • —Static, fast-loading build

The hard part

Presenting a long, flat list so that it stays scannable on a phone.

What it taught me

Structure and typography carry a list further than any amount of styling.

Built with

ReactCSS Modules

Not everything makes it here. The rest lives on GitHub, in various states of finish.

github.com/ayoeze191 ↗