PTT // PHANTOM THIEVES TOOLKIT MOCK VERSION
PRIVATE PORTFOLIO EXHIBIT

PHANTOM THIEVES TOOLKIT
MOCK WALKTHROUGH

The Phantom Thieves Toolkit is a live, timed, team puzzle event, produced and run in-house. It ran in December 2025: four back-to-back sessions, 119 guests in total, two rival teams per session.

A session worked like this. Guests arrived at a themed venue, registered on their own phones, and split into two crews. For two twenty-minute rounds, each crew swept one zone of the space and worked the puzzle stations built into it: printed props, mounted terminals, physical objects to handle. Then the zones swapped. Costumed actors were present the entire night and stayed in character throughout. Some carried the physical tools a puzzle required, and all of them were trained to steer a stuck team with hints delivered inside their character, so a crew got moving again without feeling like they had been told the answer. Staff broadcasts ended each round with a timed evacuation back to the hub, and the night closed with both crews in one room, phones out, playing a collective deduction finale together.

Every puzzle was written for this specific venue and setting. The app on each guest's phone tied it together: the shared timer, the live score board, answer submission with photo proof, the broadcasts, and the finale vote.

THIS PAGE IS A MOCK. HERE IS WHY. The real deployment is a PHP backend, a SQLite state file, and a phone client that only makes sense with thirty people in a room and an organizer driving the phases. If you opened the actual app you would see a registration form bound to a game that ended in December, a timer at zero, and none of the twenty stations, because the stations were physical: printed cards, props, actors, and terminals mounted in the space. This page shows the pieces instead. The puzzle interfaces below are taken from the event build itself, the numbers in the finale and backend sections come from the recorded event database, and near the bottom there is a full copy of the app running against a simulated backend, so even the live game is playable here.

The amber bar at the bottom describes what attendees were doing at each point. Every puzzle has a reveal button. Play or skim.

EXHIBIT 01

THE PLAYER APP, REPLAYING A REAL ROUND

Each attendee's phone showed a countdown, their team's live board, and broadcast messages from mission control. The replay below is Session 2, Round 2, reconstructed from the event database: every solve and every broadcast fires at its recorded time, compressed to about forty seconds.

TEAM: CHAOSCN: VIPER
20:00
PHASE: ROUND 2 // ZONE SWAP
Awaiting mission control...

LIVE BOARD

CHAOS
DEFIANCE
// Press REPLAY ROUND 2 to watch the recorded round play out here.
1 real minute plays in about 2 seconds
FIELD NOTE To claim a puzzle, a team member typed the answer word and attached a photo of the solved physical prop as proof. The board cell lights when the backend accepts it, on every teammate's phone. The three broadcasts near the end of the replay were the evacuation call, sent by staff from the admin console.
EXHIBIT 02

FOUR OF THE TWENTY STATIONS

Every station resolved to a single answer word. Solve them, or press REVEAL SOLUTION and move on. Nothing on this page is scored.

FIELD NOTE // THE STATIONS AROUND THESE The four below are the ones that translate to a browser. Most of the twenty were physical: card decks, printed logs, objects hidden in the space, and stations where the required tool was in an actor's hands and had to be asked for in character. More puzzles can be provided on request.

A // SHADOW TRACE TERMINAL (actual in-room screen, unmodified)

ZONE 1 // MOUNTED TERMINAL // FILE: a8futtra.html
Five of the fifteen nodes are encrypted AES-256; the decoys are anything else. Click the AES nodes in timestamp order: 03:47:12, 03:48:29, 03:49:51, 03:50:18, 03:51:06. Keyword earned: HERMIT.

B // THE UNTOUCHABLE SECURITY LOG (actual in-room screen + rebuilt paper sheet)

