50 Ways to Love Your CX Data

Fifty examples that walk through CX data — bare attributes through anchors and merge, with stops at quoted strings, multi-line text, comments, collection literals, typed columns, and a final whole-shop document. Each step adds one shape; no shape requires anything the earlier ones do not already give you. The companion §15 covers directives.

1. The atom

Just `name=value`. In CX this is a valid document on its own — logfmt mode, intended for log lines and structured events.

          size=large
        

2. Several atoms — a one-line event

A whole log line — no brackets, no root, just attributes.

          time=2026-05-09T12:00:00Z level=INFO svc=oven pizza=Margherita
        

3. Empty element

Brackets give a name. Empty, but a thing.

          [pizza]
        

4. Element with one property

The atom from example 1, now attached to a pizza.

          [pizza size=large]
        

5. Several properties

Keep adding. No commas required between attrs.

          [pizza size=large crust=thin price=12]
        

6. Bare flag (no equals-value)

Presence means yes, absence means no — same idea as `--verbose` or HTML's `required`. Here, this pizza is controversial.

          [pizza name=Hawaiian controversial]
        

7. Explicit boolean values

When you want both polarities, write the word.

          [pizza vegan=true gluten-free=false]
        

8. Boolean sigil shorthand

Booleans are ordinary attributes — `name=true` / `name=false`; the bare tokens auto-type as bool.

          [pizza vegan=true nuts=false gluten=false]
        

9. Numbers — int, decimal, negative, hex, underscores

All bare, all auto-typed. Underscores in numbers are readability sugar.

          [pizza price=12.50 discount=-2 ovens=4 mask=0xFF00FF batch=1_000_000]
        

10. Quoted — single quotes

Reads: attribute `name`, value is the string "BBQ Chicken".

          [pizza name='BBQ Chicken']
        

11. Quoted — double quotes

Pick the quote that does not appear in the value.

          [pizza name="Quattro Formaggi"]
        

12. Mix when the value has an apostrophe

Double-quote around an apostrophe; no escaping needed.

          [pizza name="Tony's Special"]
        

13. The empty string

Distinct from missing: the attribute is there, just empty.

          [pizza name=Mystery description=""]
        

14. Escape sequences inside quotes

Same family as C and JSON: `\\n`, `\\r`, `\\t`, `\\uXXXX`, `\\"`, `\\\\`.

          [pizza alert='Hot!\\nHandle with care.\\tCafé']
        

15. Entity references (XML-style)

`&`, `<`, `>` work as in XML. Useful when a literal ampersand would confuse the parser.

          [pizza name='Cheese & Pepper' note='use <tongs>']
        

16. Null

A real null value, distinct from empty string or the word "null" as a string.

          [pizza discount=null reviewed=null]
        

17. Date and datetime literals

ISO 8601 shapes are auto-typed as date or datetime.

          [promo starts=2026-05-01 ends=2026-05-31 cutoff=2026-05-31T23:59:00Z]
        

18. Plain text body

After the name, the rest of the bracket is text.

          [motto Hand-tossed since 1987]
        

19. Attributes plus text body

Reads: element `pizza`, attribute `name=Margherita`, then text body "Classic since day one.".

          [pizza name=Margherita Classic since day one.]
        

20. Multi-line text — preserved as written

Whitespace and newlines inside a text body are kept literally.

          [description
           Stone-baked, hand-stretched,
           and ready in 90 seconds.]
        

21. Triple-quoted string

Three quotes open and close. Single and double quotes inside need no escaping. Common leading whitespace is stripped.

          [bio '''
           Born in Naples, 1955.
           Started New Haven in 1987.
           Still on the line every Friday.
         ''']
        

22. Block content [| … |]

Like a text body, but indentation and newlines are kept verbatim; the block closes with `|]`. Unlike triple-quoted, inner elements such as `[em best]` are still real markup.

          [poem [|
           Roses are red,
             violets are blue,
           the [em best] pizza
             is waiting for you.
         |]]
        

