◆Plaster// After action report
After action report

Changelog

// 45 entries · newest first

Every real change to Plaster, added as part of the work, never batched later.

Task board run R-6: bomb carrier, spectating, sprint stamina, stats page fixes

2026-10-17
  • The bomb has a carrier (T-78, T-74): each Search & Destroy round the bomb lies on the ground just out of the attackers' spawn; an attacker picks it up by running over it and only the carrier can plant. When the carrier is out it drops where they were, for any attacker to pick up. Attackers see a BOMB tag through cover over the loose bomb or its carrier, and the round bar says whether to pick it up, escort the carrier or plant. Bots fetch it, the carrier heads for the site and the rest escort.
  • Spectating (T-73): once you're out you watch a living teammate from just behind them; Space / Ⓐ switches teammate.
  • Sprint stamina (T-76): sprint is 6.2 m/s instead of 7, and lasts about 4.5 s from full. It refills over 3.5 s after you stop; run it dry and you're winded until it's back to 35%. A thin bar over the ammo counter shows it while it isn't full. The server's speed check follows the shared rule.
  • Lobby countdown (T-56): the public lobby's countdown updates its text instead of rebuilding the panel each second, so clicks (Leave) aren't lost.
  • Stats page (T-60, T-77): token totals stay short enough for their tile (464M, then 1.2B) and labels no longer wrap; token times and days are in Eastern time instead of UTC.

Task board run R-5: Search & Destroy, public map rotation, everyone's own marker

2026-10-17
  • Search & Destroy (T-71): a second online mode, in public matchmaking and private lobbies. Rounds with one life each and no respawns; attackers plant the paintball bomb at site A or B (hold F / Ⓨ for 3 s inside the ring), defenders stop them or defuse it (5 s next to the bomb). Attackers win a round when the bomb goes off (30 s after the plant) or every defender is out; defenders win by defusing, by eliminating the attackers before a plant, or when the 90 s round clock runs out. First to 4 rounds; attack and defence swap after round 3. Planting or defusing holds you still and you can't fire.
  • On screen: a round bar under the score (round, your role and goal, players left on each team), A / B letters you can see through cover and rings on the ground, the Hold F prompt and progress bar, round banners, a canister bomb that blinks and beeps faster as it runs down, and a burst of paint over the site when it goes off (anyone within 7 m is out). New sounds: bomb beep, armed, defused, blast.
  • Bomb sites: a new Bomb site object in the map editor's Gameplay group (A or B, radius). Maps without any, Speedball and Woodland included, get two automatic sites between the middle and the defenders' end; at halftime the sites mirror to the other end, so team colours and spawns never change.
  • Bots play the objective: attackers push the round's site while shooting and plant when they reach it, then guard the bomb; defenders hold both sites, then the nearest goes to defuse. The mode's rules live in server/snd.mjs, apart from the match code.
  • Public map rotation (T-67): Find Match has a mode picker, players only meet others who picked the same mode, and public matches rotate through the maps (Speedball → Woodland → …): each new public lobby, and each rematch in one, plays the next map.
  • Your marker in third person (T-43): other players' figures online, and the figures in the menu and lobby, now hold the marker each player picked in Loadout, with its colours, texture or imported model, instead of always the stock one. Bots keep the stock marker. A custom built-in marker costs the same draw calls as the stock one.

Task board run R-4: hitmarker

2026-10-17
  • Hitmarker (T-61): when your paint hits an opponent, four white ticks pop out around the crosshair and fade in about a third of a second, with the hit-confirm tick sound. Works against bots and online players, and shows while aiming down the sights too.

Plaster Engine: the desktop app

2026-10-17
  • Plaster Engine (electron/, npm run engine): a Windows desktop hub for the game, the map editor, POE, the task board, the model showcase and the design docs, each in its own window. The tools are the browser pages, unchanged; the browser versions keep working.
  • Windows: one per tool (opening it again focuses it); links between tools go to the right window; Ctrl+Shift+H back to the hub; unsaved-changes prompts in the map editor and POE; sizes remembered.
  • Dev server: uses one that's running, or starts its own and stops it on quit; a waiting page in tool windows while it's down, which reopens the tool when it's back.
  • Hot reload: tool pages through Vite, the hub by itself; only main-process edits need Engine › Restart. Fixed along the way: edits to the task board's code (src/tasks/) never hot-reloaded, because the dev server ignored every tasks/ folder.
  • Locked down: sandboxed pages without Node; files only through the dev server's APIs.
  • Desktop and Start-menu shortcut: npm run engine:shortcut. Icon built from the game's logo. New Plaster Engine page; installer plan in electron/README.md.

