PA / portfolio
WorkSkillsAboutContact
Resume
01import { useState, useEffect } from "react"
02
03const engineer = new Developer({
04 stack: ["typescript", "react", "node"],
05 mindset: "ship, measure, refine",
06})
07
08export async function build(idea: Idea) {
09 const spec = await clarify(idea)
10 return spec.map(intoSoftware)
11}
12
13// small details, considered carefully
14const release = await ship({
15 performance: "measured",
16 accessibility: true,
17})
18
19interface Craft {
20 purpose: string
21 polish: Level
22}
23
24export function useDebounced<T>(value: T, ms = 300) {
25 const [state, setState] = useState(value)
26 useEffect(() => {
27 const id = setTimeout(() => setState(value), ms)
28 return () => clearTimeout(id)
29 }, [value, ms])
30 return state
31}
32
33app.get("/api/health", (_req, res) => {
34 res.status(200).json({ status: "ok" })
35})
36
37const query = `
38 SELECT id, title, updated_at
39 FROM projects
40 ORDER BY updated_at DESC
41`
42
43type Result<T> = { ok: true; data: T } | { ok: false; error: string }
44
45export const cn = (...classes: string[]) =>
46 classes.filter(Boolean).join(" ")
47
48$ git commit -m "refactor: simplify data layer"
49$ pnpm build && pnpm test
50✓ compiled successfully
51import { useState, useEffect } from "react"
52
53const engineer = new Developer({
54 stack: ["typescript", "react", "node"],
55 mindset: "ship, measure, refine",
56})
57
58export async function build(idea: Idea) {
59 const spec = await clarify(idea)
60 return spec.map(intoSoftware)
01}
02
03// small details, considered carefully
04const release = await ship({
05 performance: "measured",
06 accessibility: true,
07})
08
09interface Craft {
10 purpose: string
01import { useState, useEffect } from "react"
02
03const engineer = new Developer({
04 stack: ["typescript", "react", "node"],
05 mindset: "ship, measure, refine",
06})
07
08export async function build(idea: Idea) {
09 const spec = await clarify(idea)
10 return spec.map(intoSoftware)
11}
12
13// small details, considered carefully
14const release = await ship({
15 performance: "measured",
16 accessibility: true,
17})
18
19interface Craft {
20 purpose: string
21 polish: Level
22}
23
24export function useDebounced<T>(value: T, ms = 300) {
25 const [state, setState] = useState(value)
26 useEffect(() => {
27 const id = setTimeout(() => setState(value), ms)
28 return () => clearTimeout(id)
29 }, [value, ms])
30 return state
31}
32
33app.get("/api/health", (_req, res) => {
34 res.status(200).json({ status: "ok" })
35})
36
37const query = `
38 SELECT id, title, updated_at
39 FROM projects
40 ORDER BY updated_at DESC
41`
42
43type Result<T> = { ok: true; data: T } | { ok: false; error: string }
44
45export const cn = (...classes: string[]) =>
46 classes.filter(Boolean).join(" ")
47
48$ git commit -m "refactor: simplify data layer"
49$ pnpm build && pnpm test
50✓ compiled successfully
51import { useState, useEffect } from "react"
52
53const engineer = new Developer({
54 stack: ["typescript", "react", "node"],
55 mindset: "ship, measure, refine",
56})
57
58export async function build(idea: Idea) {
59 const spec = await clarify(idea)
60 return spec.map(intoSoftware)
01}
02
03// small details, considered carefully
04const release = await ship({
05 performance: "measured",
06 accessibility: true,
07})
08
09interface Craft {
10 purpose: string
01 return spec.map(intoSoftware)
02}
03
04// small details, considered carefully
05const release = await ship({
06 performance: "measured",
07 accessibility: true,
08})
09
10interface Craft {
11 purpose: string
12 polish: Level
13}
14
15export function useDebounced<T>(value: T, ms = 300) {
16 const [state, setState] = useState(value)
17 useEffect(() => {
18 const id = setTimeout(() => setState(value), ms)
19 return () => clearTimeout(id)
20 }, [value, ms])
21 return state
22}
23
24app.get("/api/health", (_req, res) => {
25 res.status(200).json({ status: "ok" })
26})
27
28const query = `
29 SELECT id, title, updated_at
30 FROM projects
31 ORDER BY updated_at DESC
32`
33
34type Result<T> = { ok: true; data: T } | { ok: false; error: string }
35
36export const cn = (...classes: string[]) =>
37 classes.filter(Boolean).join(" ")
38
39$ git commit -m "refactor: simplify data layer"
40$ pnpm build && pnpm test
41✓ compiled successfully
42import { useState, useEffect } from "react"
43
44const engineer = new Developer({
45 stack: ["typescript", "react", "node"],
46 mindset: "ship, measure, refine",
47})
48
49export async function build(idea: Idea) {
50 const spec = await clarify(idea)
51 return spec.map(intoSoftware)
52}
53
54// small details, considered carefully
55const release = await ship({
56 performance: "measured",
57 accessibility: true,
58})
59
60interface Craft {
01 purpose: string
02 polish: Level
03}
04
05export function useDebounced<T>(value: T, ms = 300) {
06 const [state, setState] = useState(value)
07 useEffect(() => {
08 const id = setTimeout(() => setState(value), ms)
09 return () => clearTimeout(id)
10 }, [value, ms])
01 return spec.map(intoSoftware)
02}
03
04// small details, considered carefully
05const release = await ship({
06 performance: "measured",
07 accessibility: true,
08})
09
10interface Craft {
11 purpose: string
12 polish: Level
13}
14
15export function useDebounced<T>(value: T, ms = 300) {
16 const [state, setState] = useState(value)
17 useEffect(() => {
18 const id = setTimeout(() => setState(value), ms)
19 return () => clearTimeout(id)
20 }, [value, ms])
21 return state
22}
23
24app.get("/api/health", (_req, res) => {
25 res.status(200).json({ status: "ok" })
26})
27
28const query = `
29 SELECT id, title, updated_at
30 FROM projects
31 ORDER BY updated_at DESC
32`
33
34type Result<T> = { ok: true; data: T } | { ok: false; error: string }
35
36export const cn = (...classes: string[]) =>
37 classes.filter(Boolean).join(" ")
38
39$ git commit -m "refactor: simplify data layer"
40$ pnpm build && pnpm test
41✓ compiled successfully
42import { useState, useEffect } from "react"
43
44const engineer = new Developer({
45 stack: ["typescript", "react", "node"],
46 mindset: "ship, measure, refine",
47})
48
49export async function build(idea: Idea) {
50 const spec = await clarify(idea)
51 return spec.map(intoSoftware)
52}
53
54// small details, considered carefully
55const release = await ship({
56 performance: "measured",
57 accessibility: true,
58})
59
60interface Craft {
01 purpose: string
02 polish: Level
03}
04
05export function useDebounced<T>(value: T, ms = 300) {
06 const [state, setState] = useState(value)
07 useEffect(() => {
08 const id = setTimeout(() => setState(value), ms)
09 return () => clearTimeout(id)
10 }, [value, ms])
01interface Craft {
02 purpose: string
03 polish: Level
04}
05
06export function useDebounced<T>(value: T, ms = 300) {
07 const [state, setState] = useState(value)
08 useEffect(() => {
09 const id = setTimeout(() => setState(value), ms)
10 return () => clearTimeout(id)
11 }, [value, ms])
12 return state
13}
14
15app.get("/api/health", (_req, res) => {
16 res.status(200).json({ status: "ok" })
17})
18
19const query = `
20 SELECT id, title, updated_at
21 FROM projects
22 ORDER BY updated_at DESC
23`
24
25type Result<T> = { ok: true; data: T } | { ok: false; error: string }
26
27export const cn = (...classes: string[]) =>
28 classes.filter(Boolean).join(" ")
29
30$ git commit -m "refactor: simplify data layer"
31$ pnpm build && pnpm test
32✓ compiled successfully
33import { useState, useEffect } from "react"
34
35const engineer = new Developer({
36 stack: ["typescript", "react", "node"],
37 mindset: "ship, measure, refine",
38})
39
40export async function build(idea: Idea) {
41 const spec = await clarify(idea)
42 return spec.map(intoSoftware)
43}
44
45// small details, considered carefully
46const release = await ship({
47 performance: "measured",
48 accessibility: true,
49})
50
51interface Craft {
52 purpose: string
53 polish: Level
54}
55
56export function useDebounced<T>(value: T, ms = 300) {
57 const [state, setState] = useState(value)
58 useEffect(() => {
59 const id = setTimeout(() => setState(value), ms)
60 return () => clearTimeout(id)
01 }, [value, ms])
02 return state
03}
04
05app.get("/api/health", (_req, res) => {
06 res.status(200).json({ status: "ok" })
07})
08
09const query = `
10 SELECT id, title, updated_at
01interface Craft {
02 purpose: string
03 polish: Level
04}
05
06export function useDebounced<T>(value: T, ms = 300) {
07 const [state, setState] = useState(value)
08 useEffect(() => {
09 const id = setTimeout(() => setState(value), ms)
10 return () => clearTimeout(id)
11 }, [value, ms])
12 return state
13}
14
15app.get("/api/health", (_req, res) => {
16 res.status(200).json({ status: "ok" })
17})
18
19const query = `
20 SELECT id, title, updated_at
21 FROM projects
22 ORDER BY updated_at DESC
23`
24
25type Result<T> = { ok: true; data: T } | { ok: false; error: string }
26
27export const cn = (...classes: string[]) =>
28 classes.filter(Boolean).join(" ")
29
30$ git commit -m "refactor: simplify data layer"
31$ pnpm build && pnpm test
32✓ compiled successfully
33import { useState, useEffect } from "react"
34
35const engineer = new Developer({
36 stack: ["typescript", "react", "node"],
37 mindset: "ship, measure, refine",
38})
39
40export async function build(idea: Idea) {
41 const spec = await clarify(idea)
42 return spec.map(intoSoftware)
43}
44
45// small details, considered carefully
46const release = await ship({
47 performance: "measured",
48 accessibility: true,
49})
50
51interface Craft {
52 purpose: string
53 polish: Level
54}
55
56export function useDebounced<T>(value: T, ms = 300) {
57 const [state, setState] = useState(value)
58 useEffect(() => {
59 const id = setTimeout(() => setState(value), ms)
60 return () => clearTimeout(id)
01 }, [value, ms])
02 return state
03}
04
05app.get("/api/health", (_req, res) => {
06 res.status(200).json({ status: "ok" })
07})
08
09const query = `
10 SELECT id, title, updated_at

Available for new opportunities

Buildingcompleteproducts.

I’m Praise — an agile full-stack engineer who moves comfortably from database schema to polished UI, with particular depth in backend systems and cloud infrastructure. Currently building production systems for startups across Nigeria.

View my workDownload CV
Scroll to explore

© PA / 01—04

01 / Selected work

A few things I’ve built recently.

GPS360 Academy

GPS360 Academy

Personal project

An e-learning platform with course management, progress tracking, interactive quizzes, and Stripe-powered course enrollment.

Next.jsNode.jsExpressPostgreSQLStripe
Layer3 Cloud

Layer3 Cloud

Personal project

The full marketing website for a Nigerian cloud infrastructure company, designed and built for clean UI, performance, and responsive design.

Next.jsTailwind CSS
MyFitHub

MyFitHub

2025

A fitness subscription platform connecting users to gyms, yoga, swimming, boxing, and wellness centers across Nigeria — architected the backend from the ground up, including a full Paystack subscription flow and a multi-vendor venue management system now serving 100+ active users and 15+ partner venues.

Node.jsTypeScriptPostgreSQLPaystack
DailyDrip

DailyDrip

In development

A mobile-first personal finance app built around time-locked envelope budgeting — locked category budgets auto-disburse daily allowances through a scheduled job system, enforcing spending discipline. Leading full product design end to end, from UI/UX wireframes through backend architecture and frontend implementation.

NestJSNext.jsPostgreSQLTypeScript
PaySub

PaySub

Personal project

A virtual top-up platform for airtime, data bundles, and utility bill payments, with a responsive React frontend and a REST API handling real-time transaction processing.

ReactNode.jsExpressMongoDB

02 / Skills

The languages and tools I reach for most.

const skill = "typescript"
function ship(idea) {
return build(idea)

Languages

The languages I reach for daily — TypeScript and JavaScript for almost everything I ship, with Rust and C++ from lower-level coursework and systems curiosity.

TypeScriptJavaScriptRustC++SQLTypeScriptJavaScriptRustC++SQL

Frontend

I build the interfaces my own APIs power — React and Next.js on top of Tailwind CSS, kept fast and unfussy.

ReactNext.jsTailwind CSSReactNext.jsTailwind CSS
UI
API
DB

Backend & Data

Backend is where I live — Node.js and NestJS APIs on PostgreSQL and MongoDB, designing schemas and service boundaries for platforms handling real payments and real users.

Node.jsExpressNestJSPostgreSQLMongoDBNode.jsExpressNestJSPostgreSQLMongoDB
Install
Build
Test
Preview
Deploy

Cloud & Infrastructure

Owning systems past the codebase — Dockerized deployments, Nginx reverse proxies with SSL, hardened Linux servers, and CI/CD pipelines that ship with confidence.

DockerNginxGitVercelCI/CDDockerNginxGitVercelCI/CD

03 / About

Comfortable on
both sides
of the stack.

I’m an agile, full-stack engineer — equally comfortable designing a database schema, hardening a server, or building the interface someone actually taps through. I’ve built and run production systems for Nigerian startups, from a multi-vendor fitness subscription platform to a two-sided marketplace with KYC verification built into onboarding, often owning the product end to end, UI included.

Outside client work, I’m building DailyDrip, a personal finance app with time-locked budgeting, and studying for a B.Sc. at Obafemi Awolowo University.

Based in
Nigeria · Remote
Focus
Full-stack — backend to UI
Currently
Open to full-stack roles

04 / Contact

Have a good idea?
Let’s talk.

My inbox is always open — whether it’s a role, a project, or just a question.

praiseoluwatobilobaadebayo@gmail.comDownload CV
© 2026 Praise AdebayoBuilt with love Back to top ↑