Skip to content
Vulnotes LogoVulnotes
Template Rendering Errors

Template Rendering Errors ​

Blank pages in preview or export ​

If a page appears blank in the preview or PDF export, the most common cause is a LiquidJS syntax error in that page's content. Open the template designer and check for:

  • Unclosed tags: {% if ... %} without a matching {% endif %}
  • Unclosed loops: {% for ... %} without {% endfor %}
  • Typos in variable names (e.g. report.titl instead of report.title)

Use the LiquidJS Expression Tester in the Preview tab to test individual expressions and pinpoint the error.

Variables showing as empty ​

If a variable like {{ report.title }} renders as empty text:

  • Make sure the report has a value for that field. An empty field produces empty output.
  • Check the variable name against the Variables reference. Variable names are case-sensitive.
  • For custom variables, verify the key in the template matches what you are using in the template content.
  • For vulnerability fields, make sure the finding has data in that field.

Loop not generating rows ​

If a {% for vuln in vulnerabilities %} loop produces no output:

  • Check that the report actually has findings. An empty findings list produces no loop iterations.
  • Verify the loop syntax is correct. The loop variable (e.g. vuln) must match what you use inside the loop body.
  • If using filters like sort_by or where, make sure the field name exists.

Images not showing in export ​

If images appear in the editor but are missing from the PDF export:

  • Check that the image was uploaded through Vulnotes (not hotlinked from an external URL)
  • Very large images may cause the PDF renderer to time out. Try reducing the image dimensions.
  • For template design element images using LiquidJS sources (like {{ client.logo }}), verify the variable resolves to a valid image URL in the expression tester.

Page breaks not working ​

Page breaks in the template designer control where pages split. If they are not working as expected:

  • Place page breaks between content blocks. Inside a finding loop, use {% unless forloop.last %}{% pagebreak %}{% endunless %} to separate findings without adding a trailing blank page
  • Check that the page break is on the correct page in the multi-page structure