FIELD NOTE In the room, the DECRYPT password was earned at another station. For this demo it is PYRAMID.
ZONE 2 // MOUNTED TERMINAL // FILE: b1seclog.html
INCIDENT REPORT (printed handout)
A tracking device was planted in the back room at exactly 11:00 PM. The saboteur:
  1. was inside at exactly 11:00 PM
  2. entered alone (no other entry within 4 minutes either side)
  3. was not the first person to enter
  4. exited after 11:00 PM
  5. entered before 10:55 PM
NAME THE SABOTEUR
Rules 1 and 4 clear everyone who left before 11:00 or arrived after (Ren, Ryuji, Makoto, Yukari, Ann). Rule 5 clears Haru (entered 10:58). Rule 3 clears Iwai (first in). Rule 2 clears Yusuke (Yukari entered 3 minutes before him). That leaves YUKIKO. Her log keyword is the answer word: INABA.

C // METAVERSE NAV (photographed in-room prop + actual terminal, unmodified)

FIELD NOTE This works on this page exactly the way it worked in the room. Paste a coordinate pair into Google Maps, name the landmark, type it into the terminal (letters only, no spaces), and note which letter the decryption key points at. Eight landmarks give eight letters, which spell the answer word.
The landmarks, in target order: Inokashira Park (letter 8), Shibuya Scramble (8), Tokyo National Museum (10), National Diet Building (8), Akihabara Station (5), Shinjuku Station (10), Ueno Park (2), Kanda Myojin Shrine (4). The kept letters spell ISOLATED.

D // FOX'S COMM LINK (page from the player app, logic unmodified)

PLAYER APP TAB // EXTRACTED FROM s2/index.html
The security answer is ART. Then guide Fox to the five real locations: Takemi Medical Clinic, Big Bang Burger, Cafe Leblanc, Jazz Jin, Meiji Shrine. He hands over the answer word: GLASSES.
EXHIBIT 03

THE FINALE, WITH THE REAL ROOM'S VOTES

The finale is ten multiple-choice questions that identify a mystery Palace and its ruler. Each puzzle solved during the rounds carried two intel hints, forty in total. The engine dealt them round-robin, so each attendee held a different slice on their phone. A share button posted a hint to everyone's feed.

One rule matters before you vote: any registered attendee who does not vote is counted as support for the correct answer, called Phantom Support. A locked phone never costs the room a point, and a wrong vote carries risk where abstaining does not.

Below are two of the ten questions from Session 2. Vote, then the page shows the recorded votes of the 30 attendees in that room. This room finished 10 out of 10; across the four sessions the scores were 9, 10, 10, 10.

FINALE Q7

Cognitive residue traces the ruler's obsession to...

SHADOW shared: The countryside holds this heart, not the city (Secured by DEFIANCE)
VEIL shared: Population: small. Secrets: large. (Secured by DEFIANCE)
ZERO shared: The countryside holds this heart, not the city (Secured by CHAOS)
SAGE shared: Population: small. Secrets: large. (Secured by CHAOS)
FINALE Q10

Stealing this treasure will shatter the desire to...

No hints were shared for this question. The room was on its own.
EXHIBIT 04

THE BACKEND, SHOWING RECORDED EVENT DATA

Everything below is Session 2's actual database: who registered and when, every accepted solve with its claimant, the broadcast log, and the finale vote counts. Codenames were assigned from a pool, so nothing here identifies an attendee.

SESSION 1
ACES vs BLADES
24 attendees
finale 9/10
SESSION 2
CHAOS vs DEFIANCE
30 attendees, 192 finale votes
finale 10/10
SESSION 3
EMBERS vs FATES
34 attendees, 210 finale votes
finale 10/10
SESSION 4
GLITCH vs HAVOC
31 attendees, 209 finale votes
finale 10/10
FIELD NOTE // OPERATIONS Four sessions ran back to back in one afternoon on this stack, each on its own isolated database. Staff controls covered phase changes, timer extensions, manual score corrections, entity resets, and driving the finale question by question. The ADMIN entries in the solve feed are manual credits issued from the console.
EXHIBIT 05

