cino is an experimental DSL and runtime for writing domain logic that is structurally incapable of side effects.
The core idea is a hard boundary between domain logic and the outside world. In cino, I/O, time, randomness, and external calls are not merely discouraged — they are forbidden at the language level. Domain behavior is expressed solely through pure update (state transition) and query (state read) functions, while any interaction with the outside world is represented as an Action value returned to the host. This constraint is enforced by the compiler, not by convention.
The goal is to explore how strictly enforcing this boundary affects the testability, portability, and long-term maintainability of domain logic.
For the full rationale and design overview, see docs/proposal.md.
This repository uses a Cargo workspace with the following crates:
cino-syntax: syntax tree and parser layercino-sema: static semantics layercino-ir: typed IR and lowering layercino-vm: bytecode execution layercino-codec: CBOR serialization/deserialization layer for VM valuescino-runtime: public runtime API layercino-ffi-c: C ABI bindings (cdylib/rlib) for host integrationcino-cli: developer CLI
The examples/ directory contains standalone .cino programs and a Rust integration sample. See examples/README.md for the full list and usage instructions.
The cino CLI provides tools for developing and verifying cino programs.
cino check --file examples/counter.cino# Increment count state to 1 from 0
cino run update --file examples/counter.cino \
--state '0' \
--event '{"$tag": "Increment", "$fields": {}}'
# Get count state when count state is 5
cino run query --file examples/counter.cino \
--state '5' \
--query '{"$tag": "GetCount", "$fields": {}}'cino docgen --file examples/counter.cino --out ./docsDependencies are configured as a one-way layered graph without cycles.
cino-sema->cino-syntaxcino-ir->cino-sema,cino-syntaxcino-vm->cino-ir,cino-syntaxcino-codec->cino-vmcino-runtime->cino-vmcino-ffi-c->cino-runtime,cino-vm,cino-codeccino-cli->cino-runtime,cino-syntax,cino-sema,cino-ir,cino-vm,cino-codec