Hands Up

Hands Up

Hands Up is an anonymous question board for a class. The person teaching starts a session and shows its four-letter code on the screen. Everyone else opens the session on their phone, asks without giving a name, and presses “Me too” on the questions they also want answered. New questions and votes show on every open phone within about a second. There are no accounts and nothing to install.

To try it, open HAND, a board for questions about this app. Ask something there, then come back later: your question will still be marked “Yours”. To see it update live, open HAND in two windows, or open its projector page next to your phone.

Why I built this

In a lecture or a crit, most questions come from the few people who are happy to ask out loud. My guess is that many more people have questions they never ask. Apps for this already exist. I looked at Slido, Mentimeter, Pigeonhole Live and Vevox. They are made for conferences and companies, so they come with names, accounts, polls, quizzes and moderation. Hands Up is for one class: 20 to 150 people with phones and one person at the front.

What good means here (second version)

Good means more people ask their questions, and the questions most people want answered come first.

The tests in spec/ check most of these points against the running app, for example that two votes sent at the same moment count once, and that the asker’s id is missing from pages sent to anyone else. For live updates, the tests open the same connection a page opens and check that the server sends a new question, a vote and the new order within one second, and that nothing it sends says who asked or voted. The tests do not run a browser, so they cannot see a page change. That part was checked by hand, with two browser windows side by side at phone width and on a laptop, and I tried it on my own phone and laptop. I also checked by hand that questions are still there after a redeploy. Whether more people really ask, and whether the pages are easy to read, I have to judge. I drew the screens in a design tool first. I have not yet tried it with a room of people or with a screen reader.

How it behaves when several people use it at once

The list on every screen is sorted by votes, so one person’s vote can change the order for everyone. I decided that every open screen reorders straight away, phones included. The other option was to keep the order still on a phone until its owner asks for the new one. The cost of my choice is that a question can move just as someone is about to press “Me too” on it. To make that less likely, the list does not move while a finger is on the screen, and a question that has just moved cannot be pressed for 0.4 seconds. These two were checked by hand in a browser; the tests do not cover them. I chose live reordering because anyone can then see straight away which question the class wants most. The options and the cost are in the decision record.

The tests check the count of people, the host’s actions and the projector page. The “Live” label I checked by hand, by stopping the server and starting it again with a page open.

What I chose not to build

One choice I am not sure about: Hacker News hides comment scores so that people don’t just vote the way everyone else did. Hands Up shows the count, because the person at the front needs to see what most people want answered. Counts now update live and the list reorders as votes arrive, so a question that is already at the top is easier to vote for than before. I have not tried this with a real class yet.

Not built yet

Limits

The app treats each browser as one person. If you clear your cookies or switch phones, it sees you as someone new: your questions lose “Yours”, and you can vote again. That is fine for one class, but not for anything that must be counted fairly. The server knows which browser asked each question, so it can show “Yours”, but it never shows this to anyone else in the app. The server’s log names each person by a short tag, so whoever runs the server can see which tag asked which question.

HAND has no host, so nobody can hide or mark a question there. The app runs on one small server, and the list of open connections is kept in that server’s memory, so it cannot be spread over several servers.

What I looked at