Basic structure
Every TemplateDX template is a.mdx file with optional frontmatter and a mix of Markdown and JSX:
Frontmatter
Frontmatter is optional metadata at the top of your file:Variables
Access dynamic data using curly braces:?. and . behave identically).
Learn more about variables →
Expressions
Evaluate expressions inline: arithmetic, comparison, and logical operators, property access, and registered filter calls:props.name.toUpperCase()) and the ternary operator (a ? b : c) are not supported. Use a filter or an <If> tag instead.
Learn more about expressions →
Control flow
Conditionals
Use<If>, <ElseIf>, and <Else> tags:
Loops
Use<ForEach> to iterate over arrays:
Filters
Transform data with built-in filters. TemplateDX ships 10 filters:abs, capitalize, dump, join, lower, replace, round, truncate, upper, urlencode.
Components
Create reusable template components:Raw output
Use<Raw> to emit the enclosed content as literal source text; expressions inside <Raw> are not evaluated. The plugin re-serializes its children through Markdown, so you get exactly what you wrote.
\{props.variableName} (literal text, not the value of props.variableName). TemplateDX re-serializes the Raw content through remark-stringify, which backslash-escapes { and <, so braces and angle brackets appear escaped in the output.
XML tags
Lowercase XML tags are preserved as-is in the output, making them ideal for prompt engineering patterns like<examples>, <context>, and <instructions>. A fixed allow-list of HTML tags (per supported-tags.ts) also passes through unchanged. Expressions inside these tags are evaluated normally.
Only lowercase tags are treated as XML passthrough (along with a fixed allow-list of HTML tags). The only PascalCase tags TemplateDX registers as built-ins are
If, ElseIf, Else, ForEach, and Raw. Tags like <User>, <System>, and <Assistant> are AgentMark message tags layered on top of TemplateDX, not engine built-ins. Any other PascalCase tag must be a registered TagPlugin or an imported component, or bundling throws Unsupported tag '<TagName>'. Variables and expressions inside passthrough tags are still evaluated normally.Comments
Use JSX-style comments:Fragments
Use fragments to group elements without adding markup:Markdown support
TemplateDX supports all standard Markdown:Whitespace
TemplateDX preserves whitespace in your templates:Escaping literal braces
To emit literal{ or } in output, wrap the content in <Raw>:
Type safety
See Type safety for the canonical flow:npx agentmark generate-types emits AgentmarkTypes from your prompt schemas. That’s the codegen pipeline AgentMark actually uses at runtime.
TemplateDX itself doesn’t evaluate JSDoc or TypeScript types; comments are stripped at bundle time (bundler.ts:150 removeComments).
Best practices
- Use descriptive variable names. Prefer
props.customerNameoverprops.n. - Keep templates modular. Break large templates into components.
- Generate types. Run
npx agentmark generate-typesand pass the result tocreateAgentMarkClient<AgentmarkTypes>()for compile-time prop validation. - Use conditionals wisely. Make prompts adapt to context.
- Use filters. Transform data at the template level instead of reshaping it in your application code.
Complete example
Here’s a full example combining multiple features:Next steps
- Variables - Learn about variable access
- Expressions - JavaScript expressions
- Tags - Control flow and special operations
- Filters - Data transformation
- Components - Reusable templates