Docs/Multi-Pilot Caption Templates

Multi-Pilot Caption Templates

Available from RaceTagger v1.2.0

This feature was introduced in RaceTagger v1.2.0.

When a single photo contains more than one matched pilot — common in endurance racing, GT3 fields, podiums, or cycling pelotons — your IPTC caption can quickly turn into an unreadable comma-soup. RaceTagger v1.2.0 introduces the [[ ]] per-car repeat block so each pilot gets their own properly formatted block in the caption.

Quick start

Wrap the part of your caption template that should repeat per pilot in double square brackets. RaceTagger will render the wrapped block once for each matched pilot in the photo, joined by , .

Template:

DTM 2026 [[#{number}; {team}: {name}]] - photo by GC

With two pilots in the frame:

DTM 2026 #90; Manthey: Ricardo Feller, #7; Comtoyou: Nicki Thiim - photo by GC

With a single pilot in the frame:

DTM 2026 #90; Manthey: Ricardo Feller - photo by GC

Why this exists

Before v1.2.0, when a photo contained two cars in the same frame and your caption template had placeholders like {number} or {team}, RaceTagger joined the values from both pilots into a single comma-separated list:

Caption template: "DTM 2026 #{number}; {car_model}, {team}: {name}"
Pilots in frame:  #90 Feller (Manthey, Porsche) + #7 Thiim (Comtoyou, Aston)

Result (legacy):  "DTM 2026 #90, 7; Porsche, Aston, Manthey, Comtoyou: Feller, Thiim"

The information was technically present, but you could no longer tell which number belonged to which car, or which team to which driver. For sports where two cars in one frame is normal — endurance racing, GT3 fields, motorcycle group shots, cycling pelotons — this was a real caption-quality problem. The [[ ]] block solves it cleanly: each pilot gets their own properly formatted block, with their own variables resolved together.

How to use it

Inserting a per-car block in the editor

  1. 1Open your Participant Preset and expand the IPTC Pro section: Navigate to the preset you want to edit.
  2. 2In the Caption Template field, place your cursor where the per-pilot section should go: Or select the text you want to repeat per pilot.
  3. 3Click the [[ per-car ]] button: It's the turquoise-tinted button (last button in the Quick Add row). If you had text selected, it gets wrapped in [[ ]]; otherwise an empty wrapper is inserted with the cursor placed inside, ready for you to type the block content.

You can also type [[ and ]] directly with the keyboard if you prefer.

Variables you can put inside the block

All standard participant placeholders are supported inside [[ ]], and each block iteration uses the individual pilot's data:

Placeholder Resolves to
{name} Driver's full name
{surname} Driver's surname (last word of the full name)
{number} Race number
{team} Team name
{car_model} Car / vehicle model
{nationality} Three-letter nationality code (e.g. SUI)
{persons} Extended name of this pilot only (Photo Mechanic style)

Variables outside [[ ]] continue to behave the way they always did: they hold the aggregated values across all pilots in the photo. Most of the time you don't want this for caption-quality reasons, which is exactly why the block exists.

Live preview

When the template uses [[ ]], the preview line under the Caption Template field shows two examples side by side: a single-pilot example and a 2-pilot example. If your preset only has one participant in the table, you'll see a hint asking you to add a second one to see the multi-pilot rendering.

Examples by sport

Realistic templates for the sports where multi-subject photos are most common.

DTM / GT3 — two-car panning shot

Template:

DTM, 3.+4. Rennen Zandvoort 2026 [[#{number}; {car_model}, {team}: {name}]] - picture by Gruppe C Photography

Result with two cars in frame:

DTM, 3.+4. Rennen Zandvoort 2026 #90; Porsche 911 GT3 R, Manthey: Ricardo Feller, #7; Aston Martin Vantage AMR GT3 EVO, Comtoyou Racing: Nicki Thiim - picture by Gruppe C Photography

IMSA / WEC endurance — multi-driver entries

Template:

WEC 2026 — [[#{number} {team}, {car_model}: {name}]]

Result with two cars in frame:

WEC 2026 — #51 Ferrari AF Corse, Ferrari 499P: Antonio Giovinazzi, #6 Porsche Penske, Porsche 963: Kévin Estre

Cycling peloton — three riders abreast

Template:

Stage 14 — [[{name} ({nationality})]]

Result with three riders:

Stage 14 — Tadej Pogačar (SLO), Jonas Vingegaard (DEN), Remco Evenepoel (BEL)

Multiple blocks in the same template

You can use more than one [[ ]] block in the same template. Each is expanded independently.

Template:

Drivers: [[{name}]] | Numbers: [[#{number}]]

Result with two pilots:

Drivers: Feller, Thiim | Numbers: #90, #7

Where it works

The same [[ ]] syntax is supported in every IPTC template field of a Participant Preset:

  • Caption Template (IPTC:Caption-Abstract) — primary use case
  • Headline (IPTC:Headline)
  • Title (XMP-dc:Title)
  • Event (XMP-iptcExt:Event)
  • Base Keywords — each keyword is template-resolved independently

Person Shown is special

The **Person Shown** field (`PersonInImage`) does not need `[[ ]]`: it is a list field by IPTC standard, so each pilot already gets their own entry, formatted using the **Person Shown Format** setting (Simple / Extended / Custom) on the same preset.

Limitations

  • Nested blocks not supported. Don't put a [[ ]] inside another — the parser is non-greedy and closes on the first ]], giving you broken output.
  • Separator is fixed at , (comma + space) in v1.2.0. If you need a different separator (e.g. | or /), let us know — per-block separator support will be added if there is demand.
  • Zero matched pilots → the block renders as an empty string. The rest of the template is preserved (and trailing/leading whitespace cleaned up automatically).
  • Single matched pilot → the block renders once, no separator. So Race 2026 [[#{number} {name}]] becomes Race 2026 #90 Feller, identical visually to a no-block template.
  • Existing presets are untouched. If your template has no [[ ]], RaceTagger renders it exactly as it did before — no behavior change.

Bonus: the {persons} placeholder is now correct in multi-pilot photos too

If you were already using the {persons} placeholder (a long-standing convention from Photo Mechanic-style captions), v1.2.0 fixes a long-standing bug: in multi-pilot photos {persons} used to produce nonsensical output built from the aggregated participant fields.

Before v1.2.0 (broken):

Featuring: (90, 7) Feller and Thiim - Manthey, Comtoyou - Porsche, Aston

From v1.2.0 (correct):

Featuring: (90) Feller (SUI) - Manthey - Porsche, (7) Thiim (DEN) - Comtoyou - Aston Martin

Single-match behavior is unchanged. You don't need to do anything — the fix applies automatically to any preset using {persons}. If you want a custom format for each pilot inside the caption (rather than the built-in Extended format that {persons} uses), wrap your own placeholder structure in [[ ]] instead. The two patterns are complementary.

FAQ

I wrote [[#{number} {name}]] in my template but the preview shows the brackets. Why?

If you only have one participant in your preset's table, the preview shows the single-pilot example only. Add a second participant to see how the block expands across multiple pilots. The brackets you see in the preview are intentional — they are literal characters from the template. They will not appear in the actual caption written to the file: in the IPTC output the block is expanded and the brackets are gone. If you are still seeing the brackets in the final caption written to the file, double-check that you are on RaceTagger v1.2.0 or later.

Can I use the per-car block for keywords?

Yes — you can put [[ ]] in any Base Keyword string. The block expands inside that single keyword and produces a single comma-joined keyword entry. RaceTagger also automatically adds each pilot's name and team as separate keyword entries, so you usually don't need [[ ]] in keywords; individual pilot tags are added for free.

My preset is shared with a teammate. Will their templates still work after this update?

Yes — [[ ]] is fully backward-compatible. Templates that don't use the new syntax produce identical output to before. You can adopt the new syntax at your own pace.

I'd like a different separator between block iterations (e.g. | instead of , ).

Not configurable yet in v1.2.0 — we left it at , to keep the UI simple. If you have a real use case for a different separator, let us know and we'll add a separator option.

Does [[ ]] work in Person Shown templates too?

It is available there for consistency, but you don't usually need it. Person Shown is a list field by IPTC standard: each matched pilot already gets their own individual entry, formatted with whatever Person Shown Format you've chosen (Simple / Extended / Custom). Using [[ ]] inside the Person Shown template would just duplicate every pilot's entry, which is rarely what you want.

Feedback welcome

If you have caption ideas that don't fit cleanly with the current syntax, or you'd like to see new placeholders, the team is keen to hear from photographers using the feature in real shoots. Reach out via [info@racetagger.cloud](mailto:info@racetagger.cloud).