Krafter

Sign inGet started

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 blank
  • firstName — first name only, or null
  • lastName — last name only, or null
  • jobTitle — professional headline, or null if hidden or empty
  • contactItems — array of contact fields (phone, email, location). Each item has a value string and a type of "phone", "email", or "location". Hidden fields are excluded.
  • links — array of link items from the Links section. Each has a title (display label) and href (URL). Hidden links are excluded.
  • summary — professional summary as an HTML string (from the Tiptap rich-text editor), or null if 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, or null.
  • linkDisplayHeadertrue if the link should wrap the heading in an <a> tag.
  • linkDisplayIcontrue if a small arrow icon should appear after the heading.
  • hasHeaderfalse when the item has neither a heading nor a date. Skip the tk-item-header wrapper when this is false.
  • isFirsttrue for the first item in the section. Use to conditionally add the tk-history-gap class 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; undefined for hobbies
  • display — 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 set
  • display — 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 name
  • jobTitle, company, phone, email — individual fields (may be empty strings)
  • details — convenience join of jobTitle and company, e.g. "Engineering Manager, Acme Corp"
  • contact — convenience join of phone and email, 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 &bull; or &nbsp; 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}}