Task board run R-3: crouch, pause screen, Woodland textures, smooth stairs

2026-10-17
  • Crouch ends a sprint (T-59): pressing C / Ctrl / Ⓑ while sprinting crouches at crouch speed even with Shift held; you can't sprint crouched. Shift or L3 still stands you up and sprints.
  • No pause screen when it isn't a pause (T-62): joining a match, starting Practice and the end of a match no longer show it. You're dropped straight in; if the browser hasn't given the game the mouse yet, keys and controller work at once and a hint says Click to aim with the mouse (that click doesn't fire). At the end only the scoreboard shows. Esc / Start still pause.
  • Woodland texture glitches (T-63): the plank texture's top-to-bottom shading made a hard band every metre on walls and a checkerboard on decks and stairs (removed); flush faces flickered where wall posts met plank ends, where the top rail met the plank tops, at container corners and on stair risers (now 1 cm apart).
  • Smooth stairs (T-69): players and bots walk an invisible ramp through the steps instead of hopping each one; paint and sight still hit the steps. Same collision on the server; the editor's collision view draws the slope.
  • New Woodland screenshots; Woodland map v2 on the Versions page.

8v8 private matches

2026-10-17
  • Private lobbies up to 8v8: the host picks 1v1 to 8v8; bots fill the rest. Public matchmaking stays 4v4. Server settings PLASTER_MAX_TEAM and PLASTER_PUBLIC_TEAM.
  • Measured first (all-bot server matches, 3 minutes each): at 8v8 on Woodland the server uses about 0.4 ms of its 33 ms tick and sends each player about 19 KB/s (twice 4v4).
  • Faster collision: each shape has a bounding circle, so movement, paint and sight checks skip far-away ones: about 4× less server time on Woodland, identical results (20,000-check comparison on each map).
  • Lighter player figures: each figure's parts are merged per joint and material (102 meshes → 30), so 16 players cost about 1,100 draw calls on Woodland instead of 2,800. Animation unchanged.
  • Lobby: above 4 per team, a team's open slots share one row so the lobby and Start fit on screen. Four more bot names.

Woodland: the first woodsball map

2026-10-17
  • Woodland (public/maps/woodland.json): 64 × 96 m, about 3.6× Speedball. A plank fort with four doorways and windows in a clearing, an abandoned outpost (shacks, walk-in containers, truck, barrels, crates, pallets, sandbags), a watchtower over a meadow, a sunken creek with a broken footbridge, woods, and winding trails with cross links. Blue's half is mirrored onto red's.
  • Checked: all three routes walk spawn to spawn; tower stairs, fort doors, container and shack all enterable; windows block; no line of sight into a spawn from the far half, the fort or the tower; bots play it offline and on the server; a private online match on it keeps both players in sync.
  • Engine: each map can set its field (Speedball or Woodland look, size, net height); terrain from Hill objects used by movement, paint, sight, bots and the server; objects with several collision parts (doorways you walk under, decks you stand on); stairs you walk up. Speedball plays exactly as before (20,000 random checks, no differences).
  • Looks and speed: grass, dirt, leaf litter and mud blended on the ground; instanced trees, bushes and grass; shared generated textures; static pieces merged per area. About the same draw calls as Speedball.
  • Choosing it: Practice now asks which map; private lobbies already list it. Editor: each map shows its own field, the inspector sets field type and size, new objects land on the terrain, End drops the selection onto it.
  • New Maps page.

Task board run R-2: no dev-tool links in the game, FPS and ping readout

2026-10-16
  • No dev tools in the game: Loadout no longer links to POE; nothing players see points at the editor, POE or the task board (T-57).
  • Settings › FPS counter and Ping: off by default; a small readout top left while playing shows frames per second and, in online matches, the round trip to the game server (T-58).

Task board run R-1: menu tidy, play again with the same players, POE rename/delete

