Handlebars variables reference
April 12, 2026
When Krafter renders your Handlebars template it passes a single data object containing the resume content. This reference documents every field available in that object, along with the two custom helpers registered globally.
Use tk-* class names on your HTML elements so that the _utils.css utility layer automatically wires the CSS design tokens (fonts, sizes, colors, spacing) to standard resume elements. Your template CSS then overrides only the visual distinctives via [data-template] specificity.
Top-level fields
fullName— full name as a single string (e.g."Jane Doe"); may be an empty string if both first and last name are blankfirstName— first name only, ornulllastName— last name only, ornulljobTitle— professional headline, ornullif hidden or emptycontactItems— array of contact fields (phone, email, location). Each item has avaluestring and atypeof"phone","email", or"location". Hidden fields are excluded.links— array of link items from the Links section. Each has atitle(display label) andhref(URL). Hidden links are excluded.summary— professional summary as an HTML string (from the Tiptap rich-text editor), ornullif empty or hidden. Must be rendered with triple-stash{{{summary}}}.sections— array of processed resume sections (see below). The Links section and empty or hidden sections are excluded.
Sections
Each entry in the sections array has:
type— section type key, e.g."work","education","skills","languages","references", etc.name— display label set by the user (e.g."Work Experience")category— determines which item array to use (see table below)
Use the category field to determine which item array is populated:
"history"→historyItems— work, education, courses, projects, certifications, volunteering, awards, publications, custom"tags"→tagItems— skills, hobbies"languages"→languageItems— languages"references"→referenceItems— references
historyItems
Each item in historyItems has the following fields:
heading— the item's primary title (e.g. job title or degree). Formatted according to the user's heading format setting. May be an empty string.duration— formatted date range, e.g."Jan 2020 — Present". Empty string if dates are hidden.subtitleParts— array of detail strings to show below the item header (e.g. company name, department). Detail fields consumed by the heading format are excluded. Use{{join subtitleParts ", "}}to render them.descriptionBlocks— array of HTML strings (from Tiptap), one per paragraph or list. Empty if descriptions are hidden. Must be rendered with triple-stash:{{#each descriptionBlocks}}{{{this}}}{{/each}}link— URL string, ornull.linkDisplayHeader—trueif the link should wrap the heading in an<a>tag.linkDisplayIcon—trueif a small arrow icon should appear after the heading.hasHeader—falsewhen the item has neither a heading nor a date. Skip thetk-item-headerwrapper when this is false.isFirst—truefor the first item in the section. Use to conditionally add thetk-history-gapclass for spacing on non-first items.
tagItems
Used for skills and hobbies sections. Each item has:
name— the tag label, e.g."JavaScript"proficiency— numeric 1–5 for skills;undefinedfor hobbiesdisplay— pre-formatted string combining name and proficiency per the user's setting, e.g."JavaScript (4)"or"JavaScript ●●●●○"or just"JavaScript"if no proficiency. Use this for output.
languageItems
Used for the languages section. Each item has:
name— language name, e.g."English"proficiency— proficiency label, e.g."Native","Fluent"; empty string if not setdisplay— pre-formatted string, e.g."English (Native)"or just"English"if no proficiency. Use this for output.
referenceItems
Used for the references section. Each item has:
name— person's full namejobTitle,company,phone,email— individual fields (may be empty strings)details— convenience join ofjobTitleandcompany, e.g."Engineering Manager, Acme Corp"contact— convenience join ofphoneandemail, e.g."555-1234, alice@example.com"
Custom helpers
Two Handlebars helpers are registered globally in Krafter.
join — join an array into a string
String array form — joins a plain array of strings:
{{join subtitleParts ", "}}Object array form — extracts a named property from each object before joining:
{{join tagItems "display" ", "}}
{{join languageItems "display" " · "}}
{{join contactItems "value" " | "}}Both forms HTML-escape each item value but emit the separator raw — making it safe to use HTML entities like • or as the separator.
where — filter an array before iterating
Filters an array to only the items that match a given property value. Useful for rendering specific section categories:
{{! Render only history sections }}
{{#each (where sections category="history")}}
<div class="tk-section-heading">{{name}}</div>
<div class="tk-section-heading-rule"></div>
{{#each historyItems}}...{{/each}}
{{/each}}
{{! Render only tag sections }}
{{#each (where sections category="tags")}}
<div class="tk-section-content tk-tag-list">{{join tagItems "display" ", "}}</div>
{{/each}}Multiple key-value pairs are combined with AND logic:
{{#each (where sections type="work" category="history")}}...{{/each}}Triple-stash for HTML content
summary and each entry in descriptionBlocks are raw HTML strings containing <p>, <ul>, <strong>, and other tags. Always output them with triple-stash to prevent escaping:
{{! correct — renders the HTML }}
{{{summary}}}
{{! correct — each block is an HTML string }}
{{#each descriptionBlocks}}
<div class="tk-item-body tk-rich-text">{{{this}}}</div>
{{/each}}
{{! wrong — escapes the tags and prints them as text }}
{{summary}}