CHESS.jl is a data framework for recording, reconstructing, and planning the operations of a laboratory -- automated or otherwise. Rather than storing the state of a lab (what's where, what's in it, how full it is) at each point in time, CHESS records the operations that produced that state -- movements, environmental changes, transfers, and reads -- as a permanent, append-only ledger, and reconstructs any state on demand by simulating that history. The design is directly inspired by how chess games are recorded: not as a sequence of board positions, but as a sequence of moves, replayed by an engine that knows the rules.
This mirrors the shape of the CHESS package family itself:
CHESSCore-- the "lab engine":Location/Stock/Attribute/Readtypes and the pure, in-memory operations that act on them (move_into!,transfer!,set_attribute!,record_read!).CHESSDatabase-- an append-only SQLite-backed history of every operation, plus the reconstruction algorithms that replay it intoCHESSCoreobjects on demand.CHESSLabConstants-- a starter set of registered lab constants (reagents, organisms, location kinds, instruments, standard stock recipes) built onCHESSCore's registration macros -- a template for defining your own lab's constants.CHESS-- the umbrella package:@reexports all three, plusUnitful, sousing CHESSalone is enough to get everything.
CHESS requires Julia 1.12 or later -- the repository ties its packages together as a Julia
[workspace], a Pkg feature introduced in 1.12. The workspace members (CHESSCore,
CHESSDatabase, CHESSLabConstants, Pourfecto) resolve each other via local paths, not a
package registry, so CHESS must be used from a local clone -- Pkg.add(url="...") from another
project will not work (Pkg does not carry a workspace's local path resolution to consumers that
merely add it as a dependency), and none of these packages are published to a registry.
# git clone https://github.com/jensenlab/CHESS && cd CHESS
using Pkg
Pkg.instantiate()using CHESS
room = GenericLocation(nothing, "Main Room", Room)
plate = build_location(WP96, "Plate 1")
move_into!(room, plate)
set_attribute!(room, Temperature(25u"°C"))
deposit!(plate["A1"], 100u"µL" * water)
environment(plate["A1"])[:Temperature] # inherited from room -> plate -> wellThe full manual and API reference are published at http://jensenlab.net/CHESS. The manual works through CHESS's core concepts in the order they build on one another, starting with Locations.
CHESS is licensed under the MIT License.