CanPUFF canpuff.org

Examples · 1.0-rc

Something to validate against before you write any code.

One standalone JSON object per type, each of which validates against its schema, plus a complete plain vault with a journal, a populated catalog, an attachment, and app-private data — the small cases that catch the most implementation bugs.

Standalone objects

A complete plain vault

examples/plain-vault/ · 13 records, 1 attachment
manifest.json
journal/2026/07.jsonl              3 consumption events
catalog/supplies/                  2 cards — one finished, one on hand
         shops/  chains/           1 each, cross-referenced
         brands/  producers/        1 each
         methods/                   2 cards, with aliases
         tax-rates/                 2 cards — GST and PST
         terpenes/                  1 dictionary entry
attachments/23/2351…fab3.png       content-addressed, hash verified
apps/pufftab/settings.json      app-private data, carried through intact

Run validate-vault.py against it and it passes clean — that is part of the conformance suite.

The catalog cards are best read from the repository. They are Markdown files with YAML frontmatter, which is exactly what a site generator wants to render into a web page — so the raw source lives in git, where you can also clone the whole vault in one step.