Case study · LGBTQ+ consumer app
Allgenda
Designing and building my own product for trans and queer people
Allgenda is my own product for trans and queer people. I designed and built all of it, including a live AI voice coach and a map of more than 55,000 places.
- Product
- Allgenda
- Role
- Founder and sole developer
- Timeline
- Apr 2026 – present
- Engagement
- My own product
- Live site
- www.allgenda.app ↗

The idea
Allgenda is a set of tools for the everyday parts of being queer, built with trans and gender-expansive people at the center. It's my own product, and I've been building it since April 2026.
Three products are live. Voice Lab is for practicing your voice, Inclusive Spaces is a map for finding a restroom you can use, and the FFS Results Lab previews what facial feminization surgery (FFS) might do before someone books it. Two more are built and in invite-only pilots: The Agenda, a cited news brief with two-minute civic actions, and Commons, a moderated forum.
Allgenda publishes the rules it runs by, and they set most of the engineering requirements. Every fact on the site shows where it came from and when it was checked. There are no ads or ad trackers, and nothing about a user is sold. Browsing is free, and credits pay only for the tools that cost money to run. Five percent of every charge goes to a nonprofit the buyer picks.
Voice Lab
Voice Lab helps people train toward the voice they want, whether that's more feminine, more masculine or androgynous. The free pitch meter needs no account, runs entirely in the browser and records nothing. A free account opens the full Voice Lab: solo practice, voice checks, a practice journal, lessons in five levels, 17 role-play scenarios and a live AI coach.

In a coached session the browser holds a WebRTC call with OpenAI's realtime voice model, and it never sees an OpenAI key. My server mints a short-lived secret, seals it in an encrypted ticket tied to that user and session, and passes the call offer to OpenAI itself, which also lets it hang up the call later. The audio goes straight between the browser and OpenAI and never passes through my servers.
Pitch and resonance are measured in the browser as the person speaks. The coach has 25 tools: it can read those numbers, pick the next exercise, play a reference tone or a demo clip, log how many reps landed and offer a move to the next level. It doesn't get the last word on progress, though. The server checks every reported set against the reps the meter counted and decides whether someone is ready to move up, and a level change still waits for the user to say yes.
Coaching costs one credit per 30 seconds, and solo practice is free. Billing never takes the browser's word for anything. Charges run from the moment the server saw the call connect, the page checks in every 30 seconds, and a scheduled job hangs up and bills any session that goes quiet, hits its time limit or outruns its credits. People can drop the coach mid-session and keep practicing on their own, which closes the coached stretch and bills it by itself, so free practice is never charged.
Saved recordings are analyzed by a Python service I run on a DigitalOcean server, which uses Praat to measure formants and voice quality. Recordings are private to their owner and delete themselves after 90 days. A note about hormone therapy is optional, and it never goes into logs or analytics.
To change the coach without breaking it, I built an evaluation harness. It runs the real model in text mode, with the real instructions and tools, on a simulated clock, and grades each run with fixed checks plus a model acting as judge. Changes tested this way cut the median wait between finishing a set and hearing the coach's summary from 3.4–5.2 seconds to about 1.7.
FFS Results Lab
Facial feminization surgery is expensive, and clinic galleries show their best results from the best angle. The FFS Results Lab shows a range instead. Someone adds a photo of themselves, picks the procedures they're considering and sees conservative, typical and pronounced versions of the result, each measured against real before-and-after photos that people shared with consent.

Google's Gemini makes each edit, with OpenAI's image model as a backup. The three versions are chained, so each pass edits the one before it. After every pass, my own code on Modal lines the result up with the original photo using face landmarks and keeps the change inside the areas the user picked, so a jaw-only plan leaves the nose alone. Then it measures twelve facial proportions. Once an area has moved as far as real results go, later passes leave it where it is.
A face is about as personal as data gets, so the privacy rules here are strict. The preview photo is used for that one render and never written to storage or a database. Someone can take the photo on their phone instead by scanning a QR code: the phone encrypts it with a key my server never sees, and the relay holding the encrypted copy deletes it on pickup or after five minutes. Contributed photos lose their location and device data without being re-encoded, and a person reviews each one before it's used. Withdrawing deletes them. Clinic galleries are only fetched with a written agreement on file, and a database constraint enforces it.
Inclusive Spaces

The map lists more than 55,000 inclusive restrooms and trans-friendly venues. It started from Refuge Restrooms, a public database of safe restrooms, which I brought in with an importer that resumes where it stopped and catches duplicates by distance and name. Every listing keeps a record of where its data came from, and its page shows who checked it, how and when, as one of four marks: verified, community-reported, low confidence or not checked yet.
As the map moves, it asks for the places in view. A PostGIS query returns the 500 nearest the center, and a request that a newer pan replaces is cancelled. Anyone with an account can add a place by answering four questions, and owners can claim a venue and reply to reviews. Every review, reply and photo gets an automated safety check from OpenAI's moderation model, and Anthropic's Claude takes a second look at photos and anything the first check wasn't sure about. City, state and amenity pages built from the same data give search engines a way in.
Paying for it
Allgenda sells credit packs from $5 and a membership at $12 a month, through a Stripe checkout embedded in the site. Credits are granted from Stripe's webhooks, and each grant is tied to the Stripe event behind it, so a retried webhook can't add credits twice. When a payment clears, the webhook sets aside 5% for the nonprofit the buyer picked. A refund takes the credits back and leaves that 5% alone, so it comes out of Allgenda's share.
- allgenda.app/dashboard/voice-lab/session

01 · Start a session
- allgenda.app/pricing

02 · Pricing
How it's built
Allgenda is a Next.js 16 app on Vercel with Supabase behind it. Each product keeps its data in its own Postgres schema, with row-level security deciding who can read what. Work that doesn't fit in a serverless function runs elsewhere: voice analysis and FFS dataset processing run in Python on a DigitalOcean server that GitHub Actions deploys to, and the preview geometry runs on Modal.
Public forms are checked with Vercel BotID, and requests are rate-limited through Upstash Redis. Sensitive events go to an audit log, and server logs strip emails, phone numbers and tokens before anything is written. Analytics stay off until a visitor allows them. Voice Lab and the FFS Results Lab each launched behind a feature flag and opened to invited testers before everyone else.
Six months in, the codebase is about 170,000 lines of TypeScript and 118 database migrations.
Where it stands
Allgenda is live at allgenda.app. Voice Lab and the FFS Results Lab opened to everyone with an account in September 2026. The Agenda and Commons are next.