CLN · Feb 2026 · CC BY 4.0 · Vadim Shchetinkin
CLN Specification v2.8 new: §25 Inline Fmt · §23 Directives++ · §24 Visual §§
= Cognitive Ladder Notation — universal notation for structured thinking ! v2.8 adds §25 Inline Formatting · extends §23 Directives (%include %const %alias %version %export %presentation) · v2.7 added §24 Visual Sections # #cln #spec #notation #ai #pkm
The spec is itself written in CLN-rendered HTML. Hover operators for context menus · Click spoilers to reveal · Live demos embedded in each section.
Changelog History
VerTypeChange
v2.8NEW§25 Inline Formatting — **bold** *italic* `code` ~~strike~~ $math$ ![img]() ==mark== · mid-line only
v2.8UPD§23 Directives: %include %const %alias %version %export %presentation added
v2.8UPD§14 AI Instructions Rule 20 — inline formatting awareness: tokens mid-line only; inside fences = verbatim
v2.7NEW§24 Visual Sections >> — named containers with render attributes (bg/border/accent/width/collapse/viz:)
v2.6NEW§23 Directives System % — 10 directive categories, scoping (global/section/local), combination operators
v2.5UPD§14 Rule 18 — Reality Check: Type A (non-existent) vs Type B (terminological mismatch) taxonomy
v2.4NEW§8.3 Section Divider — phase/chapter divider restored; MDA template updated
v2.4NEW§14 Line Length Guidelines — target ≤80 chars; exceptions for URLs, fenced code, table cells
v2.4NEW§15 AI System Prompt — canonical minimal + strict prompts, Custom Instructions text, text expander snippet, API usage
v2.4UPD§13 AI Instructions: rules 12–15 added (line length, link policy, output format, ⟶ divider)
v2.4UPD§11 MDA Template: updated to use for depth levels
v2.4UPD§16 Philosophy (renumbered from §14)
v2.3NEW§7 Tables ((( ))) / (( )): header row, data rows, pipe-separated cells
v2.3UPD§9 Grammar: example updated with table syntax
v2.3UPD§13 AI instructions: rule 11 on tables + quality check item
v2.2NEW§6 Parallel Blocks ( ): block grouping, flex-row rendering
v2.2NEW§4.1 Inline Spoiler || text ||: hidden content, revealed on click
v2.1NEW§5 Addressing System: ## anchors, » links, // block labels
v2.1UPD§4 Line anatomy: added Slot 4 (Anchor)

01/ What is CLN? Concept
=
=Definition
Copy
CLN — plain-text semantic notation for structured thinking, AI prompts, and knowledge storage
= Core idea: One line = one fact · Operator = semantic role · Indentation = ownership
. CLN eliminates connective tissue — "furthermore", "it should be noted", "in addition"
replaces it with visual semantics — operators the eye reads before engaging with content
+ works in any plain-text field — no rendering required to extract meaning
+ human + AI readable — operators provide typed structure AI can parse without ambiguity
! CLN is not markup for rendering — it is a cognitive tool for structuring thought

02/ Operator Set Reference
= 12 operators — each encodes a distinct cognitive role
* start with 4: = . | @ — add others as needed
OpNameCognitive RoleWhen to use
=EqualsDefinition / EssenceGoal, context, thesis, identity — "what is it?"
.DotAction / StepTasks, procedures, sequence — "what to do?"
|PipeResource / ToolLibraries, instruments, channels — "with what?"
@AtMetadata / StatusDeadline, owner, priority — "who/when/where?"
!BangRisk / WarningDangers, blockers, edge cases — "what can go wrong?"
?QuestionUnknown / HypothesisOpen questions, unverified — "what don't we know?"
*StarNote / ContextExamples, references, clarifications — "by the way"
ArrowResult / OutputConsequence, conclusion, next state
~TildeTension / ParadoxConflicting forces, trade-offs without resolution
+PlusPro / AdvantageTrade-off analysis — "for"
-MinusCon / CostTrade-off analysis — "against"
CheckDoneCompletion marker — dynamic state
? Why does CLN use single characters instead of words? The eye reads the operator column before the content column. A single character can be classified in <50ms — before you start reading the content. Words would collapse the two into one pass, destroying the pre-read scanning advantage.

