Projects

85 projects across computer vision, applied ML, full-stack products, developer tooling and research.

Page 6 of 8

Data Community Anonymous (Game Night Wall)

Data Community Anonymous (Game Night Wall)

Anonymous message wall built for a Data Community UNILAG game night: a React Router 7 server-rendered page backed by Supabase, where visitors post without signing in and can flag inappropriate messages out of public view.

TypeScriptReact Router 7React 19Tailwind CSS 4Supabasereact-hook-formDocker

Status: Completed (2025)

Role: Community Project (Event Tool)

Key Features:

  • Supabase access isolated in one typed client module; the feed query filters flagged rows and caps results at the 50 newest messages.
  • Flagging writes is_flagged to Supabase and drops the message from the client list immediately.
  • Deliberately unauthenticated single-route app with a Dockerfile for deployment.

Personal Portfolio Website

Personal site and blog: a React Router 7 server-rendered frontend backed by a Strapi 5 CMS, with posts, categories, tags, comments, likes, RSS and draft preview. Earlier iterations were Next.js and React/Express versions.

TypeScriptReactReact Router 7Strapi 5Tailwind CSSVitePostgreSQLSQLiteCloudinaryDocker

Status: In Progress

Role: Personal Project

Key Features:

  • React Router 7 SSR frontend with routes for the blog index, post, category and tag pages.
  • Strapi 5 content types for blog posts, projects, experience, categories, tags, comments and post stats.
  • Reader comments and post-like counters persisted through Strapi and server-side loaders and actions.

Doc-On (Appointment Booking)

Next.js 14 appointment-booking interface for a healthcare service, with separate doctor and patient auth, a responsive multi-month calendar, doctor previews and a dashboard messages page.

TypeScriptNext.js 14React 18Tailwind CSSRadix UIHeroicons

Status: In Progress

Role: Personal Project

Key Features:

  • App Router route groups separating auth, marketing and dashboard areas.
  • Server actions posting to an external BACKEND_URL API, storing the JWT in a cookie and attaching it through a fetchWithAuth helper.
  • Booking calendar rendering one, two or three months depending on viewport width.

Exam Progress Tracker

Web app planned to replace daily Google Forms during exam revision: students submit a five-star progress rating and written notes per course each day, feeding course leaderboards with optional privacy.

ReactReact RouterNestJSPostgreSQLTypeScript

Status: Not Started (specified)

Role: Personal Project

Key Features:

  • Daily per-course submission combining a five-star progress rating with required written feedback.
  • Course leaderboards with an opt-in privacy flag that excludes private submissions.
  • Persistent submission history so answers from previous days are retained.

Job Board ATS API

REST API for a job board applicant tracking system, with JWT role-based auth, job and application modules, file uploads and Swagger documentation.

TypeScriptNestJSTypeORMPostgreSQLPassport JWTSwaggerJest

Status: Completed (2025)

Role: Hackathon (ECX 14 Days of Code 2025, Backend Track)

Key Features:

  • NestJS 11 modules for users, auth, jobs, applications and uploads over TypeORM and PostgreSQL.
  • JWT guard with employer role checks on job creation and updates.
  • class-validator DTOs and Swagger-annotated response schemas across the endpoints.

Operations Research Tools

Browser toolkit for operations research problems: step-by-step simplex, Big-M and two-phase tableaus, graphical LP plotting, and transportation initial and optimal solutions, with validated matrix inputs and JSON export.

TypeScriptReact 19React Router 7Tailwind CSSreact-hook-formzodRechartsViteDocker

Status: In Progress

Role: Personal Project (Academic Tooling)

Key Features:

  • Simplex, Big-M and two-phase solvers returning the full tableau history for each iteration.
  • Graphical LP method plotting constraints and the feasible region with Recharts.
  • Transportation solvers covering north-west corner, least cost and Vogel's approximation, with optimality checked via multipliers.

CribPal (Student Accommodation Marketplace)