23. Raw text [# … #]

The CDATA of CX. Brackets, quotes, `<`, `>` — all literal characters. The terminator is `#]`.

          [snippet [# if (x < 10) { return "[pizza]"; } #]]
        

24. Embedded code in another language

Raw text is how you embed SQL, JS, or regex without escaping every quote.

          [query language=sql [#
           SELECT name, price FROM pizza
           WHERE price < 15 AND vegan = true;
         #]]
        

25. Line comment

`#` comments out the rest of the line. Lives outside elements, like a script header.

          # weekend special — pulled Monday
         [pizza name=TruffleSpecial price=24]
        

26. Inline block comment

Element-shaped — fits inside brackets where `#` cannot reach.

          [pizza name=Diavola [; TODO confirm price ] price=14]
        

27. Multi-line block comment

Canonical for multi-line notes.

          [;
           Pricing review:
             - Diavola: bump to 16?
             - Hawaiian: hold at 14
         ]
        

28. When to use which

`#` for line-scoped headers; `[; … ]` when the comment must nest inside an element or span lines. Not HTML's `<!-- … -->` — CX has its own.

          # top-of-file header
         [shop [; inline aside on this branch ] port=8080]
        

29. Nesting

Brackets inside brackets.

          [pizza name=Margherita [base tomato]]
        

30. Siblings

Same shape, side by side. No separators required.

          [pizza [topping cheese] [topping basil] [topping oil]]
        

31. Inline prose with markup

Prose and tags interleave freely. The same shapes you would write in HTML.

          [note Try the [b Margherita] — our [em best seller], hand-tossed [strong daily].]
        

32. A whole article — prose and data

Headings, paragraphs, links, emphasis — CX handles document text as cleanly as XML.

          [article
           [h1 New Haven Story]
           [p Founded in [em 1987]. See the [a href=/menu menu].]
           [p Still [strong hand-tossing] every pie.]]
        

33. Deeper nesting — children with their own data

Each child carries its own attributes.

          [pizza name=Quattro
           [topping cheese price=2]
           [topping ham    price=3]
           [topping olives price=2]]
        

34. Multiple top-level elements (no required root)

A document can be a flat list.

          [pizza name=Margherita]
         [pizza name=Hawaiian]
         [pizza name=Diavola]
        

35. Multi-document file

One file, several independent documents. Same separator as YAML — three dashes on a line by themselves between documents.

36. Sequence (a, b, c) — flat list

Reads: element `toppings`, body is the sequence of three strings. Collections live in a child element's body — attributes hold a single scalar, never a collection.

          [pizza [toppings (cheese, basil, oil)]]
        

37. Array [a, b, c] — nested list

Arrays preserve structure; sequences flatten. Use arrays when nesting matters.

          [grid [cells [1, 2, 3]]]
        

38. Nested arrays

A matrix is just an array of arrays.

          [board
           [cells [[1, 0, 1],
                   [0, 1, 0],
                   [1, 0, 1]]]]
        

39. Map {k: v} — named key to value

Reads: element `prices`, body is a map with three entries.

          [pizza [prices {small: 9, medium: 12, large: 15}]]
        

40. Collections in body position

Sequences, arrays, and maps can sit inside an element body too.

          [favorites
           (Margherita, Hawaiian, Diavola)]
        

41. Mixed-shape composition

Map of sequences, multi-line. Compose freely.

          [stats {
           monday: (12, 8, 14),
           tuesday: (10, 9, 11),
           wednesday: (15, 11, 18)
         }]
        

42. Explicit type annotation

A glued `::T` ascription on the name pins the body's type, overriding auto-typing.

          [count::int 42]
         [ratio::decimal 3.14159]
        

43. Typed array as body

`::int[]` for typed; `::[]` for inferred (string array here).

          [oven-temps ::int[] 220 240 260 480]
         [tags ::[] cheap fast tasty]
        

44. Plain table — header plus rows

The `[table[…]]` block declares column names once. Each line below is a row.

          [menu [table[name size price]]
           Margherita medium 12
           Hawaiian   large  14
           Diavola    medium 13]
        

45. Typed columns

Each column can carry a colon-type. Cells parse accordingly.

          [orders [table[item::string qty::int paid::bool when::date]]
           Margherita 2 true  2026-05-09
           Hawaiian   1 false 2026-05-09]
        

46. Quoted cells and nulls

Quote cells with spaces. `null` is a real null in the cell.

          [shifts [table[cook hours::int notes]]
           Pepe       8 morning
           Maria      6 'closing crew'
           'Jean-Luc' 4 null]
        

47. Anchor and alias

`&classic` names this element; `[*classic]` drops a full copy in.

          [pizza &classic name=Margherita price=12 [base tomato]]
         [menu [*classic] [*classic]]
        

48. Merge with overrides

`*classic` inherits the anchor's attrs and children; overrides apply on top.

          [pizza &classic name=Margherita price=12 [base tomato]]
         [pizza *classic name=ClassicXL size=large price=16]
        

49. A recipe — prose, data, table, all together

Tabular ingredients, prose steps with inline markup, multi-line notes — all in one document, one syntax.

          [recipe name=Margherita serves=2
           [ingredients [table[item amount::string]]
             flour      300g
             water      200ml
             yeast      2g
             'San Marzano tomato' 150g
             mozzarella 120g
             basil      'a handful']
           [steps
             [step Mix the dough and rest [em 24 hours] cold.]
             [step Stretch by hand — no rolling pin.]
             [step Bake at [strong 480 degrees] for 90 seconds.]]
           [notes '''
             A wetter dough gives a softer cornicione.
             Do not skip the cold rest.
           ''']]
        

50. The whole shop

XML decl, anchor, block comments, typed table, merged child, map and sequence children, triple-quoted text. One syntax, everywhere.

          [?xml version=1.0 encoding=UTF-8]
         [shop &flagship name='New Haven' port=8080 open=true
           [; opening hours ]
           [hours mon-fri=11-22 sat=12-23 sun=closed]
           [; menu reviewed 2026-05-01 ]
           [menu [table[name::string size price::decimal vegan::bool]]
             Margherita medium 12.00 true
             Hawaiian   large  14.00 false
             Diavola    medium 13.00 false]
           [staff [cook &lead name=Pepe shift=morning founder=true]
                  [cook *lead name=Maria shift=closing founder=false]]
           [contact address='123 Forno Lane'
             [coords {lat: 40.8518, lon: 14.2681}]
             [phones ('+39 555 0101', '+39 555 0102')]]
           [tagline '''
             Hand-tossed since 1987.
             Still tossing.
           ''']]
        

**The arc.** Bare attribute → element → strings → text bodies → comments → structure → collections → typed arrays → tables → anchors → the whole shop. Every step adds one shape; no shape requires anything the earlier ones do not already give you.