03/ Indentation Rules Structure
= step size: 4 spaces — fixed, no tabs
. Level 0 — document header: TOPIC: SUMMARY: TASK: PROJECT: MDA:
. Level 1 (4 sp) — primary operators: all 12 operators
. Level 2 (8 sp) — subordinate detail belonging to Level-1 line
. Level 3+ (12, 16…) — rare deeper nesting
! same-level operators in a block must share the same horizontal start position
TOPIC: Example indentation levels = Level 1 — this is the context @ Level 2 — subordinate metadata . Level 1 — action step | Level 2 — tool for this step ! Level 2 — risk belonging to this step Level 3 — consequence of the risk

04/ Line Anatomy ★ v2.2 Spoilers
= every CLN line follows a fixed slot order — slots are optional except Operator and Content
SLOT 1
Operator
= . | @ ! ? * → ~ + - ✔
required
SLOT 2
Content
plain text · inline tokens
required
SLOT 3
#Tags
#backend #urgent
optional
SLOT 4
##Anchor
##api-tests
★ v2.1
SLOT 5
Marker
☐ ✔ !!
optional
. Write API integration tests #backend ##api-tests ☐ ↑ ↑ ↑ ↑ ↑ Slot 1 Slot 2 Slot 3 Slot 4 Slot 5
* Parser reads right-to-left: strip Marker → strip Anchor → strip Tags → parse Content
guarantees no conflicts — ## in content vs ##id in slot 4 always resolved correctly
4.1/ Inline Spoiler || text || ★ v2.2
= syntax: || hidden text || — inline token anywhere in Content slot
= hidden state: background = text color → unreadable block · revealed on click
! does not cross line boundaries — always inline within one Content slot
? Self-Test: what kills a good note? || Ambiguity. No operator = no meaning. || = Rule: one fact per line || violating this creates cognitive debt ||
// Live demo — click the spoilers below
? What is the parser rule for spoilers? || opens, next || closes. Does not cross line boundaries. Multiple spoilers on one line are independent tokens, each toggled separately.
? Can a spoiler appear inside a table cell? Yes — spoilers and »links are the only inline CLN tokens permitted inside (( )) table cells. Operators (=, ., !, etc.) inside cells are treated as plain text.

05/ Addressing System ★ v2.1
= three primitives forming an architectural hierarchy
// Block Label
=syntax: // TEXT or // ##id TEXT
.names a section — "the Room"
.optional anchor suffix makes block addressable
*recommended: // ##arch 01 · Architecture
// Line Anchor
=syntax: ##id in Slot 4
.names a line — "the Spot"
!ID charset: [a-z0-9\-\_]+ only
!no spaces, no uppercase, must be unique
// Cross-Reference
=syntax: »[text]##id
.creates a typed link — "the Path"
.inline in Content slot — multiple per line
*short form: »##id when text = id
// ##arch 01 · Architecture = client-server, React + Go ##arch-decision // ##risks 02 · Risks ! latency spike — see »[architecture decision]##arch-decision !! . blocked by »[auth task]##auth-task

