Writing diagrams
A drill diagram is written as a few lines of text. You say where people stand, then what happens, beat by beat. Every example below is live — the court beside it is what those exact lines produce. Try any of them right here — no account needed — and when you're ready to keep one, sign up to save it to a drill of your own.
Your first drill
Three kinds of line. A drill name, a team with its players, and a beat containing something that happens. Indentation is for your eyes only — the parser ignores it.
S@z1 means "a player called S, standing in zone 1". The name is yours to choose: use S, OH1, Jana, whatever your club says out loud. It has to be unique within its team — it's how the beats below point at that player — but both teams can use the same one, so S on each side is fine.
There are two teams, and they're called red and blue. Every position is worked out from the side of the court its team is on, so those are the only two names that mean a side; anything else is refused rather than drawn in some third colour. A drill on one half only needs red. One other name is accepted, and it isn't a team either — coach, for whoever is feeding the drill from the side.
Change anything — it's yours to play with. Tab indents. Open in playground
Choosing a court
A court line picks what gets drawn. Leave it out and you get the full court. It only changes the picture — z4 is z4 whichever court you draw it on, so you can switch at any time without moving anybody.
| Line | Draws | Good for |
|---|---|---|
court volleyball | Full court, net and both attack lines | Anything with two sides |
court half | One half, net along the near edge | Drills that never cross the net |
court empty | Bare floor, no markings | Warm-ups, conditioning, anything off court |
Change anything — it's yours to play with. Tab indents. Open in playground
Saying where
There are three ways to place someone, and you can mix them freely in the same drill. Use whichever is clearest for the thing you're describing.
Zones — the way you already talk
z1 to z6, exactly as a coach names them: front row 4-3-2 left to right, back row 5-6-1. Each team's zones are read from its own side, so red.z1 and blue.z1 are both that team's back-right — which is why they appear on opposite sides of the picture.
Change anything — it's yours to play with. Tab indents. Open in playground
Grid — when you need to be exact
g(x, y) in metres, measured from the middle of the net. x runs along the net from -4.5 at the left sideline to +4.5 at the right. y is distance from the net: positive into red's half, negative into blue's. Plain numbers are absolute — g(-3, 6) is the same spot on the floor whichever team you wrote it for, which is exactly what makes it the escape hatch.
Change anything — it's yours to play with. Tab indents. Open in playground
Anchors — named lines on the court
baseline, attack-line, net, serve-zone, left-sideline, right-sideline, center, setter-target. Every one of them is read from the acting team's own side, the same way zones are — left-sideline is each coach's own left, so red's and blue's are opposite lines on the picture.
A plus always means in from the line you named — toward the net for baseline and attack-line, toward the middle of the court for the two sidelines. So baseline+3 is three metres in from the baseline and left-sideline+1 is a metre in off the left sideline, and both phrases mean the same thing to either coach instead of flipping sign depending on who you mean. A minus goes the other way, out into the free zone.
setter-target is where the setter takes the ball to distribute it — a metre right of the middle, half a metre off the net, on the seam of zones 3 and 2. It's the one place a coach points at constantly that the 1–6 numbering has no word for, because it isn't a rotational position. It and center name a single spot rather than a line, so unlike the others they take no offset: there's no direction for one number to move a point in. Use g(x, y) for somewhere near them.
Change anything — it's yours to play with. Tab indents. Open in playground
You can mix an anchor with a number inside a grid: g(-3, baseline) is three metres left of centre, on the baseline. The anchor has to match the axis it's in — g(baseline, 3) is refused, because a baseline is a distance from the net and can't tell you an x. And an anchor keeps its meaning wherever you write it, so the anchor half stays team-relative while the plain number beside it stays absolute: for a blue player, g(-3, baseline) is blue's baseline.
An offset stops at the net rather than crossing it: baseline+20 puts someone on the net, not in the other half. The far side is the opposition's court, not more of the same instruction.
Naming a place
A place two lines share should have a name instead of two copies of its coordinates. A spots: block declares one as name@place, where the place is a position — any of the three notations above, with a team prefix if it belongs on the other side (deep@blue.baseline+1). Reference it bare, anywhere a place belongs — a target, or a player's own starting spot in the line-up:
Change anything — it's yours to play with. Tab indents. Open in playground
W@queue stands a player on the spot exactly as passes to seam sends a ball to one — but only once queue has been declared. The parser reads top to bottom, so a spots: block written below the team that uses it is still an unresolved name — write it first, the same as you would declare a piece of equipment before a beat moves someone to it. An unprefixed spot resolves once, in the first team's own frame, the same rule a teamless bounce already follows — so a one-sided blue drill still puts an anchor-based spot on blue's own half. A spot written with g(x, y) is a plain point on the floor and ignores frame entirely, exactly as it would anywhere else. A position is all a spot may be, though: a prop, a player or another spot is refused, because the spots are laid out before either of those exists to point at.
A teammate is a place
A target doesn't have to be a spot on the floor — it can be a person. "Pass to the setter" is how you'd actually say it, and now you can write it that way: red.A passes to red.B sends the ball wherever B is standing, not to a copy of B's coordinates written out by hand.
Change anything — it's yours to play with. Tab indents. Open in playground
That's live, not a snapshot — move B in the line-up, or write a beat where B moves first, and every ball aimed at red.B follows. The team prefix is required, the same as any other target, so write blue.B to aim at the other side's B. A target that reads a moving teammate always uses where they stood as that beat opened, even if the same beat also moves them on somewhere else — so which of two lines you write first never changes what's drawn. A name that isn't on that team's roster is refused and tells you who is, the same message an unplaced actor gets.
Beats
A drill is a sequence of beats, and each beat is one moment. Everything inside a beat happens at once; the next beat happens after. Press play on the court below to watch them in order.
Give a beat a title in quotes and it shows up as you step through — worth doing, because that's what a coach reads when they're running the drill.
Number your own beats starting from 1. beat 0 is not yours to write — it's the line-up, the frame before anything happens, and the viewer draws it for you from where your players start.
Change anything — it's yours to play with. Tab indents. Open in playground
What the ball does
Ball actions read as a sentence: who does-what to where. Each verb draws its own kind of line, and in 3D each has its own flight path — a set loops, a spike drives down.
| Verb | Use it for |
|---|---|
| serves | Starting the rally |
| passes | First contact, up to the setter |
| sets | Second contact, to a hitter |
| attacks | Hitting it down |
| digs | Defending an attack |
| blocks | At the net |
| free-balls | An easy ball over — sent by a team, across a net |
| tosses | A coach feeding the drill in — see below |
| bounces | The ball off the floor, with or without an actor — see below |
| catches | Stops the ball in the actor's hands — no target — see below |
Change anything — it's yours to play with. Tab indents. Open in playground
Write blue.z5 to mean the other team's zone 5. Without a prefix the target belongs to whoever is acting, so red.S sets to z4 means red's own zone 4.
The coach
Half of club training starts with the coach putting the ball in play, and the coach is not a player on either side — they don't rotate, they're on nobody's roster, and they have no side of the court to call their own. Declare them the same way a team's line-up is declared, with a coach: block, and address them the same way a player is addressed: coach.C.
tosses is the verb for the feed itself — lobbed up from waist height, arriving wherever the drill needs it played. It reads exactly like any other ball action, and it takes no modifiers of its own; only unplayed applies, the same as it does everywhere.
Change anything — it's yours to play with. Tab indents. Open in playground
A coach has no side, so an unprefixed target and the coach's own line-up position both resolve in whichever team the drill declared first — the same rule a bounce, a prop or a spot already follows. tosses isn't reserved for the coach either: any player may use it, the same as any verb. And coach isn't only for feeding — it's a real actor, so it can carry any ball verb at all, such as a coach hitting down balls from a box.
Letting it bounce
Some drills want the ball on the floor — a coach throwing one up to be chased down, or a high ball nobody plays. With nobody behind it, a bounce starts with ball rather than a player, and it names both ends:
ball bounces from center to z6
Both ends are written out because neither can be worked out. Every other ball action starts wherever the player doing it is standing; this bounce has no player, so it needs telling where the ball met the floor and where it is going next.
Once a player sends the ball off the floor themselves — bouncing it through their own legs to a teammate, say — it drops from and reads like any other ball action, because now there is somebody to leave from: red.C bounces to red.D. Nothing marks it as a bounce except the verb itself.
The set above ends with unplayed, and without it the drill does not work. Every verb ends where somebody plays the ball — a set finishes at hitting height because a hitter takes it — so a set nobody touches would stop three metres in the air and the ball would never reach the floor to bounce off it. unplayed says nobody took it, so it lands. It goes on any ball action, and it keeps whatever shape the verb had on the way down.
Change anything — it's yours to play with. Tab indents. Open in playground
The dot is where it hits, and the ball swells for an instant as it lands. Looking straight down at a court you cannot see height at all, so on the flat diagram those two marks are the only sign a bounce happened — in 3D you can watch the arc come off the floor. Anything that reaches the ground gets them: the unplayed set landing in beat 1, and an attack where it lands.
It ends where someone plays it, not where it would land again. If you want to show a second bounce, write a second line. And the chase and the dig sit in beats of their own on purpose: a ball action starts from where the player was when the beat opened, so chasing and digging in one beat would draw the dig starting from where they set off.
More than one ball
Every action above already means "the ball" — a drill with no balls: block has exactly one, unnamed, and there is nothing to declare. Reach for balls: once a drill has two moving at once, or needs to say a ball is already in somebody's hands before the first beat opens.
<name> @<place> — the place is anything a target can be, a teammate or a piece of equipment included, so a ball can start already held, or waiting on a cart:
Change anything — it's yours to play with. Tab indents. Open in playground
Name which ball a line means the same way you name an actor — a bare word, this time between the verb and to (or right after catches, which has no to). Leave it out and it means whichever ball the actor is holding, which is fine right up until they are holding two: name neither, and the line is refused, listing what they are actually holding rather than guessing which one was meant.
Where a ball ends up
Possession is worked out the same way facing is. Playing a ball takes it out of the actor's hands; it comes to rest in whoever's hands are where it landed, or on the floor if nobody's are — and unplayed always means the floor, however close somebody happens to be standing. Write catches to say so outright, which overrides the worked-out answer rather than merely agreeing with it — a dig that pops loose and gets scooped up a metre from where it actually bounced still reads as caught.
Change anything — it's yours to play with. Tab indents. Open in playground
No to, because the ball stops here rather than travelling on. It takes the same ball name any other line does, and unplayed is the one modifier it refuses — a caught ball is, by definition, not one nobody played. A ball nobody's line mentions in a beat stays exactly where it was, carried along if whoever is holding it moves.
Moving people
One verb, moves, and one place: red.S moves to z2. You never write where they set off from, because the drill already says where they are standing — a start you typed in could disagree with the roster, and used to.
A player who moves in one beat is standing at their new place by the next one — you don't have to restate where they are. Two moves by one player in one beat make a path: the second sets off from the end of the first, which is how you walk somebody through a ladder and on to a cone.
Their path is the only thing that adds up inside a beat. Everything else in it happens at once, so a ball they play in that same beat still leaves from where they were standing when it opened — and swapping two lines around changes nothing.
A piece of equipment moves the same way — cart1 moves to g(4, 8). A cone does not run, so the subject is the whole difference.
Change anything — it's yours to play with. Tab indents. Open in playground
Facing
Which way somebody is looking is worked out for you — from what they're playing, the ball coming to them, or the way they're walking — so most of the time you never write it. Say so only where the worked-out answer is wrong: a blocker watching the setter instead of the ball, a defender reading the hitter rather than the flight.
red.MB faces red.S — no to, because a facing names its target directly rather than somewhere the ball travels through. It changes no position and takes no note, and it lasts until something changes it, exactly like a position does.
Change anything — it's yours to play with. Tab indents. Open in playground
The same suffix works in the line-up, right where a player starts — A@z1 faces z5 — for a drill whose whole point is body position, so it doesn't need a beat 1 made of nothing but faces lines. A written facing beats a worked-out one, whichever form it's written in, and a target can be anything a beat's own target can: a zone, a spot, a prop, or a teammate.
Touching nothing
Most of what happens in a drill is not a touch. Two hands go up at the net while the hitter swings around them, and until now there was no way to draw that — only a beat title that said so and a court with nobody on it. Leave the target off a ball verb and it stops being a touch and becomes something the player did: red.MB blocks, wherever MB already stands.
Change anything — it's yours to play with. Tab indents. Open in playground
Any ball verb can be written this way — a bare attacks is an approach jump that swings at nothing — but blocking is the one that comes up constantly, since two blockers going up is the ordinary shape of a drill and neither one touches anything. Modifiers still apply: blocks standing is reaching over the net rather than jumping into it, the same word it means on an attack.
Modifiers
Add a word after the target to change how the ball travels. The two below are the same set to the same place; only the word differs. Switch either court to 3D to see what it actually changes.
quick
Change anything — it's yours to play with. Tab indents. Open in playground
high
Change anything — it's yours to play with. Tab indents. Open in playground
| On | Modifiers |
|---|---|
| sets | quick, shoot, high, back |
| attacks | tip, roll, standing |
| serves | jump, float |
| passes | overhead |
| blocks | standing |
| catches | jump |
standing is the odd one out: every other modifier says where the ball goes, and that one says what the player did. It's registered on two verbs. An attacks is a jump by default — they leave the floor a beat early and hit at the top — and standing is the down ball you hit off your feet, which is how everybody hits in a warm-up. A blocks is a jump too, and standing there is reaching over the net rather than jumping into it, which is most of what a warm-up block actually is. It's the only way to say "don't jump" — for either one.
Setting it behind you
back is the other modifier that describes the player rather than the ball. Where it goes is already in the target — sets to z2 sends it right — so what back adds is that the setter never turned to look at it. Every other contact is played facing the target; a back set is the one that isn't, and staying square to the outside is the whole skill. Watch it in 3D: the setter keeps facing the antenna and the ball comes off the hands behind their head.
Change anything — it's yours to play with. Tab indents. Open in playground
A warm-up, in four lines
Pepper needs both of the odd cases at once, which makes it the best thing to look at: standing for the down ball, and a dig played back to the person who dug it. That dig lands exactly where it started, so on the flat court there's no line to draw — the ball just swells and shrinks where it is, because what moved was the height. Switch to 3D and you can watch it go up and come back.
Change anything — it's yours to play with. Tab indents. Open in playground
You can also leave yourself a note in quotes at the end of any action line — a ball, a movement, a bounce. It's for the person reading the drill, not the picture, so it never changes what gets drawn.
Change anything — it's yours to play with. Tab indents. Open in playground
Equipment
List equipment in an equipment: block before the first beat, then refer to it by name. Anything with a length has an entry and an exit you can run between.
Leave length off a ladder or a line and it still draws real ends, 3m apart — the picture and the diagram never disagree about where they are. Leave orient off and a ladder runs up the court while a line runs along the net, which is how each is drawn most often; write orient=x or orient=y to say otherwise.
| Type | Draws as | Takes |
|---|---|---|
| cone | An orange marker cone | size |
| ladder | An agility ladder with rungs | length, orient, width |
| hoop | A hoop flat on the floor | size |
| tire | A tire flat on the floor | size |
| target | Concentric rings to hit | size |
| ball-cart | A cart of balls | size |
| chair | A chair | size |
| net-block | A block simulator at the net | size |
| line | A marked line on the floor | length, orient |
orient is x (along the net) or y (up the court). Sizes are metres — leave them out and each type uses a sensible default. The settings belong to the type, so a cone takes a size and not a length: giving it one is refused rather than quietly ignored, because a cone has no ends to run between.
Change anything — it's yours to play with. Tab indents. Open in playground
Hoops and tires
Both lie flat on the floor and work as places to land or move through. A hoop is thin and bright; a tire is heavy and dark. Because they're a single spot rather than a run, you point at them by name — there's no entry and exit the way there is on a ladder.
Change anything — it's yours to play with. Tab indents. Open in playground
When it complains
Errors name the line they're on, and they never cost you the rest of the drill — every beat that parses still draws, and the diagram still saves. You can walk away half-finished and pick it up later.
| Message | What it usually means |
|---|---|
unknown position 'z9' |
Zones only go up to z6. Check for a typo. |
declare it above the line that uses it |
A spot or a piece of equipment referenced before its own spots: or equipment: block. The parser reads top to bottom — move the declaration above whatever uses it. |
unknown team or equipment 'blue' |
You referred to blue.something without ever writing a blue: line. |
no beat open |
An action appeared before the first beat. Actions live inside beats. |
reads like DrillScript 1's movement |
The old two-place movement — a start and an end joined by ->. DrillScript 2 drops the start and names only where it ends: red.A moves to z2. The error spells out the exact rewrite and points at the migration table below, which covers the rest of what changed. |
'baseline' describes y |
An anchor used on the wrong axis of a grid position. |
unknown team 'green' |
Teams are red and blue, or coach for whoever is feeding the drill in. Nothing else has a place on the court. |
'quik' is not a modifier of 'sets' |
A typo, or a modifier borrowed from another verb — quick shapes a set, not a pass. |
'A' is already on red |
Two players on one team sharing a label. Both teams may use it; one team may not use it twice. |
'Z' is not on red |
Either the actor doing something, or the teammate a ball is aimed at, was never put on the court — a typo in the label, or the right player named on the wrong team. |
'length' is not an attribute of a cone |
A setting the prop doesn't have. Each type takes its own — see the table above. |
'midle' is not a point on 'ladder1' |
The ends of a ladder or a line are entry and exit. |
a cone is a single spot rather than something to run between |
Only a ladder or a line has an entry and an exit. Point at anything else by its own name, like cone1. |
'center' names a spot rather than a line you can stand in from |
center and setter-target are points, not lines, so they take no offset. |
beat 2 is already in this drill |
Two beats with one number, or numbers going backwards. Gaps are fine. |
those go above the first beat |
A red:, equipment: or spots: block written below a beat. Set-up comes first. |
headers go above the first beat |
A drill or court line written below a beat. The parser reads top to bottom, so a header down there would redraw the whole drill retroactively — move it to the top instead. |
beat 0 is the line-up |
You don't need to draw the starting positions yourself — the viewer already shows them, as beat 0, before beat 1 runs. Start your own numbering at 1. |
spot 'seam' is already in this drill |
Two spots sharing a name. Every spot needs its own, the same as an equipment id. |
'baseline' is a word the language already uses |
A player, a spot, a piece of equipment or a ball tried to reuse a zone, an anchor, a team, a verb or an equipment type. Every mention of that word would otherwise mean the built-in one — pick a name that isn't already spoken for. A spot and a piece of equipment are checked against each other too, since a bare reference like to cone1 has no prefix to say which one was meant. |
'@' says where something starts out |
An @ belongs to a declaration (A@z1) and nowhere else. A target never takes one: write passes to z3, not passes to @z3. |
is holding 2 balls, so this line has to say which one |
More than one ball declared, and the actor is holding two of them. Name the one this line means, the bare word between the verb and to. |
a catch has no target |
catches ends the flight in the actor's hands — drop to and whatever follows it. |
One thing that catches people: a blank line ends a team block. A comment line starting with # doesn't, so you can annotate a line-up without breaking it.
Coming from DrillScript 1
The language changed, and nothing rewrote the diagrams you had already saved. A drill written against the old grammar now reports errors instead of drawing — which is deliberate: a silent half-translation would have moved players around without telling you. Every row below is refused by line number, and the message names what replaced it, so you can work down the list the editor gives you.
| Was | Now |
|---|---|
red.S runs z1 -> z2 |
red.S moves to z2 — drop the start and the arrow |
ball bounces from center to z6 |
Unchanged — the only from left |
units meters |
Delete the line — it never had any effect |
ladder1.start / ladder1.end |
ladder1.entry / ladder1.exit |
net+2 |
attack-line, or g(x, y) for a point of your own |
runs / approaches / covers |
moves — one movement verb, for players and props alike |
attacks to z5 line / attacks to z5 cross |
attacks to z5 — the target already says which it was |
passes to z3 platform |
passes to z3 — that is what a pass is |
sets to g(0, 3) bic |
sets to g(0, 3) shoot — closer to a bic's arc and speed than quick is |
cone1.entry, on a prop with no length |
Just cone1 — only a ladder or a line has two ends to name |
And five things you can now do that you could not: aim at a teammate (passes to red.B), name a place once and reuse it (spots:), put the coach on the court (coach: and tosses), turn somebody deliberately, in the line-up or a beat (faces), and put more than one ball in play, naming which one a line means and stating outright when it is caught (balls: and catches).
Reference
| Line | Means |
|---|---|
drill "Name" | Names the drill |
court half | Which court to draw — volleyball, half or empty |
red: A@z1 B@z4 | A team and where its players start |
coach: C@g(0, -3) | The coach — on no side, feeds the drill in |
equipment: | Starts an equipment block |
spots: seam@g(1, 1.5) | Names a place, referenced later as to seam |
balls: b1 @red.A | Names a ball, starting in A's hands — leave out for one unnamed ball |
beat 1 "Title" | Starts a beat |
red.A sets to z4 quick | A ball action, with a modifier |
red.A serves b1 to blue.B | Naming which ball, once there is more than one |
red.A passes to red.B | A ball aimed at a teammate, wherever they're standing |
coach.C tosses to red.z6 | The coach feeding the ball in |
red.A sets to z4 high unplayed | A ball nobody takes — it lands on the floor |
red.MB blocks | An action with no target — something a player did without touching the ball |
ball bounces from center to z6 | The ball off the floor and on to somewhere, with no actor |
red.C bounces to red.D | The same verb, sent off the floor by an actor instead |
blue.C catches jump | Ends the flight in the actor's hands — no target |
red.A moves to z2 "note" | A player moving, with a note |
cart1 moves to g(4, 8) | A prop being moved, same verb |
red.A faces z5 | Which way A is looking — no to, no note |
# anything | A comment |
Releases
You are reading DrillScript 2.1. The language is numbered on its own: a new major number means something that parsed no longer does, or means something else; a new minor number only adds. Every diagram remembers the release it was last saved under, and the editor tells you when yours is older than the language.
| Release | Date | What changed |
|---|---|---|
| 2.1 | 2 Sep 2026 | Balls with identity (a balls: block, a named ball between the verb and to), computed facing and the faces sentence, catches, unplayed, the actor-led bounce. Everything from 2.0 still parses. |
| 2.0 | 30 Aug 2026 | The clean break from the prototype grammar: the arrow, runs / approaches / covers, a movement's stated start, units, .start / .end, net+2 and the four label words (line / cross / platform / bic) are gone; moves, spots:, coach:, tosses, team-prefixed targets and the modifier axes arrive. Coming from DrillScript 1 is the way across. |
| 1.x | until 29 Aug 2026 | The prototype grammar. No longer parses. |