Lernen durch Bauen. Show Pony ist eine vollständige RSVP-App — ein Gastgeber legt ein Event an, teilt einen einzigen Link, Gäste sagen zu / ab / vielleicht, ganz ohne Account. Jede Zeile ist Open Source (MIT) und jeder Schritt ist als Tutorial dokumentiert. Der schnellste Weg zu verstehen, wie eine echte Kumiko-App von Anfang bis Ende zusammenpasst.
Was du bekommst: einen lauffähigen Codebase, den du in Minuten lokal startest, eine Live-Demo zum Durchklicken, und eine Kapitel-für-Kapitel-Anleitung, die erklärt, warum jedes Teil existiert — nicht nur was es tut.
Hier anfangen
- Dem Tutorial folgen → docs.kumiko.rocks/en/show-pony — vom leeren Repo zur deployten App, Kapitel für Kapitel.
- Live-Demo anklicken → show-pony.kumiko.rocks — nur lesen, Host- und Sysadmin-Zugangsdaten stehen auf dem Anmelde-Screen.
- Quellcode lesen → github.com/CosmicDriftGameStudio/show-pony — MIT, klonen und starten.
Die harten Teile, vollständig
Jede B2B-App baut diese neu. In Show Pony ist jeder davon ein paar Zeilen — und das ist alles davon, keine versteckte Framework-Magie.
Tenant-Isolation. Der Tenant kommt aus der Subdomain, nie aus dem Payload des Gastes — so schreibt ein anonymer Gast sicher, und niemand kann fremde Tenant-Daten fälschen.
async function enabledTenantByKey(db: DbConnection, key: string): Promise<TenantId | null> {
const row = await fetchOne<TenantRow>(db, tenantTable, { key });
return row !== undefined && row.isEnabled === true ? row.id : null;
}
// The subdomain IS the tenant — read it from the Host header, never the payload.
const host = hostnameOf(c.req.header("Host") ?? "");
if (host === baseDomain || host === `www.${baseDomain}`) return null;
if (host.endsWith(`.${baseDomain}`)) {
return enabledTenantByKey(db, host.slice(0, -(baseDomain.length + 1)));
}
return null;
Eine event-sourced Entity. Ein typisiertes Modell plus ein append-only Event-Store, zwei Zeilen.
export const rsvpEntity = createEntity({
fields: {
eventId: createTextField({ required: true, searchable: true }),
name: createTextField({
required: true,
sortable: true,
searchable: true,
allowPlaintext: "guest-list search/sort, no KMS provisioned",
}),
email: createTextField({ searchable: true, allowPlaintext: "guest-list search, no KMS provisioned" }),
status: createSelectField({ options: RSVP_STATUSES, default: "yes", filterable: true }),
plusN: createNumberField({ sortable: true }),
note: createLongTextField({ allowPlaintext: "anonymous-guest-input" }),
},
});
export const rsvpTable = buildEntityTable("rsvp", rsvpEntity);
export const rsvpExecutor = createEventStoreExecutor(rsvpTable, rsvpEntity, { entityName: "rsvp" });
Volle CRUD-Screens und Per-Handler-Zugriff, eine Zeile.
const hostAccess = { access: { openToAll: true } } as const;
registerEntityCrud(r, "event", eventEntity, { write: hostAccess, read: hostAccess });
auth ~7 Zeilen · Tenancy ~10 · event-sourced Entity ~2 · CRUD + Permissions 1 Zeile — alles Kumiko built-in.
Was du lernst
Show Pony ist bewusst klein, deckt aber die Teile ab, die jede echte App braucht:
- Multi-Tenant, richtig gemacht. Der Tenant kommt aus der Subdomain, nie aus dem Payload des Gastes — so schreiben anonyme Gäste sicher, und niemand kann fremde Tenant-Daten fälschen. Das ist die Kernlektion, und das Muster nutzt du in jeder Kumiko-App wieder.
- Deklarative Screens. Host-Dashboard, Event-Editor und Live-Gästeliste sind
EntityList/EntityEdit-Screens am Feature-Graph — kein handgeschriebenes CRUD-UI. - Auth ohne Boilerplate. Host-Login und geseedeter Admin über
auth-email-password. - E-Mail, die für Produktion tauscht. Bestätigungsmail über
mail-foundation— in-memory für die Demo, echtes SMTP in Produktion ohne Code-Änderung. - Öffentliche Surfaces. Die anonyme Einladungsseite und ein
.ics-„Zum Kalender hinzufügen”-Download, aus demselben Bun-Server bedient. - Echt deployen. Dockerfile, eingecheckte SQL-Migrationen, Seed-Daten, Health-Checks — die App deployt automatisch.
Die Kapitel
Das Tutorial geht den ganzen Weg: die Entities event und rsvp modellieren, den Host-Workspace verdrahten, die anonyme Gästeseite bauen, Bestätigungsmail ergänzen, Apex-Marketing- + Legal-Seiten, und in Produktion auf eine Subdomain ausliefern. Jedes Kapitel verlinkt seine lokalen und Cloud-URLs, sodass du deinen Stand unterwegs gegen die laufende Demo prüfen kannst.
Am Ende hast du nicht über Kumiko gelesen — du hast damit eine echte Multi-Tenant-App gebaut und deployt.