2026

Paddy

Overview

paddy is a rental marketplace for Ghana where every home is visited by staff before it goes live, and rent moves through escrow instead of straight to a landlord or agent.

It is a working portfolio demo with seeded listings in Accra and Kumasi and Paystack in test mode. It has no real users and has moved no real money. The real launch waits on funding, a broker licence and a legal opinion.

  • Frontend: Next.js 16, TypeScript, Tailwind v4, shadcn/ui, TanStack Query, Storybook
  • Backend: Django + DRF, PostgreSQL + PostGIS
  • Payments: Paystack hosted checkout, double-entry escrow ledger
  • Other: Google sign-in, Resend email, Cloudflare R2, Google Maps
  • Status: Portfolio demo, test mode

The problem

Renting in Ghana asks renters to trust strangers with large sums of money up front. The common pain points:

  • Fraud. Fake listings and people collecting rent on homes they do not control.
  • Misleading listings. Photos and descriptions that do not match the home.
  • Unlawful advance rent. Landlords asking for one to two years up front, beyond the six-month cap in the Rent Act 1963 (Act 220).
  • Agent costs. Viewing fees on every visit, plus an agent cut of around 10% of a year's rent.

The renter carries all of this risk, and there is little recourse once money has changed hands.

The approach

paddy puts the renter first and removes the reasons to distrust a listing.

  1. Verified homes only. paddy staff visit every home before it goes live.
  2. Lawful advance rent. Each listing stores its lease term and advance, capped at 6 months by the law.
  3. Money held, not handed over. Rent sits in escrow until the renter has seen the home and confirmed.
  4. No middleman. Landlords list directly and pay a subscription or a small commission, not a 10% agent cut.

Landlords should find it easy too, but where the two conflict, the renter wins.

Designing the money flow

The business model went through four versions. Each one was dropped for a concrete reason, and the code moved with it.

Pay to unlock

  • How it worked: Renters paid to see a landlord's contact details
  • Why it was dropped: Renters pay before trusting anything, and the deal still happens off-platform

Deposit split

  • How it worked: 5% of the deposit split to paddy through Paystack subaccounts
  • Why it was dropped: Ghana bank subaccounts could not be tested, and paddy never held the money it promised to protect

Paid escorted viewings

  • How it worked: Renters paid per staff-escorted viewing
  • Why it was dropped: A viewing fee alone did not protect the rent itself

Escrow (current code)

  • How it worked: First month's rent + a GHS 300 booking fee held in escrow, then the rest of the advance after the renter confirms
  • Why it was dropped: Still in place; being simplified (see Status)

In the escrow version, the renter pays once, views the home, then confirms or declines in the app. On confirm they pay the balance of the advance. After a 48-hour dispute window, the landlord receives the advance minus a 5% commission. On decline, the rent is refunded and the booking fee is kept to cover the viewing.

The GHS 300 fee is based on real costs. A staff-escorted viewing to East Legon costs roughly GHS 190 to 235, mostly round-trip transport, so a lower fee would lose money on most viewings.

Engineering

The hardest part was making money handling boring, explicit and hard to get wrong.

How it was built. AI coding agents wrote much of the code, especially the Django backend. My job was the decisions around it: choosing the stack, defining the payment flow and its states, writing the rules below, and checking the output against them. Wherever money is involved, I asked for boring, explicit code I could actually read.

Architecture. A Next.js App Router frontend talks to a Django REST backend through a proxy route. JWT tokens live in httpOnly cookies held by Next, so the browser never sees them. PostGIS powers map and area search.

Every reservation follows a state machine. A home is only held once payment is confirmed, and every transition is explicit.

A dispute freezes release until paddy issues a written decision. Declines and refunds return the rent; the booking fee stays with paddy.

The ledger is double-entry. Every escrow movement writes balanced entries, keyed by payment reference so a repeated webhook never moves money twice. The ledger module is the only code allowed to write entries.

Money rules I set for the code:

  • Amounts stored in pesewas, never floats
  • Prices come from server settings, never from the client
  • Payment references stored per reservation and checked on every callback
  • Money snapshots frozen at checkout, so later price changes cannot touch a live booking
  • Refunds are partial refunds against the original charge, excluding the booking fee

Things I learned the hard way: Paystack test mode cannot create Ghana bank subaccounts, allows only a few live bank lookups a day, and some default Python user agents get blocked by Cloudflare. Each one changed the design.

Design and brand

The name. paddy, always lowercase. It joins a rental "pad" with the West African slang for a trusted friend, which is exactly what the product promises.

The mascot. A soft blob with a roof bump on top and eyes drawn as thick curved strokes. In the logo it sits on a gradient squircle and blinks. I kept the eyes still on sign-in screens, where motion would distract.

The voice. Positive, energetic and friendly, modern but premium. Copy avoids em dashes and leads with what the renter gains: verified homes, no middleman, lawful advance rent.

The system. Instead of starting from zero, I reskinned the design system from Bookstaff, another product of mine. Components are built and reviewed in Storybook, and dashboard pages follow dedicated Figma frames for landlords and renters. The brand colour is still open.

Regulation as a design constraint

Moving people's rent is regulated, so I mapped the law before treating any feature as finished. Each regulator shaped the product.

Real Estate Agency Council (Act 1047)

  • Why it applies: A commission on rentals plus escorted viewings is brokerage
  • How it shaped paddy: A broker licence is a launch requirement

Bank of Ghana (Act 987)

  • Why it applies: Holding renters' money can count as a payment service
  • How it shaped paddy: Funds go to a bank trust account via Paystack, not through paddy's own account

Data Protection Commission (Act 843)

  • Why it applies: ID checks and personal data on every user
  • How it shaped paddy: Registration before any real users

Financial Intelligence Centre (Act 1044)

  • Why it applies: Brokers carry anti-money-laundering duties
  • How it shaped paddy: KYC and record keeping planned into the flow

The code enforces what it can: advance rent is capped at 6 months, and no real money moves until a bank trust deed, the Paystack route and a legal opinion are in place.

Status and what I learned

paddy is a working demo, not a live business. You can browse seeded homes, sign in with Google, reserve a home and pay through Paystack test checkout.

Not built yet: automatic release after 48 hours, real refunds and payouts (both mocked), chargeback handling and payment reconciliation.

What's next: a simpler money flow. The GHS 300 fee becomes a viewing fee covering up to three nearby homes on one trip, and rent only enters escrow for the home the renter picks. Renters pay less up front, and paddy holds less money for less time.

What I learned:

  • In fintech, the business model is a technical decision. Each model change rewrote the data model and the payment flow.
  • Regulation belongs in discovery, not after launch. Reading the law early changed the product more than any user flow did.
  • Boring code is safe code. Explicit states, integer money and one writer for the ledger made money paths easy to reason about.
  • Testing limits shape architecture. What Paystack test mode could not do decided which payment route was realistic.
  • Working with AI agents moves the hard part to specification and review. Clear rules and a small number of explicit states made their output easier to trust and to check.
NextjsTypescriptTailwind CSSshadcn/uiTanStack QueryDjangoPostgreSQLPaystackResendCloudflare

My Role/ Build

I led the product, design and brand, and built it with AI coding agents. I set the architecture and the rules the code had to follow, then reviewed and tested the output. The frontend is where I go deepest.

Deliverables Include:

Product DesignBrand IdentityWeb DevelopmentFull-stack DevelopmentDatabase DesignCheckout (Paystack)API / Server Logic