What we learned building a paid inbox you can self-host (Go + Next.js + Postgres)
Description and use
Hotly handled 217 paid notes across 921 conversations for a single creator, proving the paid inbox model works and is deployable on a single VPS.
Problem
Managing personal messages and payments for a creator’s inbox became unmanageable, requiring a self‑hosted solution that handles payments, privacy, and media securely.
Outcome
Hotly handled 217 paid notes across 921 conversations for a single creator, proving the paid inbox model works and is deployable on a single VPS.
Workflow
- 1. Deploy Hotly via Docker Compose; migrations run before API.
- 2. Creator signs in with Google/Firebase and creates a Stripe account.
- 3. Fans pay via Stripe Checkout; a server‑side price tier is applied based on note length.
- 4. Paid note is stored; owner receives notification and can reply with optional media.
- 5. Replies can be locked behind a price; media stored in Garage (S3‑compatible) behind API.
- 6. Owner can set weekly subscription limits and pricing tiers.
- 7. Fans retrieve replies via browser cookie or email recovery link.
Evidence
We built Hotly, an inbox where people pay to send someone a note and that person replies when they have time.
Each install serves exactly one person, with one Stripe account and one inbox.
Guests don’t sign up. They pay through Stripe Checkout, and the return from Checkout sets an HTTP‑only cookie that ties their browser to the conversation.
Checkout uses named tiers. The browser says "the 500‑character note", never "$10", and the server ignores any amount or currency the client sends.
A reply can carry a photo or video, free or paid to unlock. Media sits in Garage, a small S3‑compatible store, behind the API.
Go (Chi, pgx, sqlc) for the API, Next.js on Bun for the web app, Postgres 18, Garage for media, and Caddy for TLS. docker compose up starts all five; migrations run before the API.
We ran it with one creator, 536K followers on Instagram, who told the fans she already had. 217 people paid to write to her, across 921 conversations.
- Record date: 2026-10-20T16:41:22.048Z