{"$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":"<!-- Role clarified 2026-07-30: Colin's project, EJ is a dev on it. -->\n<p class=\"\">Subway Builder is Colin's game — I'm one of the devs on it. The mission, as I see it: hyperstitioning public transit into every American city. It's like Ender's Game for transit — using realistic data to let train-people SHOW their elected leaders what is and is not possible, via realistic simulations.</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>","title":"Subway Builder","metadata":{"title":"Subway Builder","date":"2026-05-01T04:00:00.000Z","category":"Art","featured":false,"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":263,"images":10,"imageDetails":{"total":10,"cloudinary":10,"withDimensions":0},"links":11,"codeBlocks":0,"headers":{},"toc":[],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/subway-builder.json","html":"https://ejfox.com/projects/subway-builder","index":"/projects.json"}}