2026-10-16
  • Main menu: Quit and the Task board link removed (T-53).
  • Public matches: when a match ends everyone goes back to the same lobby, with a new countdown, instead of the main menu, so the same players keep playing together; Leave (or Esc) to go (T-54). The menu now also follows its room straight into a match that already started.
  • POE: rename and delete imported models, textures and sounds; delete is refused while a saved map or marker uses the asset, and backs the file up (T-48).
  • The first run worked through by Claude from the task board.

POE: the Plaster Object Editor, configurable markers, asset imports

2026-10-16
  • POE (/poe.html, dev server): asset browser (markers, models, textures, sounds, animations, gameplay objects), 3D preview with a ballistics readout, properties panel, import button.
  • Markers: create, duplicate, rename, delete, restore defaults. Magazine and reserve paint, semi / burst / full-auto, rate of fire, spread, muzzle velocity, drag and drop, reload times, look (colours, texture, or an imported model with clips) and sounds. Validated in POE and again on save; unsaved changes are marked and survive a refresh. Saved to public/markers/markers.json.
  • Real game integration: the game and the multiplayer server use the picked marker's values in the existing weapon code (no second weapon system). Online, the server looks your marker up itself and sends back the stats it plays with. The built-in marker keeps the exact old values.
  • Loadout lists every marker with its real stats and lets you pick one; the HUD shows spare paint for limited-reserve markers.
  • Imports: .glb and .gltf (+ .bin, converted) models, .png/.jpg/.webp textures and .wav/.mp3/.ogg sounds, each checked before it's stored; the same file is never stored twice and nothing is replaced without asking.
  • Map editor: shares the model library with POE and picks up new imports when its tab is focused; File › Manage assets in POE.
  • Fixes on the way: held fire keeps its rate at any frame rate; the server's fire-rate check tolerates network bunching; the editor's key hint says 1 / 2 / 3.
  • New POE page. Unfinished parts are on the task board (T-43 to T-52).

Task board, voice capture, and Claude working through tasks

2026-10-16
  • Task board (/tasks.html, dev server; linked from the main menu): add, edit, delete and complete tasks with a type (feature, bug, improvement, idea), priority, optional area and notes; Pending and Completed lists, filters and search; every task keeps its history. Saved in tasks/board.json in git. The old TODO.md was imported (39 done, 1 needing your input) and archived.
  • Voice capture: a Dictate button on the board, and hold T on the board, the main menu or in a match (dev builds). Release to review: edit the text, type, priority, area and notes before saving. It only adds to the board, never sends anything to Claude; V stays separate.
  • Work through tasks: pick tasks and start a run. Claude plans it (dependencies, related changes batched together), moves tasks to in progress, marks each done only after verifying it, leaves anything that needs you open with the reason, and adds tasks it discovers. Progress, plan and summary show live on the board.
  • Claude link: the board shows when a Claude session is connected (tools/claude-link.mjs); without one, runs wait in the queue and capturing still works.
  • Removed: the old /api/todo and “auto-work”, which could send T items straight to Claude.
  • Works when the dev server drops: new tasks wait in the browser and sync later.
  • New Task board page.

Browser icon; hero splat no longer cut off

2026-10-16
  • Favicon: a lime paint splat on the dark tile now shows in the browser tab for the game, the map editor and every design doc page (also used for bookmarks and home-screen shortcuts).
  • Overview splat: the big paint splat behind the title was cut off: its left-hand drop was sliced at the edge of the image, and the top drips ran under the nav bar. The splat is re-rendered with a margin on every side, stays centred on the title, and is sized so it clears the nav bar on short screens too.

New main menu: 3D lobby, Operators, Progression

2026-10-16
  • Layout: tabs down the left (Play, Loadout, Operators, Progression, Settings, then Fullscreen and Quit), the selected screen in a glass panel, a player card with level and XP, and button hints along the bottom. New bundled fonts (Barlow Condensed, Oswald, Inter).
  • 3D lobby: instead of the fly-around, your player stands at the blue start with the field behind. In Public Match and lobbies your team lines up beside you (bots and see-through open slots included). The camera moves to a different shot per tab: close on the marker for Loadout, full body and turning for Operators.
  • Loadout: the marker's rate of fire, magazine, velocity and reload, read from the game's rules.
  • Operators: call sign, jersey number (1–99) and a blue / red kit preview. Your number is sent to the server and shown in lobbies and matches.
  • Progression: XP and levels, plus career stats for online matches and practice (eliminations, outs, wins, best match, hit rate, time played), saved in this browser.
  • Controls: mouse, keyboard (arrows, Enter, Esc) and controller (D-pad / stick, Ⓐ, Ⓑ, LB/RB to switch tabs).
  • New Main menu page; the old menu is kept on Versions.

