# Render Guide
The template at `assets/template.html` uses `{{...}}` placeholders. Most are self-explanatory; this guide covers how to fill the standup card and the HTML shapes to inject for `{{PROJECT_SECTIONS}}`, `{{TIMELINE_EVENTS}}`, `{{TODAY_BANNER}}`, `{{STAT_JIRA_ISSUES}}`, `{{STAT_CONFLUENCE_PAGES}}`, and `{{OPEN_THREADS}}`. The CSS is tuned to the Bitwarden brand palette, so fill placeholders rather than regenerating styles.
## Escape untrusted text
PR titles, review and comment bodies, commit messages, branch names, repository names, session prompts, Jira issue summaries and statuses, transition `from`/`to` names, and Confluence page titles and space keys are free text, and on any shared repository other people author much of it. Before inserting any of it into the page, HTML-escape these five characters:
| Character | Replacement |
| --------- | ----------- |
| `&` | `&` |
| `<` | `<` |
| `>` | `>` |
| `"` | `"` |
| `'` | `'` |
Escape `&` first so the other replacements are not double-escaped. For example, a PR titled `Fix focus & "Save" button` renders as `Fix <input> focus & "Save" button`. Markup the recap adds itself (``, ``, ``) goes around escaped text, never inside it. Only use `href` values that are `https://github.com/...` URLs, or a Jira/Confluence `url` that begins with that source's `site_url` over `https`. A Jira issue with a `url` of `null` renders its key as plain text, not a link.
The template's Content-Security-Policy is a second line of defense: it lets only the page's own script run and blocks outbound requests other than the brand fonts. Leave the `