43713d6b79257d8d9b1705b687cc20dc1c0771a0
By Other Means Control Timer
A round timer for By Other Means, a diplomacy/wargame-style event. Each 40-minute round is broken into four phases (Negotiation, Plenary, Discussion, Orders), and this app tracks elapsed time and displays the current phase to players.
- Start Round begins the timer and highlights the active phase as time passes.
- Once running, the button switches to Prepare Next Round, which asks for confirmation before resetting the timer for the next round.
- Time past the round length is shown in red and pulses to flag overtime.
Phase names, durations, descriptions, and colors are defined in src/utils/constants.ts.
Tech Stack
Built with TanStack Start (file-based routing via TanStack Router), React 19, Redux Toolkit + redux-persist for timer state, Luxon for time handling, and Tailwind CSS for styling.
Getting Started
npm install
npm run dev
The dev server runs on port 8000 (see vite.config.ts).
Building For Production
npm run build
A Dockerfile is included for containerized deployment.
Linting & Formatting
This project uses Biome for linting and formatting.
npm run lint
npm run format
npm run check
Project Structure
src/routes/— file-based routes (__root.tsx,index.tsx)src/pages/Welcome.tsx— main timer viewsrc/components/—PhaseandConfirmModalUI componentssrc/store/— Redux store,timeSlice(start time) andphaseSlicesrc/utils/— phase/round constants, helper functions, and types
Learn More
Description
Languages
TypeScript
63.6%
Go Template
22.3%
Makefile
11.5%
HTML
1.6%
CSS
0.5%
Other
0.5%