Shogi has kifu and chess has PGN: one move per line, readable by anyone, replayable by software, and you can diff two of them. Curling, as far as I could find, has no public notation that does the same job.
World Curling publishes every shot of the Olympics and the World Championships as "Shot by Shot". Each shot has its type and the statistician's rating, and there is even a diagram of the stones. But the format is PDF. That is fine for a person reading it, but a machine has to parse it every time, and the stone positions exist only as images. The research simulator Digital Curling has a log format, but it is not built to take records of real games.
The notation actually came first. Years ago I started on a puzzle game about curling and began working out a format for writing its games down, then left it half-finished. In August 2026 I was working with a Hokkaido Curling Tour livestream on in the background, remembered it, and dug out the unfinished spec. I rewrote the physics while I was at it, and that turned into a curling strategy board, CurlFlux. Once I needed to replay real games in the browser, I had to settle the notation too. The result is PCN (Portable Curling Notation).
This article walks through the spec from top to bottom, with the reasons behind each design decision. It is long, but it is written so that after reading it you know all of PCN. The app itself is introduced in a separate article (in Japanese).
It is still a draft, and that is the reason for this article. I am a programmer who watches a lot of curling, with no playing experience. So there must still be things that happen in real games and cannot be written in this format, and people who have played are far better placed to find them than I am. If you read something and think "you couldn't write this", please tell me.
The spec is public (the Japanese text is normative; there is an English edition): https://github.com/shinagaki/pcn/blob/main/spec/PCNSPEC.en.md
Summary for busy readers Plain text, one shot per line. The header uses PGN's [Key "Value"]; the body repeats End lines, shot lines and Score lines. Everything after ; is a comment The shot codes are taken directly from World Curling's statisticians' material. Shot type (Task) is one letter, rotation (Handle) is > or 1 reads like this: 13: sequence number within the end Y: thrown by Yellow. Usually this can be left out (see below) P: Promotion Take-out, a shot that hits one of your own stones or a guard and drives it in >: clockwise rotation. For a right-hander that is an in-turn, and the stone curls to the right 1: the statistician's rating 1 (25%). Close to a miss
This game was 5-0 after two ends, and Poland conceded. [Termination "Concede"] says so.
These are at the top of the spec. Every detailed rule after this follows from them. Four layers by depth of information
| Layer | Content | Sources that exist today | |---|---|---| | ① Line score | Points per end, the team with the hammer in end 1 (LSFE), last stone draw | World Curling results database, national association result pages | | ② Description | Thrower, shot type, rotation, 0–4 rating | World Curling / CURLIT Shot by Shot (PDF, Game Centre) | | ③ Positions | Coordinates of every stone after each shot | Diagrams in Results Books (images), Live Scores SVG, coaching apps | | ④ Motion | Position, velocity and spin at release | Simulators (Digital Curling and others), measuring equipment |
You write only the layers you have, in the same file. The first World Championship in 1959 has nothing but a line score, so it becomes a layer-① file (the scores here are made up):
Even without a single shot line, this is valid PCN. At the other end, a practice session recorded in a simulator has everything up to layer ④.
With layer ④, a deterministic physics engine can replay the game exactly. How to present a record without layer ④ is left to the implementation. It may show the layer-③ positions as the board, or it may generate throws that fit layer ③ or are consistent with layer ② and animate them. When a generated throw is written back into the record, est marks it as an estimate. Contain existing records rather than replace them
When creating a new format, the thing I most wanted to avoid was adding "yet another proprietary format". The design lets public records (line scores, Shot by Shot, position diagrams, coaching-app CSV, simulator logs) each go straight into one of the layers ①–④. Converting a World Curling PDF gives a layer ②③ PCN; throwing stones in CurlFlux gives one with layer ④ too. Line-oriented and appendable
One shot per line. grep, diff and spreadsheets all work. The file reads from top to bottom, so adding a line per throw gives you a live record. An end without a Score line is "in progress". Match World Curling practice
The shot types and ratings use the definitions and one-letter codes from Curling Statistics: How to Score, the manual for World Curling and CURLIT statisticians. The classification statisticians assign at every game becomes the notation as it is. The only thing I changed is how rotation is written (see below). Implicit values only where derivable
Throwing order (who throws first) and the thrower follow from the rules, so they may be omitted. Only exceptions (a skip throwing the lead's stones, a throwing-order violation) are written explicitly. Conversely, nothing that cannot be derived is omitted.
One [Key "Value"] per line. Inside a value, " is written \" and \ is written \\. Order is free, but putting PCN first is recommended. The rule is that unknown tags are preserved and ignored, and the same goes for unknown key=value pairs and comments in the body. That way information added by future extensions or other processors is not lost on a round trip.
