diff --git a/.env.example b/.env.example index ca23906a..7eb09538 100644 --- a/.env.example +++ b/.env.example @@ -81,6 +81,7 @@ GIT_AUTHOR_EMAIL=your-username@users.noreply.github.com # NEXT_PUBLIC_AUTHOR_TWITCH=TwitchUsername # NEXT_PUBLIC_AUTHOR_TWITTER=TwitterHandle # NEXT_PUBLIC_AUTHOR_WEBSITE=https://yourwebsite.com +# NEXT_PUBLIC_AUTHOR_YOUTUBE=YouTubeHandle # NEXT_PUBLIC_BASE_PATH=/my-repo # NEXT_PUBLIC_BASE_URL=https://yourdomain.com # Messaging backend selector (#266): 'supabase' (default) or 'dotnet'. diff --git a/public/blog/ride-the-open-source-city.md b/public/blog/ride-the-open-source-city.md index 70f73d9e..67416623 100644 --- a/public/blog/ride-the-open-source-city.md +++ b/public/blog/ride-the-open-source-city.md @@ -118,8 +118,11 @@ If you'd rather have hands-on help on _your_ game, there's a paid lane too: live - ๐ŸŽฎ **[Try the engine demo](https://scripthammer.com/game/cod-skeleton)** โ€” the bare test level, no city. - ๐Ÿšฒ **[Play the city](https://scripthammer.com/chatt/?diorama&walk)** โ€” first person, press **B** for the bike. - ๐Ÿ“ฆ **[Clone the engine](https://github.com/TortoiseWolfe/ScriptHammer)** โ€” MIT, asset-free, `@/lib/cod`. -- ๐Ÿ“บ **[Watch me build it](https://twitch.tv/TurtleWolfe)** โ€” live on Twitch. +- ๐Ÿ“บ **[Watch me build it live](https://twitch.tv/TurtleWolfe)** โ€” on Twitch, with the replays on [YouTube](https://youtube.com/@JonathanPohlner). - ๐Ÿ’ณ **[See what help costs](https://scripthammer.com/pricing)** โ€” free to Office Hours to done-for-you. +- ๐Ÿ“… **[Book 15 minutes](https://calendly.com/turtlewolfe/15min-1)** โ€” bring a screenshot of what you have in mind. - ๐Ÿ—บ๏ธ **[Read the brainstorm that started this](https://scripthammer.com/blog/playable-city-chattanooga)**. +Find me everywhere: [scripthammer.com](https://scripthammer.com) ยท [Twitch](https://twitch.tv/TurtleWolfe) ยท [YouTube](https://youtube.com/@JonathanPohlner) ยท [X](https://twitter.com/JonPohlner) ยท [LinkedIn](https://linkedin.com/in/pohlner) ยท [GitHub](https://github.com/TortoiseWolfe) + Then tell me in the comments: what's the one game in your notebook you'd build first if the boring 20% were already done? diff --git a/scripts/generate-author-config.js b/scripts/generate-author-config.js index 1831097e..c23950cc 100644 --- a/scripts/generate-author-config.js +++ b/scripts/generate-author-config.js @@ -66,6 +66,9 @@ const authorConfig = { twitch: process.env.NEXT_PUBLIC_AUTHOR_TWITCH ? `https://twitch.tv/${process.env.NEXT_PUBLIC_AUTHOR_TWITCH}` : '', + youtube: process.env.NEXT_PUBLIC_AUTHOR_YOUTUBE + ? `https://youtube.com/@${process.env.NEXT_PUBLIC_AUTHOR_YOUTUBE}` + : '', website: process.env.NEXT_PUBLIC_AUTHOR_WEBSITE || '', email: process.env.NEXT_PUBLIC_AUTHOR_EMAIL || '', }, diff --git a/src/app/blog/[slug]/page.tsx b/src/app/blog/[slug]/page.tsx index 7b5feda8..cf68a1d0 100644 --- a/src/app/blog/[slug]/page.tsx +++ b/src/app/blog/[slug]/page.tsx @@ -129,6 +129,13 @@ async function getAuthor(id: string): Promise { displayOrder: displayOrder++, }); } + if (authorConfig.social.youtube) { + socialLinks.push({ + platform: 'youtube', + url: authorConfig.social.youtube, + displayOrder: displayOrder++, + }); + } return { id: authorConfig.id, diff --git a/src/config/author-generated.ts b/src/config/author-generated.ts index 5d2352c2..56a6439c 100644 --- a/src/config/author-generated.ts +++ b/src/config/author-generated.ts @@ -16,6 +16,7 @@ export const authorConfig = { twitter: 'https://twitter.com/JonPohlner', linkedin: 'https://linkedin.com/in/pohlner', twitch: 'https://twitch.tv/TurtleWolfe', + youtube: 'https://youtube.com/@JonathanPohlner', website: '', email: '', }, diff --git a/src/config/authors.ts b/src/config/authors.ts index e1715ae5..c17e9b48 100644 --- a/src/config/authors.ts +++ b/src/config/authors.ts @@ -16,6 +16,7 @@ export interface AuthorSocialLinks { mastodon?: string; bluesky?: string; twitch?: string; + youtube?: string; } export interface AuthorPreferences { @@ -137,6 +138,9 @@ const getAuthorSocialFromConfig = (): AuthorSocialLinks => { if (authorConfigData.social.twitch) { social.twitch = authorConfigData.social.twitch; } + if (authorConfigData.social.youtube) { + social.youtube = authorConfigData.social.youtube; + } return social; }; diff --git a/src/lib/blog/blog-data.json b/src/lib/blog/blog-data.json index f5dda62d..acee7169 100644 --- a/src/lib/blog/blog-data.json +++ b/src/lib/blog/blog-data.json @@ -4,7 +4,7 @@ "id": "post_50de87ab", "slug": "ride-the-open-source-city", "title": "Why Build One Game When You Can Build All the Games?", - "content": "\n# ๐Ÿ•น๏ธ Why Build One Game When You Can Build All the Games?\n\nYou have a notebook โ€” or a Notes app, or a Discord full of half-finished pitches โ€” with ten game ideas in it. You have shipped zero. Not because the ideas are bad, but because every single one starts in the same place: collision, a camera that doesn't make people seasick, materials that aren't flat gray, footstep sounds, a sky. You burn three weekends re-solving the boring 20% and never reach the part that was actually your idea.\n\nSo here is the bet I am making out loud: **don't build one game. Build the engine that builds all of them.** Solve the boring 20% once, in the open, and every idea after that gets cheaper.\n\nIt is real, it is open source ([React Three Fiber](https://r3f.docs.pmnd.rs/) on [Three.js](https://threejs.org/)), and you can [clone it today](https://github.com/TortoiseWolfe/ScriptHammer). And because a game engine with no game is just a README, I built a whole playable 3D city on it as proof. You can **[walk it right now](https://scripthammer.com/chatt/?diorama&walk)** โ€” first person, in a browser tab, nothing to install.\n\n![Open-source Three.js game engine running a tilt-shift 3D city built from real open data](/blog-images/ride-the-open-source-city/diorama.png)\n\n_The city is the demo, not the point. The point is the engine underneath it โ€” the same one that runs [a bare test level](https://scripthammer.com/game/cod-skeleton) with no city at all._\n\n## ๐ŸŽฎ The engine is the actual point\n\nThe thing that makes any of this move is a small, honestly-scoped game toolkit called **CoD**. It is **asset-free and procedural**: the materials, sky, and sound are generated on your graphics card and CPU at load time, so it ships **zero** texture, model, or audio files. That is why a whole playable city fits on a static site with no server behind it, and why cloning it doesn't mean downloading a gigabyte of assets.\n\nHere is what it actually gives you today, and it is more than a tech demo:\n\n- ๐Ÿงฑ **Physics and collision** โ€” a fast static-world spatial index plus swept-capsule collide-and-slide, so you don't fall through walls or tunnel through corners.\n- ๐Ÿšถ **A first-person controller** โ€” walk, sprint, crouch, go prone under a low overhang, and hop on a **bike**. Real ground contact and step-ups.\n- ๐ŸŽจ **A procedural material forge** โ€” physically-based textures (color, normal, roughness) generated on the fly, no image files.\n- ๐ŸŒค๏ธ **An atmospheric sky with image-based lighting**, procedural **footstep and ambient audio**, **graphics-card particles** (dust, weather), and **camera feel** (head-bob, landing punch) โ€” the small stuff that makes a scene feel alive.\n- โš™๏ธ **An event bus and four quality tiers** (`?q=low` โ€ฆ `ultra`) so it scales from a laptop to a desktop.\n\nIt is **[Massachusetts Institute of Technology (MIT) licensed](https://opensource.org/license/mit)** and vendored from Matt Shumer's [Claude-of-Duty](https://github.com/mshumer/Claude-of-Duty) โ€” full credit to him for the original. In your own code it is one import: `@/lib/cod`.\n\nNow the honest part, because overpromising is exactly the thing I want to teach you to spot: **this is not a finished general-purpose engine, and I am not going to pretend it is.** Today it is a strong _first-person, 3D, walking-and-riding_ foundation. It has **no** entity system, **no** save format, **no** multiplayer, **no** 2D, and **no** model or animation loaders yet. \"All the games\" is the _ambition_, not a shipped fact. That gap is not a disclaimer โ€” **it is the invitation.** Come build the missing layers with people who will review your work.\n\n## ๐Ÿ™๏ธ Proof it's reusable, not a one-off\n\nA toolkit that only runs the thing its author built is a lie you tell yourself. So here is the check: the exact same engine drives **two completely different scenes**.\n\nOne is a bare [test level](https://scripthammer.com/game/cod-skeleton) โ€” a floor, a step, a wall, a crate, and a low bar you have to crouch under. No city, no data, just the engine proving it walks, collides, and crouches.\n\nThe other is [Chattanooga](https://scripthammer.com/chatt/?diorama&walk): roughly **8,000 buildings** at real rooftop heights, pulled from [OpenStreetMap](https://www.openstreetmap.org/) footprints, lidar heights, and [United States Geological Survey](https://www.usgs.gov/3d-elevation-program) elevation. Same physics, same controller, same sky and audio, pointed at a real city instead of a box. If it can carry 8,000 real buildings and a bike, it can carry your idea.\n\n## ๐Ÿงช It's a beta โ€” here's the first bug\n\nShipping something rough and asking people to break it is itself a best practice, so let me practice it. Right now, first-person Walk mode has a real bug: sometimes it spawns you **below the city** and you just fall โ€” the whole thing hangs above you like a floating island while you drop through the sky. I hit it myself:\n\n![First-person Walk mode: the bicycle drops through the sky while the Chattanooga diorama floats above it, because the spawn point is placed below the city](/blog-images/ride-the-open-source-city/walk-fall-bug.png)\n\n_You press B to ride the bike, and the bike rides off through the sky. Spawned below the city, falling โ€” at a smooth 60 fps, so the frame rate is fine and the spawn is just wrong. This is the reason to play a beta, not the reason to skip it._\n\nSo I did the exact thing I am about to ask you to do. I filed it as a bug report: **[issue #651](https://github.com/TortoiseWolfe/ScriptHammer/issues/651)**. Open it and look at the _shape_ of it, because that shape is the whole ask:\n\n- **Where** you were โ€” the URL (`/chatt?diorama&walk`).\n- **What you did** โ€” opened it, clicked to look, pressed WASD.\n- **What you expected** vs **what actually happened** โ€” \"spawn on the street\" vs \"fell through the sky.\"\n- **Your setup** โ€” browser and graphics card. It matters more than you'd think; the same scene runs very differently on different hardware.\n- **A screenshot**, if you can grab one.\n\nThat's it. A boring, specific report like that is worth more than a hundred \"it's broken\" messages.\n\nHere's the ask, concretely:\n\n1. ๐ŸŽฏ **[Play it](https://scripthammer.com/chatt/?diorama&walk)** โ€” and yes, you might fall through the world first. Try anyway: press **B** for the bike, **V** to watch yourself go.\n2. ๐Ÿ› **File what broke** on the [issues page](https://github.com/TortoiseWolfe/ScriptHammer/issues), in the shape above. Finding a new one is genuinely helpful.\n3. ๐Ÿ’ฌ **Not sure it's worth a full report?** File it anyway โ€” a rough note beats staying quiet.\n\n## ๐Ÿง  The skill isn't prompting. It's telling slop from craft.\n\nHonest meta-layer, since this is a teaching project: AI helped build a lot of this, including drafts of this post. Left unchecked, AI produces **slop** โ€” output that reads right and is confidently wrong. This post tried it. An early draft cheerfully told you to \"ride a bike through downtown.\" You just saw the screenshot: the bike drops you through the sky. The sentence was fluent. It was also false.\n\nFluent versus true is the whole game, and it's the actual skill I want to teach โ€” not \"how do I prompt the robot,\" but \"how do I know if what came out is real?\"\n\n- **Slop** says \"it works.\" **Craft** writes a test that fails when it doesn't.\n- **Slop** makes a confident claim. **Craft** checks it against the source and links it.\n- **Slop** hides the rough edge. **Craft** files the bug with steps to reproduce, like [#651](https://github.com/TortoiseWolfe/ScriptHammer/issues/651).\n- **Slop** invents specifics. **Craft** says \"I don't know yet,\" then finds out.\n\nNone of that is advanced. It is verifying before you ship, reading the code you paste, and being willing to write \"this is broken\" in public. A real game engine is a great place to learn it, because the game either runs or it doesn't โ€” the feedback is honest whether you like it or not.\n\n## ๐Ÿš€ You don't need money to get in\n\nBack to you and your notebook of ideas. Here's the part I care about most: **the price of admission isn't cash.** Learning is free, and the most valuable thing you can bring to an open-source engine isn't a credit card โ€” it's another set of eyes and another game idea stress-testing it.\n\nThe cheapest way in is also the best one. [Clone ScriptHammer](https://github.com/TortoiseWolfe/ScriptHammer), read the source, and [watch me build it live on Twitch](https://twitch.tv/TurtleWolfe). It is MIT โ€” take it, ship it, keep it. No dollars required, ever.\n\nShort on cash? **Trade instead.** Playtest this and file a good bug. Fork it and prototype your idea. Build one of those missing layers โ€” a save system, a third-person camera, an enemy. Every playtester is another set of eyes, every fork is street cred you earn in public, and more people in the project make the engine better for everyone.\n\nIf you'd rather have hands-on help on _your_ game, there's a paid lane too: live **Office Hours** (bring a goal, leave with something running, the recording is yours to keep), and [Field Study](https://scripthammer.com/pricing) for a bigger build done with you. Prices are on the [pricing page](https://scripthammer.com/pricing), and if cash is tight, see two paragraphs up โ€” trade instead. The paid tiers exist to fund the free ones, not to gate them.\n\n## ๐Ÿ’ฌ Come build it\n\n- ๐ŸŽฎ **[Try the engine demo](https://scripthammer.com/game/cod-skeleton)** โ€” the bare test level, no city.\n- ๐Ÿšฒ **[Play the city](https://scripthammer.com/chatt/?diorama&walk)** โ€” first person, press **B** for the bike.\n- ๐Ÿ“ฆ **[Clone the engine](https://github.com/TortoiseWolfe/ScriptHammer)** โ€” MIT, asset-free, `@/lib/cod`.\n- ๐Ÿ“บ **[Watch me build it](https://twitch.tv/TurtleWolfe)** โ€” live on Twitch.\n- ๐Ÿ’ณ **[See what help costs](https://scripthammer.com/pricing)** โ€” free to Office Hours to done-for-you.\n- ๐Ÿ—บ๏ธ **[Read the brainstorm that started this](https://scripthammer.com/blog/playable-city-chattanooga)**.\n\nThen tell me in the comments: what's the one game in your notebook you'd build first if the boring 20% were already done?\n", + "content": "\n# ๐Ÿ•น๏ธ Why Build One Game When You Can Build All the Games?\n\nYou have a notebook โ€” or a Notes app, or a Discord full of half-finished pitches โ€” with ten game ideas in it. You have shipped zero. Not because the ideas are bad, but because every single one starts in the same place: collision, a camera that doesn't make people seasick, materials that aren't flat gray, footstep sounds, a sky. You burn three weekends re-solving the boring 20% and never reach the part that was actually your idea.\n\nSo here is the bet I am making out loud: **don't build one game. Build the engine that builds all of them.** Solve the boring 20% once, in the open, and every idea after that gets cheaper.\n\nIt is real, it is open source ([React Three Fiber](https://r3f.docs.pmnd.rs/) on [Three.js](https://threejs.org/)), and you can [clone it today](https://github.com/TortoiseWolfe/ScriptHammer). And because a game engine with no game is just a README, I built a whole playable 3D city on it as proof. You can **[walk it right now](https://scripthammer.com/chatt/?diorama&walk)** โ€” first person, in a browser tab, nothing to install.\n\n![Open-source Three.js game engine running a tilt-shift 3D city built from real open data](/blog-images/ride-the-open-source-city/diorama.png)\n\n_The city is the demo, not the point. The point is the engine underneath it โ€” the same one that runs [a bare test level](https://scripthammer.com/game/cod-skeleton) with no city at all._\n\n## ๐ŸŽฎ The engine is the actual point\n\nThe thing that makes any of this move is a small, honestly-scoped game toolkit called **CoD**. It is **asset-free and procedural**: the materials, sky, and sound are generated on your graphics card and CPU at load time, so it ships **zero** texture, model, or audio files. That is why a whole playable city fits on a static site with no server behind it, and why cloning it doesn't mean downloading a gigabyte of assets.\n\nHere is what it actually gives you today, and it is more than a tech demo:\n\n- ๐Ÿงฑ **Physics and collision** โ€” a fast static-world spatial index plus swept-capsule collide-and-slide, so you don't fall through walls or tunnel through corners.\n- ๐Ÿšถ **A first-person controller** โ€” walk, sprint, crouch, go prone under a low overhang, and hop on a **bike**. Real ground contact and step-ups.\n- ๐ŸŽจ **A procedural material forge** โ€” physically-based textures (color, normal, roughness) generated on the fly, no image files.\n- ๐ŸŒค๏ธ **An atmospheric sky with image-based lighting**, procedural **footstep and ambient audio**, **graphics-card particles** (dust, weather), and **camera feel** (head-bob, landing punch) โ€” the small stuff that makes a scene feel alive.\n- โš™๏ธ **An event bus and four quality tiers** (`?q=low` โ€ฆ `ultra`) so it scales from a laptop to a desktop.\n\nIt is **[Massachusetts Institute of Technology (MIT) licensed](https://opensource.org/license/mit)** and vendored from Matt Shumer's [Claude-of-Duty](https://github.com/mshumer/Claude-of-Duty) โ€” full credit to him for the original. In your own code it is one import: `@/lib/cod`.\n\nNow the honest part, because overpromising is exactly the thing I want to teach you to spot: **this is not a finished general-purpose engine, and I am not going to pretend it is.** Today it is a strong _first-person, 3D, walking-and-riding_ foundation. It has **no** entity system, **no** save format, **no** multiplayer, **no** 2D, and **no** model or animation loaders yet. \"All the games\" is the _ambition_, not a shipped fact. That gap is not a disclaimer โ€” **it is the invitation.** Come build the missing layers with people who will review your work.\n\n## ๐Ÿ™๏ธ Proof it's reusable, not a one-off\n\nA toolkit that only runs the thing its author built is a lie you tell yourself. So here is the check: the exact same engine drives **two completely different scenes**.\n\nOne is a bare [test level](https://scripthammer.com/game/cod-skeleton) โ€” a floor, a step, a wall, a crate, and a low bar you have to crouch under. No city, no data, just the engine proving it walks, collides, and crouches.\n\nThe other is [Chattanooga](https://scripthammer.com/chatt/?diorama&walk): roughly **8,000 buildings** at real rooftop heights, pulled from [OpenStreetMap](https://www.openstreetmap.org/) footprints, lidar heights, and [United States Geological Survey](https://www.usgs.gov/3d-elevation-program) elevation. Same physics, same controller, same sky and audio, pointed at a real city instead of a box. If it can carry 8,000 real buildings and a bike, it can carry your idea.\n\n## ๐Ÿงช It's a beta โ€” here's the first bug\n\nShipping something rough and asking people to break it is itself a best practice, so let me practice it. Right now, first-person Walk mode has a real bug: sometimes it spawns you **below the city** and you just fall โ€” the whole thing hangs above you like a floating island while you drop through the sky. I hit it myself:\n\n![First-person Walk mode: the bicycle drops through the sky while the Chattanooga diorama floats above it, because the spawn point is placed below the city](/blog-images/ride-the-open-source-city/walk-fall-bug.png)\n\n_You press B to ride the bike, and the bike rides off through the sky. Spawned below the city, falling โ€” at a smooth 60 fps, so the frame rate is fine and the spawn is just wrong. This is the reason to play a beta, not the reason to skip it._\n\nSo I did the exact thing I am about to ask you to do. I filed it as a bug report: **[issue #651](https://github.com/TortoiseWolfe/ScriptHammer/issues/651)**. Open it and look at the _shape_ of it, because that shape is the whole ask:\n\n- **Where** you were โ€” the URL (`/chatt?diorama&walk`).\n- **What you did** โ€” opened it, clicked to look, pressed WASD.\n- **What you expected** vs **what actually happened** โ€” \"spawn on the street\" vs \"fell through the sky.\"\n- **Your setup** โ€” browser and graphics card. It matters more than you'd think; the same scene runs very differently on different hardware.\n- **A screenshot**, if you can grab one.\n\nThat's it. A boring, specific report like that is worth more than a hundred \"it's broken\" messages.\n\nHere's the ask, concretely:\n\n1. ๐ŸŽฏ **[Play it](https://scripthammer.com/chatt/?diorama&walk)** โ€” and yes, you might fall through the world first. Try anyway: press **B** for the bike, **V** to watch yourself go.\n2. ๐Ÿ› **File what broke** on the [issues page](https://github.com/TortoiseWolfe/ScriptHammer/issues), in the shape above. Finding a new one is genuinely helpful.\n3. ๐Ÿ’ฌ **Not sure it's worth a full report?** File it anyway โ€” a rough note beats staying quiet.\n\n## ๐Ÿง  The skill isn't prompting. It's telling slop from craft.\n\nHonest meta-layer, since this is a teaching project: AI helped build a lot of this, including drafts of this post. Left unchecked, AI produces **slop** โ€” output that reads right and is confidently wrong. This post tried it. An early draft cheerfully told you to \"ride a bike through downtown.\" You just saw the screenshot: the bike drops you through the sky. The sentence was fluent. It was also false.\n\nFluent versus true is the whole game, and it's the actual skill I want to teach โ€” not \"how do I prompt the robot,\" but \"how do I know if what came out is real?\"\n\n- **Slop** says \"it works.\" **Craft** writes a test that fails when it doesn't.\n- **Slop** makes a confident claim. **Craft** checks it against the source and links it.\n- **Slop** hides the rough edge. **Craft** files the bug with steps to reproduce, like [#651](https://github.com/TortoiseWolfe/ScriptHammer/issues/651).\n- **Slop** invents specifics. **Craft** says \"I don't know yet,\" then finds out.\n\nNone of that is advanced. It is verifying before you ship, reading the code you paste, and being willing to write \"this is broken\" in public. A real game engine is a great place to learn it, because the game either runs or it doesn't โ€” the feedback is honest whether you like it or not.\n\n## ๐Ÿš€ You don't need money to get in\n\nBack to you and your notebook of ideas. Here's the part I care about most: **the price of admission isn't cash.** Learning is free, and the most valuable thing you can bring to an open-source engine isn't a credit card โ€” it's another set of eyes and another game idea stress-testing it.\n\nThe cheapest way in is also the best one. [Clone ScriptHammer](https://github.com/TortoiseWolfe/ScriptHammer), read the source, and [watch me build it live on Twitch](https://twitch.tv/TurtleWolfe). It is MIT โ€” take it, ship it, keep it. No dollars required, ever.\n\nShort on cash? **Trade instead.** Playtest this and file a good bug. Fork it and prototype your idea. Build one of those missing layers โ€” a save system, a third-person camera, an enemy. Every playtester is another set of eyes, every fork is street cred you earn in public, and more people in the project make the engine better for everyone.\n\nIf you'd rather have hands-on help on _your_ game, there's a paid lane too: live **Office Hours** (bring a goal, leave with something running, the recording is yours to keep), and [Field Study](https://scripthammer.com/pricing) for a bigger build done with you. Prices are on the [pricing page](https://scripthammer.com/pricing), and if cash is tight, see two paragraphs up โ€” trade instead. The paid tiers exist to fund the free ones, not to gate them.\n\n## ๐Ÿ’ฌ Come build it\n\n- ๐ŸŽฎ **[Try the engine demo](https://scripthammer.com/game/cod-skeleton)** โ€” the bare test level, no city.\n- ๐Ÿšฒ **[Play the city](https://scripthammer.com/chatt/?diorama&walk)** โ€” first person, press **B** for the bike.\n- ๐Ÿ“ฆ **[Clone the engine](https://github.com/TortoiseWolfe/ScriptHammer)** โ€” MIT, asset-free, `@/lib/cod`.\n- ๐Ÿ“บ **[Watch me build it live](https://twitch.tv/TurtleWolfe)** โ€” on Twitch, with the replays on [YouTube](https://youtube.com/@JonathanPohlner).\n- ๐Ÿ’ณ **[See what help costs](https://scripthammer.com/pricing)** โ€” free to Office Hours to done-for-you.\n- ๐Ÿ“… **[Book 15 minutes](https://calendly.com/turtlewolfe/15min-1)** โ€” bring a screenshot of what you have in mind.\n- ๐Ÿ—บ๏ธ **[Read the brainstorm that started this](https://scripthammer.com/blog/playable-city-chattanooga)**.\n\nFind me everywhere: [scripthammer.com](https://scripthammer.com) ยท [Twitch](https://twitch.tv/TurtleWolfe) ยท [YouTube](https://youtube.com/@JonathanPohlner) ยท [X](https://twitter.com/JonPohlner) ยท [LinkedIn](https://linkedin.com/in/pohlner) ยท [GitHub](https://github.com/TortoiseWolfe)\n\nThen tell me in the comments: what's the one game in your notebook you'd build first if the boring 20% were already done?\n", "excerpt": "You have a notebook full of game ideas and zero shipped, because each one means re-solving physics, camera, materials, and sound. Build the engine once and get all the games. Here is an open-source Three.js game engine, a playable city built on it, and an open invitation to help build the rest.", "publishedAt": "2026-08-09T00:00:00.000Z", "updatedAt": "2026-08-09T00:00:00.000Z", @@ -25,8 +25,8 @@ "categories": [ "features" ], - "readingTime": 8, - "wordCount": 1598, + "readingTime": 9, + "wordCount": 1632, "showToc": true, "showAuthor": true, "showShareButtons": true,