Chess Board (platform)
Chess Board is a store of facts about one life, and the infrastructure under it. The pieces change; the board stays.
It rests on one idea: keep an append-only record of what happened, let exactly one service write to it, and compute everything anyone looks at from that record. A mistake in a view then costs an afternoon, never the data.
How a fact gets in
- A sensor or an outside service
- A message on the broker
- hermes (collector) checks it
- Cleo (record) keeps it
- Projections, read through Iris (read-api)
The broker is the queue, and the acknowledgement is the commit: hermes (collector) does not acknowledge a message until its write has committed. If the database is down, the broker holds the message and delivers it again, so nothing buffers on disk and nothing is retried by hand.
Each fact’s id is hashed from its own content, so a message delivered twice is recorded once.
Cleo (record): append-only
Cleo (record) only ever grows. The database itself refuses an update or a delete: a correction is a new row, and hiding a row is a fact of its own, written the same way.
It is the one irreplaceable thing in the stack. Everything else can be rebuilt from configuration or from the record. Cleo is copied off the server every night by mnemosyne (backup), and restored back onto it to prove the copy works.
One writer
Only hermes (collector) writes to Cleo. Anything else with something to record publishes a message and lets hermes write it. So the database grants write access to exactly one role, and append-only is a permission rather than a convention.
Projections
Everything anyone reads is derived: daily summaries, the work board, the dashboards. A derived table can be dropped and rebuilt from Cleo alone, and Proteus (projection-rebuilder) does that on a timer. Iris (read-api) serves them, read-only.
One contract, two languages
The collectors are written in Go, and the API and the tooling in TypeScript, and both can make a fact’s id. If they ever disagreed by one byte, the record would quietly fill with duplicates. So a file of test vectors is the specification, not either language’s code, and both must reproduce every value exactly.
The work is in the record too
Every task is a fact in Cleo. Metis (work-writer) writes the work, Athena (work-board) draws the board it is worked from, and GitHub’s issues are a mirror of the record, never the other way round.
How it runs
- One small always-on server, with Docker Compose and a memory limit on every container.
- Services that run all the time are containers; scheduled jobs are systemd timers, so a run missed while the server was off catches up, and every run leaves its log.
- Three repositories: the application and the record, the machines (Ansible), and what runs where, which each machine applies itself when a change merges.
- Nothing is open to the internet: every tool at home is reached over a private network.
The source
The repositories behind all of this are private for now. Each will go public on its own, once its whole history has been swept, and get a link here. See Open source.
Want a site? contact@chesser.uk