CoSpin · the paper trail
What changed
Every build, in order, with nothing important left
out and nothing boring left in. Mostly.
Names on the row
- The ledger's reports carry who was there on the row itself,
visitors marked, and under it who was not: the members on the
books that night with no attendance against it. A page of them
can be read down without opening any. The names used to arrive
one report at a time on opening; they come with the list now, in
the one request.
- The CSV export and the sheet's file carry both, as Who and Not
here.
Who was here, on the report
- The Collab report lists everybody in the group, with tonight's
attendance already on it: whoever played, or was tapped in, is
marked here, and the rest are away. Tap anyone to change it. It
was a line of names the leader could read and not touch, so the
person who arrived after the wheel and left before the podium was
a correction made somewhere else.
- Add a person under the list opens the same card the
check-in uses for a visitor, and comes back to the report with
everything already typed still in it.
- Same rows as the check-in pane, same tap, same attendance
record. The report does not keep a list of its own.
A sheet that keeps up
- A Google Sheet can mirror the ledger. The Access tab makes a
read-only key, shown once, and the key opens two files a sheet
can pull: the reports, with who was there, and the people, with
what they scored.
IMPORTDATA in a cell is enough;
a short script in the sheet refreshes faster. Both are in
docs/cloudflare.md.
- Never a phone number or an address. Contact details are on a
ninety-day clock with a nightly delete, and a spreadsheet is a
copy that sits outside the clock — so the key cannot reach
them, by construction rather than by setting.
- One key a ledger. Making a new one replaces the old, so a key
that has got out is one press from worthless, and Remove ends it.
Both are written into Activity.
Reports first
- The ledger opens on Reports now, since for anybody
running Collabs that is the page rather than a corner of it.
People, Access and Activity follow.
- Export CSV on the reports: what is on screen, as a
spreadsheet, so Only follow-ups narrows the file the same way it
narrows the list. Made in the browser; nothing leaves the page
that was not already on it.
- The search under People works as you type. It waited for Enter
or for the field to lose focus, which read as not working at all.
The ledger, in four tabs
- The back of the booth is four tabs rather than one long scroll:
People, Reports, Access and Activity,
each with its count, and a dot on Reports while a follow-up is
waiting. One sheet each, rows and hairlines inside it, and the
five boxes of totals are one line of small print under the
filters.
- Anything can be deleted now, not only a person. A single turn
— a tablet that logged one twice, or a spin from the bench
— goes from the person's list; a Collab report goes from
its own row. Every delete on the page is the same two presses:
one that says what is about to go, in red, and one that lets it.
It stands down on its own after six seconds, and each one is
written into Activity.
- Colour only where it means something: the clock on contact
details is warm, a delete is red once it has been pressed, and
nothing else on the page is either. One height for every field
and button, and the same row wherever there is a list.
In order
- A party and a group start on the Order game now rather than the
full wheel: everybody's first turn is an open question, the second
a multiple choice, the third a fill in the blank, and the whole
wheel from there. A group's round of one each is a round of people
talking, which is what the evening is for. Booth was already on
Order.
- Options still offers all three. A device that was saved on
Random is read as never having chosen — the defaults are
written out with everything else — so it moves to Order too;
Questions, which somebody had to pick, stays. A table that wants
the full wheel picks it once more.
Not you? Tap to switch
- The face over the wheel is a button at a party and in a group
now, the way it always was at a booth. A phone going round a table
reaches people in the order they are sitting, and the order their
names went in is only a guess at that — so when the screen
says Priya and it is Marcus holding it, Marcus taps and picks
himself.
- It swaps seats rather than skipping ahead. Priya takes the seat
Marcus had and Marcus takes this turn, each with their own score
and their own count of turns, so nobody owes more or less than
they did. Skipping would have left the order wrong and the same
mismatch back next lap; swapping corrects the order itself, so
one lap of this and the roster is the room.
- Only the people who still owe a turn are offered, whoever is up
is not, and it goes quiet when there is nobody left to swap with.
Not while the wheel is turning or a question is on the card —
that question was dealt to the person on screen.
An arrow on the way out
- All groups is a back control now rather than an underlined
line of text: an arrow and two words, set quiet, with the arrow
lined up under the group's name so the two read as one column.
- The underline is this app's mark for the other, smaller thing you
could do on a screen — the intake's way back out of a step.
This is not that. It leaves the group entirely and it is the only
way to, so it should read as a control rather than as an aside.
- A left arrow and not a chevron: the chevron is already the mark
down the right-hand side of the group list meaning "into this one",
and the same sign pointing the other way at the other end of the
card would be one sign meaning two things.
All groups, always
- All groups is on the card whenever a group is open. It was
gated on the device having two or more of them, on the reasoning
that there is nowhere to go back to with only one — which read
the door as a list and nothing else. It is also where you type
another group's code, and where you make a new one. So somebody with
one group had two reasons to get there and no way to.
- A screen with no way off it is the bug. How many rows the next
screen has is not the test for it.
A way out of a group
- A group that was open stayed open. The door — the card
listing every group on the device — only ever showed when none
was, so somebody who had just imported six could see one and had no
way back to the list. Picking Group from the main screen walked them
into the same one again.
- The group card now carries All groups above its name. It
shuts the open group and shows the door, and shutting is not losing:
every group is still there, one tap is back in, and it is what makes
the next trip through the main screen land on the list rather than
inside a group.
- Remove this group from this device is in the Group tab. It
was already there, worded as closing it, and unreachable once you
were in a group with no way back out. It asks first, names the
group, takes it off this phone only, and leaves nothing waiting to
sync behind it. The code still opens it, with everybody and every
night still in it.
From the sign-up sheet
- A Collab starts as a form on a website with a spreadsheet behind
it, and the way from that to a group in here was somebody typing
eighty-four names. Options now has Import sign-ups: open the
sheet, select the heading row and everything under it, copy,
paste.
- It reads as you paste, so what it found is on screen before you
press anything — the groups, how many go into each, how many
are already there, and any row it could not place. Columns are found
by name rather than by position, because a form that gains a
question moves every column after it.
- One question on the form carries both halves — "Mens
(18-24)" — so that column decides the group, and the six fall
out of it. Men, Mens, Male and Man are one word here; so are 18-24,
18–24 and "18 to 24".
- Each person brings their name, age band, email, phone and
the day they signed up, which becomes the day they joined the
group rather than the day of the import. Run it again and it adds
only the new rows, matched on email. Somebody who filled the form in
twice is folded to one person and named on the card, so the number
it promises is the number that lands.
- A code can hold a 0 and a 1 now. The alphabet left out O, 0,
I and 1 because those read back wrong across a room — but
dropping both halves of each pair was one guard too many. With the
letters gone a 0 can only be a nought and a 1 can only be a one. It
also lets a code be a name, which is what a leader remembers:
MN18 is the men aged 18 to 24.
Past write-ups, and a form that says there is more
- Every Collab Report a group has filed is now in the group.
The second tab is Nights — it was Attendance, and it
holds both halves of the record now. The dot grid says who was in
the room on the 18th; under it, Write-ups lists every night that has
a report, newest first, shut, a date and its first line each. Open
one for the three C's as they were written, and a line when a
Director was asked to follow up. Those nights keep a mark down their
edge, the same way the ledger's do.
- All of them, not the twelve the grid draws: the grid is limited by
what fits across a phone and a paragraph is not.
- The report form said it had ended when it had not. The
Charge box finished flush against the bar holding Submit, which is
exactly what the bottom of a form looks like — and Anybody new
and Testimony were under it, unseen. The last of the scroll now goes
soft against that bar while there is something left to reach, and
not at all when there is not, so it never says there is more when
there is not.
- And the boxes start at two lines and grow as they are typed into,
rather than standing three deep whether or not anybody has written
anything. Four questions fit on a phone where three did, with the
fifth showing under the fade.
Submit Collab Report
- Some Tuesdays there is no time for the wheel and the group still
met. The check-in pane has a second way out now, directly under
Start and the same size and type as it: Submit Collab Report.
Tap in who was there, press it, and the night is filed and the form
opens.
- It needs one person where Start needs two. Two is what a game
needs; a Collab that met and never got to the wheel is still a
Collab that met, and the write-up is the half a Director is waiting
on either way.
- The label does not change once tonight is filed, because the
report can be submitted again — that is how you add the thing
you remembered on the way home. The mark carries the difference, a
notepad becoming a tick, and the line underneath says the night is
filed and written up.
- The same button ends the results screen after a group's round,
where it is now full width and solid rather than a small one hugging
its own words. Play again drops to a hairline while it is
showing: two solid buttons are two answers to "what now", and after
a Collab the report is the one being asked for.
- And on a phone the three ways off that screen are one stack, each
of them the full width, in the order they are wanted — report,
another round, the roster. Side by side they hugged their own words
and sat left, which on a 393pt screen is two small buttons under a
full-width one with a lot of nothing beside them. A window wide
enough keeps the row.
- A small thing found on the way: a button whose mark depends on
what has happened could not change it. The icon painter deliberately
leaves a painted button alone, because it runs over whole screens
and would otherwise redraw every mark on every pass. The handful
that do change now go through their own path.
A group asks for more
- Making a group, and adding somebody to one, now asks for an
age band, a phone number and an email as well as a name. All
three were off; all three are on.
- They were off because the switches were kept per mode and a group
is a party as far as the wheel is concerned — which it is not,
as far as this is. A group has a roster the leader keeps, and the
leader is the person who has to ring the two who missed on Tuesday.
So a group has its own set now: the party's three stay off, the
booth's three stay on, and turning one off in Options turns it off
for that way of playing only.
- A Kid is still never asked for a number or an address, whatever
the switches say. That guard has not moved.
- What a group collects reaches the same contact table the booth's
does, and sits on the same ninety-day clock. The phone keeps its own
copy on the member, which does not expire.
The write-up
- A Collab ends with a report, and now it ends with the report. The
card comes up a couple of seconds after the podium and asks for the
three C's — Celebrate, Constructive,
Charge — plus anybody new, anything worth passing on,
and whether a Collab Director should follow up.
- It does not ask for what the group already knows. The form
this replaces wanted the date, the name of the group and the names
of everybody who came; the app has just watched all three happen.
They are shown across the top instead, so a leader can see what is
going up under their name without typing it back. A form that makes
you re-enter six names you entered ten minutes ago is a form that
stops getting filled in.
- The three C's are required. A report with the middle one blank is
the one nobody would have filed at all. Everything else is
optional.
- One a night, not one a game — three games after supper is
one Tuesday, the same rule attendance already follows — and
filing again corrects it rather than making a second one. Not
now leaves a button on the results screen for whoever has six
people still talking at them, and nights with no write-up show a
hollow dot under the date in the attendance grid.
- It rides the same queue attendance does: written to the phone
first, sent when there is signal, retried until it lands. A hall
with no bars costs nothing. On the other end the ledger grows a
Collab reports list, newest first, with the ones asking for a
call marked down the left-hand edge and who was in the room that
night on each.
- A group now starts at one question each rather than three.
A group meets every week or two and works through the same people,
and one round is what fits the time a group actually has — the
leader can spin again if the room is warm. Party and booth still
start at three, and pressing + or - once makes the number yours for
good.
Flood on flood
- The bar, measured rather than guessed at. Sampled out of the
recording: the header around it reads 225,224,220 and the bar
itself 254,253,249. Read back against the palette, allowing for the
wash lying over both, those are #e8e5e0 and #ffffff exactly
— the flood the header takes while the card announces, and
the card's own white underneath it.
- So the bar was never a wrong colour, a stale frame or a fade
caught halfway. It was the header's background not yet painted
over that stretch of the card, with the card showing through
the gap. The card carries a full-size drawing and Safari lays it
down in pieces; the right-hand end of the header is simply one of
the last pieces to land.
- Nothing can make that first paint arrive all at once. But a piece
that has not landed yet can be made to look exactly like one that
has: the card is now the flood colour too while it announces,
so an unpainted stretch of header shows flood on flood and there is
nothing to see. Every pixel that rule touches was already hidden
behind the header or the flash, so nothing that was visible changes
colour.
- Sixth attempt at this, and the first one with the two colours
actually identified rather than reasoned about. The five before it
each removed something real — a compositing layer, a blur, a
fade, an animation, an opacity on a parent — and none of them
was ever the thing.
The fade was never the card's
- Found it. The wash behind the question card was on the same
element the card lives inside, and that element was the one being
faded in. Opacity applies to everything under it, so one
line on the wrapper was fading the card too — every question,
whatever the card's own animation did or did not do. Which is
exactly why taking the card's slide away last build changed
nothing: the fade it was being drawn through was never the
card's.
- Measured off the recording, four frames after the card lands: the
header samples 230,217,185 at its left end and 248,237,209 at its
right, and over the next six frames the left ramps to 225,224,219
while the right catches up one sample at a time. Not two states
— one fade, arriving in columns. A full-screen blend of
detailed content, painted in instalments.
- The wash and the blur now sit on a layer of their own behind the
card. That layer still fades, and can: it is a flat colour with
nothing in it for a seam to fall on. The card is painted once, at
full strength, and is simply there.
- Fifth attempt, and the first four all missed for the same reason
— every one of them was a guess about the card, and the line
that mattered was on its parent.
The wheel goes soft again
- The blur behind the question card is back. It was taken out two
builds ago on the theory that it was what the bar across the top of
the card was made of, and it was not: the bar outlived its removal
and turned out to be the card being repainted in instalments while
it animated in.
- So the card sits over the wheel out of focus again rather than
over a flat wash, at 72% of the ground and a 5px radius —
which is what a question should have behind it.
The card does not move
- The bar is gone, and it went by taking the card's entrance out
altogether. It used to rise and fade; when the fade was blamed, it
only rose. Both left a bar across the top of it on an iPhone.
- A second recording, read one frame at a time, says what was
actually happening. The card's header paints in from the left over
about seven frames: at the fourth, Warm-up and a 1
are down on grey and the last fifty points of the bar are still the
card's own white, with the PT not yet in it. The next frame
has the P. The next has the T. That is not a design that flickers
— it is a card being drawn in instalments, repainted every
frame of its animation instead of being drawn once and moved, which
a card carrying a full-size illustration is apparently heavy enough
to provoke.
- So there is nothing left to draw in instalments. The card is
painted once and it is there. The scrim behind it still fades and
the flash still plays inside it, so the arrival is not a cut
— what is lost is a third of a second of slide, and what the
slide was costing was the top of the card looking broken on the way
in, on every single question.
- The dialogs keep theirs. Options, How to play, the intake and the
are-you-sure all still rise: they are smaller, they carry no
full-size drawing, and they open once in a while rather than every
time somebody spins.
It rises, it does not fade
- Found it, on the third go, by pulling a screen recording apart
frame by frame. The bar is not an element and never was. Blown up
to full size it is two hard-edged rectangles sitting at a different
step of the same fade as the ones beside them — the page
showing through the card more strongly on one side of a vertical
edge than the other. Nothing wrong with what was being drawn. Only
with how much of it had been drawn yet.
- The card used to fade in as well as rise. Fading it means
blending a large box of detailed content over a detailed page,
every frame for a third of a second, and Safari does that work in
tiles which do not all land on the same frame. So the card only
rises now. A transform is handed to the compositor and the card is
rasterised once; there is no half-finished version of it to
catch.
- The fade has not gone, it has moved: the scrim behind the card
still carries it, and can, being one flat colour with nothing in it
for a seam to show up in.
- The tier flood across the card's header changes in one frame
rather than easing over three tenths of a second, for the same
reason. There was nothing to ease into anyway — the flood
goes at the moment the flash goes and the question arrives, so
everything on that card changes on the same frame regardless.
No blur behind a question
- The pale bar across the top of the question card is gone, and it
went the blunt way. The card's scrim goes back to 88% of the ground
with no blur behind it — which is what it was before the blur
was added, and what the note in the stylesheet argued for at the
time.
- The last build fixed both known reasons the page had elements on
their own compositing layers, which is what a backdrop blur cannot
see through and what the bar was made of. The bar stayed. That is
the answer: on that engine the set of things given their own layer
is not ours to enumerate, and a blur that depends on having
enumerated it correctly will keep finding new ways to show a
rectangle of the page.
- What is lost is the wheel sitting softly out of focus behind a
question. What is gained is that nothing shows through in its own
shape, on the one card that opens for every single question, and
one less full-screen blur on a booth tablet that runs all day. The
dialogs that open once in a while — How to play, Options, the
intake — keep theirs.
- The two fixes from the last build stay, because both were right
on their own account: entrance animations that end rather than
staying applied for the length of a turn, and a wheel that asks to
be composited while it is turning rather than all evening.
An entrance that ends
- A pale bar sat across the top of the question card as it arrived,
the width of the name over the wheel. It was the name over the
wheel: a rectangle of the page showing through the card's scrim
unblurred and unwashed, in the shape of the thing behind it.
- The stage's arrival animations were selected by the state flags
alone — one while somebody is up at a booth, another while
nobody is — and a state flag lasts as long as the state.
Somebody stands at a booth for a whole turn, so four finished
animations stayed applied to four elements for the whole of it.
A finished animation is still an animation, and Safari keeps
anything carrying one on its own compositing layer — which is
exactly what a backdrop blur cannot see through to. The card's
scrim went up over the page and the hero was not in it.
- So the entrance ends. It has its own flag now, raised when the
arrangement actually changes and taken off a second later, once the
pieces have landed. Each animation was checked to finish on the
element's own resting state, so there is nothing left for it to
hold.
- The wheel had the same problem for a different reason: it asked
to be kept on its own layer permanently, for a spin that happens a
few seconds at a time. It asks while it is turning now, which was
the only time it was earning anything, and has let go by the time
the question is asked.
Take your time, at full size
- Ask me a different one now sits at the far end of its line
on a phone: Skip holds the left, the pill takes the right. Scoped
to the widths where the pair has that line to itself — swept
at twenty-point steps, it is alone to 600 and shares from 620.
- Take your time is the size of the button it stands for.
That is what it was always meant to be, and for a while it was not:
the box took its width from its own words, 216 points where the
button replacing it was 319, and its height from the ring, 58 where
the button was 50. So the wait ended with the control jumping a
hundred points wider and eight shorter, and the row was eight
taller for the whole eight seconds, which dragged Skip up with it
at the end.
- Both numbers are the button's now: the same share of the row, and
26 of ring inside 11 of padding, which is the 50 a large button
comes to. Checked at seven widths from 320 to 1200 — same
box, same place, and nothing else in the row moves when the ring
runs out.
- The words inside it went up with the box. At 15 they were right
in something that hugged them and adrift in something the full
width of a button; near the button's 18 now, and still short of it,
because this is the thing you cannot press.
As many as it takes
- Ask me a different one now sits beside Skip rather than
above it. Three things you can do with a question, one row, and the
quiet one at the end of it. The two that do not end the turn are
kept together so a phone never splits them — loose in a
wrapping row they landed side by side on one handset and stacked on
the next.
- The cap is gone. It shipped at one a turn, on the
reasoning that twice is reading the drawer until the easy one turns
up. That was a rule about a player who wants to win, on a button
whose whole point is the player who wants a question they can
answer — and somebody who does not want to talk about their
father does not want to talk about their mother either. The second
no was the one the cap made them take a nought for. The tier is
what holds the score honest, and the tier still does not move.
- Each swap puts back the one it replaces, so a turn spends exactly
one question however many times it is pressed. Checked over 1,800
swaps: not one handed back the question it was asked to replace.
- On an open question the hold rewinds with it, if it is still
running. The hold is there so a question gets read before anybody
can say it was answered, and a new question has not been read
— without this, pressing three times would be the way past
the hold rather than the way to a question you can answer. It is
not restarted once it has finished: eight seconds already sat
through is nobody pressing by reflex.
The door, not the party
- Choosing Group on the main screen and pressing Continue
showed the wrong screen on the way in. The title fades out over a
quarter of a second, so whatever is behind it is on show and
getting brighter the whole time — and the move to the group
door was happening when the fade finished. What arrived was
Who's playing, the roster, Turns each, and then a snap to the door
the instant the fade ended.
- The move now happens before the fade starts, so the fade reveals
the screen that was asked for. Nothing else changes: Continue is
still what opens the group rather than the tap that chose it, and
Party and Booth still land on the setup card.
Ask me a different one
- Not every question is one the person in front of it can answer.
It asks about the teacher who changed you and they were taught at
home; it asks what their kids call them and they do not have any;
it is a Deep end in front of a group that met last week for the
first time. The two ways out of that were to answer it badly or to
take a nought.
- There is a third now, on the card under the question: Ask me a
different one. It changes which question and nothing else —
same tier, same kind, same points. The wheel ruled on all three and
this is not an appeal: the moment somebody can leave a Deep end for
a Warm-up they are choosing their own score, and the deep end stops
being deep.
- Free, because priced at a point nobody would spend it and the
awkward question would get answered badly anyway. Once a turn,
because twice is reading the drawer until the easy one turns up.
Gone once a graded question has been checked, where a swap would be
undoing a wrong answer rather than declining a question. And it is
there at a booth, where a stranger who cannot answer should get
another rather than hand the tablet back.
- The old question goes back in the drawer, which is the
half that was easy to miss. Questions are marked seen the moment
they are dealt — onto the asker's list and onto the room's — before
a word has been read out. Without the refund every swap would spend
two instead of one, the bank would drain at twice the rate, and the
app would come to believe the room had heard things nobody said.
- It is a pill rather than a third button in the row underneath.
Those two are a pair, one ending the turn with points and one
without, and a third that ends nothing turns a yes-or-no into a
menu — one that would get pressed by people who meant Pass. This is
an aside, set close under the question it acts on.
Making a group asks the way setting up does
- Who is in it was a box you typed names into, one a line.
It is a list now, with Nobody yet in it to start and an
Add someone button that opens the same picker the setup card
opens — the same face and colour to choose from, the same
Also ask if it is on, the same everything.
- The textarea was faster to fill and handed out faces in whatever
order the list happened to be typed in. The people in a group are
precisely the ones who have to be told apart on a list every week,
and the picker is where that gets decided, so it should have been
asking through the picker all along.
- Each row can be tapped to change, and has a cross to take
somebody off. Nothing is written anywhere until Make it —
back out and the card leaves nothing behind, because there is no
group yet to leave it on.
- Make it waits for a name and nothing else. An empty group
still opens; the pool is the thing that grows.
- And on the door before it, Open and Make a group
sit eight points apart rather than twenty. They were in two stacks
with the panel's own gap between them, which read as a division
that is not there.
Two things off the group door
- The line about four characters said out loud across a room is
gone from a device that has no groups on it yet. That line is there
to describe a list, and where there is no list there is nothing for
it to describe — the field under it is already labelled Group
code and shows what one looks like, so a sentence explaining
four characters was explaining something you can see.
- It stays where it has a job: with groups on the device it still
says open one you already have, or type the code for
another, which is about the two ways in rather than about the
code.
- Make a group is the same size as Open now. It was a
notch smaller, which made the second way onto the screen look like
an afterthought rather than the other half of the question. Back to
setup stays quiet, because leaving is not one of the two.
Closer set
- Each mode's name sits closer to the line under it. The gap
between them was already one point — what was actually separating
them was leading: a 16px name in a 24px line box carries four
points of air below the glyphs before anything else is measured.
Set at 1.15, because this is a label with a caption under it and
neither of them ever wraps. Seven points of daylight down to four
and a half.
- Nothing moved. The drawing is still the tallest thing in the row,
so the card stays at 220 points.
Smaller again
- The drawings in the picker are 44 points rather than 50, which
sits better against two short lines of type than it did against
two long ones.
- Which puts the card at 220 points — fifty-eight fewer than it
took before there were any pictures on it. The main screen has
111 points of slack on a 393-point phone where it had 93 before
this started, a 360-point phone fits where it did not, and an
iPhone SE is eighteen points better off than it has ever been.
One line each
- Every mode now says who is playing in one line. Group —
your regulars, attendance taken. Party — whoever turned up
tonight. Booth — one at a time, and a name kept. They were a
sentence and a half apiece, which was right on a card that was only
words and wrong on one with a picture beside every row: the
descriptions were doing the job the drawings now do, in three lines
of small type.
- And the gap between each name and its line is one point rather
than three. They are one thing said twice, not two things.
- This is what pays for the pictures. The card comes to 238
points, which is forty fewer than it took before any of
this started — so the main screen has its original ninety-three
points of slack back on a 393-point phone, and an iPhone SE is
exactly where it was rather than worse.
- Thirty-odd characters is the whole budget, and counting them does
not predict the wrap — where the words break decides it. Every
candidate was measured at 360, 375 and 393 points.
A frame, not an edge
- The keyline round each drawing is 2px now, twice what the cards
are drawn with. At one it read as the edge of the artwork rather
than as a frame around it, which is a different thing to be.
- The chosen one goes to full ink, frame and all. Three
things say which row it is — the tint, the dot and this — and this
is the one you can see from across a room, which is where a mode
gets picked more often than it does in the hand.
- And the tile is 50 points rather than 56. Still nothing in
height: it was never the tile that cost anything, only the column,
and every size from 40 up wraps the text identically.
The drawings, edge to edge
- No inset in the tile any more. Each drawing already fills its own
canvas to the edge — the little action marks run right out to it —
so the padding was doing nothing but making it smaller. The art
meets the keyline now, and the corners are clipped to the same
radius the keyline is drawn on.
- Group's line is shorter, and the card costs nothing again.
Adding a column narrowed the text enough to push that one
description to a third row, which put eighteen points on a screen
with ninety-three to spend. It now reads The same people every
week. Tap who came, and the week is taken. — which is the
wording the group door already uses, so it is the better half of
the trade rather than a sacrifice.
- Character count turned out not to predict the wrap: several
shorter lines still took three rows and several longer ones did
not. Where the words break decides it, so the wording was chosen by
measuring ten of them at 375, 393 and 430 points rather than by
counting.
- Below about 390 points wide, Booth's line still takes a third
row. An iPhone SE scrolls the main screen with or without any of
this.
A picture for each of the three
- The main screen's card carries a drawing on every row now: hands
stacked in a huddle for Group, a hat and the confetti off it
for Party, a clipboard being filled in for Booth. In
a keylined tile between the radio and the words.
- They are in the same hand as the twenty-four avatar faces above
them, which is the one thing that could not have been added later:
art that arrives from somewhere else always looks like it did.
- They fill with
currentColor, so they are the skin's
ink and the dark skin needs no second copy. And there is no white
plate behind them, so the chosen row's tint runs through the
picture as well as around it — which ties the drawing to the choice
without a rule saying so.
- The tile is 56 points, the largest that fits inside the height
the rows already had. It still costs about 18 points on a
393-point phone, because the column it adds pushes the Group line
to a third row. Nothing between 40 and 56 changes that, so the
size was picked on how it looks rather than on what it costs.
- The radio sits in the middle of its row. It was pinned to
the first of two lines, which left it high against the block it is
the mark for — and higher still with a picture beside it. The same
component asks the intake's in-the-group question and gains the
same correction.
The line stays put
- Tapping down the three modes on the main screen to read what they
say made Add CoSpin to your Home Screen appear, vanish and
appear again. That looks like a fault, and it is a strange thing
for a picker to do to a line of text below it.
- It was rule 3 reading which radio was lit. The rule is about who
is holding the device, not which one of three is selected: what it
protects is a visitor at a stand, and a visitor at a stand is
looking at the booth screen. They are handed a running booth,
answer one question and hand it back. The main screen is the
operator's, and the line only ever lives there.
- So the rule holds by where the line is rather than by a condition
re-checked on every tap, which is both simpler and harder to get
wrong.
The icon, shown
- The Home Screen card opens with the icon you are about to make,
at the size you will get it. It is the only part of that card that
is a reason rather than an instruction, and it is what makes
somebody finish the third tap instead of stopping after the
second.
- It is carried, not fetched:
build.js puts the same
PNG into the page as a data URI, the way it already does with the
two typefaces. About 20 KB, and a copy handed out on a stick still
shows it.
- Plainer words above the steps, and one line fewer under them.
- The line now appears on the first visit. It waited for a
second one, on the grounds that nobody keeps an icon for something
they have not seen work, and that turned out to cost more than it
bought. It hid the whole feature on the build that shipped it, and
it never appeared in a private window at all, because private
browsing keeps nothing between sessions and so every visit there is
a first visit with nothing to tell it from a stranger's. The ask is
one line of small type under Continue. It does not need protecting
against.
- The number is still there and still tunable
(
INSTALL_AFTER_OPENS). The rules that do the work are
the other five: never when installed, never in Booth, never
mid-game, dismissing means it, and Options never stops offering.
Two things 1.6.10 got wrong
- Nobody saw the Home Screen line. Rule 2 holds the ask back
until a second visit, because nobody keeps an icon for something
they have not seen work — but on the day it shipped it had no way
to tell a stranger from somebody who has been playing for months.
Everybody got a fresh key, an open count of one, and silence.
- It asks a better question now: has this device actually been
used. Not whether there is a save, which proves nothing —
the app writes one a second after it is first opened — but whether
there is anything in that save only playing puts there: a roster, a
question already seen, a booth total, a group. If so the line is
there on the first visit with this build, which is what it should
have done.
- The other half of that fix went back in the bin. Telling a chosen
Booth from the Booth a new device merely defaults to is possible,
and buys a line on a phone nobody has touched yet — while risking
the one case rule 3 exists for, which is a stand tablet showing a
visitor an install prompt. Booth is Booth.
- The header stopped hiding what went under it. A heading
scrolling up behind the wordmark arrived as a legible smear beside
the logo — and on any browser without
backdrop-filter,
as itself, sharp. The blur ramp under the bar softens what passes;
it was never asked to remove it. Over the wheel that reads as
depth; over type it reads as a rendering fault.
- So the ramp now carries the room's colour as well as the blur:
nothing at the bar's bottom edge, where a hard line would show, and
solid by the height the wordmark sits at. The room's colour and not
bone, because in the booth what is behind the bar is the guest's
own, and a bone wash over a blue page is the same mistake pointing
the other way.
Add to Home Screen
- The wheel is sized off the viewport, so Safari's bar is a wheel
this app never draws. Installed, it gets that back — full screen,
no address bar sliding in over a spin, no back gesture, and the
cache it already had is one tap away instead of a bookmark
somebody has to go and find.
- iOS will not help with this. Safari has never fired
beforeinstallprompt, so there is no event to catch
and no button to offer — there is a gesture, three taps long,
that nobody finds on their own. So the whole of this is a set of
instructions and the question of who is shown them.
- One line under Continue on the main screen, and a
Home Screen row at the foot of Options. The line carries no
dismiss of its own because it covers nothing; the sheet it opens
holds that, and says out loud that Options keeps a copy.
- Installed, the Options row stops asking and reports instead.
"Did that work" is a real question on a phone where an icon and a
tab look the same for the first second, and the app already knew
the answer — this is the first place that says it.
- The rules are the feature. Never when it is already installed.
Never on the first visit, because nobody keeps an icon for
something they have not seen work — the second visit, or the first
finished game. Never in Booth: a stand tablet is set up once
by whoever runs it, and the visitor holding it is answering one
question before handing it back. Never mid-game. And one tap on
Don't ask again means it, which is only affordable
because Options never stops offering.
- Nothing on anything that is not an iPhone or an iPad. Android
has its own prompt and a desktop has nothing to gain from either
answer, so the row is not there at all. On an iPad step one says
top right rather than bottom, and in a browser that is not Safari
it says to open that browser's own share menu — they have all been
able to make an icon since iOS 16.4, but their furniture is not
ours to describe.
- A third way — a card at the foot of the screen with a caret over
Safari's own share button — is built and switched off. It is the
only one that points at anything, and the only one that can point
at nothing: the toolbar it aims at hides on scroll and moves on an
iPad. It is one flag away if the quiet line turns out not to be
read.
- The main screen no longer scrolls. A finger on it got a
scrollbar for a screen that does not scroll, because the drag was
going to the setup card underneath. The lock for that had been
written on
body, which only reaches the viewport when
the root's own overflow is visible — and it is not, so it
had been doing nothing here since the day it was added. It is on
the root now, and the intake and Options were quietly relying on
the same dead rule.
The word, everywhere it is read
- The written record now says group throughout —
docs/private-room.md, the design page beside it and
README's own section. The app has said group on every screen since
1.6.4; the prose behind it had not caught up, which left the two
disagreeing for whoever went looking for the reasoning.
- The design page also explains the split rather than leaving it to
be noticed: group in anything a person reads, room in anything you
could paste into a terminal. The SQL on it is still the schema
verbatim, because that is a thing you might run.
- The ledger's filter was labelled Room and its column
headed Room. Both say Group now. It is the same four
characters and the same query — the word over it was just the old
one.
- Two files keep their names:
docs/private-room.md and
docs/private-room.html. The second is published at a
URL people have, and a rename that breaks a link to buy a filename
is a bad trade.
Options offers what the main screen offers
- Game in Options offered two while the main screen offered
three, which read as the menu disagreeing with the launcher about
what this app can do. It offers Group, Party and Booth, built from
the same list, so neither can drift from the other.
- There is no Continue in a menu, so picking one there acts. Group
opens the group screen; Party closes the group and goes back to the
setup card; Booth does what it always did. Mid-game it still asks
first, and now lands only once somebody has said yes rather than
guessing when the answer arrived.
- Which one is lit is worked out from where the app actually is —
the mode, and whether a group or its screen is open — rather than
remembered separately. The one thing state cannot say is the moment
between choosing Group on the main screen and pressing Continue,
and that is the only thing held apart.
A group adds somebody the way a booth does
- Adding somebody to a group had a name field of its own, which
meant two things nobody asked for: no face to pick until they were
already in, and Also ask in Options doing nothing at all
here. It opens the same card the booth fills a stranger in with —
the avatar picker, the name, and whatever Options is set to also
ask for.
- In the group or just tonight is a step in that card now, on the
radio row the main screen uses. Tapping an answer is the answer, the
same as the age step, so a group add with nothing else switched on
is a name and one tap.
- Everybody already in the group counts as having taken a face and
a colour, not just whoever is playing tonight — the point of a free
look is telling people apart on a list, and next week the list is
all of them.
- What Also ask collects does not go into the group's tables. Those
still carry a name, a face, a colour and a date. It stays on the
device and rides out with that person's turns into the ninety-day
contact table, behind the same forget the booth's details are
behind. Off by default, as it was.
- The sheet that used to do all this now does the one thing it was
good at: the game is running, somebody has walked in, here are the
people the group already has — and anybody else goes to the same
card.
One radio card, used twice
- Adding somebody to a group asks whether they are in it from now on
or here for one evening, and it asked with two separate cards. They
are two answers to one question and only one can be true, so they
take the card the main screen already uses — one box, a hairline
between, a radio each.
- It is the same component rather than a second one that looks like
it: one name in the stylesheet, used in both places. Two
look-alikes drift the first time either is touched.
- The sheet sits in the middle of the screen now instead of pinned
to the foot of it. That is a phone sheet's habit, and it left the
card marooned at the bottom of a desktop window with the whole page
above it.
- Turning Motion down in Options now stops the sheet rising, which
it did not: that rule had only the system half of the setting and
not the app's own. Every other reduced rule here is keyed on
both.
The group you already have, first
- Opening a group put the code field at the top and the groups this
device already knows underneath it, in the small type used for
readouts. That is the wrong way round: somebody opening this most
weeks is opening the same group they opened last week, and a code is
what you type once, when you are handed a new one.
- The list comes first and comes large — the name in the display
face, what is in it and how many nights it has taken, the code, and
a chevron — and the code field goes under a rule as the other way
in. With something to tap, Open steps back from solid to outlined so
it is not the only weighted button on a card whose main action is
the list above it.
- The line under the heading follows the layout: it describes the
list when there is one and the code when there is not, rather than
explaining a field that is now halfway down the card.
Three ways in, on one card
- The main screen offers Group, Party and Booth.
There are still two modes underneath — a group is a party with its
people kept — but "pick Party, then find the room inside the setup
card" described the shape of the code rather than the shape of
somebody's evening, and the evening is what they are choosing
between.
- One card, a hairline between each, and radio buttons: three
answers to one question, only one of which can be true. Three
separate cards read as three things you could have at once.
- Every line says what the evening is rather than how the scoring
works. The booth's is about the names it takes, because that is what
a stand is for — the drink is how you get somebody to stop, and it
was the only thing the old line mentioned.
- Choosing does not open anything. Group waits for Continue, so you
can change your mind on the main screen without a screen appearing
underneath you.
- A private room is a group everywhere a person can read it.
The code, the link and the database still say room and are staying
that way — the API is deployed and the links are out in the world,
and a migration to make the source agree with a label is a bad
trade.
- Picking a mode from the main screen no longer asks whether you
are sure. There is nothing to lose on the screens you choose from,
and the question was being asked behind the main screen, which sits
over everything — so Booth read as a button that did nothing.
A board that takes its turn
- The list beside the wheel is a queue now. Whoever is up is the top
row, whoever has just played is the last, and the rest are in the
order they are coming. It was the seat order with a highlight
somewhere in the middle of it, which made "who is next" a thing you
read off a colour halfway down a column of twelve.
- It turns over rather than redrawing. Every row is put back where
it was and walked to where it is now, so a handover reads as one
list moving instead of a new list appearing. The row that has just
played does not travel: it would have to cross the whole column,
through everybody coming the other way, and eleven rows crossing one
is not a rotation, it is a pile-up. That one arrives in place.
Anything else that would travel more than half the board is treated
the same way, so a mid-round join never flings a row across the
column either.
- The column is bounded to the wheel beside it — the top of the face
down to the foot of the hint — and the list scrolls inside it. On a
desktop with a full table it used to run past the wheel and off the
bottom of the window, taking the button that adds the next player
with it. The head and that button sit outside the scroller now, so
a long table cannot push either off the screen.
- A player's face comes from where they sit, not from where they
are in the queue. Taking it off the queue would have handed somebody
a new face every time the list moved.
One wheel, two modes
- The booth's wheel and the party's were visibly different sizes on
the same phone. The party measured the room it had; the booth used
a line through two points — 64svh less 160px — and on a handset
with a URL bar above and a toolbar below, that line read a third
short. Same screen, same furniture above and below the wheel, two
wheels.
- Both measure now, through the same function, so neither can be
arbitrarily the smaller. The old line stays as the value to use
before the measurement has run, and an
80vw only the
booth carried is gone — a term one of the two has and the other
does not is exactly how this happens.
- The measurement also has to leave the column's own foot alone,
which it did not: the booth's first measured wheel ran 28px past
the bottom of the screen. The board-slide's bar already stands in
that space, so it is subtracted in one layout and not the other.
- Options takes How to play's overlay: the blur, and none of the
wash. It had been sharing a class with the name dialog, which does
want to dim the room behind it, so it has its own now.
- Room codes are rate limited on the reading side — thirty lookups
a minute an address, which puts a walk through the whole
four-character space at about two years. It is a binding in
wrangler.toml rather than a rule in a dashboard,
because a rule nobody can see in the source is a rule nobody knows
is there. It fails open: a room that will not open because the
thing counting the opens is broken is the worse failure.
A hub that breathes in its socket
- The Spin button pulses three times when a turn hands over, and it
was swelling out of its hole rather than breathing in it. The beat
was a flat 5.5% written into the stylesheet, and the button is
sized from the wheel's own numbers — so at the sizes the wheel
actually comes out at, the peak overshot the socket it sits in by
about two pixels, swallowed the ring drawn round it and reached out
over the gap towards the keyline. Three times, every turn.
- How far it may breathe now comes from the same place the size
does, so the two cannot drift: the peak is exactly the socket, and
the wheel under it never moves. It is a smaller beat than it was,
which is the honest amount of room there is.
- The bar at the foot of the screen was painting over the Options
card, and taking the taps along the bottom of it. The bar is fixed
and lives outside the app, and the app is a stacking context of its
own, so the bar's z-index beat the panel's however high the panel
went — every other dialog sits outside the app and never had the
problem. The bar now stands down whenever a card is open, which it
should have been doing anyway.
- Options gains Main screen: all the way out to the title,
where every mode is one tap away. It is not New game — that keeps
you where you are and only clears the scores — so it asks first,
and says what it costs before it does it.
Private rooms
- A room is a group that meets, kept: a four-character code, the
same people every week, and a record of which weeks each of them
was there. Party mode gains a way in at the top of the setup card;
everything after Start is the game exactly as it was.
- Everybody in a room is marked away until somebody taps them in.
That tap does two jobs at once — it puts them on tonight's roster,
and it marks them here this week. Attendance is the by-product of
setting the game up, which is the whole idea: nobody is ever asked
to take it.
- The pool is not the roster. A room of five with four here is not
four people and somebody deleted; the fifth is just not tapped, and
next week they are back on the list like everybody else.
- A night is a date, not a game. Three games after supper is one
Tuesday with four people at it. Somebody arriving late is added to
that night rather than opening a second one, and the mid-round
button now offers the room's own list first.
- Adding somebody asks which: in the room from now on, or here for
one evening. Small groups get visitors constantly and a room that
cannot tell the difference quietly grows into a directory.
- Attendance is a wall of dots and a last-seen column that turns
warm when it gets long. That is the whole report, and it is the
reason a leader keeps opening this.
- The code is the room's address and the way in: four characters
from an alphabet with no O, 0, I or 1 in it, because those are the
ones read back wrong across a room. It can be dealt again without
losing anybody, and
/r/MN35 opens it straight on the
check-in screen.
- Rooms work with no signal. They are kept on the device and
everything done to one queues up and goes when the network comes
back, the same promise the booth's turns already make.
- Every turn now says which room it was played in, and the ledger
filters by one — so "our group" finally means something.
A wheel that only ever slows down
- A spin that had all but stopped would jump forward again just
before it settled. The flap took the wheel the moment it dropped
under the catch speed and was handed the next peg along — from a
standstill, most of a slice away — and a spring pulls harder the
further it is stretched, so it yanked the wheel on rather than
seating it. Measured frame by frame, a wheel drifting at 0.06
degrees a millisecond was pushed back up to 0.15.
- Now the flap only takes the wheel where it cannot speed it up:
where its pull is no stronger than the drag the wheel already
carries. The wheel rolls past a peg it is going too fast to be
seated in and is taken by the next one it reaches slowly enough.
From the catch to the stop it never gains ground.
- The exception is a wheel that has run out — if what is left of
the roll cannot reach the next peg, nothing is going to carry it
there and it would creep to a halt between two. The flap seats it
in the nearest one, forward or back, which is what a flap is
for.
The payoff screen, sideways
- The throws screen, the one that pays them off and the score screen
when there is no cooler are all one column: a drawing, a line, a
title, the discs and the two buttons that end the turn. Sideways
that column is half again as tall as the window, so the drawing sat
above the top of it and the buttons — the only things on the screen
anybody has to press — were a scroll away.
- They take the split the wheel screen already uses: what happened
on the left, what to do about it on the right. The drawing, the
line and the title read down one column; the discs and the buttons
take the other, and the buttons are always under a thumb.
- The type and the drawing are sized off the height rather than the
width there. A window that is wide and short was handing every
width-based clamp its biggest step, which is how a title meant to
be the loudest thing on the screen ended up pushing the buttons off
the bottom of it.
- Same breakpoint as the wheel screen, because it is the same
question: is this window short enough that a column runs off the
end of it. At 880x600 it was, by forty pixels.
The same wheel the booth gets, sideways
- Held sideways, a party now gets the booth's screen rather than a
polite version of it: the wheel is allowed to be bigger than the
window and to hang off the bottom of it, because a wheel scaled to
fit between a header and a bar on a phone's short edge is a coaster.
Measured against the booth at two sizes, the wheel, its pointer and
the Spin button now land on the same pixels.
- Which means the scoreboard steps aside there too. Short and
sideways the board is one slide away and the bar carries the
scores, the same as on a phone held up — it was taking a third of
the width off a screen with none to give.
- Only the wheel half is cropped. The board is a list, and a list
taller than the window is a list you scroll; clipping the page
would have left the end of the roster somewhere nobody could
reach.
- How to play loses its label on a short sideways screen, mouse or
not. The wheel passes right under that corner there, and a label
makes the button three times the width of the mark.
Landscape, the way the booth does it
- A party held sideways now takes the booth's shape at the booth's
own breakpoint, rather than only on the shortest screens: the name
and the line in one column, the wheel in the other. It was still
stacking — and on a wide short window, scrolling — on anything
taller than a phone on its side.
- Above that width the scoreboard is in the row too, so the change
only applies where the window is genuinely short. On a laptop or an
iPad the wheel and the name stay stacked: side by side there
squeezed the name into a column one word wide.
- The wheel asks for the pointer's room rather than hoping for it.
The pointer is drawn clear of the wheel's own box and takes none of
the layout, so on every window wide enough for the scoreboard to
sit beside it, the point went through the controls in the corner.
The wheel also sits further in off that corner.
A phone held sideways
- Turned on its side a phone has no height to stack in, so the
wheel screen was running under the bar and scrolling — the one
thing it is not supposed to do any more. The name and the line
under it now sit beside the wheel rather than over and under it,
which is the move the booth already makes in landscape, and the
screen fits again at every size we run.
- The wheel is sized from the height that is actually left, with
room kept for the pointer above it: it is drawn outside the wheel's
own box and takes no room in the layout, so a wheel sized to the
last pixel put its point through the controls in the corner. The
wheel sits in off that corner now too.
- The half of the deck that is off the side is capped a little
shorter, by exactly the breath the column keeps under the bar. It
was tall enough to push the page past the window and leave a
screenful of nothing to scroll through.
Two names on the bar, and a wheel that fits
- The bar under the wheel says two things now instead of five: who
is leading and whose go it is, each with their face, their name and
their score. It reads across a table, and it does not run out of
room at six people the way a row of everybody did. Where the same
person is both, it says so once; before anybody has scored there is
no leader, so it is the one fact.
- It moves when something happens and not otherwise. A face arrives
when the person in it changes hands; the number rolls up and takes a
small hop when only the score moved. Both off under Reduced
motion.
- The faces wear an edge of their own on the bar, and nothing clips
them any more — the ring around the first one was being cut off at
the side.
- Add a player sits at the top of the board rather than after the
last row, where a long enough roster pushed it off the bottom of
the screen.
- The wheel screen fits the screen. The wheel is never taller than
the room between the header and the bar, and the whole of it —
name, wheel, the line under it — sits in the middle of what is
there. Nothing to scroll.
- Slide over to the board and the wheel you left is still turning
behind it, faintly, so the two halves read as one screen rather
than two.
- "Made by Field Day Team" and the build number have left the foot
of every screen for the two places somebody goes looking: the
bottom of Options, and the splash. The number is still the door to
this changelog, which now opens over the Options card it was opened
from.
The board, one slide away
- On a phone the scoreboard used to sit under the wheel, under the
fold, and a board you have to scroll to is a board nobody looks at
mid-game. It has left the wheel screen: the two are now halves of
one screen that slides sideways between them, so the wheel fits a
phone with nothing below it.
- What is left where the board was is a bar across the bottom, with
everybody's face and score on it in rank order and a count once
there are more of them than it can hold. Whoever is up is marked
rather than moved, and if the ranking has pushed them out of sight
they take the last place on it anyway.
- Press the bar and the screen slides across to the whole board;
press it again and it comes back, same thumb, same place, chevron
turned around. It also drags sideways, and answers the arrow keys
and Escape. Tabbing into the half that is off the side brings that
half over rather than leaving the focus somewhere invisible.
- Only where it earns its keep: a window wide enough to hold the
board beside the wheel still does, and a booth is untouched — it
already gives the board the screen between people.
- Starting a game now lands at the top of it. A long setup card in
landscape left the page scrolled halfway down, and the game it
started opened halfway down too, with the top of the wheel above
the window.
A header that stays, and goes soft underneath
- The header is fixed to the top of the screen now, and see-through
again — the colour it was painted in five builds ago is gone. What
separates it from the page is the same ramp of blur the wheel sinks
into at the bottom, turned the other way up: five layers, each
blurring what is already blurred a little more, so what scrolls
under it goes soft on the way rather than sliding under a hard
edge.
- Its height is measured rather than guessed. The wordmark and the
two controls are all set in clamps, so the bar is a different height
on every screen, and both the room the column leaves for it and the
depth of the blur come from that one number. Re-measured when the
type arrives, since the bar is as tall as a webfont.
The credit line, spaced properly
- "Made by Field Day Team · 1.5.10" had lost the space before its
dot, and hovering the build number drew the underline out from
under the dot as well. One cause: the dot was being generated
inside the button. Leading space inside a button is thrown away by
the browser, which is where the gap went, and an underline belongs
to the whole button, which is where the rest came from. The dot is
a character in the line now. The number is the door; the dot is
not.
- The number's tap target went up and down instead of side to side
while we were in there. Padding either side of an underlined
button is more underline, which is what put a rule three pixels
past the last digit.
This card, put in order
- Everything from 1.4.1 onwards had been landing as another bullet
inside the section headed 1.4.0, newest first — so the card opened
on a story about an iPhone status bar and had twenty-six builds
hidden underneath it in reverse. Each release has its own heading
now, with its date and a name, newest at the top.
- The exception is on purpose. The twelve builds that took the strip
behind the clock and then handed it back are one story, so they are
one section, told forwards, ending where it started.
A board that survives being turned
- Today's board no longer comes apart when a tablet is turned. Every resize re-measured the board and started a fresh ticker on it without stopping the one already running, and a rotation fires resize four or five times — so the board ended up with five of them, each shifting it by a different amount off a different row height. It stops the old one now, and a resize that changes nothing leaves the roll alone entirely.
Your name for it, on the screen you play on
- Whatever you called the sitting is now on the screen you spend the night looking at. It sits above the round count and the questions left, in the reading face rather than the mono those two use — so it reads as the title of that column rather than a third number in it. Same line on a booth, over Today and the board.
One word on the button, and a name it insists on
- The booth's start button says "Get started" and keeps saying it. It used to roll a line off a list of twenty — "Cooler's stocked", "Bring them over", "Let's trade" — which was fun once and a glitch every time after, because the card is redrawn on every tap of a stepper and the button changed under the hand. A control that says something different each time you look is a control you stop trusting.
- And naming the sitting is required now, in both modes. Start stays off until there is one, with the reason under the field rather than on the button — the button has just stopped changing and is not about to start again. An unnamed game was a row on the ledger nobody could place afterwards, and afterwards is the only time anybody looks.
A booth day gets a name too
- A booth day can be named, the way a party game already could. It always could, in fact — every turn a booth writes has carried a name and an id since named games shipped, and the only thing missing was the field, hidden by a rule that dropped every setting off the booth's card back when all of them were about a group. It says "Name this day" there rather than "Name this game", because a booth opens once and takes whoever walks up.
The five values, on the wheel
- Thirty-three questions about the five values. Twenty-two open ones that ask about the thing each value is about rather than asking anybody to recite it — who makes a room easier to walk into, where you are giving God your leftovers, what makes "together" hard for you honestly. Then the values in their own words as three fill-in-the-blanks and eight multiple choice, where getting it wrong costs the turn and teaches you the answer on the way past.
- They live in the local block with the mission statement, which is where a church's own questions go — separable from the general bank, merged into it on load. There is a new check on the bank itself now: no question twice, a gap for every answer, no decoy that is secretly correct, and the right answer not always sitting in the same slot.
One question bank
- The booth stopped keeping its own questions. It had forty-eight written for somebody standing on a conference floor with a flight to catch — hotel breakfast, window or aisle, first conference or your hundredth — and this runs in a foyer after a service. Those are gone. Twenty-two that read fine in any room moved into the main bank, and the rest were already there in better words. One bank now, 172 questions, every mode drawing from it.
Music that changes with the room
- The music changes with the room. Four beds were written for four moments — Lobby, Wheel, Answering, Podium — and exactly one of them ever made it into the app, playing under everything from the setup card to the podium. The other three are in now: the wheel gets one note climbing over and over, a question going up drops the room to almost nothing so the person talking is the loudest thing in it, and the scores get something you can clap over.
- Three of them needed voices the app did not have: a bell, an open hat and a clap. The beds were written using them on the bench and were being played here with the holes left in. A booth between people gets the lobby rather than the wheel — nobody is spinning, the board is on the screen, and that is a room waiting.
1.5.0 – 1.5.1
30 August 2026
A booth without a prize, and a party you can join late
- A booth can now run without a prize. There is a Prize mode switch on the Get started card: turned off, the discs and the cooler never appear, the questions are the whole game, and a turn ends on the day's board instead of at a frisbee. Everything that mentioned a drink stops mentioning one — the card, the How to play, the line over the wheel, the art, and the Wins column, which was about to be a row of noughts.
- Points still work the way they always did: a question is worth 15 a point, which is exactly what it was worth as the floor of a throw. So a no-prize day and a prize day land on the same board and mean the same thing.
- And you can add a player to a party that has already started. The button is under the scoreboard. They go on the end of the order and the game runs until they have had their turns too.
- Which turned up something old: nobody was ever taken out of the rotation when they ran out of turns. It never showed, because everybody started together and finished together — but a latecomer makes the table wait, and the people who were there from the start were quietly taking a fourth and fifth turn while it did. Three turns each means three.
- 1.5.1: a turn without a prize round now ends on a screen of its own rather than quietly dropping back to the board: what the questions were worth, where that leaves them on the day, and the same two ways out as the throw screen — Another go, or Next person. A turn nobody was told the result of is not a turn that ended, it is one that stopped.
- It shows up even when nothing was answered, which the prize round skips straight past. There is nothing to throw either way, but there is still somebody standing there who has just finished, and saying so is the entire job of the screen.
Names you could not read
- Player names were black on black. The name in each row is a button — tapping it opens the editor — and it had never been given any styling at all, so it wore the browser's own button paint. In a light interface that is a grey slab with a keyline. On a phone set to dark it is a near-black slab, with our ink on top of it, which is a name you cannot read.
- Two fixes, because either alone leaves the trap set. The name is styled now — plain text, like the "Nobody yet" beside it. And the page has stopped telling the browser it does light or dark: there is one skin on offer and it is light, so the browser has no business painting anything in the other one. There is a new sweep that reads every control with words on it, in both phone settings, and fails if the two disagree by so much as a hundredth.
How to play stops dimming the room
- How to play no longer dims the page behind it. Every other dialog washes what it covers, because it is taking the screen away from you for a moment. This one is a card you open to read and close again, so it takes nothing away: the page stays its own colour, out of focus, and the card is held off it by its keyline alone. The changelog you are reading right now is the same panel and got the same treatment.
A header you can actually see
- The header is painted now. It was see-through, showing whatever the page behind it happened to be, which was the room — so it looked right by accident rather than on purpose. It is now a band across the top in the room's own colour, running out to the edges of the column, and it says so in the stylesheet.
- A see-through header gets the page's half-second fade for free. A painted one does not, and started arriving early: the band snapping to the new room over a page still easing into the old one. Same clock, same curve now — and still no transition at all where reduced motion is asked for.
Flick to spin, out of the box
- Flick to spin is on out of the box. It is a wheel; a finger should turn it. Still a switch in Options for the room where a wheel that moves under a passing sleeve is a nuisance, and still absent on a machine with nothing to flick it with.
- Which nearly changed nothing for anybody. The setting was written down on every single launch, not only when somebody chose it — so every phone that had ever opened CoSpin was carrying an "off" nobody had asked for, and the new default would have reached exactly the people who had never played. It is written down only when a thumb lands on the switch now, and the old leftover is swept up on the way past.
Nobody could make a ledger account
- Nobody could make a ledger account. Passwords are stretched 120,000 times before they are stored, which is an ordinary number everywhere except the one machine this runs on: Cloudflare refuses anything over 100,000, because it is a shared machine and a password hash is a fine way to hog it. So every sign-up threw, and threw somewhere nothing was catching, so the page had nothing to report and said "That did not work." — which is true, and useless. 100,000 now, which it will run.
- Two things came out of that. The stored password now carries the number it was made with, so if that number has to move again nobody gets shut out. And an unexpected error is an answer: the ledger says what actually broke instead of shrugging. The tests never caught any of it because they run on a machine with no such limit — there is now one that checks what the other machine will refuse.
1.4.0 – 1.4.12
29–30 August 2026
The strip behind the clock, taken and handed back
- Installed on an iPhone, the strip behind the clock now belongs to the app. It used to belong to iOS, which painted it from your phone's light or dark setting and had no idea the room had gone teal. It moved when the phone did and never when the app did — which is the most annoying kind of nearly-working.
- It follows the room. A dark room runs straight to the top of the screen with no seam at all. A light one gets a band in the deep end of its own colour, because the price of owning that strip on iOS is that the clock is always white, and a white clock on a bone background is a clock you own but cannot read.
- Every room is checked. All sixteen guest colours on both skins, and the plain one, held to 7:1 against white. Thirty-four rooms, thirty-four distinct bands, no exceptions and no eyeballing.
- Nothing changes in a normal browser tab. The whole thing only exists for an app you actually installed.
- 1.4.1: and then it didn't appear, because the whole thing hung on a CSS media query that iOS home screen apps don't reliably answer. Built the feature, hid it behind the one door iOS won't open. It asks Apple's own question now as well.
- There's a line at the bottom of this card reporting what the app makes of the screen it's on. A phone has no console, and both of the things wrong with this were invisible from anywhere else.
- 1.4.2: and if the app is installed but the status bar still isn't playing along, it now says so and tells you to reinstall. iOS decides how that strip behaves when the icon is made and never asks again, so a new build cannot reach it. Three rounds of "it's still broken" before anyone thought to check that.
- 1.4.3: and then the Options card lost its close button, along with the intake's and the changelog's. All three were exactly where they had always been — underneath the new band. Taking the top of the screen for the clock means giving it back to everything that covers the whole screen, which is now one number they all agree on.
- 1.4.4: and the other end. Taking the whole screen means taking the strip the home indicator sits on too, and a see-through scrim stopped before it — so the room glowed through as a bright bar under a darkened screen. The page behind now wears the same wash the scrim would have given it, which makes the seam a seam between two identical things.
- 1.4.5: and the sheets that are the whole screen — the name card and Options on a phone — now run their own bone off the bottom edge instead of stopping at the home indicator with a dark strip under them. There is no scrim to match when the sheet is everything; matching one anyway was the bug.
- 1.4.6 through 1.4.8: the big faint wheel behind the board. It was never falling short — it runs to 1200 in an 860-tall window and was simply being cut there, while the screen carries on to 874. Nothing on the page can paint that last strip, so pushing the wheel further down did precisely nothing, twice. It now fades to the colour of the page before the cut, arriving exactly at it, so the strip below matches and there is no line. It sinks instead of being scissored, which is what it was always meant to do.
- 1.4.9: and the confetti, which was landing on that same fourteen pixels and getting sliced along a straight line. It now fades out just before the edge, so the paper falls out of view instead of being guillotined. The cannons moved up a touch to fire clear of the fade — twenty-two pixels at fifteen a frame, which is nobody's idea of a noticeable distance.
- 1.4.10: a pale strip along the very bottom of any dialog over a coloured room. The dim you see through a dialog and the page colour behind it are two separate recipes that have to agree, and they were mixing 60% and 78% of the same room — a difference nobody would notice anywhere except the one strip at the foot of the screen where only the page colour reaches. Both now read from a single number, so they cannot drift apart again.
- The question card had it too and nobody had mentioned it. On a guest's room it was dimming with one colour and the page behind was dimming with another, which is the same bug wearing a different hat. Fixed in the same breath.
- 1.4.11: the strip at the bottom of the screen is not a fact about phones. It is a fact about this app, installed on an iPhone, since 1.4.0 — the change that took the status bar over also handed back a window fourteen pixels shorter than the screen. The wheel had been running clean off the bottom edge for months before that, and the confetti had never been cut.
- Three separate fixes went out for it, and all three went to every screen there is: the wheel faded on desktops that had nothing to fade, and the confetti cannons moved up twenty-two pixels on machines with no strip to clear. The app now measures the gap instead of assuming it, and the compensations only exist where the gap does. Everywhere else it is back to running off the edge, which is what it did before we ever went near it.
- 1.4.12: the status bar goes back to iOS. Taking it over was the only way to make it follow the room, and the price turned out to be the bottom of the screen — the same swap that hands you the strip behind the clock hands back a window fourteen pixels shorter than the phone. A coloured strip at the top is not worth a cut one at the bottom.
- So the band, the contrast ladder that kept a white clock legible over thirty-four rooms, the fade at the bottom of the wheel, the mask on the confetti and the shifted cannons are all gone. Everything below the clock is exactly what it was at 1.3.1, which is to say it runs off the bottom edge like it always did. Android still follows the room; it always could.
- If you installed CoSpin between 1.4.0 and 1.4.11, make the icon again. iOS decides how the status bar behaves at the moment the icon is created and never looks at it again, so the old icons are still running the old arrangement and no build can reach them. Press and hold, remove, add to the Home Screen. Nothing you have collected is stored on the icon.
A phone on its side, put straight
- The name sits in the middle again. Turned sideways, the
wheel is deliberately bigger than the screen and hangs off the
bottom — and the name and hint beside it were being measured against
the wheel rather than the window, so they sat ninety pixels low.
They were perfectly centred. On the wheel. Which you cannot see all
of. That was the problem.
- The wheel's outer ring is all there. It is drawn just
outside the wheel's own edge, and the crop that trims the bottom was
flush with it, shaving the ring off the top and the right. It now
has room to be a circle.
- The blur reaches the whole wheel. It used to start at the
halfway mark, which was a guess, and on the widest phones the guess
left a seam down the wheel's edge. It now starts where the wheel
actually starts, and a little before.
- An empty phone or email box no longer offers to continue.
The button was on before you had typed anything, off the moment you
typed one character, and on again at the end — enthusiastic about
nothing, then suddenly hard to please. Skip is how you say no, and
it is right there.
The ledger learns everyone's name
- Accounts, not a shared password. You sign in to the ledger
with your own email and your own password. A shared password can tell
you somebody was allowed in; it can never tell you which somebody. We
got tired of that particular whodunnit.
- Bring people in one at a time. Add their email, hand them the
setup code that appears, and they choose their own password. Nothing
is emailed, so nothing gets stuck in a spam folder — the weak link is
you remembering to actually pass the code along.
- Remove somebody and they're out immediately. Not "after
everyone changes the password." Immediately, on every device they
were signed in on.
- What has been done. A list at the bottom of the ledger: who
signed in, who added whom, and every deletion with a name attached.
Deleting a guest destroys the evidence of itself, so the evidence now
lives somewhere else. Alibis available on request.
- Fixed before it bit anyone: taking back an invite nobody had
claimed was blocked by the rule that stops you removing the last
person who can get in. An unclaimed invite is not a person. It is a
sticky note.
- Collecting still needs nothing at all. Open the page, play, done.
None of the above ever comes near a booth.
Open the page. That is the setup.
- No key, no code, no nothing. Open CoSpin on any phone and it
collects. The booth key is gone, and with it the QR code, the paste
box and the twenty minutes in a Cloudflare dashboard. Two commits
after we built the nicest possible way to type a secret into a
tablet, we found the nicer one: don't.
- Name your game. There's a field on the setup screen — call
it "Sunday youth night" and every turn played carries that name into
the ledger. Four games in an evening are now four things instead of
one long Tuesday. Optional: an unnamed game still runs, it just goes
in the books as unnamed, like a racehorse nobody believed in.
- Two clocks per turn. When it was played and when it actually
reached us, which are the same thing right up until the wifi has an
opinion. The ledger shows the gap: "straight away" most of the time,
"3 hours later" when a booth spent the afternoon offline and the
tablet held on anyway.
- Where it came from. Each turn records the address it was
sent from, so two booths are tellable apart and a nonsense row has a
return label on it.
- The ledger sets its own password. First person to open it
picks one, and it lives in the booth's own database. No dashboard, no
redeploy, no secret that can't be read back. Do it the day it goes
up — until somebody chooses one, anybody can.
- Fixed: a stray null byte had been sitting in the ledger's
unlock check since it was written, quietly making it search for
nothing at all. It worked. It should not have.
Keys, and how to stop typing them
- Point a camera at it. The ledger now draws the setup link as
a QR code. Show it to a new tablet and it joins the booth — nothing
typed, nothing pasted, nobody reading a secret out loud across a
room. We wrote the encoder ourselves, which is either very impressive
or a cry for help. Reader, it was both.
- The code knows when to leave. It disappears after ninety
seconds and whenever you close the page. That code is the
key, and a key should not linger like the last guest at a wedding.
- “No key on this tablet” is now a button. It used to be a
complaint. Tap it, paste the key, done. Same row fixes a key that has
been rotated out from under a tablet — everything it was quietly
holding goes the second the new one lands.
- Send data. One row in Options that answers the only question
anyone has at the end of a day: can I close this now. It counts what
is waiting, says why the last try failed in words a human uses, and
retries on its own when the wifi wanders back.
- Nothing is lost to a dropped connection. Turns queue on the
tablet and go up when they can. The booth has already proved this
the hard way, which is not how we would have chosen to prove it.
The back of the booth
- The Booth Ledger. A page at
/ledger that shows
everything held about everybody who has played, and — the important
half — the way to get rid of it. Two presses to forget somebody. No
dialog box you can hammer through by muscle memory.
- Contact details now come with a clock. Ninety days, a line
on screen telling the guest so before they hand anything over, and a
job at 4:17 every morning that actually does the deleting. A promise
with a cron behind it is a promise.
- Phone numbers and emails get checked. Ten digits and an @
with something either side of it. We are not going to guess what you
meant by
jim@jim.
- Fixed: the party screen occasionally insisted it was Bob's
turn when it was very much Janice's. Bob has been asked to sit down.
Two modes, not three
- Questions mode has retired. It and Party were the same game
wearing different hats, and one of the hats was doing nothing. Party
kept the good bits. Nobody has noticed, which rather proves the
point.
- Everyone gets a face. The name-and-avatar step from the
booth now works in Party too, so the roster is people rather than a
list of strings.
- The room takes the colour of whoever is up. In every mode,
not just the booth. Checked against the contrast rules in all sixteen
colours, because a room you cannot read is just a mood.
The first one
- A wheel, some questions, and a room full of people who did not
know each other twenty minutes ago. That was the whole brief.
- One file, no server needed, works with the wifi off. Email it,
put it on a stick, open it on a plane.
This icon is a version
behind. iOS decides how the status bar behaves when the icon is made
and never revisits it, so this build cannot reach it — which is why the
clock is hard to read and the wheel stops short of the bottom. Press and
hold the CoSpin icon, remove it, then add it to the Home Screen again —
everything you have collected is kept.