Lagos, Nigeria · WAT (UTC+1)

Sage.

Full Stack Engineer — NestJS · Next.js · TypeScript

I build products end-to-end. REST APIs, databases, auth systems, and the interfaces people actually use. Currently completing HNG XIV across both Frontend and Backend tracks.

About.

I'm a full stack engineer based in Lagos, Nigeria. I work across the entire stack — designing and building REST APIs, modelling databases, wiring up auth flows, and shipping the frontend that sits on top.

During HNG XIV, I completed both the Frontend and Backend internship tracks simultaneously — shipping real features under tight deadlines, reviewing other engineers' code, and contributing to a shared production codebase.

I care about code that is readable, systems that are observable, and APIs that are predictable. I don't cut corners on error handling or validation at the boundaries that actually matter.

6+

Projects shipped

2

HNG tracks (FE + BE)

XIV

HNG cohort

Backend

  • REST API design (NestJS)Insighta API, Flowbrand API
  • Database modelling (Prisma + PostgreSQL)Insighta API
  • Authentication (JWT, Guards)Flowbrand API, Insighta API
  • Background jobs & queuesFlowbrand API
  • Docker + docker-composeInsighta API

Frontend

  • React & Next.js (App Router)Insighta Web, Habit Tracker
  • TypeScriptAll projects
  • PWA & service workersHabit Tracker
  • Chrome Extension APIsAI Summarizer
  • WebSockets + Web Crypto APIE2E Chat

Tooling & Process

  • CI/CD (GitHub Actions)Habit Tracker, Summarizer
  • Testing (Vitest, Playwright)Habit Tracker
  • pnpm workspacesInsighta Web, Habit Tracker

Projects.

Work I built during HNG XIV — each one shipped under a real deadline with a real review process.

Insighta API

AI-powered intelligence profiles platform with natural-language queries, CSV bulk import, and a full REST API.

  • Designed the full NestJS modular architecture (profiles, auth, classification, import)
  • Built NLP-powered search endpoint and AI classification trigger
  • Implemented CSV bulk import with Prisma createMany + skipDuplicates for duplicate detection
  • Containerised the service with Docker and docker-compose
NestJSPostgreSQLPrismaDockerJWT

Insighta Web

Web frontend for the Insighta intelligence profiles platform, connecting to the REST API.

  • Built the full Next.js App Router frontend from scratch
  • Wired up all API calls against the Insighta REST API
  • Implemented authenticated routes and session handling
Next.jsTypeScriptTailwind CSSshadcn/ui

Insighta CLI

Command-line tool for querying and managing intelligence profiles via the Insighta API.

  • Built the entire CLI from scratch — commands, auth flow, output formatting
  • Implemented token-based auth and persistent session storage
  • Designed human-readable output with JSON and table modes
TypeScriptNode.js

Habit Tracker PWA

Offline-capable habit tracking Progressive Web App with e2e Playwright tests and GitHub Actions CI.

  • Built the app shell with full offline support via service worker
  • Wrote the complete Playwright e2e test suite covering core user flows
  • Set up GitHub Actions CI pipeline — lint, unit tests, and e2e on every PR
Next.jsPWAPlaywrightVitestGitHub Actions

AI Page Summarizer

Chrome extension that extracts and summarises any web page using an AI API.

  • Wrote the Chrome extension manifest and background service worker
  • Built the content script for full-page text extraction
  • Implemented the popup UI and wired up the AI summarisation API call
ViteTypeScriptChrome APIsWeb Workers

E2E Encrypted Chat

Real-time chat application with end-to-end encryption using the browser's native Web Crypto API.

  • Implemented ECDH key generation and public key exchange between peers
  • Built the AES-GCM encrypt/decrypt pipeline — messages never leave the browser in plaintext
  • Integrated WebSocket real-time transport with the crypto layer
ReactTypeScriptWebSocketsWeb Crypto API

Team Work.

Beyond solo projects, I contributed to Flowbrand — a production NestJS API built by an HNG team. Real PRs, real reviews, real merge cycles.

80/100

Top Performer

HNG XIV · Stage 6 · Backend Track

29 merged PRs
"You anchor the load-bearing infrastructure. PR #35 (889 lines, 22 tests) is the most substantial single contribution on the team. Code quality is clean: no any types, service layer properly separated from controllers."
Engineering Quality16/20
Testing16/20
Edge Case Handling13/15
Architecture & Scalability13/15
Production Readiness9/10
Reliability & Observability7/10
Collaboration + Docs6/10
+24 more

The remaining 24 merged PRs cover deploy promotions, queue reliability hardening, auth improvements, logger coverage, database migration management, and bug fixes across the stack. View all on GitHub ↗

Reflection.

What changed during HNG XIV — honest and specific.

How my API design changed

At stage 0 I was writing Express routes directly in index.ts with no separation. By Flowbrand I was thinking in modules first — what are the aggregates, where are the boundaries, what does the service layer own versus the controller. NestJS exception filters and interceptors taught me that cross-cutting concerns belong in the pipeline, not scattered across handlers.

Race conditions — shape, not verb

I used to think about race conditions by HTTP verb. Wrong lens. The right question is the operation pattern: read-modify-write, check-then-act, multi-step writes without a transaction, single-use token exchange. PR #84's bug was a GET→DELETE that wasn't atomic. PR #109's bug was three writes that needed a transaction. The verb was incidental both times.

Error handling: catch specific or don't catch

Broad catch clauses that return null convert 5xx infrastructure failures into 4xx client errors. The Redis outage looks like an invalid token. The DB being down looks like a user not found. I learned to only catch the error you expect — EntityNotFoundError, not Error — and let everything else propagate so it surfaces as a 5xx.

Validation belongs at the boundary

Checks that only use request data kept appearing in my service layer. By the time you're in the service you've already paid the cost of the request. If the check needs no async lookup, it belongs in the DTO. Cross-field validation, format checks, enum membership — all DTO work, not service work.

Queue and Redis architecture

Bull stores all jobs in Redis — there's no separate queue server. Understanding this made the whole architecture click: sessions, rate limits, distributed locks, and background jobs all live in the same Redis instance, separated by key naming conventions. The processor architecture taught me that who owns the failure matters — ExtractionProcessor swallows and records, FunnelGenerationProcessor rethrows and lets Bull retry.

The thing I got wrong under pressure

PR #35 shipped at 889 lines across 15 files. The funnel worker, LLM orchestration, fallback chain, and atomic DB writes are at least three logical concerns. I knew that while writing it and merged it anyway because the deadline was real. My lowest score was Collaboration + Docs (6/10). Smaller, stacked PRs are reviewable PRs — that's the one I carry forward.

Concepts gained

NestJS exception filtersInterceptors & middlewareRedis distributed locks (setNx)Bull queue processor patternsBackoff & jitter strategiesDB indexing & composite indexesCache invalidation patternsQueryRunner transaction managementIdempotency guardsTOCTOU race conditions

Contact.

Open to backend and fullstack engineering roles. If you're building something and need someone who ships, reach out.