Verified student-accommodation marketplace built as a single Next.js App Router app with student, hostel-manager, agent, investor and admin portals.

Next.js 15 (App Router)TypeScriptTailwind CSS 4better-authMongoDBCloudinaryZustandRechartsFramer Motionthree.js

Status: In Progress (2026)

Role: Collaboration (Full-Stack / Integration)

Key Features:

  • Grafted Catalyst's agent and investor dashboards onto the CribPal codebase as role-gated surfaces, kept demo-mode-safe by rendering sample data when no Mongo cluster or payment…
  • 3D/360° virtual-tour builder and viewer rendered as a self-contained three.js document inside a sandboxed iframe, so no bundler or runtime three dependency is required.
  • Role-picker hub at /portal for demo previews, with the live portal chosen from the signed-in user's better-auth role.

grpc-tunnel

Python CLI tool to easily expose local gRPC servers over the internet via ngrok tunnels.

PythonclickgrpciopyngrokHatchling

Status: Completed (Unpublished due to AVZDAX contract IP limitations)

Role: Developer Tool / Package

Task-System

A deterministic, AI-friendly task format built on plain Markdown, with a tsk command-line tool, a two-way-sync web UI, and a core library that keep them consistent.

TypeScriptNode.jsReactViteVitestnpm workspaces

Status: In Progress

Role: Developer Tool / Open Source (Personal)

Key Features:

  • Deterministic, idempotent, and confluent formatter — input order never matters and there is no wall-clock, so output is reproducible.
  • Tolerant parser that preserves unrecognized lines position-stable.
  • Structured model: frontmatter, title, a nested timeline partitioned by 🏁 milestones, and an archive, with four date fields (🛫 start, 📅 due, ✅ done, ➕ created).

MELDA (AI Teaching Assistant)

An AI teaching assistant that helps teachers prepare better learning experiences, understand how students respond to them, and use that information to teach more effectively.

TypeScriptReact Native (Expo Router)ExpressPGlite/PostgreSQLDrizzle ORMDeepSeek/Anthropic APIpnpm

Status: Deployed (Web + Android)

Role: Hackathon (AFRETEC Innovation Challenge)

Key Features:

  • Multi-tenant platform (signup → teacher creates a class with an invite code → students join via code), deployed across a web app and Android APKs.
  • AI-assisted lesson and quiz drafting, plus section-level "adaptations" the teacher can generate (six pedagogical modes or a free-form "my own way" instruction) and edit before…
  • Student → teacher signal loop: "I don't get this" flags a struggling section straight to the teacher's drill-down, where a one-tap Adapt re-casts it.

Animate Commits

CLI that replays a git commit or commit range as VS Code typing in the user's own theme, exporting an MP4 or a scrubbable browser preview. Nothing is written to the target repository or VS Code settings.

TypeScriptNode.jsplaywright-corevscode-textmatevscode-onigurumaffmpegCommanderViteVitesttsup

Status: In Progress (2026)

Role: Developer Tool (CLI)

Key Features:

  • Reads history through git rev-list, diff --name-status -M and cat-file, and verifies every planned edit replays to the exact new file contents.
  • Renderer is a pure function of time (window.__seek(tMs)) driven by a JSON event timeline with a seeded PRNG, so no CSS animation is involved.
  • Frame-state fingerprinting reuses unchanged frames before piping captures to ffmpeg for an H.264 MP4.

Web-To-Desktop

Electron wrapper that turns a website into a small always-on-top desktop window toggled by a global keyboard shortcut. Each app is a JSON file naming its URL, shortcut and window options.

ElectronJavaScriptNode.jsJSON

Status: Completed (2025)

Role: Developer Tool (Desktop Utility)

Key Features:

  • Per-app JSON config in apps/, where the filename becomes the app name and CLI argument.
  • globalShortcut registers a toggle that shows and hides the window.
  • Frameless, always-on-top window sizes set per app, with nodeIntegration disabled.