Clockchecker is a solver of Blood on the Clocktower's puzzles,
specifically the kind posted by reddit user u/Not_Quite_Vertical.
An archive of their puzzles is here.
The project page for clockchecker is here.
Clockchecker Interactive (i.e., this webpage) is a
statically-hosted web GUI for clockchecker.
It was vibe-coded using Gemini+Canvas, because I am not a front-end guy. The clockchecker solver runs using PyScript, which is the full(ish)
CPython interpreter compiled into WASM bytecode that runs in your browser. It uses a single thread, so
it is not particularly fast (I've found it to be around 20x slower than running natively on a
16-core CPU).
But it does work, which I think is pretty neat. ✨
Why is it slow?
Clockchecker is a hobby project. To try to keep it fun, it is
written in Python, and the design decisions lean
towards conceptual simplicity rather than efficiency. This helps keep the sprawling complexity of
Blood on the Clocktower's character
interactions managable, but it does mean it's not as fast as it could be. Additionally,
Clockchecker Interactive
(this web front-end) runs the solver in a single thread, in a Python interpreter, in a WASM runtime, in
your browser...
If you would like to run the solver faster (e.g. ~20x
faster if you have a 16-core CPU), you can
download the clockchecker source from github
and run it natively, no installation required.
How to Use
Puzzle Input
The left panel is a python code editor. Write the puzzle specification here, this will be the input
to the solver. See the Puzzles tab for examples of previously written puzzles. See the Characters
tab
for example snippets describing each character. You can click a character snippet to insert it into
the
puzzle input at the current cursor location.
Puzzle Visualization
The top-right panel automatically renders a visual representation of the puzzle in the input. This
is
an automatically generated, best-efforts attempt, it may have poor layout or misrepresent some
details.
You can resize the panels to make the render easier to see.
(Note, the render is done by the same python thread that solves the puzzle, so the render will not
update
while the solver is running).
Solve
Click the Solve button to find possible solutions to the puzzle in the input.
Solutions will be displayed in the bottom right output panel. Click any solution to render it to the
visualisation panel.
Sharing
Click the 🔗 icon in the top right ofthe input panel to copy a shareable link that includes your
current puzzle and solutions.