{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"project","url":"https://ejfox.com/projects/subway-builder","json_url":"https://ejfox.com/projects/subway-builder.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<p class=\"\">The mission, as I see it: hyperstitioning public transit into every American city. Subway Builder is a game created by Colin Miller, a member of Room 302 Studio, in 2025 — a sort of Ender's Game for transit, using realistic simulations to let train-people SHOW their elected leaders what is and is not possible.</p>\n<p class=\"\">The game itself: a transit simulation (an Electron build) — design train types with realistic acceleration, capacity, and cost parameters, lay networks over real-world geography, and analyze the demand you create. It launched on Steam in July 2026. My corner of it: code contributions, Steam release infrastructure, and spin-offs like <code class=\"md-inline-code\">subway-builder-mods</code> and a Pico-8 demake.</p>\n<p class=\"\">It's also a success story for <a href=\"https://room302.studio\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://room302.studio\">Room 302 Studio</a> — Colin grew from a studio member to having the studio support his effort, and I wanna do that for more people and their dream apps and games.</p>\n<figure role=\"figure\" aria-label=\"Subway Builder construction mode — laying track in an isometric city\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780066321/projects/subway-builder/build.png\" alt=\"Subway Builder construction mode — laying track in an isometric city\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1780066321/projects/subway-builder/build.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1780066321/projects/subway-builder/build.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780066321/projects/subway-builder/build.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1780066321/projects/subway-builder/build.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Subway Builder construction mode — laying track in an isometric city\" width=\"2560\" height=\"1440\" style=\"--splay-rot:0.6deg;\" data-dimensions=\"2560×1440\" class=\"img-full my-8 rounded-sm img-splay aspect-video w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Subway Builder construction mode — laying track in an isometric city</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"A subway network laid over real geography\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780066322/projects/subway-builder/map.png\" alt=\"A subway network laid over real geography\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1780066322/projects/subway-builder/map.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1780066322/projects/subway-builder/map.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780066322/projects/subway-builder/map.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1780066322/projects/subway-builder/map.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"A subway network laid over real geography\" width=\"2556\" height=\"1518\" style=\"--splay-rot:0.6deg;\" data-dimensions=\"2556×1518\" class=\"img-full my-8 rounded-sm img-splay aspect-video w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">A subway network laid over real geography</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Train-type editor with full simulation parameters\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780066323/projects/subway-builder/trains.png\" alt=\"Train-type editor with full simulation parameters\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1780066323/projects/subway-builder/trains.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1780066323/projects/subway-builder/trains.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780066323/projects/subway-builder/trains.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1780066323/projects/subway-builder/trains.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Train-type editor with full simulation parameters\" width=\"1800\" height=\"2262\" style=\"--splay-rot:-1.9deg;\" data-dimensions=\"1800×2262\" class=\"img-full my-8 rounded-sm img-splay aspect-[3/4] w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Train-type editor with full simulation parameters</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"A 3D transit map — blue rail lines and teal stations across a metropolitan area\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757165888/screenshot_2025-09-06_at_9.37.55_AM.png\" alt=\"A 3D transit map — blue rail lines and teal stations across a metropolitan area\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1757165888/screenshot_2025-09-06_at_9.37.55_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1757165888/screenshot_2025-09-06_at_9.37.55_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757165888/screenshot_2025-09-06_at_9.37.55_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1757165888/screenshot_2025-09-06_at_9.37.55_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"A 3D transit map — blue rail lines and teal stations across a metropolitan area\" width=\"2400\" height=\"1600\" style=\"--splay-rot:-0.84deg;\" data-dimensions=\"2400×1600\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">A 3D transit map — blue rail lines and teal stations across a metropolitan area</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"A Manhattan line running in simulation — stations and real-time train arrivals\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757696787/screenshot_2025-09-12_at_1.06.14_PM.png\" alt=\"A Manhattan line running in simulation — stations and real-time train arrivals\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1757696787/screenshot_2025-09-12_at_1.06.14_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1757696787/screenshot_2025-09-12_at_1.06.14_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757696787/screenshot_2025-09-12_at_1.06.14_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1757696787/screenshot_2025-09-12_at_1.06.14_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"A Manhattan line running in simulation — stations and real-time train arrivals\" width=\"2400\" height=\"1600\" style=\"--splay-rot:-2.89deg;\" data-dimensions=\"2400×1600\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">A Manhattan line running in simulation — stations and real-time train arrivals</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Elevated parallel tracks from Vernon Ave to Bleecker St — $538M of imaginary money\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757719938/screenshot_2025-09-12_at_7.32.05_PM.png\" alt=\"Elevated parallel tracks from Vernon Ave to Bleecker St — $538M of imaginary money\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1757719938/screenshot_2025-09-12_at_7.32.05_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1757719938/screenshot_2025-09-12_at_7.32.05_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757719938/screenshot_2025-09-12_at_7.32.05_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1757719938/screenshot_2025-09-12_at_7.32.05_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Elevated parallel tracks from Vernon Ave to Bleecker St — $538M of imaginary money\" width=\"1796\" height=\"2262\" style=\"--splay-rot:-1.91deg;\" data-dimensions=\"1796×2262\" class=\"img-full my-8 rounded-sm img-splay aspect-[3/4] w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Elevated parallel tracks from Vernon Ave to Bleecker St — $538M of imaginary money</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Generating train service across the NYC network\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1758896118/screenshot_2025-09-26_at_10.15.05_AM.png\" alt=\"Generating train service across the NYC network\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1758896118/screenshot_2025-09-26_at_10.15.05_AM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1758896118/screenshot_2025-09-26_at_10.15.05_AM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1758896118/screenshot_2025-09-26_at_10.15.05_AM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1758896118/screenshot_2025-09-26_at_10.15.05_AM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Generating train service across the NYC network\" width=\"2400\" height=\"1600\" style=\"--splay-rot:1.11deg;\" data-dimensions=\"2400×1600\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Generating train service across the NYC network</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"The construction panel — track and station options with live cost estimates\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757693265/screenshot_2025-09-12_at_12.07.32_PM.png\" alt=\"The construction panel — track and station options with live cost estimates\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1757693265/screenshot_2025-09-12_at_12.07.32_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1757693265/screenshot_2025-09-12_at_12.07.32_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757693265/screenshot_2025-09-12_at_12.07.32_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1757693265/screenshot_2025-09-12_at_12.07.32_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The construction panel — track and station options with live cost estimates\" width=\"2400\" height=\"1600\" style=\"--splay-rot:-2.09deg;\" data-dimensions=\"2400×1600\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The construction panel — track and station options with live cost estimates</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Achievements: 2 of 9 unlocked — Track Builder and First Station\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757555519/screenshot_2025-09-10_at_9.51.45_PM.png\" alt=\"Achievements: 2 of 9 unlocked — Track Builder and First Station\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1757555519/screenshot_2025-09-10_at_9.51.45_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1757555519/screenshot_2025-09-10_at_9.51.45_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1757555519/screenshot_2025-09-10_at_9.51.45_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1757555519/screenshot_2025-09-10_at_9.51.45_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Achievements: 2 of 9 unlocked — Track Builder and First Station\" width=\"2400\" height=\"1600\" style=\"--splay-rot:1.06deg;\" data-dimensions=\"2400×1600\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Achievements: 2 of 9 unlocked — Track Builder and First Station</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"The transit-operations event log — the simulation keeps receipts\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1759077479/screenshot_2025-09-28_at_12.37.44_PM.png\" alt=\"The transit-operations event log — the simulation keeps receipts\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1759077479/screenshot_2025-09-28_at_12.37.44_PM.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1759077479/screenshot_2025-09-28_at_12.37.44_PM.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1759077479/screenshot_2025-09-28_at_12.37.44_PM.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1759077479/screenshot_2025-09-28_at_12.37.44_PM.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The transit-operations event log — the simulation keeps receipts\" width=\"3600\" height=\"2338\" style=\"--splay-rot:0.99deg;\" data-dimensions=\"3600×2338\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The transit-operations event log — the simulation keeps receipts</figcaption>\n</figure>\n<h2 class=\"\" id=\"metro-savefile-doctor\">Metro Savefile Doctor</h2>\n<figure role=\"figure\" aria-label=\"Metro Savefile Doctor — current game analysis\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/metro-savefile-doctor/ui-1.png\" alt=\"Metro Savefile Doctor — current game analysis\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/metro-savefile-doctor/ui-1.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/metro-savefile-doctor/ui-1.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/metro-savefile-doctor/ui-1.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/metro-savefile-doctor/ui-1.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Metro Savefile Doctor — current game analysis\" width=\"2000\" height=\"1400\" style=\"--splay-rot:-1.89deg;\" data-dimensions=\"2000×1400\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Metro Savefile Doctor — current game analysis</figcaption>\n</figure>\n<p class=\"\"><a href=\"https://github.com/ejfox/metro-savefile-doctor\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://github.com/ejfox/metro-savefile-doctor\">Metro Savefile Doctor<svg class=\"inline-block w-4 h-4 ml-1 opacity-50 dark:opacity-75 group-hover:opacity-100 transition-opacity align-text-bottom\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" class=\"\"></path></svg></a> is a TUI (and cross-platform Tauri desktop app) for editing Subway Builder save files, in both JSON and <code class=\"md-inline-code\">.metro</code> binary formats, with auto-backup. It edits money, game time, train count, and ticket price through an interactive terminal interface with a crackintro aesthetic.</p>","title":"Subway Builder","metadata":{"title":"Subway Builder","date":"2026-05-01T04:00:00.000Z","category":"Games","featured":true,"url":"https://github.com/ejfox/subway-builder-mods","tech":["JavaScript","Simulation","Transit","Game Modding"],"state":"evolved","ai-involvement":"ai-assisted","tags":["games","simulation","transit","dataviz"],"words":306,"images":11,"imageDetails":{"total":11,"cloudinary":11,"withDimensions":0},"links":2,"codeBlocks":0,"headers":{"h2":1},"toc":[{"text":"Metro Savefile Doctor","slug":"metro-savefile-doctor","level":"h2","children":[]}],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/subway-builder.json","html":"https://ejfox.com/projects/subway-builder","index":"/projects.json"}}