Build a Kahoot alternative
Build a Kahoot alternative with a join code, questions, and a score. Pro Start is $9 a month billed annually. Slide decks and homework stay on the long row.
You can build a Kahoot alternative with a join code, questions, and a score. Kahoot is that product. The catalog line is “A join code, questions with one right answer, and a score.”
The card lists $9 to $99 a month. Kahoot’s business pricing lists Kahoot! 360 Pro Start at $9 a month billed annually, $108 a year, through Pro Ultra at $99 a month. The card leaves out the introduction offer. The first estimate is 10 hours. The verdict is “Score the room”.
Last time I wrote about vibe coding your own 1Password. That was a teardown. This one is a regular backlog topic. A content library and homework stay on the skip row.
Build a Kahoot alternative from one quiz
The Kahoot page splits the work into three rows.
The first row is 10 hours. Questions, a join code, and a score. You write the questions. People join. The board counts correct answers.
The second row is 3 days. A leaderboard treatment, a close, and a CSV. A file of every answer can wait until the room already scored a real quiz.
The third row is 1 month and up. A content library, slide import, and assignments. The table labels that row as the part you should skip.
If you tell an agent to “clone Kahoot”, it aims at the third row. Copy the prompt, then pin it to the first one.
Store Quiz, Question, Choice, Player, and Answer. The card names all five. For these 10 hours, all five exist. The quiz is the container. The question has up to four choices and one correct choice. The player is a name on the join code. The answer is that player’s pick for one question.
A quiz is the title and the join code, open while people are answering. A question is the prompt and the correct choice. A choice is one of the four labels. A player is a display name on that code. An answer is one row per player per question.
The audience is one host running a short scored quiz for a room. The goal on the card is to open a quiz, let players join with a code, and score each player from the correct answers. The same v1 also stands in for Quizizz and Blooket. The card lists both and does not give them prices.
A live poll with no correct answer is Mentimeter at $11.99 to $24.99 a person a month. A form you send out, with a response table, is SurveyMonkey at $39 to $75 a person a month, in Vibe code your own SurveyMonkey. Those are other rooms. This one has a right answer.
The guardrail is the rule you paste into the prompt. Accept an answer only while the quiz is open. Keep one answer per player per question. Score from the stored correct choice.
How a Kahoot alternative keeps score
Priya is running a workshop quiz on Friday, November 6, 2026. Three questions. The join code is 4K7M. Noah and Jules join from their phones.
Question 1 is “Which day ships the pin?” The choices are Friday, Monday, Never, and Tuesday. Friday is stored as the correct choice. Noah picks Friday. Jules picks Monday. The board reads Noah 1, Jules 0.
She moves to question 2. Answers for question 1 stop. A second tap from Noah on question 1 does not add another point, and it does not replace the row. One answer per player per question is the whole scoring rule.
Your browser, and theirs, talk to one Astro app. Node.js plus Astro is the default. Use TanStack Start if React is your weekday language. The capability line on the card is Astro, Durable Objects, and D1. The quiz, the questions, and the correct choice live in D1. The open room lives in one Durable Object, because two answers arriving on two isolates will otherwise paint two different boards.
The score is a count of stored answers whose choice id matches the question’s correct choice. Priya does not type the score. If Jules’s answer is still Monday, Jules stays at 0 for that question. If you “fix” the board in the page and forget the row, a refresh lies.
Every query is scoped by the host, except the join. A player with code 4K7M can submit a name and an answer. A player with a wrong code gets an empty room. A guessed quiz id from another host returns an empty page. The host’s edit screen and the player’s phone are different routes.
Screens of a Kahoot alternative
v1 needs the question on the host’s laptop, the join on a phone, and the score beside the names. A CSV after a formal close is the 3-day row.
The host
Priya sees question 1 of 3, the four choices, and which one is correct. The code 4K7M is on the same screen, large enough to read from the back of the room. Next is how she leaves question 1.
The phone
Jules opens the join page, types 4K7M, and the name Jules. Question 1 shows the four choices and no mark for the correct one. She picks Monday. The button goes quiet. A second pick does not send.
The board
After question 1, the host’s board lists Noah at 1 and Jules at 0. The count is the stored answers. Priya never types it. Question 2 has not been answered, so the totals are still those.
How a quiz gets its score
Priya writes the three questions first, each with one correct choice, and saves. The quiz is closed to answers until she opens it. Opening it mints 4K7M and wakes the room object.
Noah joins, then Jules. Each name is a player row tied to that quiz. The same name twice is a second player only if you allow it. I would reject a duplicate name on the same code, so the board does not show two Jules rows and then guess which answer belongs to which phone.
Question 1 is the current question on the room object. Noah’s Friday and Jules’s Monday both land there. The object writes the answer rows and broadcasts the count. D1 is the record a refresh reads. The object is what makes the two phones agree before that write finishes. If the write fails, the room should say the answer was not stored, and the phone can send once more. A silent success with no row is how a point disappears.
Next advances the current question. The previous question no longer accepts answers. That is the guardrail, and it is also how the 10-hour quiz ends a round without the 3-day close. The 3-day close freezes the whole quiz and unlocks the CSV. Until then, the board is the screen.
A player who joins late, during question 2, has no row for question 1. Their score starts at 0. You do not backfill a missed question. The month row is where a content library, an imported slide deck, and an assignment for later would live. The non-goal says not to import slides, not to assign homework, and not to host an opinion poll. Mentimeter is the poll. This room has a correct choice.
What you leave on the long row
Ten hours is a quiz Priya wrote, a code on the wall, and a score that matches the correct rows. Noah at 1 and Jules at 0 after question 1 is the test. Refresh the board. The numbers should still be those, because they came from the answer table.
The 3-day row adds a close that rejects every later answer, and a CSV of players and choices. A fancier leaderboard draws that same count larger.
The month row is the catalog. Someone else’s questions, a slide deck imported into the quiz, and an assignment a student finishes on Sunday. The card says to skip that. Quizizz and Blooket sit in the same “also replaces” line, still without prices, because the room is the part you wanted.
Paste the one-answer rule from How to write a coding agent prompt, and keep the three rows in How to scope a SaaS clone.
Start with the first row
Go to Build your own Kahoot. Copy the Astro prompt, or TanStack Start if that is what you write.
Tell the agent the first estimate only. Questions, a join code, and a score. Ten hours.
Run question 1 with two phones. One correct, one wrong. The board should show 1 and 0, and a second tap should not move it. If you need a content library or homework, keep the $9 plan for that part.