Eros

Truth or dare and drinking, for adults

.NET MAUI.NET 10AndroidSQLite

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.

Back to projects