fae
All work

Fae · specimen №04

Whispers

Structured game state, derived from notes written in plain language.

A note-taking app for Blood on the Clocktower players that reads your free-text notes and derives who claimed what, who suspects whom, and who died when.

Role
Product design, engineering
Platform
iOS
Years
2026
Built with
Swift 6 · SwiftUI · SwiftData · Zero dependencies
Status
In development
Fig. 04: Notes in, structure out. A walk through the app (five minutes, silent).

The problem

Players want two things that normally conflict. They want to write fast, in their own shorthand, while the conversation moves. And they want structure afterwards: a clear picture of every claim, every suspicion, every death.

Structured note apps solve the second by sacrificing the first: tapping a player, tap a role, tap a claim. It's awkward make-work that is more book-keeping than note-taking. By the time you've done it, the conversation has moved on. Plain notes apps solve the first and give you an unsearchable wall of text.

The approach

Whispers refuses the tradeoff by inverting it. You write one continuous text stream, the way you always would. The app reads it as you type and derives the structure in the background.

Typing @sarah claimed washerwoman creates a player, links a role from the active script, and records a claim. Typing i think @don is the drunk records a suspicion. No forms, no mode switching, no tapping through a hierarchy.You can then tap a player or a role and see all the notes tied to them.

Decisions that mattered

4 entries

Deterministic inference, not a model

Detection runs on explicit, inspectable rules matched against the selected script. It is predictable, instant, works with no network, and when it gets something wrong you can see exactly why.

A user edit is permanent

Re-inference never overwrites something you corrected by hand. The derived layer yields to the human layer, always; otherwise you can't trust any of it.

Text is the source of truth

The note stream is the document. Structure is a projection of it, not a parallel database that can drift out of sync with what you actually wrote.

Persisted on every keystroke

No save button, no draft state, no losing the last ten minutes because the app was backgrounded during a long night phase.

What it does

Writing

  • One text stream per game, split into days
  • @mentions create and reference players inline
  • Mentions highlighted by alignment and tappable
  • Role names detected against the active script

Reading back

  • Per-player view: life, alignment, role history, every mention
  • Per-role view: ability text, claimants, suspects
  • Inferred records are editable and deletable
  • Built-in scripts plus custom script JSON from the clipboard

Marginalia

Built on Swift 6 and SwiftData with no third-party dependencies, a deliberate choice for an app that should still compile and run in five years.

The rest of the catalog

All work