SF, homeBack to the work

Case study

Safespace

Two-way anonymous reporting software for workplaces, schools and communities, taken from a blank page to a working product. I designed and built the full product: the brand identity, product site, reporting experience, case dashboard and data layer underneath.

Role
Brand identity, software design and engineering
Stack
Next.js, TypeScript, Tailwind CSS, Supabase (PostgreSQL), Resend
Live
safespaceapp.co.uk (opens in a new tab)
Safespace product site with a sample anonymous conversation between a reporter and the People team

The problem

Problems rarely start big. They start unsaid. The people closest to an issue usually notice it first, but most reporting channels either ask them to put their name to it or send their words into a form that never answers.

Safespace makes reporting anonymous and two-way. The organisation can ask follow-up questions and share outcomes, and nobody’s identity is collected along the way.

Identity

A lowercase wordmark set in Fraunces and finished with a green full stop, on a calm palette of aubergine, paper and mint. Coral is kept for urgent states only, so it means something when it appears. Figtree carries the interface and Geist Mono handles case numbers, timestamps and figures.

The safespace wordmark on paper, aubergine and mint, with the app icon at several sizes
  • Paper#FAF8F4
  • Mint#C8EEDB
  • Spring#5FE08F
  • Lilac#D8CCFA
  • Aubergine#2D1E3D
  • Coral#FF7559

Three views

One product, three audiences: the buyer, the person speaking up and the team responding. Each one can be tried in the walkthrough, which runs on sample data for a sample organisation.

Built for trust

Anonymity can’t depend on the interface behaving. The safeguards live in the database and on the server, where they hold even if a screen gets something wrong.

Row-level security
Every table is locked down in Postgres, so staff can only read cases from their own organisation, whatever the interface does.
Hashed case keys
Keys are 16 characters from an alphabet with no lookalike letters and are hashed with a server-side secret before they reach the database.
Content-free alerts
Email alerts say that a case needs attention, never what it says. Messages can only be read on the dashboard.
Rate limiting
Submissions are throttled by a Postgres function, so the reporting page can stay open to anyone without being flooded.
Walkthrough mode
The public walkthrough runs on an in-memory copy of a sample organisation. Nothing is saved or emailed and app routes are kept out of search engines.