Multiplayer

2026-10-16
  • Main menu: Play Online, Practice (the existing offline game), Settings, Fullscreen and Quit, over a fly-around of the field; works with mouse, keyboard and controller.
  • Public matchmaking: joins a forming lobby or a running match (taking over a bot), else opens one. Humans are balanced between teams and bots fill every empty slot for 4v4.
  • Private matches: room code and invite link; the host picks map, team size (1–4) and bots, moves players and starts for everyone; never visible to matchmaking; back to the same lobby after the match.
  • Authoritative server (runs inside npm run dev; npm run server for builds): owns paintballs, hits, eliminations, respawns, score, clock and bots; checks every player's movement and fire request. Leaving or disconnecting hands your place to a bot; reconnecting within the grace time puts you back.
  • In match: other players and bots with team colours and name tags on teammates, score bar and clock, kill feed, hold-Tab scoreboard, end-of-match board. First to 30 eliminations or 5 minutes.
  • Shared simulation: collision, hitboxes, rules and the bot AI now run without graphics (src/sim/), so the server uses the game's own code. Single player is unchanged.
  • Settings: name, mouse sensitivity, controller look speed and invert, field of view, volume.
  • New Multiplayer page.

Controller support and keyboard-only play

2026-10-16
  • Controller: Xbox / PlayStation / standard-layout controllers. Left stick moves (analog: push further to go faster), right stick looks, RT shoots, LT aims, Ⓐ jump, Ⓑ crouch, Ⓧ reload, LB/RB lean, L3 sprint, Start pause. Stick dead zones, a fine-aim response curve, and rumble on firing and on being hit. The menu shows the layout when a controller is connected.
  • Keyboard only: arrow keys look around, Enter shoots, Right Shift aims. Arrow keys no longer move the player (WASD does), and sprint is Left Shift.
  • No mouse capture needed: press Enter or Ⓐ on the menu to play without pointer lock (Esc / Start pauses). If the browser refuses to capture the mouse, as some remote-desktop setups do, the game switches to this mode automatically.
  • Map editor: the arrow keys now look around (WASD still moves), so the editor works without a mouse too.
  • New Controls page.

Import your own models; Unreal-style editor camera

2026-10-16
  • Import 3D models: GLB files (e.g. exported from Blender) can be imported with the asset browser's Import button or by dropping them on the editor. They're saved to public/models/, listed in models.json, and stay in the library after restarts. The game loads them too: placed models render, block players and bots with a box around their bounds, and take paint. Re-importing a model with the same name can replace it (every placed copy updates; the old file is backed up).
  • Real previews: every asset tile in the browser now shows a preview rendered from its actual 3D model instead of a placeholder icon.
  • Camera: hold the right mouse button to look around in place (mouse captured, like Unreal) and fly with WASD, E/Q up/down, Shift faster; the mouse wheel while flying changes camera speed. Alt+left-drag orbits; middle mouse still pans.
  • Fix: maps created with Save As (and newly imported models) couldn't be loaded by the game until the dev server restarted. They're now served straight from disk.

Dev HUD removed; WASD in the map editor

2026-10-16
  • The in-game dev HUD is gone: FPS, Claude usage, tokens, activity feed and to-do panels, plus the V (talk to Claude), T (add a to-do), O (toggle HUD) and M (free the mouse) keys. Building now happens in the map editor, so the game shows only the crosshair, ammo counter and match UI. Esc pause moved into the main controls on the menu.
  • Map editor: WASD or the arrow keys now move the camera on their own (level over the field), with Q/E for down/up and Shift for faster. Holding the right mouse button still lets you look around and fly where you look. The gizmo tools moved from W/E/R to 1/2/3 to make room.
  • The viewport's controls hint now sits on a dark backing so it's readable over the turf.

