Fifth Week Site Updates
We’re five weeks into our new adventure, this one with a different shape: just 39 shipped changes, a relatively small set of deliveries. That said, it wasn’t slow - it was instead a week where a lot of the effort went underneath the floorboards, a rebuild of how character sheets are stored, described, and rendered that isn’t visible yet but is the high-CR encounter standing between us and several of the sheet features you’ve asked for.
What is visible: 18 new character sheets, mainly a full set of playbooks for Blades in the Dark — and, behind them, a converter that builds a sheet template straight from a publisher’s PDF instead of by hand. You can now peek at a character’s sheet without leaving the topic. The forum index got about twenty times faster. A search privacy defect from the old site is closed. Games that have been silent for a year now archive themselves. And another three migration gaps got filled in.
Blades in the Dark and Mythic Bastionland Character Sheets
Eighteen new sheets went live — ten Blades in the Dark playbooks, seven BitD crew sheets, and a Mythic Bastionland sheet. They’re in the New Sheet dropdown now.
The sheets are the visible part. The part worth telling you about is that we don’t draw sheets by hand any more. We built a converter that reads a publisher’s own character sheet PDF and turns it into a working template: it measures where every box, checkbox, clock and write-in line actually sits on the page, and lays our controls over the publisher’s artwork at exactly those coordinates. Placing the fields on a sheet used to be a day of someone squinting at a picture and nudging boxes. It’s now a couple of minutes of machine time, and the machine doesn’t get bored on sheet number nine.
No coordinate is ever guessed. Every position comes from the PDF’s own geometry, and each finished template is then rendered in a real browser and screenshotted with every control outlined, so we can see that each marker lands on the box it’s supposed to. A sheet that’s four pixels out is worse than no sheet, and nothing short of an actual browser will tell you that.
“Nearly complete” is the honest description, and the gap is names. A PDF knows precisely where a control is; it very often has no idea what it is. That’s the week these sheets took rather than the day — a sheet’s field names are also its storage keys, so we took a lot of time to make sure the data model was correct before switching anything on. About 700 field ids were corrected. That work is where a human still earns their keep: spotting that a crew sheet prints its label to the left of the marker, that one playbook’s contact triangles are inverted relative to the other nine, or that a word printed on the page is prose rather than a label.
And that review compounds. Corrections are recorded against the sheet rather than patched into the output, so re-running the converter never loses them — the BitD set was rebuilt six times in one session with every fix intact. Better still, the ten playbooks share one publisher layout, so 58 corrections reviewed once on the Cutter carried across to the other nine. Reviewing the first sheet of a family is most of the work for the whole family.
Two things the converter couldn’t know, both caught on the way out:
Mythic Bastionland’s condition markers print as diamonds; we drew circles. A fillable PDF’s checkbox declares round-or-square and nothing finer, so the shape simply isn’t in the file. Corrected by hand.
A template fix stayed invisible for up to an hour to anyone who already had that sheet open, with no way to force it. Sheet template files were cached for an hour under a filename that never changes, so no deploy could dislodge what your browser already held. They now revalidate on every load. This one hit twice during the go-live, and it could not have reproduced on our development machines — it’s a difference in how the live site serves those files.
Attribution now ships with the sheets. Blades in the Dark is CC BY 3.0, and attribution is the single condition attached to that licence — we shipped 17 templates built on it before satisfying it, and that’s now fixed. Evil Hat publishes the exact sentence required, verbatim and at the same size as the rest of our copyright text, so it renders beneath every sheet using one of those templates, in full at /attributions, and the footer links there from inside the copyright line.
While we were in there: the Create/Clone sheet picker got a typeahead and a browse-or-search view, which matters rather more now that the list is 70 templates long than it did when it was 48.
None of this is Blades-specific — the converter doesn’t know or care which game it’s reading. What that changes is which problem is the hard one: how long a sheet takes to build is no longer what stands between you and a sheet for your system. Permission is — as The Groundwork Under the Sheets below gets into, every publisher we’ve asked so far licenses the rules text and withholds the artwork.
Peek at a Character’s Sheet From Their Post
Click a character’s name above their post and their sheet opens right there, read-only, organised into sections — Identity, abilities, skills, equipment — with the portrait at the top (for the sheets that support them so far; eventually, we’ll add it to all templates, tied to the character-game link). No new tab, no losing your place in the topic.
The old behaviour is deliberately intact. Ctrl-click (Cmd-click on a Mac, or middle-click) still opens the full sheet viewer in a new tab exactly as that link always did, and the pop-up’s own header carries an Open the sheet ↗ link if you want the real thing after all. A first attempt at this last week replaced the link outright and was reverted for exactly that reason: a working route to the sheet is not something to trade.
You only see what the sheet’s owner has made visible to you. A private sheet stays private, along with private fields.
This is also the first thing you can see of the sheet rebuild mentioned up top — that pop-up isn’t a picture of a sheet, it’s the sheet’s data, arranged by meaning. Which is why the next section exists.
The Groundwork Under the Sheets
Most of this week went here, and almost none of it is visible yet. The short version of why it’s worth a week:
Our latest “Anvil” sheets are, today, pictures with boxes drawn on top of them. That’s how they were built, it works, and it’s also why we can’t do most of what you ask for. A sheet whose structure is a set of coordinates can’t be shown on a phone, can’t be printed at a sensible density, can’t be searched, can’t be summarised in a postbit, and can’t exist at all for a game whose publisher licenses the rules text and withholds the artwork.
So: all 70 sheet templates now have a meaning overlay, a description of what each field is and which fields belong together, covering 6,514 blocks and 5,844 table rows, a grammar that did not exist on Monday. That’s the input the pop-up above reads, and it’s the input a mobile layout, a print layout and a per-game custom layout would all read. It also will give us the ability to hand you a more meaningful data picker when inserting sheet fields into your posts.
Two real bugs fell out of the review, both fixed:
Shadowrun 3e gave thirty radio buttons a single name. The Stun monitor, the Physical monitor and the vehicle damage track were all one control, so a character could mark exactly one box across all three, and marking one silently cleared the other two. 172 of 769 live Shadowrun 3e sheets had a value stored. The tracks are now separate, and the stored value has been moved to the Stun monitor — that placement is a judgement call, not a recovery, because a single stored value genuinely cannot say which of the thirty buttons set it.
The Witcher sheet was a proof of concept nobody had finished. Five fields for a four-page sheet, with pages 3 and 4 entirely empty. It’s been rebuilt from the source page images — 126 elements over 528 fields, every page covered, sections named from the sheet’s own printed headings — and is back in the dropdown. All six live Witcher sheets were empty, which is what made a clean rebuild possible instead of a migration.
Sheets Print Properly Now
Printing a sheet printed the whole website around it. The print stylesheet that was supposed to strip the site navigation, header and buttons was scoped to a part of the page it didn’t apply to, so half of it never ran. Fixed — a printed sheet is now the sheet.
We also corrected our own printing advice, which was wrong. The guide told you to print at 80% scale; Chrome fits a sheet to the page automatically at Actual size, and following our instructions made the result smaller than it needed to be.
The Forum Index Got Much Faster
The community forum list was taking 959ms to render. It now takes 43ms. Game forum lists went from 446ms to 5.5ms.
That one query was 37.6% of all database load on the site. It was reading every user and every topic in full, and spilling about 87MB to temporary disk to do it, on every load. This is the single largest thing we’ve fixed for general page speed since the cutover, and you should feel it on the forum index, on every game’s forum list, and indirectly everywhere else, because everything else was queuing behind it.
A Search Privacy Fix
Post search has, until this week, been able to tell you that a post matched your search term because of text inside a private block you weren’t a party to.
Some detail, because this is the kind of thing worth being precise about:
It was never a live defect. The code that strips private blocks before indexing has been correct for some time, and we verified that every one of the leaking posts is historical: new posts have never leaked.
What leaked was an association, not the text. Search snippets render from a separately stored copy that was clean, so a search could tell you “this post matches”, not what it said.
It survived a fix we’d already done. This was reported and fixed once before, for posts in one format, and the clean-up script written for it was scoped to that format — which turned out to be 5% of the archive. Every remaining leaker was in the other 95%. We missed this the first time because we only fixed HTML-formatted posts, not BBcode — the script was named, written and run for the original report, and it left 95% of the archive untouched because the defect had been described in terms of the format that introduced it rather than the formats that carried it.
The fix is that post search now reads from the re-indexed copy of the archive rather than the original — the copy that last week’s re-index built, correctly stripped, for all 17M posts. Which also closes out last week’s promise: that re-index is finished. The ~21% of posts that had never had their searchable text properly extracted have been.
Worth saying plainly: this change was not a speed improvement and we’re not going to claim it as one. Measured against each other, the old and new paths are a dead heat. It’s a privacy fix. Search speed is still being worked separately, and the number we’re tracking there is how often a search gives up, not how long one takes.
Games That Have Gone Quiet Now Archive Themselves
A game with no posts for a year is now archived automatically. Nothing else about it matters — not visibility, not member count, not how long it ran before it stopped. Only posts count, and every post resets the clock.
This exists because play-by-post games almost never end. They go quiet, the GM drifts away, and the game sits on every member’s active-games list forever — not alive, not finished, with nobody left holding the button. Of the 1,079 games the site currently calls stalled, 646 have had no post in a year, and 367 of those have been silent for over two. The oldest last post is from July 2014. Our “active games” figure was inflated by roughly 46%.
What happens is the ordinary archive, run on your behalf: the game is de-listed, pending applications are rejected, and every member is notified. Unarchive is one click when you want the game back live.
Three things it will not do:
It won’t touch a game that’s recruiting. A live advertisement means the game is looking for players, whatever its post history says.
It won’t archive the same game twice. Unarchive a game and it’s exempt from then on, indefinitely — unless it gets genuinely played again and then goes quiet for another full year.
It won’t archive a game that was never played. A game with no posts at all never started, which is a different thing from one that stopped.
The backlog is being slowly drained at one game per day, deliberately. There are ~649 games in it, so this runs for about 21 months. A game that’s been dormant for a decade may be archived long after this shipped; that pacing is on purpose, so the site’s health numbers stay readable rather than falling off a cliff on day one and so we don’t flood the membership with notifications.
If a year is too short for the way you run a game: post something. An OOC “still here, still planning” resets the clock, and it tells your players the same thing.
More Recovery From the Migration
Three more gaps from the old-site import, all from the same source: a re-run on May 15 that recovered 866 games missed by the original February import, created their games, forums, topics and posts — and then didn’t finish the job. All three were user-reported.
Membership (bug #1019). The re-run wrote no member rows at all. Those games were invisible in every player’s game list even though all their content was intact. Restored: 2,425 memberships across 688 games, plus 19 games that had no recorded owner. A residue of 40 members can’t be restored because those accounts never migrated.
Characters (bug #1022). The same re-run imported zero characters for all 866 games. The sheets themselves were never in danger — they exist, with their content, and always did; what was missing was the link between a sheet and the game it belongs to. Restored: 341 characters and 379 sheet links across 139 games.
Lost threads (bug #1021). Three games were short of content. Restored: 89 threads and 1,391 posts, reconciling exactly against the old site’s own reply counts. Attribution is partly gone, only 4 of the 15 authors still have accounts here, so 715 of those posts are attributed to the System user, the same fallback the original import used. That’s not ideal and it’s still better than the content staying lost.
Checking the other 863 games from that re-run: 679 match the old site exactly, and 184 genuinely had no threads. Should be at 100% import now, but we’re holding the final backup copy of the old site indefinitely, just to be sure.
Fixes
The Generators 404’d from the Resources menu. They moved to a standalone page last week and one of the two links pointing at them was still pointing into the app. Fixed.
An over-long sheet name returned a server error instead of telling you the name was too long. Now it tells you, on all five places a sheet can be named.
Behind the GM Screen
A worker hung up at 100% CPU for an hour on August 23, and nobody noticed — including us, for 25 minutes. The cause was an unbounded loop in the D&D 3.5e treasure generator: a rule that says “reroll and add two more” grew the loop’s own limit faster than the loop could consume it, and on medium and major shields it’s not even unlucky — it’s deterministic. About 1 in 1,200–2,000 generated treasure hoards would hang forever, and it’s been latent in that code for five months. User impact was zero (one 5xx error in the whole hour, response times flat, because the sibling worker absorbed the traffic) and the fix was restarting that one worker, which also cost zero errors. The loop is now bounded, and we verified the fix changes nothing else by comparing 59,950 generated hoards before and after: byte-identical. It’s worth being blunt about what this was, though: a remote-triggerable way to take a server down, not merely a hang.
The image rescue backfill finished its first pass (the one promised here last week). Every referenced off-site image outside of post bodies has been copied to our own storage. The big one — post bodies themselves, which is where 29% of hot-linked images have already rotted away — starts on August 30, once a measurement window closes. This will help us ensure we can always show you your content, no matter what happens on the rest of the internet.
Our activity instrumentation got its second readout, and found four defects in the measuring, none in what’s measured. Chief among them: one event type had never fired at all, because it was watching a route the site doesn’t use. We’re continuing to refine the metrics to make sure our new members get acquainted to the site while winnowing out malicious actors.
Every Site Update So Far
Site Updates — Feature Freeze & the Road to Cutover, June 26 to June 30
This announcement — Site Updates — August 23 to August 29
What’s Next
Go make a Blades character. Seventeen sheets and a week of naming review say they should behave; tell us if one doesn’t, and tell us before you’ve filled it in rather than after, because a field-name fix after your first save is a much bigger deal than it looks.
Click a character’s name on a post. That’s new, and it’s the first visible piece of a much larger sheet rebuild — what you think of how it groups things is genuinely useful to us right now, while the groupings are still cheap to change.
If you print your sheets, print one. The site chrome is gone, and if our page-fit advice is still wrong for your sheet we’d like to know which sheet.
Check whether a quiet game of yours is about to archive itself. A year with no posts does it, you’ll be notified, and Unarchive is one click — but if you’d rather it never happened, one post resets the clock.
Keep filing. Three of this week’s recoveries were user-reported, and all three turned out to be bigger than the report that found them.
Keep on weaving those myths!