---
name: wristdope-match
description: Build a Wrist Dope match file (.wdmatch) and a wristdope.com/m match link from a PRS, NRL, NRL Hunter or club stage sheet, a match-director link (impactscoring.net, PractiScore) or a photo, so the shooter can open it in the Wrist Dope app. Use when a user asks for a Wrist Dope match, a .wdmatch file, or to put a match in Wrist Dope.
---

# Build a Wrist Dope match

Wrist Dope (https://wristdope.com) is a ballistics app for Apple Watch, iPhone, Android and Wear OS. Its Match Mode holds a match as stages, each with targets (a label and a range) and a shoot order. The app solves the holds live from the shooter's own gun, load and conditions; the file holds only what the stage sheet holds. Match Mode is part of Wrist Dope Pro.

Your job: turn what the user gives you (a stage sheet, a photo of one, a match link, a description) into a valid `.wdmatch` document and hand it over so they can open it on their phone.

## What to produce

1. **The file.** Name it `<Match name>.wdmatch`. Replace / \ : * ? " < > | in the name with spaces. If you can attach files, attach it. If you cannot, print the JSON in a code block and tell the user to paste it at https://wristdope.com/m, which turns it into a link and a download.
2. **The link, only if you can run code.** `https://wristdope.com/m#<payload>` where `<payload>` is base64url (RFC 4648 section 5, no `=` padding) of the minified JSON. Never encode by hand; without a code tool, skip the link and give the file. The link opens a page that shows the match with a Download button, and the shooter opens the downloaded file with Wrist Dope. Wrist Dope versions with match links (the next updates) open the link straight into the app's import dialog. The payload lives in the URL fragment and never reaches the server.
3. **Your notes.** Anything you inferred or could not read (estimated ranges, an unclear order, a doubtful digit), so the shooter fixes it in the app before shooting.

## The document

Schema: https://wristdope.com/skills/match/schema.json. Complete example: https://wristdope.com/skills/match/example.wdmatch.

```json
{
  "format": "wristdope.match-backup",
  "schemaVersion": 1,
  "exportedAt": "2026-10-17T14:00:00Z",
  "platform": "assistant",
  "matches": [
    {
      "id": "6C0C5B2E-7D7B-4C0B-9C21-2F1E2A1B0C01",
      "name": "Parma October PRS",
      "createdAt": "2026-10-17T14:00:00Z",
      "lastModified": "2026-10-17T14:00:00Z",
      "stages": [
        {
          "id": "A3F1C2D4-5E6F-4A7B-8C9D-0E1F2A3B4C5D",
          "name": "Stage 3",
          "parSeconds": 90,
          "roundLimit": 10,
          "briefNote": "Prone on the concrete pad, near to far",
          "targets": [
            { "id": "B1C2D3E4-F5A6-4B7C-8D9E-0F1A2B3C4D5E", "label": "T1", "range": 429 },
            { "id": "C2D3E4F5-A6B7-4C8D-9E0F-1A2B3C4D5E6F", "label": "T2", "range": 503 }
          ],
          "sequence": [
            { "id": "D3E4F5A6-B7C8-4D9E-8F1A-2B3C4D5E6F7A", "targetID": "B1C2D3E4-F5A6-4B7C-8D9E-0F1A2B3C4D5E", "rounds": 2 },
            { "id": "E4F5A6B7-C8D9-4E0F-9A2B-3C4D5E6F7A8B", "targetID": "C2D3E4F5-A6B7-4C8D-9E0F-1A2B3C4D5E6F", "rounds": 2 }
          ]
        }
      ]
    }
  ]
}
```

The app refuses a file that breaks any rule below and says only "damaged or unreadable", so check each one:

- `format` is exactly `wristdope.match-backup` and `schemaVersion` is `1`.
- One match per file: `matches` holds exactly one entry.
- Every `id` is a fresh UUID v4, uppercase, like `8553CA91-FD73-4644-A03F-4D03128DFCF7`. No id appears twice in the file.
- Dates are UTC in exactly this shape: `2026-10-17T14:00:00Z`. No fractional seconds, no time-zone offset.
- `range` is a number in yards, above 0. Convert metres: yards = metres × 1.0936.
- `label` is 1 to 8 characters, no leading or trailing spaces. Use `T1`, `T2`, … in the order the sheet lists the targets, or a short name such as `KYL1`, `LG`, `SM`, `Ram`.
- `sequence` is the shoot order: one entry per engagement, in order; `targetID` is the `id` of a target in the same stage; `rounds` is 1 or more. A target may appear many times (T1, T2, T1, T2). `positionNote` is where the shooter is for that step (`kneel L`, `pipe 2`, `P3`), a few words at most.
- `parSeconds` and `roundLimit` are whole numbers; leave them out when the sheet has none. `briefNote` is one short line from the stage brief, optional.
- Only the keys in the schema exist. wristdope.com/m refuses any other key (`brief_note`, `par`, `targetId`); the apps drop it silently, so the value never arrives. Leave an optional field out rather than writing `null`.
- NRL Hunter blind stages (targets found on the clock): `"hunterBlind": true` with empty `targets` and `sequence`.
- Never invent a target or a range. If the sheet gives a band ("5 targets, 140 to 220 yd"), space the targets evenly across it and say so in your notes.

## Reading a stage sheet

Per stage, find the stage name or number, the par time in seconds, the round count, the targets with their ranges, the order with rounds per engagement, and the positions. Common PRS phrasings and what they become:

- "5 targets near to far, 2 rounds each": five targets in ascending range; sequence T1 to T5, rounds 2.
- "engage the large target then the small target from each of 5 positions, 1 round each": two targets (`LG`, `SM`) at the stated range; sequence LG, SM repeated five times, rounds 1, positionNote `P1` to `P5`.
- "KYL rack largest to smallest, 1 round per target, from the pad, then repeat from the tank trap": five targets `KYL1` to `KYL5` at the one range; the sequence listed twice with positionNote `pad` and `trap`.
- "near to far, then far to near": the sequence forward, then reversed.
- "2 rounds from each of 6 positions on one target": one target; six steps of 2 rounds with positionNote `1` to `6`.
- a coloured group at one range with no count ("engage the red squares from each position"): one target per named group (`RED`, `BLUE`) at that range, one step per position, and say in your notes that the group was collapsed. Make one target per square only when the sheet counts them.
- When positions are not counted, positions = round count ÷ rounds per position (10 rounds, 2 targets, 1 round each = 5 positions). Say so in your notes.

When the split of rounds is not stated, divide the round count evenly across the steps and say so in your notes.

## Match links

**impactscoring.net** (`https://www.impactscoring.net/match/view?id=NNNNN`). The page is a JavaScript app and its HTML contains no match. Fetch the JSON the page itself loads; no login is needed:

`https://app-api.impactscoring.net/rest/website/getMatch?id=NNNNN`

Read `payload.match.name` for the match name and `payload.match.about` for the stage briefs as plain text ("Stage 3 / Round Count: 10 Rounds / Par Time: 90 Seconds / Target ranges: 429, 503, 554, 628, 666 / Shooter will …"). Use `payload.stages[]` only for the stage list and its order (`name`); take the par time and round count from the brief text ("Par Time: N Seconds", "Round Count: N Rounds"), because the structured `maxTimeHundredsOfSecond` field can be a default (match 11010 reports 120 s for every stage while the brief says 90 s for stages 3 and 4). Use `targetsCount` and `maxTimeHundredsOfSecond` ÷ 100 only when the brief has no numbers. `about` is one text with every stage brief in sequence, separated by blank lines; stage names there can differ in case from `stages[].name`. Ranges and the shoot order exist only in the brief text.

**PractiScore and other sites.** Use the match book or stage descriptions the page shows. If the page is empty for you, ask the user for a screenshot or the match book PDF.

**Photos.** A flat, overhead photo of a sheet reads reliably; an angled one does not. If a digit is doubtful, say which one.

## Tell the user

- On the phone, tap the link and download the file, or open the file with Wrist Dope (share sheet, then Wrist Dope; or the Match page, Import Match). Newer Wrist Dope versions open the link directly.
- The app asks "Import Match?" and shows the stage and target count. After Import the match is active and the Stage Card shows live holds for every target.
- Check every range against the sheet before shooting, and read your notes.
