WordPerfect

↗ Live site

WordPerfect is Boggle in the browser for people who already know each other. Everyone gets the same 4×4 grid for 60 seconds. Found words drop into a shared box as physics pills. If anyone else finds your word, you both score zero. Leave the tab and the board locks for five seconds. Built with vanilla JS, Matter.js, and Supabase Realtime. Live at wordperfect.vercel.app.

WordPerfect home screen with title, tagline 'The word nobody else found', name input field, create room and how-to-play buttons, and room code join field.
Home screen. Enter a name, create a room or join one.
Context
Realtime Game
Stack
Matter.js, Supabase, Javascript
Role
Creative Technologist, Designer
Date
April 2026 - Present

The challenge

Physical Boggle already works. A cup, a sand timer, paper, then you read your lists out loud and kill the words you share. I did not want a prettier list. I wanted that table in a browser, including the part where someone always tries to look a word up.

How do you put Boggle in a browser without turning it into a typing race against a dictionary tab?

What I looked at

I played the games people already open when someone says "word game," then kept the one mechanic each of them actually owns.

Physical Boggle

The cup is the product. Shake, sand timer, paper, cancel shared words. I kept the shake, the timer, and the cancel. I could not ship the paper, so the pills had to become the pile everyone can see.

Wordle

One word, no friends in the room, no cheat problem because yesterday's word is public. Fine game. Wrong room. WordPerfect needs other people looking at the same grid at the same second.

Words with Friends

Turn-based. You can leave, think, come back. The table energy dies. I wanted a 60-second round that starts when everyone is ready, not a move you send at midnight.

Spellcast / Word Hunt

Solo or async. Fast, pretty, no one watching you. If nobody else can cancel your word, the game is a crossword with a timer.

I stole the cup from Boggle and the shared-word death from the paper version. I stole the infinite solo score from nobody.

Ideas I threw out

The first versions were a spreadsheet with extra steps. Each of these looked finished. Each of them made a different game.

A list of submitted words

Readable. Dead. Finding a word felt like appending a row. The pile never grew in space, only in count.

Honor system

"Please don't look it up." At a table of friends this lasts one round. Then someone googles a plant.

A native app so I can lock the OS

I do not ship App Store. The browser is the room. If I cannot make cheating cost more than it pays here, I do not have a game.

Rounds longer than a minute

People get bored or they get a dictionary. Sixty seconds is short enough that a 5-second lock after a tab-out actually hurts.

Out
  • word lists
  • honor system
  • async turns
  • solo high scores
  • simple plurals
In
  • pills with weight
  • shared words die
  • 60-second rounds
  • tab-out lock
  • a shake, not a shuffle

The problem after I built

I thought the hard part was the physics. The hard part is the room. Sync that drifts, a lobby that feels empty, a penalty that is funny once and then annoying. The pills and the shake only matter if other people are in the same sixty seconds.

How do you keep a table of friends in the same second, on a browser that wants them to leave?

The system

Three layers sit on top of each other. Pills so a word has weight. Presence so the timer ticks on every screen. A focus lock so a dictionary tab costs more than it pays.

Pills with weight

A found word becomes a pill. It spawns with a small sideways scatter, falls, tumbles, and stacks in the box. The corners are chamfered so the pills bounce.

A list tells you a count. A pile tells you who is ahead. You can see the box fill without reading a number.

The same sixty seconds

Supabase Realtime runs the lobby, the ready state, and the round. Presence tracks who is connected. A broadcast starts the countdown and collects scores. There is no database write for every keystroke.

If one screen starts late, the table is already a different game. Presence plus broadcast keeps the sixty seconds the same sixty seconds.

A shake, not a shuffle button

Shuffle sends every tile to the center with a random tilt, piles them, then springs them back onto the grid. That is the Boggle cup.

The shake is not decoration. If the tiles do not pile in the middle, it is a randomize button wearing a cup costume.

Leaving the tab costs five seconds

Leave the tab and the board blurs. Come back and you wait 5 seconds before you can type again. The lock is there so a dictionary tab costs more than it pays.

The lock does not make people honest. It makes the dictionary tab cost more than it pays.
In-round game board with 4x4 letter grid, Round 1/3 indicator, 00:49 timer, seven found words stacked as physics pills, and Lock In Early button.
Mid-round. Found words drop as pills into a shared box.

What the sandboxes are for

The live game has a timer, a lobby, and other people. These two toys isolate the parts I could not explain in a paragraph: that a word should have weight, and that a shuffle should feel like a cup being shaken, not a CSS shuffle. If the pill stack is boring here, it will be boring in a round. If the grid snap feels cheap here, it will feel cheap when you are losing.

Physics sandbox

Type a word and it drops as a pill. The width comes from the text. It falls and bumps the others.

Please fill in this field
0/15

Type words and click "Drop Word" to fill the physics container.

Grid shuffle

Tiles fly to the center, stack with messy rotations, and spring back to new cells. Shuffle the grid below.

Shuffle piles the tiles in the middle, then springs them back.

How a night goes

Someone opens a lobby. Guests join on their own phones. Ready, then a countdown. Three rounds. Each round is sixty seconds on the same grid. You draft words. They drop as pills. After the timer, the table sees who found what and who cancelled whom.

Game lobby showing room code PNTB, round and timer steppers, player list with a Medium bot, and Start Game button.
Lobby. Pick rounds, timer, mode. A bot fills in until friends join.

How you score

The live game is blunt about this. Four or more letters. No simple plurals. RAINS will not count if RAIN is on the board. One point per letter, so longer words pay more. If anyone else finds your word, you both score zero.

4+ letters

Short noise is free in Boggle and boring on a screen. Four letters is the floor so the pile is words, not fragments.

No simple plurals

RAINS is not a second find. It is RAIN with an S. The refresher on the results screen says this out loud because people always try it.

1 point per letter

A six-letter word is worth more than two fours. Obscurity and length are the same bet.

Shared words die

This is Boggle's paper rule. Without it, the fastest typist wins. With it, the person who saw what nobody else saw wins.

Tab-out lock

Leave the tab and the board blurs. Coming back costs five seconds of a sixty-second round. I did not try to make people honest. I made the cheat worse at math.

Round results screen with filter chips for All, Raj, and bot player, showing scored words like DIETARY and PROTEST with point values.
Results. Filter by player. Shared words score zero.

What's live

The lobby, the three rounds, the pills, the shake, and the lock all run. Friends can sit down and play. I still treat the physics as something I have to keep proving, which is why the sandboxes sit on this page.

Works

  • Lobby, ready, 3 rounds of 60s
  • Pills drop with weight
  • Shake piles tiles, then springs
  • Shared words score zero
  • Tab-out blur and 5-second lock

Still tender

  • Sync drift when a phone sleeps
  • A lock that is funny once, then sharp
  • Empty lobbies look like a broken room
  • The dictionary is still one tab away
  • No paper, so the pile has to do that job

The cheat is not gone. It just costs a twelfth of the round.

What I would not undo

I would not go back to a word list. I would not ask people to be honest. I would not make a solo mode to pad the empty lobby. The game is the table. If the table is empty, the product is empty.