The Products Β· How it works
6 min readHow it works
Every tenant-based product follows the same shape: a Keycloak realm provides the login/identity boundary, a backend microservice owns the product's data, and a web frontend renders the experience. What differs between products is the domain β what kind of thing the tenant is building and publishing.
Erevna β surveys & forms
What it is. Erevna is a survey and form builder. A tenant creates a survey, adds questions, publishes it, and collects answers β including from people who are not logged in at all.
Who it's for. Anyone who needs structured input: customer-satisfaction surveys, sign-up forms, feedback collection, research questionnaires, NPS tracking.
Core features. Erevna supports a broad set of question types and, crucially, answer-validation rules layered on top of them:
| Question type | What it captures |
|---|---|
| Single choice | One option from a list |
| Multiple choice | Several options from a list |
| Text | Free-form text |
| Rating | A star/score rating |
| NPS | Net Promoter Score (the classic 0β10 "how likely to recommend") |
| Number | A numeric value |
| Date | A calendar date |
| Linear Scale | A labelled scale (e.g. "1 = disagree β¦ 5 = agree") |
Validation rules constrain what a respondent may submit:
| Rule | Applies to | Example |
|---|---|---|
| min / max | Number, scales | "Age must be 18β120" |
| length | Text | "Comment must be β€ 500 chars" |
| regex | Text | Match an email-shaped string |
| number of selections | Multiple choice | "Pick exactly 3" |
The standout capability is the public / anonymous respondent flow: once a survey is published, you can hand out the link and collect answers from people who have no account. This is what makes Erevna useful for real-world data collection rather than just internal forms.
How a user uses it. A tenant owner logs into the Erevna frontend (Keycloak realm questioner), builds a survey by adding questions and validation rules, publishes it, shares the public link, and later reviews the collected answers.
Architecture note. The backend is deliberately a "dumb store" β it persists each survey's questions as a JSON blob and does not branch on question type. Type-specific logic, validation, and scoring run mostly client-side. This is a real tradeoff to understand:
type is added; the store is generic and flexible.
it's handed; richer server-side analytics, type-aware querying, and scoring are harder and are the reason Erevna sits at ~65% complete with analytics as the next gap.
- Upside: the backend never needs a schema migration when a new question
- Downside: validation is enforced on the client, so the server trusts what
Erevna data shape (conceptual)
Survey
ββ questions: [ { type, label, options?, validationRules? }, ... ] β stored as one JSON blob
ββ responses: [ { answers: [...] }, ... ] β anonymous responses allowed
Katalogos β online menus
What it is. Katalogos lets a restaurant or cafΓ© build a digital menu and publish it as a public page β the kind of page you'd put behind a QR code on a table.
Who it's for. Hospitality businesses: restaurants, cafΓ©s, bars, anywhere a printed menu could be replaced (or supplemented) by a scannable page.
Core features.
| Feature | What it gives the tenant |
|---|---|
| Categories | Group the menu (Starters, Mains, Drinksβ¦) |
| Items | Individual dishes/drinks with prices |
| Variants | Choices like sizes (Small / Large) |
| Modifiers | Add-ons / extras (extra cheese, oat milk) |
| Image uploads | Photos per item |
| Public menu page | A shareable, QR-friendly page |
| Custom domains | Serve the menu under the cafΓ©'s own domain |
Billing. Katalogos has billing tiers, and the enforcement is the interesting part architecturally:
- Free tier shows a watermark on the public menu.
- Premium removes the watermark and unlocks extras.
Enforcement happens on the backend, not the client. The menu service does not trust the browser to decide whether a tenant is paid β it asks the Payment service whether the tenant is subscribed. This is the correct pattern: a client could spoof "I'm premium", but a server-to-server subscription check can't be bypassed by editing the page.
Public menu request
browser ββ> Katalogos backend ββ(is tenant subscribed?)ββ> Payment service
β
ββ subscribed? remove watermark : show watermark
How a user uses it. A cafΓ© owner logs in (Keycloak realm onlinemenu), creates categories and items, adds variants/modifiers and photos, and publishes. The resulting public page can be linked from a QR code. On the free tier the page carries a watermark; subscribing removes it. A cafΓ© on premium can also point its own custom domain at the menu.
Kefi β event pages with custom domains
What it is. Kefi creates event landing pages. A tenant spins up a page for an event; visitors can register / RSVP, and the page tracks which event was viewed.
Who it's for. Event organisers β a meetup, a party, a conference, a launch β anyone who wants a dedicated page per event with sign-ups.
Core features.
| Feature | Detail |
|---|---|
| Per-event URLs | Each event gets /t/{tenantSlug}/{eventSlug} |
| Editable slug | The {eventSlug} part can be changed |
| RSVP / register | Visitors can sign up |
| View tracking | The page records which event was viewed |
| Custom domains | Bring-your-own domain via a CNAME record |
The per-event URL structure is worth internalising:
https://<host>/t/{tenantSlug}/{eventSlug}
β ββ editable, identifies the event
ββ identifies the tenant
Custom domains are the most infrastructure-heavy feature here. A tenant adds a CNAME DNS record pointing their domain at the platform. The platform then provisions a per-host ingress, obtains an automatic TLS certificate, and uses a Traefik path-rewrite middleware so that a request to the tenant's bare domain is internally served as the tenant's existing event page (the middleware rewrites the path to the /t/{tenantSlug}/β¦ form behind the scenes). The visitor sees a clean, branded domain; the platform serves it without the tenant having to host anything.
visitor β events.somebrand.com (CNAME β platform)
β per-host ingress + auto TLS
β Traefik middleware rewrites path
βΌ
/t/{tenantSlug}/{eventSlug} β the page that already existed
How a user uses it. A tenant creates an event, optionally edits the slug to something memorable, and shares the URL. To brand it, they set a CNAME on their own domain and the platform handles the ingress + certificate. Visitors land on the page and RSVP. Kefi is feature-complete.
Games & tools
What it is. A set of standalone browser apps that live on the platform but are not tenant-based SaaS products. They reuse platform plumbing β the deploy pipeline, analytics, and shared game libraries β without a per-customer account model.
| App | Type | Notes |
|---|---|---|
| Aurora | Tile / puzzle game | Built on Phaser; has a synth WebAudio sound engine and haptics |
| Morphe | Browser game | Standalone |
| KeyboardPiano | Browser music tool | Standalone |
| Quotes | Tool | A curated quotations app |
Who they're for. The general public β anyone with a browser. There's no sign-up-and-own-your-data model the way Erevna/Katalogos/Kefi have.
What they share. Even though they're standalone, they aren't built in a vacuum. They use:
save-state (so each game doesn't re-implement "buzz the device" or "save my progress" from scratch).
- the same analytics instrumentation,
- the same deploy pipeline,
- shared game libraries for cross-cutting concerns like haptics and
Aurora is the richest example: a Phaser-based tile/puzzle game with its own synthesised audio engine (sound generated in the browser via WebAudio rather than shipping audio files) and device haptics for feedback.
How a user uses it. Open the URL, play. No login required.