06/ Parallel Blocks ( ) ★ v2.2
= groups CLN lines into blocks that render side-by-side (flex-row) in HTML
= in plain text: blocks stack vertically · in rendered output: consecutive blocks flow horizontally
. syntax: ( on its own line opens a block · ) on its own line closes it
! single ( ) block → plain group · consecutive ( ) at same indent → flex container
TOPIC: Architecture choice ( = Option A — Monolith + fast start - hard to scale ) ( = Option B — Microservices + flexible - high overhead )
// Live render of the above — two flex-row blocks
Option A — Monolith
+fast start
-hard to scale
Option B — Microservices
+flexible
-high overhead
// Parser rules
.line equals ( trimmed → open block, push level = current indent
.line equals ) trimmed → close block, pop level
.consecutive ( ) at same indent → wrap in .cln-parallel (flex container)
.blocks can be nested — ( inside ( is valid

07/ Tables ((( ))) / (( )) ★ v2.3 NEW
= encodes two-dimensional, fixed-column data — comparisons, matrices, reference tables, schedules
= table = sequence of row lines · each row wrapped in (( )) · optional header in ((( )))
. cells separated by | within a row · escape with \| inside cell values
TokenRoleHTML output
((( col | col )))Header row<thead> <th>
(( val | val ))Data row<tbody> <td>
| | (whitespace only)Empty cell<td class="cln-td-empty">
\|Escaped pipe (literal in cell)renders as |
7.1/ Syntax
((( Algorithm | Best | Average | Worst | Stable ))) (( Quick Sort | O(n log n) | O(n log n) | O(n²) | No )) (( Merge Sort | O(n log n) | O(n log n) | O(n log n) | Yes )) (( Heap Sort | O(n log n) | O(n log n) | O(n log n) | No )) (( Bubble Sort | O(n) | O(n²) | O(n²) | Yes )) * Tim Sort (hybrid) is default in Python and Java ! Quick Sort worst case triggered by sorted input without randomised pivot ? Which is the only stable O(n log n) sort? || Merge Sort — guarantees stability without extra cost ||
// Live render of the above CLN table
AlgorithmBestAverageWorstStable
Quick SortO(n log n)O(n log n)O(n²)No
Merge SortO(n log n)O(n log n)O(n log n)Yes
Heap SortO(n log n)O(n log n)O(n log n)No
Bubble SortO(n)O(n²)O(n²)Yes
* Tim Sort (hybrid merge+insertion) is default in Python and Java
! Quick Sort worst case triggered by sorted input without randomised pivot
? Which is the only stable O(n log n) sort? Merge Sort — guarantees stability at all input sizes without extra algorithmic cost.
7.2/ Rules & Constraints
=table begins at the first (( or ((( row at any indent level
=table ends when a non-table line is encountered at same or lower indent
=column count fixed by header (or first row) — all subsequent rows conform
!nested tables are forbidden — (( inside (( is a parse error
!( ) parallel blocks are forbidden inside table cells
+|| spoilers || are permitted inline inside cells
+»links are permitted inline inside cells
.short rows → right-padded with empty cells · long rows → truncated + parser warning
*CLN operators inside cells (=, ., !, etc.) → treated as plain text, not parsed
7.3/ Parser Rules
Step 1 Line matches /^\s*\(\(\((.+)\)\)\)\s*$/ → header row strip outer ((( ))) · split on unescaped | each segment → <th>, trimmed Step 2 Line matches /^\s*\(\((.+)\)\)\s*$/ → data row strip outer (( )) · split on unescaped | each segment → <td>, trimmed empty segment (whitespace only) → <td class="cln-td-empty"> Step 3 Consecutive rows at same indent → one <table> first ((())), found → opens <thead>, then <tbody> if no ((())) before first (()) → open <tbody> immediately Step 4 First non-table line at same/lower indent → close </table> Step 5 Column count = len(header) if header present, else max(row widths) short row → append <td class="cln-td-empty"> to fill long row → truncate + emit [TABLE:OVERFLOW row N] Step 6 Inside cells: || text || → <span class="cln-spoiler"> »[t]##id → <a href="#id" class="cln-ref"> \| → literal pipe character
7.4/ HTML Output
<!-- ((( Algorithm | Best | Worst ))) --> <!-- (( Quick Sort | O(n log n) | O(n²) )) --> <table class="cln-table"> <thead> <tr> <th>Algorithm</th> <th>Best</th> <th>Worst</th> </tr> </thead> <tbody> <tr> <td>Quick Sort</td> <td>O(n log n)</td> <td>O(n²)</td> </tr> </tbody> </table>
/* Minimal CSS for cln-table */ .cln-table { border-collapse: collapse; width: 100%; } .cln-table th { text-align: left; font-weight: 600; border-bottom: 2px solid var(--border); padding: .3rem .6rem; } .cln-table td { padding: .28rem .6rem; border-bottom: 1px solid var(--border); } .cln-td-empty { color: var(--muted); }
7.5/ Tables vs Parallel Blocks
Use ((( ))) / (( )) when:
=data is two-dimensional, fixed-column
=cells contain scalar values (string, number, status)
=reader will scan vertically (compare column values)
=you would draw this in Excel or a spreadsheet
Use ( ) blocks when:
=content is hierarchical (CLN lines with operators)
=cells need multi-line content with indentation
=items are equal but not tabular (alternatives, pillars)
=you need + - ! operators per block
~ decision heuristic — three questions
? Does it have a fixed column schema? Yes → table. No → blocks.
? Are cells scalar (one value each)? Yes → table. No → blocks.
? Would you draw it in Excel? Yes → table. No → blocks.

08/ The Horizontal Bar ─── Utility
=Unicode U+2500 Box Drawings Light Horizontal — two roles
.Section separator — visual chapter divider in long CLN documents
.Code fence — embeds raw data (JSON, code, logs) without confusing the parser
!! - = inside the fence are NOT CLN operators — plain text only
. validate config | format: json ─── { "source": "database", "flags": ["debug", "!important"] } ─── ! check for missing required keys

09/ Grammar in 30 Seconds Quick Ref
TOPIC: Title goes here = definition or essence #domain @ status: active . action step one #tag ##step-one| tool: something . depends on »[step one]##step-one+ advantage ✔ confirmed - disadvantage ! risk !! ~ unresolved tension * Self-Test: main risk? || see ! line above || ( = option A + fast ) ( = option B + reliable ) ((( Metric | Option A | Option B ))) (( Speed | fast | slow )) (( Memory | O(1) | O(n) )) (( Stable | No | Yes ))
* Line anatomy recap: OPERATOR · Content · #tags · ##anchor · ✔marker

10/ Summarization Template Template
SUMMARY: [Title] = core definition / thesis (1–2 lines max) = key insight or takeaway . main point 1 * supporting detail . main point 2 | tools / methods / resources involved + strengths / advantages - weaknesses / limitations ! risks / warnings / common mistakes @ domain: field of application @ source: origin / author / year
.every line = one independent fact (no filler words)
.operators encode the TYPE of information, not emphasis
.reader extracts meaning by scanning the operator column alone
.result must be copy-paste ready into any plain-text environment
!no Markdown symbols (** ##headers) — use ─── for code, ##id for anchors

11/ Multi-Dimensional Analysis Template
MDA: [Topic] — depth [N] ##first First-Order . Dimension: [AREA 1] = description + strength - weakness ##second Second-Order . Effect: consequence of »[First Order]##first * explanation ##third Third-Order Cascade . Cascade: emergent system effect = description * implication ##foresight Foresight . Strategic direction ~ tension that drives the cascade

12/ CLN vs Prose vs Markdown Comparison
PropertyProseMarkdownCLN
Human readability✅ narrative flow✅ rendered✅ raw text
Scannability❌ must read all⚠️ headers help✅ operator column
Data embedding❌ messy⚠️ code blocks─── fencing
AI parsabilityMediumMediumHigh (structured)
Semantic typing❌ implicit❌ visual only✅ operator = type
Internal linking❌ prose refs⚠️ markdown anchors##id + »link
Tabular data❌ formatting⚠️ basic tables((( ))) / (( ))
Parallel layout❌ prose only❌ none( ) flex-row
+use CLN for: summaries, analysis, specs, notes, PKM, AI prompts, agent protocols, linked knowledge graphs
*use prose for: storytelling, essays, blog posts, emotional content

13/ Instructions for AI Models ★ v2.4
= when a user asks for CLN format (or uses ^summarize, ^mda) follow these rules:
  1. 01Start with a header at Level 0: SUMMARY: ANALYSIS: TASK: MDA: PROJECT:
  2. 02Use operators semantically, not decoratively — each operator signals a specific cognitive role
  3. 03One fact per line — no compound sentences, no filler words
  4. 04Indent consistently — 4 spaces per level, operators aligned vertically
  5. 05Use ─── for code — wrap JSON, code, logs. Do not use Markdown backticks inside CLN
  6. 06Output must be copy-paste ready — works in any plain-text field without rendering
  7. 07Scan test: reader should understand structure by reading only the operator column
  8. 08Use ##anchors + »links for cross-references, task dependencies, TOC navigation
  9. 09Use ( ) blocks for parallel alternatives, options, or side-by-side concepts
  10. 10Use || text || for spoilers — deferred context, self-test answers, hypotheses
  11. 11★Use ((( ))) / (( )) for tabular data — header + data rows, pipe-separated cells. No nested tables. No ( ) inside cells. || || and »links permitted inside cells.
  12. 12★Keep lines short — target ≤ 80 chars per content line. Split long lines into parent + children via indentation. See §14 for full rules and exceptions.
  13. 13★Link policy — real URLs only when explicitly requested. Never fabricate links. No citation markers ([1], :contentReference[…]). Internal references: »[text]##id syntax only.
  14. 14★Output format — wrap the full CLN response in a fenced code block tagged cln. No prose outside the block. Preserves indentation in all Markdown-rendering interfaces.
  15. 15★Use dividers for sequential phases, MDA depth levels, timelines, and roadmaps. See §8.3.
  16. 16★Directives processing — when % directives present: read all before generating. %alias expands first. %reality: off suspends Rule 18. %template expands before cascade. See §23.
  17. 17★Visual Sections>> is a container, not a content operator. Content inside inherits section directives. When %presentation: true, each >> = one slide. See §24.
  18. 18★Inline formatting awareness — tokens (**bold** *italic* `code` ~~strike~~ $math$ ![img]() ==mark==) are parsed mid-line only. At line-start: * = Note operator. Inside ─── fences: all tokens verbatim. See §25.
Quality Check Before responding
🔍
Risk scan
Can I find all risks by scanning for ! lines?
📋
Action scan
Can I find all action items by scanning for . lines?
💻
Code scan
Is raw code safely wrapped in ─── fences?
🔗
Link scan
Are cross-references using »[text]##id syntax?
📦
Block scan
Are parallel alternatives wrapped in ( ) blocks?
📊
Table scan ★ v2.3
Is tabular data using ((( ))) / (( ))? No nested tables?
📏
Length scan ★ v2.4
Are content lines within 80 chars? (excl. URLs, fenced code, table cells)
🔗
URL scan ★ v2.4
All URLs real and explicitly requested? No [cite] or :contentReference noise?

14/ Line Length Guidelines ★ v2.4
= target: ≤ 80 characters per content line (operator + indent + content)
= recommendation, not a hard rule — exceptions exist (see below)
. split long lines by adding parent + children via indentation — never paraphrase to shorten
! long lines break scannability — the operator column loses its value when content sprawls horizontally
✓ Good — split into hierarchy
=React frontend
|state: Redux
|data: React Query
@deployed: AWS
✗ Bad — one long line
=The system uses React with Redux state management and React Query for data fetching, deployed on AWS
14.2/ Exceptions — lines that may exceed 80 chars
.URLs — never truncate real hyperlinks
.Fenced code blocks ─── — raw code, JSON, logs reproduced as-is
.Table cells (( )) / ((( ))) — never break table structure for length
.Anchors ##long-descriptive-anchor in Slot 4 — never shortened

15/ AI System Prompt ★ v2.4
= canonical prompts — copy verbatim into the system field of any AI interface
= three variants: minimal (recommended) · strict · text expander snippet
15.1/ Minimal Prompt — recommended
You are a CLN engine. CLN = Cognitive Ladder Notation v2.8. OUTPUT RULES: 1. Wrap every response in ```cln ... ``` (fenced code block, tag "cln"). 2. No text outside the code block. 3. Use operators: = . | @ ! ? * → ~ + - 4. 4-space indentation per level. 5. One fact per line. Max ~80 chars per line (not strict for URLs/code fences). 6. No fabricated URLs. No citation markers ([1], :contentReference). Internal links: »[text]##id only. 7. Use ─── for raw code/data embedding. 8. Use ⟶ for sequential phases and MDA depth levels. 9. Use tables ((( ))) / (( )) for fixed-column data. 10. Use ( ) blocks for parallel alternatives. 11. Use || text || for inline spoilers. 12. Inline formatting mid-line only: **bold** *italic* `code` ~~strike~~ $math$ ==mark== 13. Read %directives before generating. %alias expands first. %reality:off = fiction mode. 14. >> sections are visual containers. %presentation:true = slide mode. Spec: https://cognitiveladder.com/CLN-Spec-v2_8.md
15.3/ Custom Instructions field (ChatGPT / similar)
.paste into "How would you like the AI to respond?" field · applies to all new chats
Always respond in CLN (Cognitive Ladder Notation) v2.8 format. Wrap every response in ```cln ... ```. No prose outside the block. Operators: = . | @ ! ? * → ~ + - | 4-space indent | one fact per line. Lines ≤ 80 chars. Split long lines via indentation, not paraphrase. No fabricated URLs. No [cite] or :contentReference markers. Internal links: »[text]##id only. Real URLs only when explicitly asked. Use ─── for code fences. Use ⟶ for phases/MDA. Use ((( ))) for tables. Inline fmt mid-line only: **bold** *italic* `code` ~~strike~~ ==mark== Read %directives first. >> sections = visual containers. Spec: https://cognitiveladder.com/CLN-Spec-v2_8.md
15.4/ Text Expander Snippet /cln
.for platforms without persistent system prompts (chat.z.ai, API playgrounds)
.create shortcut /cln in TextExpander, Espanso, or Alfred with this body:
[CLN MODE] Respond in Cognitive Ladder Notation v2.8. Wrap in ```cln```. One fact per line. 4-space indent. Max ~80 chars. Operators: = . | @ ! ? * → ~ + - No fake URLs. No citation markers. Internal refs: »##id. Use ─── for code. Use ⟶ for phases. Use ((( ))) for tables. Inline fmt mid-line: **bold** *italic* `code` ~~strike~~ ==mark==
type /cln at the start of any new conversation to instantly activate CLN mode
* API usage: pass §15.1 prompt as {"role": "system", "content": "..."}

16/ Origin & Philosophy Meta
= CLN evolved from A1sLadder — a code formatting standard based on eye-tracking research
* the core insight: manual formatting is not styling — it is the act of thinking
CLN does for text what musical notation did for music — makes invisible structure visible, portable, reproducible
LevelToolRole
TacticalA1sLadderCode formatting for documentation
StrategicCLNUniversal notation for thinking
OperationalChainalystAnalytical engine using CLN as I/O
A1sLadder → CLN → Chainalyst Code formatting → Universal notation → Analytical engine

23/ Directives System % ★ v2.6 ++ v2.8
=directives are processing instructions — a meta-layer above the CLN document
*they tell AI and parsers how to interpret and generate content
=syntax: %directive: value · always on their own line · before the content they govern
!fully optional — valid CLN requires zero directives. Start with none; add one when you feel the need
23.1/Core Directives (v2.6)
|%domain: medicine · law · finance · cooking · tech · science · education · creative
|%units: strict · relaxed · si · us · uk
|%language: en · ru · de · fr · … (BCP-47 tag)
|%tone: formal · neutral · casual · academic · technical
|%depth: 1–5 (1 = headline only · 5 = maximum detail)
|%audience: expert · professional · general · beginner · child
|%template: summary · mda · recipe · legal · medical
|%reality: strict · default · off (off suspends Rule 18 for fiction)
|%output: plain · html · markdown · json
|%validation: strict · default · none
23.3+/New Directives ★ v2.8
%version: 2.8v2.8
Declares CLN spec version. Parser warns on mismatch (VERSION:MISMATCH). Allows graceful degradation.
%include: ./path/to/file.clnv2.8
Includes external CLN file at this point. Supports key=value overrides. Circular include → error INCLUDE:CIRCULAR. Scoped to current document unless propagated.
%const: name = "value"v2.8
Defines a named constant. Reference via %%name in content. Must be defined before first use. Undefined reference → CONST:UNDEFINED warning.
%const: author = "Vadim Shchetinkin" %const: version = "2.8" @ author: %%author · spec: %%version
%alias: name = directive:v directive:v …v2.8
Defines a named macro that expands to multiple directives. Invoke with %aliasname. One level deep — no nested alias chains.
%alias: medical = domain:medicine units:strict tone:formal reality:strict %medical ← expands to all four directives above
%export: html | pdf | pptx | plain | json | mdv2.8
Target output format hint for the renderer/exporter. Does not change CLN syntax — purely advisory.
%presentation: truev2.8
Enables slide mode — each top-level >> section becomes a slide. Slide attributes: type: (title/content/section/end) · transition: (fade/slide/zoom/none) · columns: · notes: · align:
%presentation: true %export: pptx >> ##s1 Overview | type:title align:center = CLN v2.8 — Cognitive Ladder Notation >> ##s2 Problem | type:content transition:fade columns:2 ( = without CLN ! prose loses structure ) ( = with CLN + operators type every fact )
23.4/Scoping — cascade
=local directive > section directive > global directive
.global: at document top · section: inside >> block · local: inline %units:si on one line
.12-step parse order: alias expansion → const substitution → include processing → template expansion → cascade

24/ Visual Sections >> ★ v2.7
=named containers — a meta-layer element that wraps CLN content into addressable, visually styled blocks
*in plain text: acts as a section header · in HTML: renders as <section> with optional styles
!not a content operator — wraps content, not describes it. Not equivalent to = or |
24.1/Syntax
>> ##anchor Section Title | bg:color border:color accent:color width:N collapse:true = content inside the visual section ! risks inside . actions inside
24.2/Render Attributes
AttributeValuesEffect
bg:hex color / CSS variableSection background
border:hex colorBorder color
accent:hex colorLeft accent stripe
width:1–12 (grid columns)Section width in grid layout
collapse:true / falseCollapsible section (spoiler-like)
divider:true / falseVisual divider above section
pad:sm / md / lgInternal padding
css:any CSS stringPassthrough to style=""
viz:bar / line / pie / area / sparklineChart rendering for data lines
24.3/Example
>> ##risks Project Risks | bg:#1a0a0a accent:#d4654a collapse:true ! no fallback if API goes down !! ! deadline: 2026-03-15 is fixed !! >> ##kpis Q1 Metrics | viz:bar = revenue: 120 000 = users: 8 400 = NPS: 72

25/ Inline Formatting ★ v2.8
=inline tokens borrowed from Markdown/LaTeX — familiar, portable, non-conflicting with CLN operators
!key rule: tokens are only parsed mid-line — never at line-start
** at line-start after indent = operator (Note)
**word* mid-line = italic · distinction unambiguous — parsers check position
.inside ─── fences: all tokens verbatim — no formatting parsed
25.1/Token Reference
NameSyntaxRenderedPlain text fallback
Bold **text** text *text*
Italic *text* text _text_
Inline code `code` code kept as-is
Strikethrough ~~text~~ text --text--
Math inline $formula$ MathJax/KaTeX kept as-is
Math block $$formula$$ display-mode kept as-is
Image ![alt](url) <img> rendered [alt]
Highlight ==text== text >>text<<
25.2/Usage Examples
TOPIC: Project Status = **CLN** is a plain-text notation — *semantic*, not just visual = install with: `npm install cln-parser` = deprecated: ~~use prose notes~~ · replaced by CLN operators = energy: $E = mc^2$ (Einstein · 1905) = see: ![architecture diagram](./arch.png) = ==critical deadline== — review before merge !! ! **never** push to main directly !! * see OWASP: `A03:2021 — Injection` . run `npm test` before committing ☐
25.3/Operator Disambiguation
✓ Mid-line → formatting
=this is bold and italic text
!never ignore this warning !!
.run npm test
✗ Line-start → operator
*this is a Note — not italic
=*this* at line-start after indent = operator, not italic
25.4/Quality Check additions
✏️
Inline fmt scan ★ v2.8
Are **bold** / *italic* tokens mid-line only? None at line-start? All inside ─── fences verbatim?
🖼️
Image alt scan ★ v2.8
Every ![…](url) has non-empty alt text? Missing alt → WARN [IMG:NO-ALT]