Skip to content
All work
NODE_01 Live LIVE PRODUCTION

VoicesZA

Civic platform

A public record where South Africans describe what happened to them at a government office — and the accounts add up into campaigns that office has to answer.

at voices.org.za
Live
automated tests
~840
payment rails built
2
The VoicesZA record as it stands: the headline, zero accounts and zero offices on the record, and the first-visit notice that the first account is the hardest one.

// The problem

Complaints about public offices vanish into call centres and social media, one at a time. Nothing collects them where the office itself can be held to them, and nothing turns a pattern of the same complaint into pressure.

// What was built

  • First-person accounts, each tied to the office responsible, with optional phone verification of the author.
  • Escalation: when enough accounts describe the same thing, they become a campaign — petition, pledge or open letter.
  • Moderation, office pages, and public statistics about the record.
  • Payments for campaigns later on: Paddle for international cards, Payfast for Instant EFT and SnapScan in rand.

// Engineering

  • Laravel and Livewire, rendered on the server, fast on cheap phones and slow connections.
  • Two payment providers behind one interface; the part that differs is the browser flow (an overlay against a signed redirect), not the server.
  • Around 840 automated tests, run by hand before every release; production behind Cloudflare with error tracking.

Built with

Laravel Livewire Alpine.js Tailwind MySQL
Status
LIVE PRODUCTION
What it is
Civic platform
Public address
voices.org.za

// Open for work

Want something like this, built to your own brief?

Fast, accessible, and built to last — no page builders, no template you'll outgrow in a year. Tell me what you need and the contact form goes straight to my inbox.