mobslgcy
← All work

Marketplace · 2026

XploreCars

A Nigerian vehicle marketplace built solo, from verification and billing to ranked search and chat.

Role
Solo, end to end
Timeline
2026
Stack
NestJS, Next.js, Drizzle, PostgreSQL, Paystack
Links
Private · 2 min read
The XploreCars homepage: a car search bar above a hero inviting sellers to list their car, with an orange Sell Your Car button.

The problem

Buying a car in Nigeria online usually means a classifieds page, an unverified seller and a phone number. XploreCars set out to be a marketplace you can trust: sellers are verified, listings are ranked by quality rather than by who posted last, and buyers can talk to sellers without leaving the platform.

What I built

The whole platform, solo and end to end: seller onboarding and verification, subscription billing, ranked search, in-app chat and fraud protection.

NestJS endpoints
51
domains
17
tables
29

One schema, one source of truth

A NestJS API and a Next.js storefront share a single Drizzle schema of 29 tables. The schema is where the types come from, for the API and the frontend alike, so a column change shows up as a type error in both places at once instead of a runtime surprise in one.

The API is split into 17 domains — auth, listings, billing, verification, chat, fraud and the rest — so each can change without reaching into the others.

Ranking that knows about the business

Discovery is the product. Every listing is scored at write time on recency, completeness, seller tier and trust. Search sorts on a precomputed number instead of doing the maths per query, and because seller tier is an input, the ranking supports the subscription model rather than working against it.

The hard part: a privilege-escalation hole

During review I found that a client could promote itself to the top verification tier, which also unlocked paid plans.

The cause was subtle. The request bodies were typed with TypeScript interfaces, which are erased at runtime, so nothing actually stopped an extra field like the verification tier from reaching the update. The types said it was safe; the running code did not agree.

I replaced the interfaces with allowlisted DTOs that strip unknown fields, added role gates on every route that touches tier or billing, and then checked each attack path by hand until all of them failed.

Payments

Subscriptions run on Paystack, the payment rail most Nigerian buyers and sellers already trust.

Something here caught your eye?

Tell me about the product you’re building, the role you’re hiring for, or the problem you’re stuck on. Pick a coffee chat, a consultation or a hiring conversation.