Design doc catch-up

2026-10-16
  • New menu and Dev HUD screenshots with the green accent and the tokens panel. The old ones are kept as v2 on the Versions page, which also gains the map editor.
  • Stats brought up to date (days, changes, versions, Session 3 log), and the Models page notes which bunker settings the map editor exposes.

Map editor

2026-10-16
  • New visual map editor at editor.html, styled after Unity/Unreal: toolbar, 3D viewport, asset browser, searchable hierarchy and an inspector. See the Map editor page.
  • Select objects in the viewport or hierarchy, move/rotate/scale them with gizmos or exact values, and duplicate, rename, hide, lock or delete them. Supports multi-select, snapping, world/local axes, a grid and a collision overlay, plus full undo/redo.
  • The inspector is built from the asset registry, so each bunker and prop shows its own settings (size, length, team, colors) and only settings the game actually uses.
  • Save, Save As and Open write JSON maps in public/maps/. Every overwrite backs up the old file to map-backups/, the editor checks for changes made on disk, and unsaved work can be recovered after a crash.
  • Play runs the real game on the scene being edited, unsaved changes included, with the same movement, marker, paint, bots and collision. Stop returns you to the editor with selection and undo history intact, and nothing in the game can change the editor’s data.

Maps moved into data files

2026-10-16
  • The speedball field is no longer hard-coded: bunkers, props and spawn zones are loaded from public/maps/default.json through a shared asset registry. index.html?map=name plays another map.
  • Converted from the original code one call at a time. All 31 colliders match the original to within half a micrometre, and before/after screenshots are identical. The original layout stays built in as a fallback, so the game always starts.
  • Spawn zones now set which way you face when you spawn.

Total tokens on the Stats page

2026-10-16
  • The Stats page now leads with total tokens used, with exact counts.
  • Sessions from Windows and from the sandbox now add up instead of overwriting each other.

Green accent

2026-10-16
  • The game menu and the design doc switched their accent from orange to green #A6FF00, including the splat artwork.

Real token tracking

2026-10-12
  • Token usage is now counted from Claude Code's own session transcripts (each response records its exact usage). The dev HUD has a live "Tokens · this project" panel, and the Stats page shows totals per session and per model.
  • Replaces the old "can't be read from inside a session" placeholder on the Stats page, which was wrong.

Design doc rebuilt: briefing look + version history

2026-10-12
  • Restyled the whole design doc to the Plaster motion-graphics look: dark briefing-table backdrop with topo lines, grid, grain and vignette; HUD corner brackets and REC timecode; cut-corner panels; condensed military headings; one orange accent.
  • New Versions page: every model, graphic and sound shows each of its versions side by side. Models and Sounds pages show version history inline, and replaced sounds have play buttons for their old versions.
  • Rebuilt the original v1 models and sounds from the 2026-10-11 code so they can be shown next to the current ones.
  • Models page is now an armory layout with callouts on the marker. Sounds page uses comms-style rows with keycap play buttons and real waveforms.

Full quality pass: field, models, lighting, sound, bots, dev HUD

2026-10-12
FieldGraybox → speedball field: 34 × 50 m turf with paint lines, 5.5 m nets, inflatable bunkers, flags, tents, treeline. Shape-accurate collision; jump onto low bunkers.
LightingSky bounce light and reflections, player-following sharp shadows, contact shadows under bunkers, distance haze.
ModelsNew mag-fed marker (rail, red dot, curved mag, HPA-tank stock) with first-person arms; paintball players with jerseys, masks, pod packs and animation.
Shooting~88 m/s with air drag — paint arcs (~40 m level shot). Red dot centered in ADS. Spread, sway, bob, sprint pose, mag-drop reload. 20-rd mags.
PaintWet, glossy splats that wrap curved bunkers and stick to the body part hit; goggle splat when you're hit.
BotsUse real cover, need line of sight, react, tighten aim, arc shots for drop, lead moving targets, no spawn camping.
Sound20 synthesized sound effects; opponents positioned in 3D.
FixesShots spawning from last frame's camera; round-bunker corner collision; removed muzzle flash (markers don't have one).
Dev HUD"Claude is listening" indicator; voice popup says Sent vs. Saved for later; usage bars.
UIIn-game UI kept minimal on purpose: crosshair dot, ammo counter, start countdown.

