Pebble Functions
A set of utility functions registered by Invirt that can be used inside Pebble templates.
request()
Returns the current http4k Request (wrapped in an InvirtRequest).
This function is required inside macros, where the context request object
is not visible. Outside macros either form works.
{% macro requestSummary() %}
{{ request().uri }}
{{ request().method }}
{% endmacro %}
{{ request.method }}
{{ request.query("q") }}
errors()
Returns the validation errors object (io.validk.ValidationErrors), or null if there are no validation
errors for the current request. Required inside macros — outside, the
errors context object is equivalent.
Read more about validation here.
{% if errors().hasErrors("name") %}
<div class="text-error">{{ errors().error("name") }}</div>
{% endif %}
json(value)
Renders the given object as a JSON string. Typically used when embedding model data into a JavaScript context.
<div id="map" data-map-place='{{ json(model.place) | raw }}'></div>
jsonArray(value)
Same as json(), but always renders the value as a JSON array. When value is not a collection it is
wrapped in a single-element array.
<div id="map" data-map-places='{{ jsonArray(model.places) | raw }}'></div>
uuid()
Returns a new time-ordered UUIDv7 as a hex string (no dashes). Convenient for unique DOM ids in templates.
<input type="text" id="field-{{ uuid() }}"/>
currencyFromMinorUnit(minorUnitAmount, currency)
Formats a minor-unit currency value (pence/cents) as a human-readable string using the currency's symbol and default fraction digits.
{{ currencyFromMinorUnit(order.totalMinorUnit, "GBP") }} // £12.50
pluralize(count, singular, plural)
Returns singular when count == 1 and plural otherwise.
You have {{ model.count }} {{ pluralize(model.count, "message", "messages") }}.
dateWithDaySuffix filter
Formats a LocalDate, LocalDateTime or Instant using a DateTimeFormatter pattern, inserting the
English ordinal suffix on the day of month (1st, 2nd, 3rd, ...).
{{ model.deliveryDate | dateWithDaySuffix("EEEE, MMMM d yyyy") }}
{# → "Sunday, March 1st 2026" #}
An Instant is a point on the timeline rather than a calendar date, so it takes a zone argument (a zone
id) saying which zone the date is read in, and the filter fails if it is missing. 2026-08-31T23:02:00Z is
the 31st of August in UTC and the 1st of September in Europe/London, so there is no zone the filter could
pick for you that isn't the wrong day for someone.
{{ model.dispatchedAt | dateWithDaySuffix("EEEE, MMMM d yyyy", zone="Europe/London") }}
{# → "Tuesday, September 1st 2026" #}
zone means nothing to a LocalDate or a LocalDateTime, which are calendar values already, and is
ignored if passed.