THE APP ITSELF, PLAYABLE

The app is the attendee's mission device. Each person opened it on their own phone and used it to register a codename, watch the shared timer, follow the live board, submit answer words with photo proof, receive staff broadcasts, and vote in the finale. Staff drove the game from a separate admin console against the same backend.

The copy below is the real Session 2 client file. One script is added to it: the PHP backend is swapped for an in-page mock seeded with the recorded event state, and the recorded room plays along as you go. Solves trickle onto the board during Round 2 and the recorded votes arrive after you open a finale question.

SESSION 2 CLIENT // FILE: s2/index.html + sandbox.js
OPEN THE APP Opens in a new tab. Best viewed at phone width.
FIELD NOTE // HOW TO PLAY THE SANDBOX Register a codename on either team. The game starts in Round 2, so the answer lock from the live event applies: on CHAOS, the words INABA or ISOLATED from the exhibits above will land; on DEFIANCE, GLASSES or HERMIT will. An amber MC panel in the corner stands in for the staff console: use it to switch rounds, move to the finale, open questions, and score votes. Differences from the event build: no photo proof required (event phones attached a camera shot with every solve), character art is replaced with placeholders, and audio files are not included.
EXHIBIT 06

HOW THE MULTIPLAYER RAN LIVE

The whole system is one PHP file and one SQLite database per session, running on ordinary shared web hosting. The player app and the staff console are single HTML files. There is no framework and no build step. Deploying a session means copying a folder to the server.

Multiplayer works by polling. Every phone asks the server for the current game state every two seconds and redraws from the answer: the phase, the timer, the latest broadcasts, both teams' boards, and during the finale that player's dealt hints and vote status. Thirty phones asking every two seconds is a light load for the server. Because the phone holds nothing important, a device that sleeps, refreshes, or dies loses nothing: the codename is remembered locally, the server recognizes it on reconnect, and all progress lives in the database.

The server is the referee. It checks answers, enforces which puzzles each team may submit in the current round, rejects duplicates, and scores the finale. The phone only displays state and collects input, so nothing a player does to their own device can cheat the game. A solve submission carries the answer word plus a photo of the solved prop, taken and compressed on the phone, stored on the server, and visible to the whole room on the next poll.

The live game is a handful of values in the database: current phase, timer, finale state. The staff console edits those values through the same API behind a password. During the event, staff used it to start rounds, extend a timer, credit a solve by hand, reset a stuck team, and run the finale question by question. Timing is data rather than code, so a round could be stretched while it was running, and one was.

The finale deal is computed server-side: forty hints tied to the twenty puzzles are split evenly across each team's roster, so every phone receives its own unique share and gets the same share back after a refresh. Votes can be changed until staff locks the question. Anyone who never votes is counted toward the correct answer, and the room's most-picked choice is compared against the key.

Each of the four sessions was a separate copy of the folder with its own database, so the games ran back to back with no shared state and no cleanup between them. Two shortcuts were deliberate: polling instead of live push, because a two-second delay is invisible in a physical room, and one shared staff password, acceptable for a single night with a trusted crew. A public deployment would replace both.

STACK
  • PHP, one self-contained API file per session
  • SQLite, one database file per session
  • HTML, CSS, and JavaScript with no framework; single-file clients
  • Apache on shared hosting
  • HTTP polling every 2 seconds as the multiplayer transport
  • Multipart photo upload for solve proof
  • localStorage for session recovery on the phone
WHAT THIS IS UNDERNEATH

UNDERNEATH THE THEME

Teams, answer keys, hint pools, finale content, and phase timing are configuration. The mechanics stay the same under any theme: timed rounds, photo-proof solves, a live board, and a hint-splitting finale.

Built and operated in-house. Ran December 2025.

FIELD GUIDE Scroll to begin. This bar describes what the room was doing at each exhibit.