dotBEP Flavored Markdown
dotBEP renders Markdown in two places: reports and standards. Both support standard Markdown (headings, lists, tables, blockquotes, bold, italic, inline code, code blocks) and both support the same extension on top of it: dotBEP Flavored Markdown, or DFM.
DFM adds visual block elements using a :::token syntax. Each block opens with :::token-name, contains one item per line with fields separated by |, and closes with :::. You do not need to write this syntax yourself: ask the AI for what you want (a chart, a table, a highlighted note) and it will produce the correct block. This page exists as a reference, in case you want to read or adjust a block directly.
Stats
Displays a row of stat cards. Each line: value | label | color (color is optional, accepts any CSS color value).
:::stats
47 | Open clashes | #ef4444
12 | Resolved this week
3 | Pending approval
:::
Progress
Displays labeled progress bars. Each line: label | value | total.
:::progress
Structural | 34 | 40
MEP | 18 | 40
Architecture | 40 | 40
:::
Pie chart
Displays a pie chart. Each line: label | value.
:::pie-chart
Completed | 58
In progress | 27
Not started | 15
:::
Area chart
Displays an area chart. Each line: label | value.
:::area-chart
Week 1 | 4
Week 2 | 11
Week 3 | 19
Week 4 | 31
:::
Timeline
Displays a milestone timeline. Each line: name | date | status. Status values: completed, active, upcoming (default).
:::timeline
Design freeze | 2025-03-15 | completed
Coordination | 2025-05-01 | active
Construction issue | 2025-07-30 | upcoming
:::
Matrix
Displays a data matrix. The first line defines column headers; each subsequent line is a row. Fields separated by |.
:::matrix
Discipline | Open | Resolved | Critical
Structural | 12 | 34 | 3
MEP | 8 | 21 | 1
Architecture | 5 | 18 | 0
:::
Callouts
Highlights a message with a colored border. Three variants: warning, danger, success. The title after the variant name is optional.
:::callout-warning Coordination deadline at risk
The MEP coordination workflow has 3 instances blocked for more than 5 days with no action taken.
:::
:::callout-success
All clash detection instances for the structural package have been resolved.
:::
Inline references
Unlike the blocks above, an inline reference does not describe its own content: it points at data that already lives elsewhere in the BEP and resolves it live, every time the content is read. The syntax is {{<JSONata expression>}}, evaluated against the whole BEP as its root context:
The lead architect is {{teams[id='ARC'].name}}.
The project code is {{project.code}}.
JSONata reads like ordinary property access, with a filter for picking a specific entry out of a collection by id: teams[id='ARC'].name finds the team whose id is ARC and reads its name. A singular field, like project.code, needs no filter at all. An expression that does not resolve, a bad id, a typo, a missing field, is shown as a visible ⚠ {error} marker instead of failing silently or being rejected when the content is written.
This is what powers referencing other BEP data from a standard’s prose. See Standards and Guides for the authoring side of it.
Entity tables
This block renders structured, collection-shaped BEP data as a table, rather than a single value. Not every entity supports it, only the ones listed below. The syntax is :::bep:{entity}[:{arg}]:::, where bep: is a fixed namespace (unrelated to the {{...}} JSONata grammar above, it just keeps this token from colliding with the others on this page):
:::bep:disciplines:::
:::bep:teams:::
:::bep:deliverableNamingConvention:::
:::bep:referenceData:{domainId}:::
| Entity | Argument | Renders |
|---|---|---|
referenceData | Required: {domainId}, optionally followed by a dotted path to a specific node, {domainId}.{key} | The reference data domain, or a specific node’s children, as a table. If a node has children of its own, its row includes a toggle to expand them inline, indented one level further, in the same table |
disciplines | None | Every discipline defined in the project |
teams | None | Every team defined in the project |
deliverableNamingConvention | None | The project’s naming convention, one row per segment, in the order they are concatenated |
The table is reconstructed fresh every time it is rendered, so it always reflects the current values, never a stale copy. This block is available in standards, so a standard’s prose can embed a live table of the data it describes instead of only linking to it or restating it as text. See Standards and Guides for how to embed one from a standard.