I Built a Free Online Charades Game With 500+ Words, a Live Timer, and Team Scoring No App, No Sig

I Built a Free Online Charades Game With 500+ Words, a Live Timer, and Team Scoring No App, No Sig

posted 4 min read

I play charades at family gatherings. Every time, someone spends 10 minutes writing words on paper slips, someone loses the slips, someone argues about the score, and the phone timer app keeps locking the screen mid-countdown.
So I built a browser-based charades game that handles all of it. One link, open it, start playing in 10 seconds.
Here is what it does and how I built it.

What It Is
The Charades Generator is a complete game system that runs entirely in your browser. No download, no account, works on any phone.
Features:

500+ words and phrases across 10 categories
Built-in countdown timer with visual pressure cues
Live team score tracker with round summaries
Difficulty levels: Easy, Medium, Hard
Adult 18+ mode, Christmas pack, Movie charades, Animal charades
Fully customizable: rounds, cards per round, timer length, team names

The Word Bank Architecture
The words are organized into category objects. Each word has three properties: the phrase, a difficulty level, and an optional hint.
javascriptconst categories = {
general: [

{ word: "Skydiving", difficulty: "medium", hint: "extreme sport" },
{ word: "Invisible Man", difficulty: "hard", hint: "classic concept" },

],
movies: [

{ word: "Inception", difficulty: "medium", hint: "dreams" },
{ word: "Titanic", difficulty: "easy", hint: "ship" },

],
animals: [

{ word: "Platypus", difficulty: "hard", hint: "unusual mammal" },
{ word: "Dog", difficulty: "easy", hint: null },

]
};
When the user picks categories and a difficulty level, the system filters across all selected categories and builds a flat deck. The deck gets shuffled with a Fisher-Yates shuffle before the game starts.
javascriptfunction buildDeck(selectedCategories, difficulty) {
let deck = [];
selectedCategories.forEach(cat => {

const words = categories[cat].filter(w =>
  difficulty === "all" || w.difficulty === difficulty
);
deck = deck.concat(words);

});
return shuffleDeck(deck);
}

function shuffleDeck(deck) {
for (let i = deck.length - 1; i > 0; i--) {

const j = Math.floor(Math.random() * (i + 1));
[deck[i], deck[j]] = [deck[j], deck[i]];

}
return deck;
}

The Timer With Visual Pressure
A plain countdown is boring. I wanted players to feel the pressure build as time runs out.
The timer ring changes color based on time remaining. It turns orange at 15 seconds and red at 5. The CSS transition handles the color shift smoothly.
javascriptfunction updateTimerDisplay(secondsLeft, totalSeconds) {
const ring = document.getElementById('timerRing');

if (secondsLeft <= 5) {

ring.style.borderColor = '#ef4444'; // red

} else if (secondsLeft <= 15) {

ring.style.borderColor = '#f97316'; // orange

} else {

ring.style.borderColor = '#8b5cf6'; // default purple

}

document.getElementById('timerDisplay').textContent = secondsLeft;
}
Players notice the color change before they check the number. It creates urgency without them thinking about it.

Score Tracking Across Rounds
Each team has a running total plus a per-round breakdown. At the end of each round, a summary screen shows what each team scored before switching turns.
javascriptconst gameState = {
teams: {

team1: { name: "Team 1", total: 0, rounds: [] },
team2: { name: "Team 2", total: 0, rounds: [] }

},
currentRound: 1,
currentTeam: "team1"
};

function recordScore(teamId, points) {
gameState.teams[teamId].total += points;
gameState.teams[teamId].rounds.push(points);
}
No paper. No arguments. The scoreboard stays visible throughout the entire game.

What Broke During Testing

The Adult 18+ category needed to be completely isolated from family categories. Early builds let filters bleed across category selections when users switched between Quick Bundle presets rapidly.
Fix: reset the entire category selection state whenever a Quick Bundle button is pressed, then apply only that bundle's categories fresh. No carry-over from previous selections.
The second issue was the timer continuing to tick after a player pressed "Got It" or "Skip" on the last card. The interval kept running in the background. Fix was simple: always call clearInterval(timerInterval) before any card transition, not just on timeout.

Why Client-Side Architecture Matters Here

The Charades Generator runs zero server calls during gameplay. The entire word bank loads once with the page. The timer, scoring, and card logic all run in the browser tab.
This is the same approach I use across all tools at stackflowtools.com. The background remover processes images without uploading them. The image compressor runs entirely on-device. The AVIF to JPG converter uses the Canvas API to handle conversion in the browser tab. No file ever leaves the user's device.
For a game tool, the benefit is different. No server means no latency between cards. The game feels instant because it is. There is no network request between pressing "Next Card" and seeing the next word.

By the Numbers
FeatureDetailTotal words500+Categories10Timer options30s, 60s, 90s, 2 minRound options3, 5, 7, 10Cards per round3, 5, 7, 10Server requests during game0Signup requiredNo

Try It
Open stackflowtools.com/charades-generator on your phone, pick your categories, and start playing. Setup takes under 30 seconds.
If you are building other party game tools, the Random Animal Generator on the same site follows a similar word-bank approach and works well as a kids game companion. For game nights that need a name generator, the Free Fire Stylish Name Generator and PUBG Name Generator are also part of the same tool suite at stackflowtools.com.
If you have questions about the deck logic, timer behavior, category isolation, or state management across rounds, drop a comment below.

Sohaib Khan builds free browser-based tools at stackflowtools.com.

More Posts

How I Built a React Portfolio in 7 Days That Landed ₹1.2L in Freelance Work

Dharanidharan - Feb 9

I’m a Senior Dev and I’ve Forgotten How to Think Without a Prompt

Karol Modelskiverified - Mar 19

5 Web Dev Pitfalls That Are Silently Killing Your Projects (With Real Fixes)

Dharanidharan - Mar 3

TypeScript Complexity Has Finally Reached the Point of Total Absurdity

Karol Modelskiverified - Apr 23

Sovereign Intelligence: The Complete 25,000 Word Blueprint (Download)

Pocket Portfolioverified - Apr 1
chevron_left

Related Jobs

View all jobs →

Commenters (This Week)

8 comments
1 comment

Contribute meaningful comments to climb the leaderboard and earn badges!