Eros
Truth or dare and drinking, for adults
Eros is a mobile truth-or-dare and drinking game for adults (18+) on Android, built with .NET MAUI. It evolves the classic concept with two differentiators: intensity is not a fixed session label but a temperature that rises and falls during the game, and the limits each player declares in private are respected by construction. That second part is not a best-effort filter: the selection engine never proposes anything that violates the limit of someone present, and that guarantee is verified by tests. The promise in one sentence: you can let go because the app already knows where your line is.
What it does
It moves into code a rule that games of this genre usually leave to the judgement of whoever is playing: what someone has vetoed does not come up, and it does not come up because the system cannot propose it.
- Each player declares in private what they do not want, and nobody sees anyone else’s vetoes, not even on the shared device.
- The engine discards any content incompatible with the strictest limit at the table: when in doubt it does not approximate.
- Intensity rises and falls during the game instead of being fixed at the start.
- Consent is revocable on the fly: passing on a dare is free and always visible, and a veto mid-game applies instantly.
- It plays with no sign-up, no accounts and no permissions: setting up a table of four takes under two and a half minutes, measured.
- A game is ephemeral by default, with no content history and no analytics of what was played.
- If the limits leave the catalogue with no options, it says so plainly instead of filling in with something that grazes the line.
Architecture
The product guarantee is a property of the system, not an intention: if the domain gets contaminated or a selection rule breaks, the build fails.
- Domain in pure .NET with no MAUI, I/O or network dependencies, so the same engine can run on the server in the connected version.
- Architecture tests that break the build if that rule is violated, alongside the selection engine rules.
- Minimal SQLite persistence, ephemeral by default.
- Dare catalogue embedded in the app, with the pack indirection present in the model from day one and no infrastructure in v1.
- Setup cost pinned in code: a new mandatory question breaks the build, which stops the time-to-play from growing silently.
- The v2 connected mode uses ASP.NET Core and SignalR with an authoritative server, because the client cannot know other players’ limits without breaking their privacy.
Stack
A .NET MAUI client on net10.0-android with Android 8.0 as the floor, a pure .NET domain with no dependencies and SQLite persistence. Development is spec-driven in strict cascade, and CI builds, runs the tests —architecture rules included— and publishes the APK.