CLN Wiki · Syntax · v2.3
Tabular Data
Spec CLN v2.3 Feature ((( ))) / (( )) @ February 2026
When your data has fixed columns and scalar cells, it deserves a table. CLN v2.3 delivers — in plain text, no renderer required.
01/ Definition Term
DEFINE: Tabular Data in CLNv2.3 NEW
=Tabular data — two-dimensional, fixed-column, scalar-cell information =new in CLN v2.3 — the missing structure between lists and prose .one header row: ((( col | col | col ))) .data rows: (( val | val | val )) .cells separated by | pipe character .empty cell = whitespace between pipes →renders as HTML table — reads as plain text✓ portable
COMPARE: Before and after v2.3motivation
// Before (v2.2 — no tables) -metric comparisons buried in nested lists -column alignment lost in raw text -reader can't scan vertically across options // After (v2.3 — tables) +column schema declared once in header row +vertical scan path: compare column values at a glance +still plain text — works in Slack, email, terminal +|| spoilers || and »links permitted inside cells
02/ Syntax Grammar
SYNTAX: Table grammar — plain text sourcecopy-paste ready
// Minimal example
((( Metric | Option A | Option B ))) (( Speed | fast | slow )) (( Memory | O(1) | O(n) )) (( Stable | No | Yes ))
// Full document context
ANALYSIS: Algorithm comparison = choosing sort algorithm for 10M records ((( Algorithm | Time | Space | Stable ))) (( QuickSort | O(n log n) | O(log n) | No )) (( MergeSort | O(n log n) | O(n) | Yes )) (( HeapSort | O(n log n) | O(1) | No )) → MergeSort chosen — stability required
// Empty cell = whitespace between pipes
((( Feature | Free | Pro | Enterprise ))) (( Storage | 5GB | 50GB | Unlimited )) (( SSO | | | ✓ )) (( API access | | ✓ | ✓ ))
DEFINE: Token anatomyparser view
=header token: ((( … ))) =data token: (( … )) =cell delimiter: | pipe, one or more spaces either side .parser reads: ((( → header → ))) .then: (( → row → )) until no more rows .column count inferred from header !header row must precede all data rows !do not nest tables inside tables !do not use ( ) blocks inside cells
03/ Rules & Constraints Spec §7.2
SPEC: Complete rule set — CLN §7.2normative
// Structure .exactly one ((( ))) header row per table .one or more (( )) data rows follow immediately .all rows indented at same level as the header .table ends at first non-table line at same indent // Cells =cell content: scalar — one value per cell =leading/trailing whitespace trimmed from each cell =empty cell = one or more spaces between | pipes
// Permitted inside cells +|| spoilers || — deferred cell content +»[text]##id cross-references +Unicode characters, emoji, symbols // Forbidden inside cells !nested tables ((( ))) !parallel blocks ( ) !multi-line cell content !CLN operators as cell content (= . etc.)
04/ Table vs Parallel Blocks Decision
? Fixed column schema across all items?
Yes → continue →
No → use ( ) blocks
→
? Cells are scalar — one value each?
Yes → continue →
No → use ( ) blocks
→
? Reader scans vertically (compare columns)?
Yes → continue →
No → use ( ) blocks
→
→ Use Table
((( col | col )))
(( val | val ))
EXAMPLE: Table — API tiers comparisonscalar cells ✓
=comparing three API rate-limit tiers for pricing page
TierReq/minBurstPrice/moSLA
Free 60 10 $0 —
Starter600 100 $29 99%
Pro 3 000500 $99 99.9%
EnterpriseCustomCustomCustom99.99%
*fixed schema · scalar cells · vertical comparison — table is correct choice
EXAMPLE: Blocks — architectural optionshierarchical ✓
=cells need multi-line + nested operators → use ( ) blocks, not table
= Monolith
+simple ops · fast start -scale ceiling !deploy = full redeploy
. Microservices
+independent scale -ops complexity ↑↑ ~flexibility vs coherence
*each block has operators, subpoints, tensions — not scalar → blocks win
05/ Live Examples Real-World
COMPARE: Database enginestech selection
=choosing DB for analytics workload · 500M rows
EngineQueryWriteJoinsCost
Postgres ⚠ slow✓ fast✓ full $
ClickHouse ✓ fast⚠ batch✗ limited$$
BigQuery✓ fast⚠ stream✓ full$$$
DuckDB ✓ fast⚠ local✓ full free
→DuckDB for local analysis · BigQuery for prod✓
ANALYSIS: Sprint velocitymetrics
=Q1 2026 · team of 4 · 2-week sprints
SprintPointsDoneBugsDelta
S134283-6
S236351-1
S338380±0
S440420+2
→velocity trend: +2.9 pts/sprint average !S1 deficit caused by onboarding new engineer
COMPARE: PKM tool matrixfeature table
=evaluating knowledge tools for team of 12
ToolLocalAPICLNPrice
Obsidian ✓plugin✓free
Notion ✗ ✓ ⚠$16/mo
Logseq ✓beta ✓free
Plain CLN✓✓✓free
*CLN files work in any tool — format is portable
06/ Inline Features in Cells Spoilers · Links
GUIDE: Table cells with spoilers and cross-references|| || and »links inside (( ))
// ##tbl-inline Spoilers inside cells — click to reveal
AlgorithmBest caseWorst caseStable?Verdict
QuickSort O(n log n) O(n²) No avoid for sorted input — use randomised pivot
MergeSort O(n log n) O(n log n) Yes preferred when stability matters — extra O(n) space cost
TimSort O(n) O(n log n) Yes Python/Java default — optimised for real-world data patterns
HeapSort O(n log n) O(n log n) No in-place but poor cache behaviour — niche use
// »links inside cells
TaskDepends onStatus
Tokenizer core — ✔ done
Addressing system »[Tokenizer] ☐ wip
Table parser »[Addressing] ☐ next
JSON export »[all above]##tbl-inline ☐ planned
07/ Self-Test || spoilers ||
QUIZ: Tabular data in CLN v2.3click to reveal answers
*Q: What token marks a table header row? ((( col | col | col ))) — triple parentheses *Q: What token marks a data row? (( val | val | val )) — double parentheses *Q: How do you create an empty cell? whitespace between pipes: (( val | | val )) *Q: Can you nest a table inside a table? NO — strictly forbidden. Flat structure only. *Q: Which inline tokens ARE permitted inside cells? || spoilers || and »[text]##id cross-references *Q: When should you use ( ) blocks instead of a table? When cells are hierarchical, multi-operator, or non-scalar — i.e. anything you wouldn't put in Excel →three questions: fixed schema? — scalar cells? — vertical scan? →all yes → table. any no → parallel blocks.✓ rule

← Human Readability Full Spec v2.3 →