ShowPony : a guest list you can build in an afternoon
Mira runs rooftop events for a small studio. She needs one link to share, a guest
list that fills itself, and a dashboard she never has to redesign. ShowPony is that
app built on Kumiko from end to end, with real screenshots from a Playwright runner
(bun run screenshots in the show-pony repo).
This tutorial is the whole build: install, routing, data model, anonymous RSVP, mail, deploy. Every chapter ends with the complete file it produced.
What you’re building
Section titled “What you’re building”Two surfaces, one codebase:
| Who | URL | What they see |
|---|---|---|
| Host (logged in) | show-pony.localhost:4180 | Events, guest list, team admin |
| Platform operator (sysadmin) | same apex | Platform workspace only: tenants, users, audit (not Mira’s Events) |
| Guest (anonymous) | demo.show-pony.localhost:4180/e/<slug> | Invite page + RSVP form |
| Surface | Local | Cloud |
|---|---|---|
| Host login (apex) | http://show-pony.localhost:4180/login | https://show-pony.kumiko.rocks/login |
| Demo invite (rooftop) | http://demo.show-pony.localhost:4180/e/rooftop-launch | https://demo.show-pony.kumiko.rocks/e/rooftop-launch |
| Acme invite (offsite) | http://acme.show-pony.localhost:4180/e/acme-offsite | https://acme.show-pony.kumiko.rocks/e/acme-offsite |
Demo accounts. Local dev uses the values below; production uses Pulumi-injected credentials:
| Role | Password | |
|---|---|---|
| Tenant admin (host) | [email protected] | changeme |
| System admin | [email protected] | changeme |
The host is decided by the subdomain in the request, never by anything the guest sends. That’s chapters 4 and 7.
The product tour
Section titled “The product tour”Host dashboard
Section titled “Host dashboard”Events, forms, and guest lists are schema-driven. CRUD needs no custom React.



Invite branding (host)
Section titled “Invite branding (host)”Per-tenant hero image, accent colour, and layout control what guests see on /e/<slug>.

Guest invite page
Section titled “Guest invite page”Custom React powers the public surface: hero, copy, calendar link, and RSVP card.



Run it locally
Section titled “Run it locally”Bun + Docker:
git clone https://github.com/CosmicDriftGameStudio/show-ponycd show-ponycp .env.example .envdocker compose up -dbun installbun dev- Open
http://show-pony.localhost:4180and log in as[email protected]/changeme. - Create an event with slug
rooftop-launch, or jump to the live demo for pre-seeded Rooftop Launch Party ondemoand Acme Offsite RSVP onacme(chapter 11). - Share
http://demo.show-pony.localhost:4180/e/rooftop-launchwith a guest. - Watch the guest list fill up after an RSVP.
Live: show-pony.kumiko.rocks · demo event (read-only; RSVP locally)
How it fits together
Section titled “How it fits together”Host (logged in) Guest (anonymous) apex.show-pony.… ── creates ──▶ event │ shares the link │ ▼ demo.show-pony.…/e/slug │ RSVP form ── submits ──▶ rsvp │ apex.show-pony.… ◀── guest list ──┘The chapters
Section titled “The chapters”- Install: clone, Docker,
bun dev. - Look and feel: lavender brand + i18n.
- Mount the foundation: auth, tenant, shell.
- Apex and subdomains: hostname → tenant.
- The data model:
eventandrsvp. - Wire the business logic: handlers, screens, nav.
- Anonymous RSVP: guest write without login.
- Dashboard from schema: what the host sees.
- The public surface: invite page + RSVP UX.
- Mail and calendar: confirmation +
.ics. - Seed and ship: demo content + production image.
- Marketing apex: public landing on
/. - Legal pages: Impressum / privacy in marketing chrome.
- PII and compliance: guest data, legal text vs GDPR runtime.
- Plans & Stripe checkout: tiers, caps, host billing screen.
Read in order, or jump to the chapter that matches what you’re stuck on.