@czap/canonical
The sync bytes kernel — deterministic CBOR encoding, FNV-1a content labels, and addressed digests, with no Effect runtime and no @czap/core graph behind it.
You usually don't install this directly — @czap/core re-exports these surfaces at its public boundary, so app authors who already depend on core get them for free. Reach for @czap/canonical standalone only when core is too heavy: an upstream factory or WASM-side path that needs stable bytes without pulling the full graph.
Install
pnpm add @czap/core
If you do need the kernel standalone, install it directly: pnpm add @czap/canonical. Its only third-party dependency is @noble/hashes (for the sha256/blake3 digests) — no Effect, no peer setup.
30 seconds
import { CanonicalCbor, AddressedDigest, fnv1a } from '@czap/canonical';
const bytes = CanonicalCbor.encode({ title: 'hello', n: 42 });
const digest = AddressedDigest.of(bytes);
console.log(digest.display_id);
console.log(digest.integrity_digest);
console.log(digest.algo);
console.log(fnv1a('any string'));
CanonicalCbor.encode produces a stable Uint8Array for any JSON-shaped value; decode is its strict inverse, accepting only the canonical subset the encoder emits. AddressedDigest.of pairs a sync FNV-1a display_id with a cryptographic integrity_digest over the very same bytes, so identity and integrity can never disagree.
Where it sits
This package is a standalone leaf — it carries no @czap/core, no Effect, and no spine imports, which is exactly why upstream and WASM-side code can address content without dragging in the full graph. @czap/core re-anchors ContentAddress / IntegrityDigest to spine brands at its own boundary (ADR-0012); here they are kept local. See the package surfaces map for the full layout.
If encoding throws
Only the JSON-shaped value subset encodes: numbers, strings, booleans, null, Uint8Array, arrays, and plain objects. Functions, symbols, bigint, Map, Set, and Date raise an UnsupportedError rather than emit ambiguous bytes — determinism is the whole point. Plain-object properties whose value is undefined are skipped, matching JSON semantics.
Docs
Part of LiteShip — powered by the CZAP engine (Content-Zoned Adaptive Projection), distributed as @czap/* packages.