software engineer Berlin, Germany

Adepeju

Peace Orefejo

Software Engineer

Adepeju Peace Orefejo

Software Engineer with 4+ years building scalable full-stack applications across marketplaces, developer tools, and serverless architectures. I work across the stack — Node.js, React, TypeScript, GraphQL, and AWS — with a focus on clean architecture, performance, and solutions that actually hold up at scale. Currently based in Berlin, Germany.

stack

Node.jsReact TypeScriptGraphQLAWSMongoDBPostgreSQLSvelteNext.jsExpressDockerD3.jsPythonReduxSocket.IO

education & research

M.Sc. Software Engineering

2025

Euclea Business School — France, Europe

Emotion Detection for Autism Support

2024 – 2025

Trained CNNs for facial emotion recognition on FER2013, CK+, and AffectNet datasets — improving detection accuracy by 35%. Built D3.js Sunburst visualisations to represent emotional states for researchers and developers.

#Python#CNN#Deep Learning#D3.js#FER2013#AffectNet
selected work see all →
01 2025 Senior Backend Developer

Multi-sided marketplace with real-time notifications (Socket.IO), Paystack payment integration, dual-order management for food delivery and e-commerce, and geospatial rider tracking.

A Node/TypeScript backend powering a four-sided marketplace: customers, two kinds of merchants, and delivery riders, all converging on one shared platform for payments, notifications, and dispatch. Each role has its own auth flow and order lifecycle, but every transaction has to stay consistent across all of them.

The interesting engineering wasn't the happy path — it was everything that breaks when money and physical goods are involved. Payment splits between merchants and the platform that have to land in the right wallets every time. Order state machines that need to survive crashed apps, dropped sockets, and payment webhooks arriving out of order or arriving twice. Ledgers that have to reconcile cleanly after a partial refund. Media buckets that slowly fill with orphaned uploads from abandoned listings.

Most of what I'm proud of in this project isn't visible to the end user. It's the recovery scripts that reconstruct orders from payment provider records when something fails midway. The scheduled cleanup crons that keep storage costs honest. The careful state transitions that make sure a rider disconnect mid-delivery doesn't leave the customer hanging or the vendor unpaid. The kind of work that only matters when things go wrong — which, in production, is constantly.

  • Multi-role auth with social SSO, email and phone verification, and role-based access control
  • End-to-end order lifecycle from cart to settlement, with deterministic recovery paths for every failure mode
  • Payment integration with automatic multi-party splits, virtual accounts, and refund flows driven by webhooks
  • Append-only transaction ledger backed by an event log for reconcilable wallet history
  • Real-time order tracking and live dispatch updates over WebSockets
  • Production hardening: scheduled media-cleanup jobs, order-recovery tooling, refund scripts, rate limiting, input validation
#Node.js #Socket.IO#Paystack#MongoDB#Express#TypeScript
read case study →
02 2025 Research + Full-stack development

A CNN-based facial emotion recognition system trained on FER2013, CK+, and AffectNet datasets, with D3.js sunburst visualisations representing emotional states.

My MSc thesis project at Big Academy UAE / Euclea Business School. The research side trains and compares three CNN models from scratch — one on FER2013, one on CK+, one on AffectNet — to measure how well each generalises across datasets. No transfer learning, no pretrained weights, just standard convolutional architectures to establish honest baselines.

The applied side is a full-stack web app. Upload a photo, point your webcam, or drop a video, and the system detects faces and classifies emotions in real time. The backend runs on FastAPI with OpenCV for face detection and TensorFlow for inference. The frontend is a React app with pages for each input mode, a research overview, and an interactive emotions reference.

The point wasn't to beat state-of-the-art benchmarks — it was to understand where simple models break down across different data conditions, and to build something usable that demonstrates the findings.

  • Full research pipeline: preprocessing, training, confusion matrices, per-class metrics, and visualisation
  • React frontend with interactive emotions reference, research overview, and multiple analysis modes
  • FastAPI backend with OpenCV face detection and TensorFlow inference, deployed on Render
  • Live web app with webcam, photo upload, and video analysis — faces detected and emotions classified in real time
  • Three CNNs trained from scratch on FER2013 (59%), CK+ (100%), and AffectNet (62.5%) with cross-dataset evaluation
#Python#Deep Learning#D3.js #React.js
read case study →
03 2026 Full-stack · AI

An LLM-powered Discord music bot that understands vibes, not just song titles — ask for "some chill vibes" and Gemini curates the queue.

Most Discord music bots are glorified search boxes — you give them an exact title, they play it. This one treats requests the way a friend would: you describe a mood, a fragment of lyrics, or a half-remembered song, and a Gemini agent figures out what you actually want.

Under the hood, each Discord server gets its own MusicAgent instance that owns the voice connection, audio player, and queue. Slash commands that are unambiguous (/skip, /pause) bypass the LLM entirely to save tokens — only the fuzzy requests go through Gemini. The agent can clarify ambiguous asks, suggest tracks for a mood, curate full playlists on demand, and politely refuse non-music requests without wasting a token on them.

It's self-hosted on purpose: YouTube blocks datacenter IPs, so the bot runs on a home server or a Raspberry Pi. A deliberate constraint that kept the scope honest.

  • Per-guild MusicAgent with isolated voice connection, queue, and audio state
  • Gemini-powered intent routing — play, clarify, suggest, curate, or reject
  • AI playlist curation: "/playlist 90s road trip" → a 10–15 track queue
  • Direct commands skip the LLM entirely to stay token-efficient
  • Channel lock, auto-leave after 5min idle, structured Pino logging with secret redaction
  • Zod env validation — fails fast at startup if anything's missing
#Typescript#Node.js#Discord.js#Gemini#yt-dlp#Vitest#Zod
read case study →
#Machine Learning#Vectors

Vector Analysis and Machine Learning

A vector — an ordered list of numbers carrying both magnitude and direction — can represent anything from the pixels of an image to the semantic meaning of a word.

read →

© 2026 adepeju orefejo