{"id":82846,"date":"2026-09-15T09:30:11","date_gmt":"2026-09-15T04:00:11","guid":{"rendered":"https:\/\/tothenewone.online\/blog\/?p=82846"},"modified":"2026-10-27T23:14:08","modified_gmt":"2026-10-27T17:44:08","slug":"from-chatbot-demo-to-full-stack-investigation-game","status":"publish","type":"post","link":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/","title":{"rendered":"From Chatbot Demo to Full-Stack Investigation Game"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>A \u201c<strong>you are the game master<\/strong>\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee.<\/p>\n<p><strong>The Last Broadcast<\/strong>\u00a0is the other design: a short investigation you can finish. AI may turn English into a command.\u00a0<strong>A deterministic engine is the only thing that changes the world<\/strong>.<\/p>\n<p><strong>Play:\u00a0<\/strong><a href=\"https:\/\/ai-powered-interactive-game-master.vercel.app\">https:\/\/ai-powered-interactive-game-master.vercel.app<\/a><br \/>\n<strong>Code:\u00a0<\/strong><a href=\"https:\/\/github.com\/harshit-ttn\/Build-an-AI-Powered-Interactive-Game-Master\">https:\/\/github.com\/harshit-ttn\/Build-an-AI-Powered-Interactive-Game-Master<\/a><\/p>\n<p>If you only have ten minutes: open the live app, finish a few rooms, then in the repo open\u00a0<strong>applyAction<\/strong>\u00a0and\u00a0<strong>CommandInterpreter<\/strong>. That is the whole argument.<\/p>\n<h1><strong>Why this is worth your time<\/strong><\/h1>\n<p>If you are wiring a language model into a product, the useful question is not \u201cdid we call the API?\u201d It is \u201cwhat happens when the model is wrong, slow, or missing?\u201d<\/p>\n<p>This project is a small, concrete answer. Same pattern shows up in assistants that must not invent refunds, bookings, or permissions:\u00a0<strong>parse language at the edge; keep the ledger in code<\/strong>.<\/p>\n<table style=\"height: 144px; width: 100%; border-collapse: collapse; border-style: solid; border-color: #000000;\" border=\"1px\">\n<tbody>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\"><strong>Chatbot demo<\/strong><\/td>\n<td style=\"width: 50%; height: 24px;\"><strong>This game<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Model owns the world<\/td>\n<td style=\"width: 50%; height: 24px;\">Engine owns\u00a0GameState<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Hard to test<\/td>\n<td style=\"width: 50%; height: 24px;\">Handlers and a full win-path test<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Dies without a vendor key<\/td>\n<td style=\"width: 50%; height: 24px;\">Keyword parser still plays<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">One prompt, one story<\/td>\n<td style=\"width: 50%; height: 24px;\">Second case is JSON<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">No URL, or a toy server<\/td>\n<td style=\"width: 50%; height: 24px;\">Same-origin deploy<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h1>The idea<\/h1>\n<p>Two jobs get mashed together:<\/p>\n<ol>\n<li><strong>Parse intent<\/strong> \u2014 messy language \u2192 { intent, target, confidence }.<\/li>\n<li><strong>Apply rules<\/strong>\u00a0\u2014 can you enter, did you earn the clue, which ending fires.<\/li>\n<\/ol>\n<p>Models are useful at (1) and unreliable at (2). We split them.<\/p>\n<p>Intents are closed:\u00a0<strong>MOVE<\/strong>,\u00a0<strong>INSPECT<\/strong>,\u00a0<strong>SEARCH<\/strong>,\u00a0<strong>TALK<\/strong>,\u00a0<strong>USE_ITEM<\/strong>,\u00a0<strong>ACCUSE<\/strong>,\u00a0<strong>DECIDE<\/strong>. No\u00a0<strong>TELEPORT<\/strong>. No invented loot. Illegal action \u2192\u00a0<strong>INVALID_ACTION<\/strong>\u00a0and a GM line, not a rewritten universe.<\/p>\n<p>Fiction: a hijacked city signal \u2014 \u201cFind the witness before the silence.\u201d Loop: search \u2192 evidence \u2192 theory \u2192 decide at the tower (<strong>stop\u00a0\/\u00a0expose\u00a0\/\u00a0continue<\/strong>).\u00a0<strong>Cold Harbor<\/strong>\u00a0is another mystery on the same engine. Stories are JSON. Physics are code. Health, trust, score, hints exist so choices hurt.<\/p>\n<ul>\n<li><strong>The model talks. The engine keeps score.<\/strong><\/li>\n<\/ul>\n<h1>Stack and packages<\/h1>\n<p>TypeScript monorepo:<\/p>\n<ul>\n<li><strong>@broadcast\/web<\/strong> \u2014 React 19, Vite, Zustand<\/li>\n<li><strong>@broadcast\/api<\/strong> \u2014 Fastify 5, Zod, CORS, 80 req\/min<\/li>\n<li><strong>@broadcast\/game<\/strong> \u2014 engine + scenarios<\/li>\n<\/ul>\n<p>The UI never \u201cfinds\u201d a card on its own. It sends an HTTP request. The API runs the engine.\u00a0<strong>GET \/health<\/strong>\u00a0is liveness. Zod rejects garbage before handlers run.<\/p>\n<p>Tests sit next to the rules: engine tests cover locks, the locker card, puzzle sequences,\u00a0<strong>USE_ITEM<\/strong>, health on a bad accusation, Cold Harbor boot, and a full path to\u00a0<strong>hidden_truth<\/strong>. API tests cover start, a persisted\u00a0<strong>MOVE<\/strong>, and parsing\u00a0<strong>Use access card<\/strong>.<\/p>\n<h1>Try this (five minutes)<\/h1>\n<p>On the live URL:<\/p>\n<ol>\n<li>You start in the Control Room. Chip or type: go to Security Office.<\/li>\n<li>Inspect the evidence locker \u2192 access card + a clue.<\/li>\n<li>Use the card (inventory click or <strong>use access card<\/strong>).<\/li>\n<li>Lab: inspect the terminal, open Evidence Board, solve the three-step cipher (<strong>7 \u203a 4 \u203a 9<\/strong>).<\/li>\n<li>Keep going: desk note, server rack puzzle, archive, pin\/connect all five clues, submit the theory, tower, decide.<\/li>\n<\/ol>\n<p>You will not finish the best ending in five minutes. You will see locks, inventory, board, and a log that is not free-form fanfic. If a typed line is vague, you get <strong>Did you mean\u2026?<\/strong> \u2014 that is the interpreter, not the engine \u201cbeing nice.\u201d<\/p>\n<h1>Mysteries as data<\/h1>\n<p>Locations, NPCs, locks, clues, puzzles, theories, inspect effects, dialogue, and ending rules live in a pack. Adding a case should not mean rewriting\u00a0<strong>applyAction<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-83488\" src=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Mysteries_Data.png\" alt=\"Mysteries_Data\" width=\"750\" height=\"271\" srcset=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Mysteries_Data.png 750w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Mysteries_Data-300x108.png 300w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Mysteries_Data-624x225.png 624w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/p>\n<p>The server room wants\u00a0<strong>access_card<\/strong>. The elevator wants coordinates from the cipher. Best ending needs the right clues, a validated theory, and enough health.<\/p>\n<h1>Rules as a handler registry<\/h1>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-83489\" src=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Handler_Registry.png\" alt=\"Handler_Registry\" width=\"752\" height=\"195\" srcset=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Handler_Registry.png 752w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Handler_Registry-300x78.png 300w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Handler_Registry-624x162.png 624w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><\/p>\n<p><strong>applyAction<\/strong>\u00a0clones state, refuses a finished case, dispatches, then\u00a0<strong>finish()<\/strong>\u00a0writes journal + suggestions.\u00a0<strong>MOVE<\/strong>\u00a0checks exits and locks.\u00a0<strong>USE_ITEM<\/strong>\u00a0needs inventory.\u00a0<strong>INSPECT<\/strong>\u00a0runs\u00a0<strong>inspectEffects<\/strong>.\u00a0<strong>TALK<\/strong>\u00a0picks lines by NPC, trust, clues. Wrong accusation and failed theory cost health; repeated puzzle fails raise difficulty.\u00a0<strong>DECIDE<\/strong>\u00a0only at the ending location.<\/p>\n<p>Pin, connect, submit. Wrong theory is a scored miss. Puzzles unlock after inspect; failed attempts raise\u00a0<strong>hintLevel<\/strong>\u00a0and can show a fragment. Hints cost <strong>\u221250<\/strong> and follow\u00a0your\u00a0stuck point (lock, object, puzzle, missing clues). Optional AI only rephrases that hint.<\/p>\n<p><strong>memories[]<\/strong>\u00a0(discoveries, talks) go into interpretation as the last ten strings \u2014 context for language, not a second physics engine. Chapters follow beats, not room count.<\/p>\n<h1><span style=\"font-size: 1.5rem;\">AI proposes; it does not loot<\/span><\/h1>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-83490\" src=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Command_Interpreter.png\" alt=\"Command_Interpreter\" width=\"754\" height=\"90\" srcset=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Command_Interpreter.png 754w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Command_Interpreter-300x36.png 300w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Command_Interpreter-624x74.png 624w\" sizes=\"auto, (max-width: 754px) 100vw, 754px\" \/><\/p>\n<p>With a key: strict JSON schema (<strong>intent<\/strong>\u00a0enum,\u00a0<strong>target<\/strong>,\u00a0<strong>confidence<\/strong>). Prompt: return a command, do not invent items. Input: location, inventory, clues, memories, trust. No key \u2192 keyword parser.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-83491\" src=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/AI_Proposal.png\" alt=\"AI_Proposal\" width=\"752\" height=\"109\" srcset=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/AI_Proposal.png 752w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/AI_Proposal-300x43.png 300w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/AI_Proposal-624x90.png 624w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><\/p>\n<p>Chips skip confirm. Narration is after the fact, off by default. Scenario generate is admin + Zod +\u00a0<strong>never<\/strong>\u00a0auto-loaded.<\/p>\n<h1>When things go wrong (this is the useful part)<\/h1>\n<table style=\"height: 288px; width: 100%; border-collapse: collapse; border-style: solid; border-color: #000000;\" border=\"1px\">\n<tbody>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\"><strong>What happens<\/strong><\/td>\n<td style=\"width: 50.0436%; height: 24px;\"><strong>What the system does<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">No\u00a0OPENAI_API_KEY<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">Parser still plays the full case<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Model returns junk<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">Catch \u2192 same parser<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">\u201clook around\u201d \/ low confidence<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">Confirm UI, no silent mutate<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Inspect a name not in the room<\/td>\n<td style=\"width: 50.0436%; height: 24px;\"><strong>INVALID_ACTION<\/strong>, stall line, failed-action count<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Use an item you do not have<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">Rejected<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Walk into a locked exit<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">Lock message from the scenario<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Accuse the wrong person<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">Score, trust, health<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Submit a thin theory<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">Fail, \u2212health, try again<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Decide without evidence<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">Worse ending, still a real ending<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Case already closed<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">No more mutations<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 49.8692%; height: 24px;\">Serverless cold start<\/td>\n<td style=\"width: 50.0436%; height: 24px;\">In-memory session can vanish. Resume from\u00a0<strong>localStorage<\/strong>\u00a0only works while that process still holds the case. The planned fix is durable storage (Redis or Postgres) so a new isolate can reload the same\u00a0<strong>GameState<\/strong>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>If you copy one idea into your own service:\u00a0<strong>never let the model write the ledger<\/strong>.\u00a0Let it propose a DTO your code already understands.<\/p>\n<h1>UI, HTTP, and environment<\/h1>\n<p>Log, chips, command bar, map, inventory \u2192 <strong>USE_ITEM<\/strong>, evidence graph, tower checklist, scenario picker. <strong>localStorage<\/strong> + <strong>GET \/state<\/strong>. Analytics: <strong>x-admin-key<\/strong>; events like <strong>game_started<\/strong>, <strong>clue_discovered<\/strong>, <strong>ending_reached<\/strong>. Warm process only.<\/p>\n<p>Typical path:\u00a0<strong>POST \/api\/v1\/game\/start<\/strong>\u00a0\u2192\u00a0<strong>\/interpret<\/strong>\u00a0or\u00a0<strong>\/action<\/strong>\u00a0\u2192 evidence\/puzzle\/hint \u2192\u00a0<strong>DECIDE<\/strong>.\u00a0<strong>GET \/health<\/strong>.<\/p>\n<p><strong>.env<\/strong>:\u00a0<strong>PORT<\/strong>, optional\u00a0<strong>OPENAI_*<\/strong>,\u00a0<strong>ADMIN_DASHBOARD_TOKEN<\/strong>. Do not commit secrets. Do not ship the toy admin default on a public URL.<\/p>\n<h1>Run it yourself<\/h1>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-83492\" src=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Run_Command.png\" alt=\"Run_Command\" width=\"740\" height=\"93\" srcset=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Run_Command.png 740w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Run_Command-300x38.png 300w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Run_Command-624x78.png 624w\" sizes=\"auto, (max-width: 740px) 100vw, 740px\" \/><\/p>\n<p>Vite proxies\u00a0<strong>\/api<\/strong>\u00a0locally. A static production build does not, so the hosted app uses one origin for UI and API.<\/p>\n<h1>Production<\/h1>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-83493\" src=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Production_Run.png\" alt=\"Production_Run\" width=\"753\" height=\"127\" srcset=\"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Production_Run.png 753w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Production_Run-300x51.png 300w, https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Production_Run-624x105.png 624w\" sizes=\"auto, (max-width: 753px) 100vw, 753px\" \/><\/p>\n<p>ESM via dynamic\u00a0<strong>import()<\/strong>\u00a0after a CJS wrap. Game sessions stay in memory on serverless, which is why a cold start can drop a case. Compose includes Postgres, but it is not on the live path yet. Next upgrade is wiring Redis or Postgres for session (and analytics) persistence, then more JSON packs. Git auto-deploy is not connected.<\/p>\n<h1>Where to look in the repo<\/h1>\n<table style=\"height: 192px; width: 100%; border-collapse: collapse; border-style: solid; border-color: #000000;\" border=\"1px\">\n<tbody>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\"><strong>Question<\/strong><\/td>\n<td style=\"width: 50%; height: 24px;\"><strong>File<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">What is a case?<\/td>\n<td style=\"width: 50%; height: 24px;\">packages\/game\/src\/scenarios\/*.json<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Who mutates state?<\/td>\n<td style=\"width: 50%; height: 24px;\">packages\/game\/src\/engine\/apply-action.ts<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Who only guesses?<\/td>\n<td style=\"width: 50%; height: 24px;\">apps\/api\/src\/ai\/command-interpreter.ts<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Confirm gate<\/td>\n<td style=\"width: 50%; height: 24px;\">apps\/api\/src\/server.ts (\/interpret)<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Client confirm<\/td>\n<td style=\"width: 50%; height: 24px;\">apps\/web\/src\/store\/useGame.ts<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Deploy adapter<\/td>\n<td style=\"width: 50%; height: 24px;\">api\/index.ts<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 50%; height: 24px;\">Proof it is completable<\/td>\n<td style=\"width: 50%; height: 24px;\">packages\/game\/src\/engine.test.ts<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h1><span style=\"font-size: 1.5rem;\">Conclusion<\/span><\/h1>\n<p>The point is not that we used a model. It is a\u00a0<strong>playable investigation whose physics are code, whose cases are JSON, and whose language layer you can rip out<\/strong>.<\/p>\n<p>If the vendor is down, the case still runs. If the guess is sloppy, we confirm or reject \u2014 we do not rewrite the locker. If we want another mystery, we add a file.<\/p>\n<p>I would not call the deploy a finished product. Memory-backed sessions will bite you. Durable storage first. Unconstrained world-gen would put the model back in the referee\u2019s chair; I would not start there.<\/p>\n<p>Open the URL, play until the board has a clue. Then open the two files above. One owns truth. The other only proposes.<\/p>\n<p><strong>Play:<\/strong>\u00a0<a href=\"https:\/\/ai-powered-interactive-game-master.vercel.app\">https:\/\/ai-powered-interactive-game-master.vercel.app<\/a><br \/>\n<strong>Repo:<\/strong>\u00a0<a href=\"https:\/\/github.com\/harshit-ttn\/Build-an-AI-Powered-Interactive-Game-Master\">https:\/\/github.com\/harshit-ttn\/Build-an-AI-Powered-Interactive-Game-Master<\/a><\/p>\n<p><strong>Let the model talk. Let the engine keep score.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction A \u201cyou are the game master\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast\u00a0is the other design: a short investigation you can finish. AI may turn English into a command.\u00a0A deterministic [&hellip;]<\/p>\n","protected":false},"author":1768,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":0,"footnotes":""},"categories":[3477],"tags":[4782,8977,5726,6444,5733,8976,6925,1474,4064,4117,7967],"class_list":["post-82846","post","type-post","status-publish","format-standard","hentry","category-media-entertainment","tag-ai","tag-apidesign","tag-fastify","tag-gamedevelopment","tag-genai","tag-investigationgame","tag-llm","tag-opensource","tag-react","tag-typescript","tag-vercel"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Introduction A \u201cyou are the game master\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast is the other design: a short investigation you can finish. AI may turn English into a command. A deterministic\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Harshit Singhal\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"TO THE NEW BLOG\" \/>\n\t\t<meta property=\"og:type\" content=\"blog\" \/>\n\t\t<meta property=\"og:title\" content=\"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"Introduction A \u201cyou are the game master\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast is the other design: a short investigation you can finish. AI may turn English into a command. A deterministic\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/tothenewone.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/tothenewone.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@tothenew\" \/>\n\t\t<meta name=\"twitter:title\" content=\"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Introduction A \u201cyou are the game master\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast is the other design: a short investigation you can finish. AI may turn English into a command. A deterministic\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/tothenewone.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#article\",\"name\":\"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog\",\"headline\":\"From Chatbot Demo to Full-Stack Investigation Game\",\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/harshit-singhal\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/wp-ttn-blog\\\/uploads\\\/2026\\\/09\\\/Mysteries_Data.png\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#articleImage\"},\"datePublished\":\"2026-09-15T09:30:11+05:30\",\"dateModified\":\"2026-10-27T23:14:08+05:30\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#webpage\"},\"articleSection\":\"Media &amp; Entertainment, AI, apidesign, Fastify, GameDevelopment, GenAI, investigationgame, LLM, opensource, react, TypeScript, Vercel\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/media-entertainment\\\/#listItem\",\"name\":\"Media &amp; Entertainment\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/media-entertainment\\\/#listItem\",\"position\":2,\"name\":\"Media &amp; Entertainment\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/media-entertainment\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#listItem\",\"name\":\"From Chatbot Demo to Full-Stack Investigation Game\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#listItem\",\"position\":3,\"name\":\"From Chatbot Demo to Full-Stack Investigation Game\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/media-entertainment\\\/#listItem\",\"name\":\"Media &amp; Entertainment\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\",\"name\":\"TO THE NEW Blog\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/harshit-singhal\\\/#author\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/harshit-singhal\\\/\",\"name\":\"Harshit Singhal\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#authorImage\",\"url\":\"https:\\\/\\\/newersworld-sf-static.tothenew.net\\\/prod\\\/profilePicFolder\\\/4d380118-2bfb-4f7d-94a3-09b129141c83_4923-Harshit-Singhal-PROFILEPICTURE.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Harshit Singhal\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#webpage\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/\",\"name\":\"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog\",\"description\":\"Introduction A \\u201cyou are the game master\\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast is the other design: a short investigation you can finish. AI may turn English into a command. A deterministic\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/from-chatbot-demo-to-full-stack-investigation-game\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/harshit-singhal\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/harshit-singhal\\\/#author\"},\"datePublished\":\"2026-09-15T09:30:11+05:30\",\"dateModified\":\"2026-10-27T23:14:08+05:30\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\",\"name\":\"TO THE NEW Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog","description":"Introduction A \u201cyou are the game master\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast is the other design: a short investigation you can finish. AI may turn English into a command. A deterministic","canonical_url":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#article","name":"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog","headline":"From Chatbot Demo to Full-Stack Investigation Game","author":{"@id":"https:\/\/tothenewone.online\/blog\/author\/harshit-singhal\/#author"},"publisher":{"@id":"https:\/\/tothenewone.online\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/tothenewone.online\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Mysteries_Data.png","@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#articleImage"},"datePublished":"2026-09-15T09:30:11+05:30","dateModified":"2026-10-27T23:14:08+05:30","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#webpage"},"isPartOf":{"@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#webpage"},"articleSection":"Media &amp; Entertainment, AI, apidesign, Fastify, GameDevelopment, GenAI, investigationgame, LLM, opensource, react, TypeScript, Vercel"},{"@type":"BreadcrumbList","@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/tothenewone.online\/blog#listItem","position":1,"name":"Home","item":"https:\/\/tothenewone.online\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/tothenewone.online\/blog\/category\/media-entertainment\/#listItem","name":"Media &amp; Entertainment"}},{"@type":"ListItem","@id":"https:\/\/tothenewone.online\/blog\/category\/media-entertainment\/#listItem","position":2,"name":"Media &amp; Entertainment","item":"https:\/\/tothenewone.online\/blog\/category\/media-entertainment\/","nextItem":{"@type":"ListItem","@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#listItem","name":"From Chatbot Demo to Full-Stack Investigation Game"},"previousItem":{"@type":"ListItem","@id":"https:\/\/tothenewone.online\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#listItem","position":3,"name":"From Chatbot Demo to Full-Stack Investigation Game","previousItem":{"@type":"ListItem","@id":"https:\/\/tothenewone.online\/blog\/category\/media-entertainment\/#listItem","name":"Media &amp; Entertainment"}}]},{"@type":"Organization","@id":"https:\/\/tothenewone.online\/blog\/#organization","name":"TO THE NEW Blog","url":"https:\/\/tothenewone.online\/blog\/"},{"@type":"Person","@id":"https:\/\/tothenewone.online\/blog\/author\/harshit-singhal\/#author","url":"https:\/\/tothenewone.online\/blog\/author\/harshit-singhal\/","name":"Harshit Singhal","image":{"@type":"ImageObject","@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#authorImage","url":"https:\/\/newersworld-sf-static.tothenew.net\/prod\/profilePicFolder\/4d380118-2bfb-4f7d-94a3-09b129141c83_4923-Harshit-Singhal-PROFILEPICTURE.jpeg","width":96,"height":96,"caption":"Harshit Singhal"}},{"@type":"WebPage","@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#webpage","url":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/","name":"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog","description":"Introduction A \u201cyou are the game master\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast is the other design: a short investigation you can finish. AI may turn English into a command. A deterministic","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/tothenewone.online\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/#breadcrumblist"},"author":{"@id":"https:\/\/tothenewone.online\/blog\/author\/harshit-singhal\/#author"},"creator":{"@id":"https:\/\/tothenewone.online\/blog\/author\/harshit-singhal\/#author"},"datePublished":"2026-09-15T09:30:11+05:30","dateModified":"2026-10-27T23:14:08+05:30"},{"@type":"WebSite","@id":"https:\/\/tothenewone.online\/blog\/#website","url":"https:\/\/tothenewone.online\/blog\/","name":"TO THE NEW Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/tothenewone.online\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"TO THE NEW BLOG","og:type":"blog","og:title":"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog","og:description":"Introduction A \u201cyou are the game master\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast is the other design: a short investigation you can finish. AI may turn English into a command. A deterministic","og:url":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/","og:image":"https:\/\/tothenewone.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","og:image:secure_url":"https:\/\/tothenewone.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","twitter:card":"summary","twitter:site":"@tothenew","twitter:title":"From Chatbot Demo to Full-Stack Investigation Game | TO THE NEW Blog","twitter:description":"Introduction A \u201cyou are the game master\u201d chat box is easy. It is also easy to cheat. The model invents a key, walks a lock, or forgets the room. That is improvisation with no referee. The Last Broadcast is the other design: a short investigation you can finish. AI may turn English into a command. A deterministic","twitter:image":"https:\/\/tothenewone.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png"},"aioseo_meta_data":{"post_id":"82846","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"created":"2026-09-09 04:54:16","updated":"2026-10-27 17:44:10","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/tothenewone.online\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/tothenewone.online\/blog\/category\/media-entertainment\/\" title=\"Media &amp; Entertainment\">Media &amp; Entertainment<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tFrom Chatbot Demo to Full-Stack Investigation Game\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/tothenewone.online\/blog"},{"label":"Media &amp; Entertainment","link":"https:\/\/tothenewone.online\/blog\/category\/media-entertainment\/"},{"label":"From Chatbot Demo to Full-Stack Investigation Game","link":"https:\/\/tothenewone.online\/blog\/from-chatbot-demo-to-full-stack-investigation-game\/"}],"_links":{"self":[{"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/posts\/82846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/users\/1768"}],"replies":[{"embeddable":true,"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/comments?post=82846"}],"version-history":[{"count":28,"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/posts\/82846\/revisions"}],"predecessor-version":[{"id":84092,"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/posts\/82846\/revisions\/84092"}],"wp:attachment":[{"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/media?parent=82846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/categories?post=82846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tothenewone.online\/blog\/wp-json\/wp\/v2\/tags?post=82846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}