Token reference
Every Filename Format v3 token documented with every option. Group, SKU, descriptor, position, seq, date, val, ext, folder, exif.
Last updated April 27, 2026
Filename Format v3 is the token grammar that powers every filename preview and every export in Renamerly. Each token is a curly-brace expression with an identifier and optional pipe-separated options:
{IDENT[:POSITIONAL][|KEY=VALUE]…}
The full grammar lives in docs/TEMPLATE_ENGINE.md. This page is the practical reference for every supported token, with every supported option.
Grammar primer
- Literals pass through verbatim:
{sku}-{descriptor}{ext}rendersnike-001-front.jpg. - Escape a literal brace with a backslash:
\{literal-braces\}. - Unknown tokens render as empty string and emit a warning — a typo will not crash your export.
- Unknown options on a known token are silently ignored, so additive options added in future versions never break old templates.
- Sanitization is applied at write time when you set a metadata value through the workspace (SKU goes through SKU sanitization; descriptors and other free-text keys go through descriptor sanitization). Tokens that reference those values control output shaping via
case=andsep=. - Short-circuit on missing required values. If the active format references
{sku},{descriptor}, or{group}and the row's value is empty, the renderer returns''for that row and the row is skipped on export. This prevents stray separators (nike-001--1.jpg) and keeps Inbox rows out of the ZIP.
{group} — manual-group bucket name
{group}Renders the manual-group bucket name for the current image (image.metadata.group).
Set by the Group action in the selection toolbar (see Manual groups) or by mapping a group column in CSV Import. Rows with no group assignment render {group} as empty; if the active format references {group}, those rows are skipped on export.
{group|case=KEY}"lower" · "upper" · "keep"default: "lower"Force case on the rendered group name.
{group|sep=CHAR}"-" · "_"default: "-"Replace hyphens in the stored group name with a different single character.
Only - and _ are honoured. Stored group names with whitespace already collapse to - at write time, so this option re-shapes the existing internal hyphens without touching the source value.
{sku} — the sku metadata value
{sku}Renders the post-sanitization sku metadata value for the current image (image.metadata.sku).
SKU is a metadata key like any other; {sku} and {val:sku} resolve to the same value. The dedicated {sku} token exists because SKU has slightly different sanitization rules at write time (see Groups & metadata). Rows with no SKU render {sku} as empty; if the active format references {sku}, those rows are skipped on export.
{sku|case=KEY}"lower" · "upper" · "keep"default: "lower"Force case on the rendered SKU.
keep preserves whatever mixed case the user typed (rare — the workspace lowercases SKUs at write time by default).
{sku|sep=CHAR}"-" · "_"default: "-"Replace hyphens in the SKU with a different single character.
Only - and _ are honoured. Other separators are rejected at parse time with a warning; use a literal chip in the Format Builder if you need something exotic.
{descriptor} — the per-image label
{descriptor}Renders the post-sanitization descriptor metadata value for the current image.
If the descriptor is empty and the format string references this token, the filename short-circuits to empty (the image is not renamed on export). This is the default behaviour for every built-in starter template and every workspace format that includes {descriptor}.
{descriptor|case=KEY}"lower" · "upper" · "keep"default: "lower"Same semantics as {sku|case=}.
{descriptor|sep=CHAR}"-" · "_"default: "-"Same semantics as {sku|sep=}.
{position} — 1-indexed group position
{position}The image's 1-indexed position within its group. Not zero-padded.
For zero-padded output use {seq} instead — {position} intentionally does no padding because some platforms (Shopify, Etsy) expect unpadded position digits.
{seq} — zero-padded sequence
{seq}"3", scope "group", from "1"Zero-padded sequence number, defaulting to 3 digits and group scope.
{seq:N}Set padding width explicitly.
Any positive integer. A width smaller than the rendered number is ignored (the number is rendered at its natural width rather than truncated).
{seq|scope=KEY}"group" · "batch"default: "group"Switch between group-local and whole-batch counting.
group restarts at 1 for each new group. batch continues across the whole export in the order the workspace renders rows.
{seq|from=N}"1"Offset the starting number.
Useful when delivering shoot #3 of a multi-day engagement and you want 100 to be the first file name.
{date} — time-based tokens
{date}src "now", fmt "iso"Current wall-clock date in ISO format (YYYY-MM-DD).
{date|src=KEY}"now" · "mtime" · "exif"default: "now"Choose which timestamp to render.
now— the current wall-clock at the moment the filename renders, in UTC. Same across every image in one render pass.mtime— the file'slastModifiedtimestamp, read from the OS. Uses local timezone (the OS itself stores lastModified in the machine's local zone).exif— EXIFDateTimeOriginal; falls back to EXIFDateTime; falls back tomtime; falls back to empty with a warning. Uses local timezone because EXIF timestamps carry no timezone data.
{date|fmt=KEY}"iso" · "YYYY-MM-DD" · "yyyymmdd" · any custom string using YYYY/MM/DD placeholdersdefault: "iso"Output format.
iso is an alias for YYYY-MM-DD. yyyymmdd is the compact legacy form. Any custom string containing the placeholders YYYY, MM, or DD has them substituted; everything else passes through as a literal.
{val:KEY} — per-image metadata
Resolves against the image's metadata dictionary. Populated by inline editing, Set Metadata bulk writes, or CSV Import.
{val:KEY}Look up KEY in the image's metadata bag.
When the key is missing or empty, renders empty and emits a warning. Combine with default= to avoid warnings. Note that {val:sku} and {val:group} resolve identically to the dedicated {sku} and {group} tokens — the dedicated tokens exist for clarity and slightly different sanitization at write time.
{val:KEY|default=VALUE}Fallback value when KEY is absent or empty.
Fallbacks are also passed through case and sep normalization so the rendered filename stays consistent regardless of which branch fired.
{val:KEY|case=KEY|sep=CHAR}Same normalization semantics as {sku} and {descriptor}.
{ext} — original file extension
{ext}The original filename's extension, lowercased, including the leading dot.
Always rendered last in every built-in starter template. Renamerly never changes extensions on export — a JPEG stays a JPEG, a RAW stays a RAW.
{folder:depth} — dropped-folder path segments
{folder:N}The folder segment at depth N from the dropped root (0 = first folder after root).
Reads from the browser's webkitRelativePath property. Resolves to empty for flat file-picker selections (no folder hierarchy). Out-of-range depths render empty with a warning.
{folder:N|case=KEY|sep=CHAR}Same normalization semantics as other shaping tokens.
{exif:KEY} — curated camera metadata
Only three EXIF keys are exposed at launch. GPS and serial-number tags are deferred pending a privacy review.
{exif:iso}Camera ISO sensitivity (integer).
Falls through to empty if EXIF is absent (PNG, screenshots, HEIC without metadata).
{exif:camera}Camera model string from EXIF.
{exif:lens}Lens model string from EXIF.
{exif:KEY|default=VALUE}Fallback when the EXIF field is absent on this image.
Option resolution order
Options are resolved left to right, with default= applied first, then case=, then sep=. This means {val:color|default=Unknown|case=upper} renders UNKNOWN when the key is missing — the fallback is normalized to match the rest of the filename shape.
Unknown tokens and warnings
Any identifier not listed above renders as empty string and emits a non-fatal warning surfaced in the Format-String Field below the preview. The parse cache is invalidated automatically when the format string changes, so fixing a typo is instant.
For a deep dive on the parser internals and grammar edge cases, see docs/TEMPLATE_ENGINE.md.