Opponent shooting sounds

2026-10-11
  • The opponent's shots now play the same synthesized shot sound as yours, scaled quieter with distance rather than always full volume.

Start-of-match countdown

2026-10-11
  • First time you click to play, a 5-second countdown runs before anything can act (player movement/shooting and the opponent are frozen) — doesn't repeat on later re-locks after Esc or M.

Elimination, magazine/reload, and opponent polish

2026-10-11
  • Any hit now eliminates — real paintball rules, no health bar. The opponent's left arm swings up, it fades out, then respawns elsewhere a bit over a second later. The player has no body model yet for the same animation, so getting hit fades the screen to black, teleports back to spawn, and fades back in; movement freezes for that moment.
  • A hit on the opponent now leaves a paint splat stuck to its actual body (parented to it, so it moves along), not just on walls/floor.
  • Opponent now turns to face you whenever you're in its engagement range, even while stationary — it used to only face its movement direction, so it could be shooting one way while visually facing another.
  • Added a magazine: 15 rounds, R to reload (1.5s, can't fire mid-reload or empty), with a small ammo counter on screen.

First AI opponent, lean/ADS, and a round of bug fixes

2026-10-11
  • First graybox opponent: a red humanoid that wanders the field (same collision as the player) and takes occasional shots at you when in range — green paintballs so you can tell enemy fire apart from your own. No health/damage system yet, so nothing happens on a hit this pass.
  • Lean (Q/E, tilt + sideways peek) and aim-down-sights (right click: narrower FOV, slower movement) shipped, then both needed real fixes: leaning was corrupting the look controls at steep angles (fixed by applying lean only at render time and reverting it immediately, never writing it into the camera's persistent state), and shots fired while leaning spawned from the wrong position (fixed by making the shot computation use that same transient lean transform).
  • The gun viewmodel now renders in its own pass so it stops clipping through nearby walls — and fixing that introduced, then fixed, a regression that blacked out the whole screen (the second render pass's auto-clear was wiping the first one).
  • Lighting: brighter ambient + a dim fill light opposite the sun, so shadowed faces aren't near-black.
  • Paintball flight tuned to go further before dropping (muzzle velocity 40→55, gravity 18→9) — it was landing well short of the far side of the field.

First-person marker, with shooting and real projectile physics

2026-10-11
  • A mag-fed paintball marker viewmodel (body/barrel/foregrip/magazine/grip/stock, built from primitives — no model file) held bottom-right of view. Deliberately no hopper on top, since mag-fed markers load through the magazine, not a gravity loader.
  • Left click fires (150ms cooldown), with a muzzle flash and a recoil kick on the viewmodel.
  • Paintballs spawn from the actual muzzle tip and have real projectile motion — initial velocity plus gravity, so they visibly drop over distance like a real paintball, not a hitscan laser. They disappear on hitting a bunker, wall, or the floor, or after 3 seconds. No splat decals yet.

Crouch (C)

2026-10-11
  • Press C to toggle crouch: half movement speed, camera height drops smoothly from 1.7 to 1.0, and crouching overrides sprint.

First graybox map, and an activity feed filter

2026-10-11
  • A small walkable paintball field: 10 gray box bunkers (two sizes/shades) loosely laid out around spawn, plus a boundary wall marking roughly a 60×60 unit arena. Basic AABB collision — you can't walk through the boxes (no jump/crouch yet).
  • The Claude Activity panel now has a "Show: All / Text only" toggle — Text only hides tool-call lines and shows just what I say. Remembered per-browser.
  • Both shipped via the auto-work toggle chaining straight through the two items that were already queued when it was turned on.

Auto-work toggle for the backlog

2026-10-11
  • A button on the To-Do panel (Auto-work: ON/OFF) controls whether a new item added with T gets worked on immediately versus just sitting queued like before. When on, new items surface to Claude through the same channel V uses, and Claude chains through the rest of the pending list rather than stopping after one.
  • State persists to .auto-work-state.json and is off by default — nothing runs on autopilot until it's explicitly turned on.

Fixed to-do list not updating live, and a true terminal mirror

2026-10-11
  • Found the root cause of the to-do panel not updating right after adding an item with T: the project folder is mounted over virtiofs, which doesn't reliably deliver inotify events — so fs.watch() on TODO.md was silently not firing. The T-command path now broadcasts directly instead of waiting on a watcher, and the watcher itself switched to mtime polling (fs.watchFile) so external edits (me checking items off) still update live too.
  • Replaced manual activity-feed pushes with an automatic relay: a small script tails this Claude Code session's own transcript file and mirrors every real tool call and message into the HUD in near-real-time — a true terminal mirror instead of curated snippets.

Real Claude usage numbers in the HUD

2026-10-11
  • The "5-hour window" / "weekly window" usage panel now shows real percentages, polled server-side from the same (undocumented) endpoint Claude Code's own /usage uses.
  • The OAuth token is read from ~/.claude/.credentials.json and used only on the server — it's never sent to the browser, only the resulting percentages/reset times are.
  • Polling backs off automatically on rate limiting/errors (up to 30 min) and persists its schedule to .claude-usage-cache.json so a server restart doesn't trigger an immediate re-fetch.

HUD follow-ups: scrollable, pending-only, denser activity feed

2026-10-11
  • Hold M to release the mouse without opening the full menu overlay — lets you scroll the HUD panels, press M again to re-lock and resume play.
  • To-do panel now shows only pending items; completed items disappear instead of showing struck-through.
  • Activity feed is much denser now (a line per real action, not just milestones) with a taller panel to match — closer to watching a live terminal.

Dev HUD (toggle with O)

2026-10-11
  • Top-right: a live Claude activity feed (pushed over Vite's dev websocket whenever Claude does something notable) and a to-do panel showing TODO.md's pending/done items plus what's currently being worked on.
  • Top-left: an FPS counter (current + session minimum) and a Claude-usage panel for 5-hour/weekly limits — built but intentionally shows "N/A": there's no way for Claude to read actual account usage numbers from inside a coding session, so it's not faked.
  • TODO.md is watched on disk, so checking an item off updates the HUD live without a page reload.

Hold T to add a voice backlog item

2026-10-11
  • Hold T instead of V to speak something that gets added to TODO.md as a checklist item instead of acted on immediately — for queuing up requests to work through later.
  • Q-to-cancel works for both V and T. The listening indicator is now color-coded: orange for an immediate command, blue for a backlog item.

Cancel a voice command mid-talk

2026-10-11
  • Hold Q while holding V to abort the current voice command — it's discarded instead of sent, with a brief "Cancelled" indicator.

Game concept defined: mag-fed paintball multiplayer FPS

2026-10-11
  • Plaster is a first-person multiplayer shooter built around real mag-fed paintball markers, not firearms.
  • Pacing/movement target: old-school CoD4 (2007) / World at War (2008) feel.
  • Design document site created (this site) with Overview, Changelog, Stats, and Features pages.

Push-to-talk voice commands

2026-10-11
  • Hold V in-game to speak a command; browser transcribes via the Web Speech API and posts it to a same-origin /api/voice route baked into the Vite dev server.
  • Commands are appended to voice-commands.log and watched live during dev sessions so spoken requests can be acted on without leaving the game.

Three.js deprecation cleanup

2026-10-11
  • Replaced deprecated THREE.Clock with THREE.Timer in the main render loop.
  • PCFSoftShadowMap was removed upstream in r186; switched to PCFShadowMap.

Fixed dev server not reachable over published port

2026-10-11
  • Host published both an IPv4 (127.0.0.1) and IPv6 (::1) mapping for port 5173, but Vite was only bound to IPv4 — browsers resolving localhost to IPv6 first got nothing.
  • Bound Vite's dev server to :: for dual-stack IPv4/IPv6 so both mappings work.

Fixed broken first-person controls on spawn

2026-10-11
  • The installed three.js version removed PointerLockControls.getObject() — the camera is now driven directly via controls.object. Updated movement code accordingly.

Initial scaffold

2026-10-11
  • Project set up with Vite + three.js.
  • Empty-world spawn: procedural physically-based sky (Sky addon, no external HDRI) with a matching directional sun light.
  • 60×60 tiled floor with a procedurally generated grout texture, shadow-receiving.
  • First-person spawn with PointerLockControls — WASD + mouse look, shift to sprint.