Anonymous audience Q&A for community meetings, built as a Google Apps Script web app with Gemini grouping and translating questions. It runs entirely inside an organization's own Google Workspace. There is no server to host and nothing for the audience to install.
Built to support the Autism Society of Los Angeles.
- The room screen shows a QR code. For in-room sessions the code changes every 150 seconds, so only people in the room can ask.
- People scan it and ask anonymously in English, Korean, Spanish, or any language.
- Gemini groups questions by topic and translates them in one call, so a Korean and a Spanish question about the same thing land in the same group.
- The facilitator's queue shows topics instead of a long list. They merge a topic into one question to read aloud, and mark it Now answering on the room screen and everyone's phone.
- The app itself reads in English, Spanish or Korean, chosen per person — the queue, the admin page, the room screen's status lines and the emails, not only the questions.
- Participants can tap Me too on topic labels, never on other people's questions, so the room's priorities surface without repeat questions.
- When the session ends, QA Facilitators get a summary email with a CSV.
All screenshots use made-up demo data from scripts/preview.js.
Room screen: QR code, instructions in three languages, the topic being answered, and a clock showing the code is live.
| Participant's phone Ask anonymously; tap Me too on approved topics. ![]() |
The same page in Korean Picked from the phone's language, with a switcher. ![]() |
QA Facilitator queue: questions grouped by topic across languages, a merged question to read aloud, Answer now, Me too counts, show-on-phones approval, prepared questions, answered topics sinking to the bottom, and dismissed questions kept for restoring.
PowerPoint: the Question Desk QR add-in shows the live code on a slide.
Admin: events and their sessions, people and session summary recipients, branding, and health checks.
![]() |
![]() |
![]() |
![]() |
![]() |
Regenerate with node scripts/screenshots.js (needs Google Chrome).
- Events that group sessions, with event branding between the site's and each session's
- Day-of checklist, printable QR sheets, whole-event summary, and duplicate events and sessions
- Optional removal of old question wording, a weekly health report, and a queue that stays useful when Gemini is down
- CSV export and import of sessions, with a preview before anything is saved
- Activity log of every administrator, QA Facilitator and scheduled action
- Panelist view for the panel table, and keyboard shortcuts in the QA Facilitator queue
- Multiple sessions at once, each joined by in-room rotating QR or a shareable link
- Administrators and per-session QA Facilitators, restricted to the organization's domain
- Scheduled start and end, and end-of-session summaries
- Branding: logo, colors, welcome and footer text, per-session overrides for partner events
- Landing page, health check with failure alerts, and a load-test tool
- Prepared questions, per-session wait between questions, and drag-to-reorder sessions
- Guest page that avoids Google's multi-account error for Safari and Firefox
- PowerPoint add-in that shows the live, rotating QR code on a slide (Windows, Mac, web)
- Participant page, room screen and topic labels in English, Korean, Spanish, Chinese, Vietnamese, Tagalog and Armenian, chosen per event; translations never soften criticism
- Larger-text option for participants, a high-contrast room screen, and "Answered" shown on the asker's own phone
The audience is anonymous and outside the Google domain, so the app cannot identify individuals. Instead of pretending to rate-limit people, it relies on:
- Presence: the rotating room code.
- A per-session question cap.
- Topic grouping: twenty questions from one person collapse into one card the facilitator dismisses once.
CLAUDE.md explains the constraints and design decisions.
Google shows this error, before Question Desk runs, to browsers signed into more than one Google account. Turn on the guest page to avoid it for Safari and Firefox: step-by-step fix.
See SETUP.md for installation, the Admin page, running an event and
load testing. You need a Google Workspace account that can publish web apps to
"Anyone", and a Gemini API key.
node --test tests/*.test.js # functional tests against fake Apps Script services
npm install && npx playwright install webkit chromium
npm run test:browsers # real-browser layout, behavior and visual comparison tests (WebKit, Chromium)
npm run test:visual:update # accept an intended visual change as the new baseline
node scripts/check-secrets.js # blocks keys, IDs and real email addresses
git config core.hooksPath .githooks- No dependencies: the web app has no build step or npm packages, and the tests need only Node 18+.
- Real code under test: the tests run the actual server code, covering roles, sessions, tokens, limits, grouping, email, branding, schedules, health alerts and the load-test endpoint.
- Releases:
scripts/ship.shhandles them; seeCHANGELOG.md.
Please report vulnerabilities privately; see SECURITY.md.
Copyright 2026 Dwayne Sinclair. Licensed under the Apache License 2.0.










