Hearso changelog

What we shipped, and what we learned shipping it. When something broke we say why it broke and what we changed so it does not happen again. The references in brackets name the pull requests that shipped each change; our code is private, so they are there for tracing, not as links. No account details, credentials, internal endpoints, or operational secrets appear here, which is what privacy-safe means on this page.

36 releases, newest first.

v1.0.0-beta.18

Nothing new to play with this time: we tightened the checks every change passes before it reaches you.

  • Nothing you can see is meant to change. This release is all behind the scenes. We changed no page, button, score or message on purpose, so there's nothing for you to do or relearn. If something does look different, that's a mistake of ours and we'd like to hear about it. (web #717, #718)
  • Stricter checks on our own code. Our code now has to say which fields it reads before it reads them, has to check that an item in a list is really there before using it, and can no longer hand over an empty value where it meant to hand over nothing. Our tests have to follow stricter rules about how they look things up on a page. Meeting those rules meant touching about eight hundred files without meaning to change what any of them does. The new rules did not catch everything: while rewriting tests we weakened seventeen checks ourselves, the rules passed them, and a review caught them. We put them back. (web #670, #694, #697, #702, #714, #724, #725, #726, #727)
  • What's still open. A list of about 127 rewritten test lookups still needs a person to read through it. And saying which fields our code reads is not the same as checking them: the checks we write by hand are what they were. We'd rather say so than call the job finished. (web #670, #703, #714)

v1.0.0-beta.17

Teams become squads, every name wears its type, and a badge you earn gets stamped on the spot.

  • Teams are squads now. Every page, button and email says squad and squadmate, so “team” can keep meaning the people you work with and “squad” the group you play with. Old team links still work. (web #657)
  • Names have no spaces. Display names can't contain spaces any more. So every name reads as one gamer tag, the same on the board, in rooms and beside your type. Every existing name, guests' included, was joined with its letters kept as written: “Rubber Duck Ray” is now “RubberDuckRay”, so nobody loses their name or needs to do anything. Squad names were joined the same way, so your squad's name may have changed (“Hearso Squad” is now “HearsoSquad”), but you're still in it and nobody has to do anything. A new name with any kind of space is refused, and the name field says so as you type. Your World board name catches up with your next game. (web #662, #661)
  • Your squad on the World board, if you want it. The World board shows the squad each best score was played as. It says Secret Squad until you switch on “Show my squad's name on boards” in Settings › Preferences, because the board used to promise it never showed your squad, and showing it should be your choice. The switch updates all your past rows, and a squad you've left shows nothing. (web #657)
  • A totem and a card for every type. Each of the twelve developer types has its own creature, drawn for Hearso (the Assassin is a cat, the Sage a koi from our pond), and a full card with its skills and best squadmate. The totems replace the old busts, so a type looks the same everywhere it shows. You pick your type from a deck of the cards, and anyone can browse them on the new Developer types page. (web #657)
  • Names wear their type, and the top ten wear a badge. One tag now draws a player everywhere, with their type's totem, so you look the same in a room as on a board. The all-time World board's top ten wear a crown, medal or globe beside it on every one of those, with the rank printed. Guests stay plain. (web #657)
  • Badges you can see, stamped as you earn them. All twenty-three achievements have their own badge, drawn like the type totems so the two read as one family. One you earn is stamped onto your results in a space kept for it, so it never covers the standings or buttons. The Achievements page now shows all twenty-three, with the twenty that can't be earned yet plainly locked, and marks what's new since your last visit. (web #657)
  • Home, rearranged. Host and Join now sit inside today's round card, next to the round they start, and stay there even when it can't load. Home ends on the all-time World board's top thirty. The trivia page and the leaderboard show the same thirty, because each used to read the board its own way and two pages listed different players. (web #644, #649)
  • The top bar stays put. It stays on screen as you scroll, so you can get to any other page without scrolling back up, and in-page links land just below it. Its one cost: on the trivia page the World list shows about two fewer rows before it scrolls, so the standings still fit a laptop screen under the bar. (web #656)
  • A correction to beta.16: trivia scrolling. We said a trivia swipe lands a whole section and never locks you in place. On a trackpad, 9 of 12 swipes in our test stopped mid-section, and the next swipes could be ignored for up to 2.5 seconds. Now all 12 land one section on, and the next is never held. (web #656)
  • Room names and topics in full. The open rooms board prints every topic, and room names up to 28 characters, over two lines. We measured one wider line first: it only fit with the board's letters shrunk below a readable size. Korean and Japanese names stay whole. (web #656)
  • Your seat stays yours. Signed in and lost your join on a bad connection? Trying again gives back your seat. Left a lobby? Rejoin from any device you're signed in on, until the game starts, because your account proves the seat. Guests still need the browser they joined with: for a guest, it's the only proof. (web #657)
  • Results list only who played. Leaving the lobby before the start no longer puts you in the results or on the boards with 0 points, or spends a guest game. A player who left after the start without answering is left out too, because nothing yet tells the two apart. Realtime rooms follow with that service's next update. (web #657)
  • Each player stays signed in as themselves. If two players' sessions renewed at the same moment, the second could be signed in as the first, with their profile and scores. Now each renewal runs on its own: in our test, 16 of 24 crossed over before and none after. We found it ourselves, in our own testing, and we have no reports of it affecting a player. It went out on its own, before this release. (web #650)
  • Fixed on the way. Our reviews caught these before release. “(you)” beside your name was unreadable on the daily podium's winner card (dark on teal, 1.63:1) and now meets contrast. Pressing Leave right after joining could be undone by the room seating you again. The rooms board cut ordinary names short and left stray emoji tiles, and screen readers lost a room's topic and seat count on phones. And the page could scroll behind an open dialog. (web #656, #657)

v1.0.0-beta.16

Trivia gets a home of its own, on a pond you can feed, with a world board that shows who moved.

  • A new trivia page. Trivia opens on its own page: start or join a room, browse the open rooms, and see the boards, one section at a time. Scroll freely; a swipe lands a whole section, and it never locks you in place. (web #601)
  • A pond under every game. Koi swim under the page and you can feed them. Pick any of six skies, rain included, from Your pond, or leave it on Auto to follow your theme. A Pause motion control stops it all, and with reduced motion switched on it stays still from the start. (web #601)
  • Your pond keeps a log. Your pond keeps one line a day of what you fed and broke. If you played as a guest this month, signing up carries that month into your account, once. (web #601)
  • A world board for every game. Each player's best score in a game, with their character type, a flag for their country, this week's points and, once a week has been recorded, how far they moved since last Monday. (web #601, leaderboard #111)
  • Home has everything Live had. The room about to start sits on top as Last call, and the open lobbies read like a departures board, each game with its own marker. Live moves onto the pond. (web #601)
  • Only accounts host. Guests still join and play any room, but opening one needs an account, and when a host leaves, the seat passes to the next account in the room. A room with only guests left closes when its lobby timer ends. Answers now reveal after 5 seconds unless the host picks longer. (web #601, rt #28)
  • Erased means erased, in last week's board too. The weekly record behind the movement arrows is scrubbed when you delete your account or switch off world play, even if the week was being recorded at that very moment. (leaderboard #111)
  • Made a team, then lost the connection? The form now says your team is ready and offers Finish setup, instead of inviting you to create it a second time. (web #600)
  • Easier to read and to reach. Words over moving water sit on a calm panel, room notices keep their contrast over any background, and the open rooms table reads correctly to a screen reader on a phone. (web #592, #601)

v1.0.0-beta.15

Your name, your room and your face the way you set them, and analytics only after you say yes.

  • The bell and the inbox agree. The bell counts exactly what your inbox lists. A new teammate's inbox starts on the day they joined, not with two weeks of old rounds marked unread. (web #550)
  • Your name, whenever you like. Change your display name in Settings any time. Profiles now ask for a first name, last name and country (phone optional). Your names and phone stay private: never shown to your team or on a board, never sent to analytics. Your country shows as a flag on boards. (web #551, leaderboard #105)
  • One face, photos for teammates only. Your avatar looks the same everywhere. Remove any photo and your initials take its place. Only teammates see a photo; the world board shows a character type or initials. (web #553)
  • Named rooms, and lobbies that close themselves. Starting a session asks for a room name and a 10, 20 or 30-minute lobby timer. If the game hasn't started in time, the room cancels and everyone waiting sees why. The lobby is redesigned: the room's name first, a seat per player, and Start on screen without scrolling on a laptop. (web #554)
  • Emotes and a live room list, shipped. Lobby emotes carry the sender's name and show on every screen in the room, not only your own. The Live page has a live list of open rooms. Both switched on for everyone on 1 October, once our realtime service update was live. (web #554, #558, rt #25)
  • New type, game marks and logo. Headings, labels and scores have typefaces of their own, every game has a two-colour mark, and Split Ice, a block of ice cracked in two, is our new logo. (web #555, #556)
  • A new footer and six legal pages. The footer links Cookie Settings, Privacy, Website Terms, Disclaimer, Platform Terms and Accessibility. They're drafts that say only what we can back up. (web #556)
  • An accessibility sweep. We loaded 40 pages at 136 screen sizes and fixed what ran off the screen or couldn't be reached by keyboard. (web #556, #559)
  • Clearer leaderboard controls. World or Team is a two-way switch, the periods are light tabs, and the game is a label, not a button that did nothing. (web #559)
  • Guests keep their scores. A guest keeps one nickname and id per browser, and nobody else can play under it (before, anyone could copy a guest's id; we found this ourselves). Sign in in that browser and your guest scores move to your account. (web #562, leaderboard #106)
  • Analytics only after you say yes. Our analytics tool starts only after you agree, and never receives your first name, last name, email or phone. We're asking everyone again; a no you gave before still stands. (web #561)
  • A correction to our privacy page. It said nothing was sent before you agreed. In fact the analytics tool loaded its settings on every page under an anonymous id. It doesn't any more. (web #561)

v1.0.0-beta.14

A status page that shows what's really happening, and our write-ups retold with the numbers first.

  • A status page that tells you when something's wrong. status.hearso.com now shows each service's last 90 days as a row of bars. Point at a day to see when a service was down, for how long, and any incident notes. While the page is open it checks again every 30 seconds. On 29 September we stopped a service on purpose: the page showed it within a minute and went back to green within a minute of it returning. The same test caught the page saying everything was fine while its own monitor was down. Now it says it can't tell instead. (web #532, #535)
  • Our blog, changelog and roadmap, rewritten. Every engineering post now opens with what we expected, what happened and the numbers. We checked each one against its sources and corrected, with dates, the claims that didn't hold up. One of them: some failed test scores in August came from a server limit, not the cause we first gave. The roadmap now says plainly what's live and what we're still building. (web #533, leaderboard #102)
  • Groundwork for faster live games. Behind the scenes we added a switch that can move new games onto our faster realtime service a little at a time. It only moves them while that service reports itself healthy, and it can always be turned back. Nothing changes for your games yet. (web #530, #531, #534, rt #22)

v1.0.0-beta.13

Rooms stick to your topic, and a slow sign-in no longer turns you into a guest.

  • Your topic, and only your topic. A room on one topic now asks only that topic's questions. Before, a host who picked Science or Music could still be dealt questions from every topic. A topic without enough questions for a full game shows greyed out in the picker, and we never top it up from other topics. (web #521)
  • No more quiet guest seats. If you're signed in and your profile is slow to load, creating or joining a room now asks you to try again. Before, it quietly gave you a guest seat that wasn't linked to your account. In a test on 28 September, 25 signed-in hosts created rooms at the same moment, and every first attempt came out as a guest room. (web #525)
  • A sign-in outage doesn't sign you out. If we can't check your sign-in for a moment, you stay signed in and we ask you to try again shortly. A room never seats you as a guest because of it. (web #526)

v1.0.0-beta.12

The leaderboard holds up when everyone opens it at once, and scores stop going missing in a crowd.

  • The board loads for everyone after a reveal. When a whole group opens the leaderboard at the same moment, it now loads for everyone instead of telling some of you “Could not load this right now”. A board can be up to five seconds old, except for your own game: when your room finishes, its scores show at once. The load test we built for this moment also showed that the leaderboard's own limit on reads was the first thing to give, so we raised it from 10 to 50. (web #515, #518, leaderboard #95)
  • Scores no longer go missing when many games finish together. In a test on 27 September, 100 players finished within about a second and 8 of their scores never reached the board: those players saw their results, but their score was missing. A score the leaderboard turns down for a moment is now sent again, and it's never counted twice. When we repeated the test on our test environment, all 100 scores landed. (web #519, leaderboard #97)
  • Back works on the Writing page. Going Back from a post you'd scrolled no longer leaves the list half drawn and stuck until you reload. Rows now draw in as they come into view, and the header drifts away as you scroll. With reduced motion on, nothing moves. (web #517)
  • The contents follow you down a post. On longer posts, once you scroll past the “On this page” list, it becomes a round Contents button in the bottom-left corner. It opens the list, marks the section you're reading, and takes you to any heading. (web #516)
  • A new engineering post about the checks we use to catch the mistakes our tests can't see. (web #522)

v1.0.0-beta.11

The world board is one tap away, and phones and tablets get a single menu button.

  • The world board is easier to reach. Every Full board link now opens it, and it sits at the bottom of the Library for everyone, signed in or not. If you're on a team, a World / Team switch at the top moves between the two in the same layout, and old links to your team's board still work. The boards are narrower, and the world table has column headings. (web #510)
  • One Menu button on phones and tablets. It sits at the top centre and opens a menu that covers almost the whole screen; the same button, Escape, choosing a page or tapping outside closes it. With reduced motion on, it fades instead of moving. The bottom tab bar, which could drift away from the bottom of the screen, is gone, and keyboard focus is no longer lost when the screen widens with the menu open. (web #511, #512)
  • /board always reaches the leaderboard. The old in-browser board page is gone. On the live site /board already went to the leaderboard, so nothing you see changes. (web #506)
  • Security: board reads can carry their own key. Our server can now send a separate key when it reads a board, and the address of our leaderboard service is no longer built into the pages we send to your browser. That address was never a secret, and the boards it served are public; now only our server uses it. Nothing you see changes. (web #506, leaderboard #90)

v1.0.0-beta.10

Two security fixes on our server. Nothing you see changes, and that's the point.

  • Security: your player id and country are out of our server logs. When our leaderboard service turned down a finished game's score, our server logs recorded the player id, and sometimes the country the player had picked, which the service repeated back. Those logs aren't public; our hosting provider keeps them for us. They no longer record either, and a database error is cut short before it can repeat what it was sent. Names and email addresses were never logged. We found this ourselves. (web #501)
  • Scores refuse to leave without their key. Before, a server that hadn't been given the key still sent scores, and the leaderboard accepted them. Now a score without its key isn't sent at all. Nothing changes for you: the live site has the key. (web #502)
  • More to read. A new engineering post benchmarks our real-time rooms against a remote database, and two earlier posts gained dated update notes. (web #499, #500, #502)

v1.0.0-beta.9

Teams get a feed and a weekend, and games get sound.

  • A correction to what we told you in beta.6. We said weekend games count for no week board and Friday's reveal crowns the week. Neither is true now: a team's week runs Monday to Sunday and is crowned when Sunday ends. Teams also get a Day board, which the leaderboard button after a game now opens. Month and All time on a team board are still to come. (web #484, #485)
  • The Team page has a feed. Anyone on the team can post short text and react with five emoji; links stay plain text, and posts are deleted after 90 days. Member rows show each person's most played game, join date and last activity, which you can hide in Preferences. Two teams can no longer share a name, whatever the capitals or spacing. (web #469, #483)
  • Invites keep their history. Settings lists the invites you've received and sent, and you can decline one; after a decline, that address can't be invited to the team again for thirty days. An email invite now works only for its own address, where before anyone holding its code could use it. An expired invite says so, and a resent one works. Your inbox now tells you about new achievements and teammates, with pop-ups you can turn off. (web #474, #481)
  • Games have sound. Cues for the big moments and quiet music during questions and reveals, with Game sounds and Music switches in Preferences and in the room. Confetti now greets everyone on the results screen. (web #473, #493)
  • Share a game's results. Share makes a link to a page with the podium: anyone with the link sees the players' names and scores for 90 days, as the privacy page now says. Links to results, rooms and invites show a preview card. On an iPhone sharing takes two taps, and we haven't tried it on a real one yet. (web #477)
  • Fixes in the room. The question card no longer shifts at the reveal, and on a phone the answers no longer squeeze or scroll sideways (the smallest screens still scroll a little). The top bar no longer says 0 players at the reveal or slides under the Room button. A join that hasn't answered in ten seconds lets you try again, and a failed join no longer says the room doesn't exist. (web #473, #479, #491)
  • Other fixes. Team settings follow a team switch and keep a change you undid, and switching straight back to your old team works. Pages no longer flash dark, long titles fit, the colour choice no longer widens the page, and a round's table lines up. The status page no longer waits on your sign-in, and screen readers find the footer. Plus four new engineering posts. (web #468, #472, #484, #486, #487, #493, #494)
  • Masked recordings, only if you agree. If you agree to analytics, we now also record masked sessions and click heatmaps: every word is hidden, answer choices and photos are left out, and recordings are deleted after 30 days. Because we're asking for more, anyone who said yes before is asked again; a no stays a no. (web #478)
  • Security: changes must come from the app. A page on one of our other addresses, such as the status or news site, could have used your session to make a change, from joining a room to deleting your account. We found this ourselves. We haven't looked for signs anyone used it, so we can't say either way. A failure in a room now shows a plain sentence, not our database's error text. (web #490)

v1.0.0-beta.8

Hearso moves to its own addresses, and your saved links still work.

  • Hearso has its own addresses. The game and your account live at app.hearso.com, the status of every service at status.hearso.com, and our writing at news.hearso.com, while www.hearso.com keeps the pages that describe Hearso. Every address you've saved still works: it takes you to the new one in a single step. (web #448, #465)
  • Sign in once more. Your sign-in now belongs to app.hearso.com, so you'll be asked to sign in again the first time you visit. That's the only time. (web #465)
  • Emailed sign-in links work again. On the first day of the move, signing in with an emailed link failed with a message saying the link had expired. The link was opening on the wrong address, where the page that finishes signing in couldn't see it. An emailed link now always finishes on the address that can use it. Signing in with Google was never affected. (web #467)

v1.0.0-beta.7

A front page that shows the game, and a status page with a memory.

  • The front page shows the game. A phone under the headline plays a whole round on a loop: the lobby filling up, three real questions from the question bank, the results and the board. If somebody has sent you a room code, there's a field right there to use it, and you don't need an account to get in. (web #461)
  • Status keeps a history. /health-status still shows what it did before, and now also keeps a history of incidents, a record of uptime, a page for each incident, and a feed you can follow in any feed reader. There have been no incidents to list yet, and the page says exactly that. (web #461)
  • Our writing lives here now. Engineering posts are full articles, each with a list of its sections at the top, and the documentation at /docs is a page of Hearso with drawn diagrams instead of a separate file. (web #461)
  • Small things you'll notice. Small labels are set in a serif. Pages you read scroll smoothly, screens you play on don't, and nothing moves if your device asks for reduced motion. If you've never picked a theme, you now start in light mode; a choice you already made is kept. How to play in the trivia lobby is a numbered list, and the end of a round throws a little confetti, once. (web #461)
  • Four pages are gone. /break-room, /tools, /compare and /the-case. The argument that lived at /the-case now opens /case-studies, and old links to /solutions and /the-case take you there. Nothing in this release changes how a round is played or scored. (web #461)

v1.0.0-beta.6

Late-night rounds count for the right day, and our nightly tests stop reporting success they hadn't earned.

  • Late-night rounds count for the day you see. If you finished a live round after midnight where your team is, but before your team's daily drop, your points reached the week board while the “today” column still read zero. The round was filed under the calendar date, and the board counts a day from one daily drop to the next. They agree now: a live round counts for the day the board is showing you. (web #458)
  • Weekend rounds stayed off the week board, on purpose. Friday's reveal crowned the week, and a Saturday game that quietly changed who had won it seemed worse than one the board never showed. Your profile still counted it. We changed this in beta.9: a team's week now runs to Sunday. (web #458)
  • Our nightly tests had a blind spot. For eleven nights our nightly test run skipped every signed-in test, and on six of them it reported success, because it couldn't tell “I wasn't allowed to look” from “there was nothing there”. It now says which one it means, and fails loudly when it can't tell. Nothing you do was affected, but the day fix above, and a fix to the accounts we test with, had been sitting where no test could find them. (web #456, #458)

v1.0.0-beta.5

Two big changes built and switched off, a public status page, and guest scores on the weekly board.

  • Built, tested and switched off. Rooms that run over a live connection to a separate real-time service, instead of your browser asking for the state every second and a half, and a split of the site across two addresses. Every room you play behaves exactly as it did yesterday, and every link you've saved still answers. (web #436, #448, rt #2)
  • A status page. At /health-status, linked from the footer everywhere except the screens you play on, where a way out of the page is a way to lose a round by accident. It lists the checks we run, what each one says, how much of the last day it has been up, and when it last reported. It's our own page, so your browser never talks to the monitoring tool. A check we haven't heard from in ten minutes reads as unknown instead of staying green, and until monitoring is connected the page says status isn't available yet. (web #447)
  • Guest scores reach the weekly board. They still never reach the all-time board, and that's deliberate: we keep nothing permanent for a guest, and all-time is the only board whose rows never expire. The all-time tab now says so. (web #434)
  • A rematch no longer loses its place on the board. Every score is sent with a key so a retry can never post twice, and the key named the room and the player but not the game. A rematch keeps the room and the players, so its score arrived under the first game's key and was turned away as a duplicate. The key names the game now. We found this by reading the code, not from a report, so we can't tell you how many rematches it cost. (web #435)
  • Feedback reaches us now. Messages from the feedback form went to an address we send mail from but have never received mail on, so each one looked sent and had nowhere to arrive. Where feedback goes is now a setting, and if it's missing, the form is refused and retried instead of quietly dropped. (web #447)
  • The message box points somewhere real. When it couldn't help you (a guest, or anyone who had sent too many in a minute), it named an address that can't receive mail yet either. It now links to the Contact page, which needs no account and goes somewhere we read. (web #447)

v1.0.0-beta.4

The colour picker works from the keyboard, and leaving a room means you've left.

  • The colour swatches answer the arrow keys. They told screen readers they were a set of radio buttons, which promises that arrows move between the choices and that the set is one Tab stop, and did neither: choosing a colour without a mouse meant pressing Tab ten times. One arrow now moves the selection and the outline together, either direction wraps, and the set is a single stop that starts on the family you already use. (web #429)
  • No needless saves. Picking the colour family you already use no longer saves it to your profile again. (web #429)
  • Walking back into a room you just left is refused properly. The room page rejoins every time it opens, and if you pressed Leave between it asking and it answering, you could be shown a room you were no longer in. Your scores were never involved, and the clean-up of abandoned rooms was never affected: what was wrong was the answer you were given. (web #428)

v1.0.0-beta.3

Nine colour families, a light mode you can actually see, and rooms that end when everyone leaves.

  • Nine colour families. In Settings → Preferences. They sit on top of the theme you picked instead of replacing it, so nine families and two themes give you eighteen combinations. Only the accent changes; the page colour, the text and the lines stay where they were. (web #422)
  • We measured before we built. We measured all thirty-six colours first, and it mattered. Six of the nine families have no pair of colours that can carry readable body text, so they could never be full themes, and only four accent colours work on both dark and light. Three families had nothing visible on light paper, so their light accent is a darker version of the family's own most distinctive colour. (web #422)
  • Light mode's accent is a deep teal. The brand lime measured 1.07 to 1 against the light page, where the guideline asks for at least 3, and the same colour draws the keyboard focus outline, so on light that outline was effectively missing. Our contrast checks had passed the whole time because they measured the text on the button, never the button against the page. They measure both now, across all eighteen combinations. (web #421)
  • Six pages got their footer back. /contact, /changelog, /roadmap, /privacy, /terms and /review lost it when they moved onto the new design, and the accessibility scan over those exact pages stayed green, because it has no opinion about footers. The check is now one rule for the whole set. (web #421)
  • Rooms everybody has left now end. A room nobody is in is cleared about a quarter of an hour after the last person stops being seen, instead of the next day. Before, you could be sent back into a room you'd just left, which then said it had already started. Two earlier attempts were rejected in review, and a third reached production and did nothing: it looked for rooms everyone had pressed Leave in, and people leave by closing the tab. It now asks whether anyone has been seen recently. (web #421, #422, #425)
  • The open-rooms list reads like a list of rooms. The code comes first and largest, a badge marks a room that's nearly full, and a meter sits beside the seats taken: “3 in the lobby” became “3 of 12 in the lobby”, because one number on its own can't be compared with anything. (web #422)
  • Our own tab icon. It had been the tooling's default since the very first commit, and nobody noticed because nothing pointed at it. (web #422)

v1.0.0-beta.2

The page for wrong addresses stops talking to the wrong people.

  • A wrong address no longer says your room closed. That page catches typos and old bookmarks, and almost nobody who reaches it was in a room: a dead room link is answered inside the room itself. We'd written the words for one kind of visitor and shown them to everybody. (web #414)
  • “Enter a room code” goes where the field is. On that page it now reaches the page with the code field, not the one that describes the game. The page that needed it most had quietly worked around the problem, so the one place still broken was the one nobody checked. We now check the rule for every page in the set. (web #414)
  • A correction to the beta.1 notes. They were missing eight entries when it shipped, including the leaderboard fix that release existed for: two changes landed after our release process gathered the notes and before the release went out. They're in the record now, and the release check looks for stragglers instead of assuming there are none. (web #414)

v1.0.0-beta.1

The new Hearso: a redrawn site and game, with sign-in, teams and the daily round.

  • This is the new Hearso. The site and the trivia game are redrawn: a front door that shows the product, sixteen new pages behind it, navigation on a phone, and a game with one look from the screen you open it on to the scores at the end. Signing in, your home page, teams and the daily round arrive with it. (web #374, #385, #397, #398, #399, #405)
  • Achievements are real, and they're kept. Three can be earned: your first game, your first win, and someone you invited joining your team. Each is written down the day it happens, so a deleted team or a retired question can't take back what you've been shown. (web #403)
  • Light mode works. Choose Dark, Light or System in Preferences; System follows your device. (web #398)
  • Friendlier dead ends. A mistyped or out-of-date link reaches a page that says so and offers a way back, instead of a bare browser error. A link to a room that has since been cleaned up says so, where it used to sit on a spinner. (web #374, #404)
  • Points you win reach every leaderboard. A room opened from a code belonged to no team, and a round with no team was dated by a clock in London, so a game finished on a Friday evening in Chicago was filed as Saturday, outside the working week the week board counts. The points were never lost, only filed where no board looked. Both are fixed, and past rounds were put back where they belong. (web #411)
  • Our board test had been passing throughout. It opened the leaderboard and accepted either rows or “Nothing on the board yet this week.”, the exact sentence people were complaining about. It now plays a real round first and insists the points appear. (web #411)
  • Link previews. Paste a Hearso link into a chat and you get a proper card. Every page used to unfurl as a bare title beside a blank rectangle. (web #403)
  • A correction to this page. v0.1.0 and v0.2.0 had been missing since it was written. It promises every version shows up here, and now that's true. (web #374)

v0.17.0

Nothing you use changes yet. Behind the scenes, Hearso learns to write to you.

  • Built, behind a switch. An Inbox that gathers notes, announcements and the things the calendar implies; a support message box, reachable from anywhere, that goes by email rather than into a ticket queue; and account photos you can upload, crop and remove. The pages you use today and the trivia game are unchanged. (web #336, #340, #341, #344, #346)
  • One rule for every avatar. Fourteen places drew an avatar, thirteen with hand-written copies of the same code and one with none. All were right only by accident: a Google account stores a link and an upload stores a file path, so the first upload would have broken every one of them. One function draws them all now. (web #334)
  • Security: photos only for teammates. Serving a photo first needed only a sign-in, and one deployment serves every customer, so any signed-in account could have fetched any player's photo. It now applies the shared-team rule we use elsewhere, and every refusal is the same “not found” an account with no photo gets, so it can't reveal which accounts exist. We found and fixed this before the release went out, so it never reached the live site. (web #351)
  • One nudge a day, held by the database. Two teammates tapping in the same second would both read “not nudged yet”, so checking first causes the very duplicate it's meant to prevent. A uniqueness rule in the database now holds it to one nudge per person per day. (web #347)

v0.16.0

Dark mode becomes readable, and teams get safer behind the scenes.

  • Dark mode is readable where it was worst. The accent on headings, active links and small labels measured 2.6 to 3.0 against the 4.5 a page should meet. It's now set per theme and checked against each of the five dark backgrounds it appears on. (web #325)
  • One thing we found and didn't finish. Some muted footer text on the older pages measured 1.04 in dark, which is effectively invisible. We wrote it down instead of quietly leaving it, and fixed it in v1.0.0-beta.1. (web #325, #385)
  • Handing over a team can't happen twice. A transfer writes the new owner first, and only if you still own the team, so two transfers racing from separate tabs can't both succeed. Permission checks ride on the change they allow, so “an admin cannot remove an admin” is enforced by the removal itself. (web #307)
  • A blank setting isn't a missing one. The sender address for team invite emails was read as “the preferred one, or else the fallback”, but our setup template ships the preferred one present and empty, so the fallback never ran and invite emails were off. No player could have met it: team invites weren't switched on yet. All four places with that pattern now read through one helper. (web #315)
  • We wrote up our most common mistake. It's a check whose empty or failed result looks the same as success, with the eight shipped cases that taught it. A rank we can't work out now shows a dash that says why, not #0. (web #316, #320)

v0.15.0

Home, the Library, Live and your profile are built and waiting behind a switch.

  • Built, not yet switched on. Signed-in players get a home page with the day's round, a Library of every game, a Live tab for joining by code, and a profile that keeps their record. (web #264, #297)
  • Longer room codes. Room codes are eight characters shown with a dash, like 7K2Q-M4XD; you never type the dash, and existing codes keep working. Spoken team invite codes use a separate set of characters, so the two can never be mistaken for each other. (web #287)
  • Caught in review: a recycled room code. Finishing a daily round found your claim by room code alone, but codes are reused and rooms are cleared within a day, so the chance of landing on a stranger's old claim grew with every claim ever written. It would have credited another team and used up your one try. It never shipped. (web #256)
  • Profile numbers are counted, not sampled. Your four profile numbers were described as all-time but worked out from a capped page of rows. Three are now counted by the database, because a count can't be cut short. The same review found capped reads in four places, including joke ratings that would have stopped counting at a thousand. (web #248, #253, #259)

v0.14.0

The leaderboard says how many are playing, and sign-up and teams wait behind a switch.

  • How many players are on the board. The office leaderboard shows it under the period tabs (“Top 25 of 1,204 players”) whenever the count is known. (web #213, leaderboard #73)
  • Sign-up, sign-in, onboarding and teams are built and switched off. Showing a page never renews your sign-in behind your back: an expired session costs one explicit step that renews it, and a dead one ends at sign-in with its cookies cleared. (web #225, #233)
  • Code that ships before its database. These features were written to run before their database changes land, because code deploys first. Until then, reads answer “not set up yet” and writes refuse instead of pretending to succeed. The cost is a short window where they're unavailable; the alternative was a deploy that locks every existing account out. (web #222, #227, #229)
  • Doing it twice does it once. Creating a team twice inside a minute makes one team, and finishing onboarding twice leaves one record. (web #229)

v0.13.0

Over two thousand new questions, so repeats get rare.

  • Over two thousand reviewed questions across twelve topics, up from fifty. The original fifty were retired rather than deleted, so a game already running at deploy still finished every question it had dealt. (web #201, #203)
  • Fewer repeats. You'll see a repeat far less often, and a room draws from the same fresh bank for everyone in it. (web #203)
  • Each environment keeps its own bank. The generated bank here, and the fifty known-answer questions everywhere we test, so automated play-throughs can check real scoring against a deck they can predict. (web #201)

v0.12.0

Our phone tests start testing phones, and a long question stops moving the card.

  • Our phone tests weren't on phones. Three browser tests built their own windows in a way that dropped the device being emulated, so the phone and reduced-motion runs had been running as ordinary desktop windows: green results that proved nothing. Fixing it turned the phone run red on the first real defect it could finally see. (web #185)
  • A long question no longer grows the card. One wrapped to a fourth line mid-game. The card and each choice now reserve the space the longest allowed text needs at phone width, and question and choice length are capped when the bank loads, when it syncs and in its own test. (web #185)
  • Safer database changes. A check now fails a change that would apply out of order, asks for a written reason before anything destructive, and requires every new table to arrive with its access rules. (web #186)

v0.11.0

The game runs itself, so no room waits on a button.

  • No more waiting on the host. A question reveals when its answer window closes, or as soon as everyone still in the room has answered if the room chose that, and a reveal ends after the room's set length. The host's advance button is no longer a gate. (web #178)
  • Room settings follow the game. Settings live on the room and are checked against the game's phase, not only against who's asking: nothing changes after a game has finished, a reveal-length change during a reveal applies from the next one, and skip permission can only be set in the lobby. (web #176)
  • Reloading mid-game works. It used to be refused with “game already started”, because the page rejoins every time it loads. Rejoining now succeeds for someone who already holds that seat, while a newcomer or a departed player gets the same refusal, so the error reveals nothing about who's in the room. (web #179)

v0.10.0

Fresh questions every game, and a name that stays yours.

  • Fresh questions across games. We don't keep a history of what you've seen. Each player holds a private shuffle plus a position, four numbers in total, and a room draws what the fewest of its players have seen. (web #126)
  • Questions got permanent IDs. Rooms stored their decks as positions in the question file, so adding or removing one question would have quietly pointed every running game at different questions. Questions now carry permanent IDs and a retired flag, matching the old positions, so no running game was disturbed. (web #125)
  • Each game has its own page. Search engines can find it, and the app is one step further in. (web #122)
  • Display names are set once. You choose yours at sign-up, and the server holds it as well as the form, because the leaderboard records the name a score was earned under, and that only holds if the name can't change later. (web #124)

v0.9.0

Run it back: rematches with fresh questions, and colours we can actually measure.

  • Rematches get fresh questions. A rematch draws from the bank minus the deck just played. With fifty questions and ten a game, a blind redraw repeated about two each time: roughly a nine-in-ten chance of at least one repeat. (web #97)
  • Our accessibility scan was hiding its doubts. It dropped the “can't tell” verdict, so twenty parts of the landing page, the whole hero, were neither passing nor failing, and a green run looked like a clean page. We rebuilt the hero on flat, solid colour so it's measured for real. (web #106, #109)
  • Two colour traps. Transparency compounds down the page, so 70% inside a section already at 80% renders at 56%. And one colour can fail in light and dark at once, which means no single replacement fixes it. (web #109)
  • Every game starts on a clean board. Starting any game zeroes the scoreboard in the same step, instead of leaving a rematch to start and reset in two steps that a failure could split. (web #97)

v0.8.0

The results screen stops throwing you out, and signed-in accounts lose a permission they never needed.

  • Security: a signed-in account could have emptied every room. Signed-in accounts still held full permissions on the data behind rooms, on the reasoning that our access rules made that harmless. Those rules cover reading, adding, changing and deleting rows, but not emptying the data outright, so one statement from any signed-in account could have ended every live game. Our own code review found it, and we've removed the permission. We don't know whether anyone used it. (web #87)
  • Both ways out of a room follow one rule. Leaving on purpose only checked whether someone had formally left, so a host could hand the room to somebody who had closed their laptop ten minutes earlier. Both ways out now check who's actually present. (web #91)
  • The results screen stays put. We deleted the ten-second redirect off it rather than tuning it. It moved players on mid-sentence, before anyone had shared anything, and it was in the way of the rematch and sharing features being designed for that screen. (web #88)
  • Refresh without races. The manual Refresh and the fifteen-second update on the room list share one request, because two overlapping requests can finish out of order and leave the older list on screen. (web #80)

v0.7.0

Rooms survive a host who walks away.

  • The room notices when the host is gone. Host presence rides the update the room page already makes, not an “are you still there?” prompt or a browser timer; a timer is least reliable in a background tab, which is exactly the case we're detecting. A host quiet for thirty seconds passes the room on. (web #82)
  • A room can't outlive its host. With nobody to inherit, a room could sit in the public list for up to an hour showing “0 of N players”, and anyone joining could neither change the topic nor start. Abandoned rooms are unlisted now, and joining by code takes over a room whose host is away, so a shared link survives the host stepping out. (web #81, #82)
  • Coming back to a room works. Leaving stamps a departure time instead of deleting your seat, so your score survives, but coming back never cleared it: you were present to yourself and invisible to everyone else. Now it does. (web #83)

v0.6.0

Leaving a room really leaves, and the reveal button does one thing per press.

  • “Reveal answer” does one thing. It meant “do the next thing”, so a second click did the next thing again and skipped the reveal. It now does its work once however many times you press it, and disables while that work is in flight. (web #74)
  • Leaving frees your seat. You drop out of the set the round is waiting on, so an absent player no longer holds a question open, and your score stays in the final results where you earned it. If the host leaves, the longest-standing player takes over. (web #70, #73)
  • An empty lobby and a broken one look different. They used to look the same, so a failure read as a normal empty list. Specific refusals, like room full or game already started, also stopped being overwritten by a generic message. (web #68)

v0.5.0

Rooms stop disappearing mid-game, and analytics stop seeing your answers.

  • Rooms aren't removed mid-game. Expiry was measured from when a room was created, so the clean-up could delete a room during a game. The twenty-four-hour clock now runs from the room's last activity. (web #61)
  • Privacy: analytics no longer see your answers. Automatic click tracking recorded the label of whatever was clicked, and on an answer button that label is the answer, so our analytics provider received answer text. It no longer does. We found this ourselves, while writing our privacy policy. (web #59)

v0.4.0

Hearso starts counting what it does, and guests play without a limit.

  • Numbers that keep their meaning. Every usage figure is stored with the window, definition and exclusions it was computed under, plus a version that only a database change can move, so a number recorded last month stays readable against the rules that produced it. (web #51)
  • Abandoned rooms stop inflating the count. Rooms have no closed state, so an abandoned one would have held the peak of live players up forever. A room stops counting once its last activity is over an hour old. (web #50)
  • Guests can play as much as they like. Creating and joining a room no longer depends on how many games a guest has finished, so the three-game limit from v0.2.0 is gone. (web #28)
  • A correction to our own documentation. It implied database changes are tried on a preview database before production. One database serves both, so the safety rule is now the one that actually holds during a rolling deploy: new columns carry defaults, and new tables are written only by code that works without them until both sides are live. (web #53)

v0.3.1

Signing up before your first game works.

  • Sign up first, play later. Signing up before ever playing used to dead-end, because saving your profile needed a player id that didn't exist yet. Our server creates one on your first save now. (web #23)
  • Test traffic stays out of the real numbers. Analytics events carry the environment they came from, added in one place so it covers page views and automatic capture too. One analytics project can now keep development and production apart. (web #21)

v0.3.0

A front page, rooms that know who's acting, and analytics that wait for your yes.

  • Security: rooms know who's acting. Before, a room trusted the player id your browser sent, and a player id isn't a secret, so someone who knew a room code and a player id could have acted as that player or the host. Room actions now take who you are from a short-lived, signed cookie that page scripts can't read, issued only after our server admits you. We found this ourselves; we don't know whether anyone used it. (web #15)
  • Analytics wait for your yes. They start switched off and capture nothing before you choose. After you agree, they record only link and button clicks and form submits: typed input, session replay, error and performance capture are all off, on purpose a smaller set than the default. (web #16)
  • A front page. hearso.com opens on a page that explains the game, and the game itself moved to /play. (web #14)
  • Guest scores go to the daily board. Signed-up players' scores also reach the weekly and all-time boards. (web #18)

v0.2.0

Accounts arrive, and they're optional.

  • Accounts arrived, and they're optional. Sign up with an email and password or continue with Google, or play as a guest and nothing changes, except that a guest gets three finished games before we ask. Signing up keeps the identity you already played under, so your scores come with you. (web #7, #9, #10)
  • Google sign-in runs on our server. The one-time code verifier rides a short-lived cookie that page scripts can't read, and the session lands in the same cookies as email sign-in, so page scripts never handle a token. (web #9)
  • A bot check that can't be replayed. Each check's token works once, so the widget resets after every attempt, and our server verifies it. A failed check used to be reported as a server fault; it's now an error you can correct. (web #11)
  • A fair guest limit. It counts a finished game once per room, in the same step that finishes the game exactly once, and a game already underway never throws out a player who crosses the limit mid-game. (web #10)

v0.1.0

The first release: rooms, a trivia game and an office leaderboard.

  • Scores are sent exactly once. Our server submits the scores the moment a game finishes, so a room that somehow finishes twice can't post twice. (web #1)
  • Your browser's clock stays out of scoring. Answer times are worked out on our server and feed the speed bonus: a correct answer is 100 points plus up to 100 for speed. (web #1)
  • Checked on every change. Every change runs lint, type checks and the game-rule tests, and the build is proven to need no secrets, so it can't quietly come to depend on one. (web #1)

What we have committed to

Decisions we have settled on and intend to keep, so you can tell what to expect of a room before you walk into one.

Rooms look after themselves
No game should hang on one person staying connected. If the host goes, the room finds a new one. When the last player leaves, the room retires rather than sit there looking joinable.
Leaving never rewrites the game
Your seat is freed. Your score stays where you earned it.
The server runs the game
Questions, timing and scoring are decided on our side, not in your browser, so a round means the same thing for everyone in it.
We take the minimum
Of what we keep about you, and of what the app itself is allowed to touch.
Every version shows up here
Including the ones that fix our own mistakes.
Help improve Hearso

With your permission, we measure how you use Hearso (pages, buttons, your display name, your squad's name and your games) and record sessions and click heatmaps of how pages are used. We never send your first name, last name, email, phone number or passwords to analytics, and recordings hide them. You can change this in Settings after signing in. Hearso also keeps anonymous totals of rounds, players, and live rooms without this permission; see the player guide.