<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Evolved-Tech</title>
    <description>The latest articles on DEV Community by Evolved-Tech (@evolvedtech_27a34e6a5cf9).</description>
    <link>https://dev.to/evolvedtech_27a34e6a5cf9</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3989902%2Fcc4b311c-fa33-48d9-9c31-2865909e6317.jpg</url>
      <title>DEV Community: Evolved-Tech</title>
      <link>https://dev.to/evolvedtech_27a34e6a5cf9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/evolvedtech_27a34e6a5cf9"/>
    <language>en</language>
    <item>
      <title>title: We Built a Full Game IDE in a Browser Tab and Our CPU Barely Complained</title>
      <dc:creator>Evolved-Tech</dc:creator>
      <pubDate>Tue, 22 Sep 2026 19:01:06 +0000</pubDate>
      <link>https://dev.to/evolvedtech_27a34e6a5cf9/title-we-built-a-full-game-ide-in-a-browser-tab-and-our-cpu-barely-complained-5efd</link>
      <guid>https://dev.to/evolvedtech_27a34e6a5cf9/title-we-built-a-full-game-ide-in-a-browser-tab-and-our-cpu-barely-complained-5efd</guid>
      <description>&lt;h1&gt;
  
  
  We Built a Game IDE in the Browser and Lived to Brag About It
&lt;/h1&gt;

&lt;p&gt;Hey, we're &lt;strong&gt;Evolved Tech&lt;/strong&gt; — the crew behind &lt;strong&gt;Limn Studio&lt;/strong&gt;, a browser-based game IDE where you can build, run, and publish 2D games without installing a single thing. No npm. No webpack. No 45-minute &lt;code&gt;node_modules&lt;/code&gt; folder that somehow weighs more than the actual game. Just us, a browser, a questionable amount of caffeine, and an unreasonable number of &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;

&lt;p&gt;You'll mostly hear from Kehinde and Desire in this one, but there's a wider crew behind the scenes at Evolved Tech who deserve just as much credit for keeping this thing running — you know who you are, thank you.&lt;/p&gt;

&lt;p&gt;Somewhere along the way we also lost four hours to a bug that turned out to be a smart quote sneaking in from a pasted Google Doc. We're still not over it.&lt;/p&gt;

&lt;p&gt;Grab a coffee. This is the full, slightly unhinged tour of everything we built, why we built it, and the one CPU-saving trick that finally stopped our animations from moving like they were wading through molasses.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdggzy4ahucd296a9vzcg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdggzy4ahucd296a9vzcg.png" alt=" " width="800" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1: The Editor Shell (or: How to Build an IDE Out of Spite and &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;s)
&lt;/h2&gt;

&lt;p&gt;Here's a fun fact that will make actual frontend engineers wince: Limn Studio's editor is &lt;strong&gt;one HTML file&lt;/strong&gt;. No framework. No build step. No bundler crying softly in the corner about peer dependencies. Just &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags, stacked like a JavaScript lasagna.&lt;/p&gt;

&lt;p&gt;Why? Because every dependency you add is a tiny gremlin that wakes up in six months, demands a major version bump, and takes your whole app down over a &lt;code&gt;null&lt;/code&gt; check nobody asked for. No gremlins allowed here. This thing deploys to any static host and will probably still run in 2040, long after everyone else's React app has dependency-rotted into digital compost.&lt;/p&gt;

&lt;p&gt;The layout has four zones: a top bar, tabs, main content, and a floating action button that pops open like it's got somewhere important to be. Very dramatic. Very "we contain multitudes."&lt;/p&gt;

&lt;h3&gt;
  
  
  Mobile: The Great Padding Massacre
&lt;/h3&gt;

&lt;p&gt;Turns out, on a 380px phone screen, our lovely 24px of padding on each side of the editor was quietly eating &lt;strong&gt;12% of the horizontal space&lt;/strong&gt;. Twelve percent! That's not padding, that's a landlord. So on mobile we ripped out every border, radius, and ounce of breathing room and went full edge-to-edge. The editor now goes commando on small screens, and everyone's happier for it, especially the pixels.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fky7hk95g0yucvveuauo2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fky7hk95g0yucvveuauo2.png" alt=" " width="800" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2: The Code Editor (Handmade, Like Artisanal Bread, But It's a Syntax Highlighter)
&lt;/h2&gt;

&lt;p&gt;This is where we lost the most sleep. We did not build a mini Monaco. We do not have the staffing, the sanity budget, or frankly the will to live required for that. What exists instead is about 400 lines of vanilla JavaScript doing an extremely convincing impression of a real code editor, and getting away with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trick:&lt;/strong&gt; stack two elements directly on top of each other like a syntax-highlighting sandwich.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; on the bottom layer, rendering pretty colored &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; tokens&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; on top with the text made completely invisible (&lt;code&gt;color: transparent&lt;/code&gt;), but the &lt;em&gt;caret&lt;/em&gt; stays visible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The textarea handles all the boring-but-critical native stuff — selection, undo, autocorrect, whatever mysterious ritual iOS performs when you triple-tap — while the &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; just sits there looking pretty. It's a magician's assistant setup: one element does all the labor, the other gets all the applause.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tokenizer: 80 Lines, Character by Character, No Regrets
&lt;/h3&gt;

&lt;p&gt;We hand-wrote a tokenizer that walks the code one character at a time and slaps a &lt;code&gt;&amp;lt;span class="tok-*"&amp;gt;&lt;/code&gt; on everything — keywords, strings, numbers, comments, operators, punctuation, function calls, the works. No parser library. No AST. Just vibes and a &lt;code&gt;while&lt;/code&gt; loop. And somehow it works beautifully, in GitHub Dark Modern colors, because taste doesn't take a day off just because we're suffering.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bracket Analyzer: Snitching on Your Unclosed Curly Braces Since Day One
&lt;/h3&gt;

&lt;p&gt;Ever forgotten to close a &lt;code&gt;{&lt;/code&gt;? Of course you have, you're a person who writes code. The bracket analyzer walks your file, tracks a stack of open brackets, and drops a glowing red dot in the gutter the second something doesn't match. It runs 350ms after you stop typing — not on every keystroke — because nobody needs their editor having a nervous breakdown every time they press a key.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Minimap
&lt;/h3&gt;

&lt;p&gt;A tiny compressed column showing your whole file as 2px colored bars, because sometimes you want to feel like you're piloting a submarine sonar screen instead of writing a Snake clone.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcg3qadzuzqggoq8oi72o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcg3qadzuzqggoq8oi72o.png" alt=" " width="800" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3: The Console (It's Not a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, It's a Whole Personality)
&lt;/h2&gt;

&lt;p&gt;The console has color-coded log levels, a real REPL, and message batching so that a game logging 60 times a second doesn't turn your browser tab into a space heater.&lt;/p&gt;

&lt;p&gt;The REPL is the fun part: the editor lives in the parent window, the game runs inside an iframe, and we bridge the two dimensions with &lt;code&gt;iframe.contentWindow.eval()&lt;/code&gt;. Type &lt;code&gt;player.speedX = 500&lt;/code&gt; into the console mid-game and watch your character rocket off screen like it just heard the ice cream truck. Basically necromancy, but for pixels.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: The Engine (epic.js) — Small, Mighty, Slightly Feral
&lt;/h2&gt;

&lt;p&gt;Games run on &lt;strong&gt;epic.js&lt;/strong&gt;, the canvas engine we built from scratch, along with the entire editor, the console, the Build tab, and the arcade around it. Two people, one engine, way too many late nights.&lt;/p&gt;

&lt;p&gt;The whole thing boils down to one sacred law: every game has an &lt;code&gt;update(dt)&lt;/code&gt; function, and if you multiply your movement by &lt;code&gt;dt&lt;/code&gt;, your game runs at the same speed whether it's on a gaming rig or a haunted Chromebook from 2013. Frame-rate independence — the closest thing game dev has to a peace treaty.&lt;/p&gt;

&lt;h3&gt;
  
  
  The New Thing: Teaching Animations to Stop Choking the CPU
&lt;/h3&gt;

&lt;p&gt;Here's the update we're actually proud of this week, and credit where it's due: Kehinde went in and fixed the animation system in epic.js so it stops hammering the CPU into submission. Before this, a busy scene with a lot going on would start visibly dragging — like the game had suddenly remembered it has responsibilities and needed a minute. Now the animation loop is lighter on its feet, the frame pacing holds up under pressure, and games stay smooth even when there's a lot happening on screen at once. No CPU fans spinning up like a jet engine just because someone added a few extra particles.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F05lsnqnsnck238y15dg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F05lsnqnsnck238y15dg7.png" alt=" " width="800" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 5: The Build Tab — 15 Templates, Zero Native &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; Elements
&lt;/h2&gt;

&lt;p&gt;There are 15 starter templates — Platformer, Runner, Shooter, Snake, Dungeon Crawler, and eleven of their cousins — each one a JS object that spits out working game code based on a form you fill in.&lt;/p&gt;

&lt;p&gt;We also built a custom dropdown instead of using a native &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;, because native selects on Android tablets like to float over your entire app like a UFO that doesn't respect your design system. Rude. Not on our watch.&lt;/p&gt;

&lt;p&gt;Color pickers got the same glow-up: instead of the sad native &lt;code&gt;&amp;lt;input type="color"&amp;gt;&lt;/code&gt;, every color field is a full card with a swatch, a live hex code, and a copy button. If we're building a game IDE, it's going to look like one, not a 2004 HTML form that time forgot.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6 &amp;amp; 7: Command Palette and Find &amp;amp; Replace
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Ctrl+K&lt;/code&gt; opens a fuzzy-search command palette straight out of VS Code. Type "fmt," get "Format Code." Type "sv," get "Save" and "Save As" fighting for the top spot like siblings arguing over the last slice of pizza. &lt;code&gt;Ctrl+F&lt;/code&gt; opens Find &amp;amp; Replace with a match counter, because scrolling through 400 lines hunting for a typo by eye is a form of self-harm we do not endorse.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F278k9guem4sywkxi5tbr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F278k9guem4sywkxi5tbr.png" alt=" " width="800" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffdxrlajujxap3c07toks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffdxrlajujxap3c07toks.png" alt=" " width="800" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 8, 9 &amp;amp; 10: Cloud Sync, Sharing, and the Arcade
&lt;/h2&gt;

&lt;p&gt;Save your file and it goes to Supabase if you're logged in, or quietly to &lt;code&gt;localStorage&lt;/code&gt; if you're not — either way, your work survives, because losing an hour of game-dev progress should be a punishable offense in several countries.&lt;/p&gt;

&lt;p&gt;Hit Share and you can either publish your game to the &lt;strong&gt;Arcade&lt;/strong&gt; (the public gallery of everyone's creations) or grab a private link. The Arcade has search, a Featured banner for the week's most-liked game, and auto-generated thumbnails — template games get a stylized scene, custom games get a procedurally chosen art style based on a hash of the game ID. No two games end up looking alike, which is more than we can say for most portfolio sites.&lt;/p&gt;

&lt;p&gt;And yes — Desire already told Kehinde he's topping the leaderboard this week. Screenshot pending. Bragging rights secured in advance. If it doesn't happen, this paragraph never existed and you didn't read it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 11, 12 &amp;amp; 13: The Player, Profiles, and the Leaderboard
&lt;/h2&gt;

&lt;p&gt;Every game has its own player page with Like, Fork, Fullscreen, and a comment thread (nested one level deep, because we're not trying to recreate a Reddit thread war inside a game IDE). Every user gets a public profile with an animated rainbow banner that we are, frankly, a little too proud of.&lt;/p&gt;

&lt;p&gt;And then there's the &lt;strong&gt;weekly leaderboard&lt;/strong&gt; — a literal podium with a bobbing 👑 on first place, resetting every Monday UTC. Nothing motivates a small team quite like public, weekly, slightly humiliating rankings that reset right when you're finally winning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 14 &amp;amp; 15: Inbox and Settings
&lt;/h2&gt;

&lt;p&gt;The inbox tells you your stats, your leaderboard standing, and any engine updates, so you always know exactly how many people liked your Flappy Bird clone this week (the answer is never enough, there is no number that will satisfy you, this is the curse of shipping things publicly).&lt;/p&gt;

&lt;p&gt;Settings let you set a permanent username, a changeable display name, an avatar URL, and subscribe to weekly updates, because everyone deserves the chance to opt back into our nonsense on a weekly cadence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 16: The Database
&lt;/h2&gt;

&lt;p&gt;Games, likes, comments, profiles, follows, saved files, share links, changelog entries — all living in Supabase tables with Row Level Security turned all the way up, because nobody's editing anybody else's stuff except through the front door, with a badge, and an &lt;code&gt;auth.uid()&lt;/code&gt; check standing guard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 17 &amp;amp; 18: Design System and Performance
&lt;/h2&gt;

&lt;p&gt;Dark background, blue/purple/pink accents, nothing animates faster than 0.15 seconds because slow motion reads as expensive and we would like to seem expensive. Under the hood: console messages batch per animation frame instead of spamming the DOM 60 times a second, bracket checking is debounced, the console caps at 500 lines, all UI animations freeze the instant a game starts running, and — as of this week, thanks to Kehinde — the epic.js animation loop no longer treats your CPU like a personal enemy. Smooth frames, happy fans, no jet-engine noises from your laptop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 19: Deployment (Or: How We Avoided Docker Like It Owed Us Money)
&lt;/h2&gt;

&lt;p&gt;Static frontend on Vercel. Supabase for the backend. No Docker, no Kubernetes, no CI pipeline beyond "push to git and pray a little." Edit a file, push, it's live. It's the deployment pipeline equivalent of a shrug that somehow always works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 20: What's Next
&lt;/h2&gt;

&lt;p&gt;Multiplayer via Supabase Realtime, sprite and tilemap editors, an audio library, fork trees, playlists, achievements, and scheduled tournaments. Basically, we're not done — we're just done for &lt;em&gt;today.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 The "I Don't Want to Read All That" Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What It Actually Does&lt;/th&gt;
&lt;th&gt;Why You Should Care&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single-file editor shell&lt;/td&gt;
&lt;td&gt;Whole IDE in one HTML file, no build step&lt;/td&gt;
&lt;td&gt;Deploys anywhere, breaks nowhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom code editor&lt;/td&gt;
&lt;td&gt;Hand-built syntax highlighting, gutter, minimap&lt;/td&gt;
&lt;td&gt;Feels like a real IDE, weighs like a text file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-indent &amp;amp; bracket matching&lt;/td&gt;
&lt;td&gt;Smart &lt;code&gt;{}()[]&lt;/code&gt; handling, red-dot error markers&lt;/td&gt;
&lt;td&gt;Fewer "why won't this run" moments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live console + REPL&lt;/td&gt;
&lt;td&gt;Real-time &lt;code&gt;eval()&lt;/code&gt; into your running game&lt;/td&gt;
&lt;td&gt;Poke your game's guts while it's alive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;epic.js engine&lt;/td&gt;
&lt;td&gt;Lightweight canvas game engine with &lt;code&gt;update(dt)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Frame-rate independent games out of the box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;New: epic.js animation fix&lt;/strong&gt; (by Kehinde)&lt;/td&gt;
&lt;td&gt;Animation loop no longer hogs the CPU&lt;/td&gt;
&lt;td&gt;Smooth gameplay even in busy, particle-heavy scenes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build Tab (15 templates)&lt;/td&gt;
&lt;td&gt;Form-driven game generator&lt;/td&gt;
&lt;td&gt;Go from blank page to playable game in minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command Palette (&lt;code&gt;Ctrl+K&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Fuzzy-searchable action menu&lt;/td&gt;
&lt;td&gt;VS Code energy, browser-tab price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Find &amp;amp; Replace (&lt;code&gt;Ctrl+F&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Search, replace, match counter&lt;/td&gt;
&lt;td&gt;Stop scrolling like it's 1998&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud sync&lt;/td&gt;
&lt;td&gt;Supabase-backed save, falls back to &lt;code&gt;localStorage&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Never lose your masterpiece&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share &amp;amp; Publish&lt;/td&gt;
&lt;td&gt;Private links or public Arcade publishing&lt;/td&gt;
&lt;td&gt;Show off or keep it secret, your call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Arcade&lt;/td&gt;
&lt;td&gt;Public gallery, search, featured games, auto thumbnails&lt;/td&gt;
&lt;td&gt;Where games (and egos) go to be discovered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Player page&lt;/td&gt;
&lt;td&gt;Like, fork, comment, fullscreen&lt;/td&gt;
&lt;td&gt;Full game-consumption experience&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creator profiles&lt;/td&gt;
&lt;td&gt;Rainbow banner, badges, follow system&lt;/td&gt;
&lt;td&gt;Internet fame, minus the algorithm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly Leaderboard&lt;/td&gt;
&lt;td&gt;Podium, crowns, resets every Monday&lt;/td&gt;
&lt;td&gt;Wholesome public pressure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbox &amp;amp; Settings&lt;/td&gt;
&lt;td&gt;Notifications, stats, account controls&lt;/td&gt;
&lt;td&gt;The boring-but-necessary stuff, handled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance tricks&lt;/td&gt;
&lt;td&gt;Message batching, debounced checks, animation freezing&lt;/td&gt;
&lt;td&gt;Smooth even when your game logs like it's angry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🤝 Need Help, Found a Bug, or Just Want to Say Hi?
&lt;/h2&gt;

&lt;p&gt;We built this thing in public and we'd love for you to poke at it, break it, and tell us about it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;💬 Discord community&lt;/td&gt;
&lt;td&gt;&lt;a href="https://discord.gg/kVpSmYWXr" rel="noopener noreferrer"&gt;discord.gg/kVpSmYWXr&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧑‍💻 GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/terracodes004" rel="noopener noreferrer"&gt;github.com/terracodes004&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📧 Support / general questions&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:evolvedtech004@gmail.com"&gt;evolvedtech004@gmail.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Limn Studio exists because we refused to install a framework and then dared each other to keep going. No npm install, no webpack, no dependency graph plotting against us at 2am. It loads in one HTTP request, works offline after the first visit, and runs on anything with a browser and a pulse.&lt;/p&gt;

&lt;p&gt;If you're building something similar: start small, add one feature at a time, and only optimize once you've actually measured something slow. Almost nothing in this project exists because it looked clever. It exists because something was annoyingly slow — like, say, an animation loop dragging our CPU down with it — and we fixed it out of spite.&lt;/p&gt;

&lt;p&gt;So go open the editor. Type a few lines. Hit Run. You don't need a gaming rig, a 40GB SDK, or a computer science degree with a minor in suffering. You need a browser, an idea, and the willingness to write one line, watch it run, and write the next one.&lt;/p&gt;

&lt;p&gt;Stop waiting for inspiration. Draw your game into existence. 🎮&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limn Studio&lt;/strong&gt; is live at &lt;strong&gt;limn-engine-doc.vercel.app&lt;/strong&gt; — go break it and tell us how.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>gamedev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Limn Engine Just Got Smarter — Here's What We Added (And Why It Matters)</title>
      <dc:creator>Evolved-Tech</dc:creator>
      <pubDate>Mon, 07 Sep 2026 19:08:00 +0000</pubDate>
      <link>https://dev.to/evolvedtech_27a34e6a5cf9/limn-engine-just-got-smarter-heres-what-we-added-and-why-it-matters-1m7i</link>
      <guid>https://dev.to/evolvedtech_27a34e6a5cf9/limn-engine-just-got-smarter-heres-what-we-added-and-why-it-matters-1m7i</guid>
      <description>&lt;p&gt;The question that started it all: "Why do we have to write the same code in every single game?" So we built Limn Engine — a zero-configuration, browser-based 2D game engine that hits 60 FPS on hardware old enough to vote. It got published on SitePoint and ranked #3 among 2D JavaScript game engines, which we now mention in every conversation, including this one.&lt;/p&gt;

&lt;p&gt;Today's post is about what's new. And to be crystal clear: &lt;strong&gt;all of it is live right now.&lt;/strong&gt; Not "coming soon," not "in beta," not "works on our machine." You can go use every single feature below today, this minute, before you even finish this sentenc—okay you finished it, go use them.&lt;/p&gt;

&lt;p&gt;Fair warning: some of these features exist purely because we got tired of doing something annoying, several times, in a row, forever.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl9uae5lx9tq4dsebto6x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl9uae5lx9tq4dsebto6x.png" alt="Image showing the playground editor with its sharable url button" width="799" height="454"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0zueiudeiwmv7kmv2k3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0zueiudeiwmv7kmv2k3w.png" alt="Image showing the sign up page of limn Engine" width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrhtc0w0l3ovtevvy1fg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrhtc0w0l3ovtevvy1fg.png" alt="Image showing the homepage of limn engine" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuk0lg23m66tb8r49h6sp.png" alt="Image showing the inbox page of limn engine" width="800" height="446"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📋 The TL;DR (For Those Who Scroll First, Read Later — No Judgment)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Why You'll Care&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔐 &lt;strong&gt;Google OAuth&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;One-click sign-in via Google, plus email OTP as backup. Powered by Supabase Auth.&lt;/td&gt;
&lt;td&gt;No passwords, no forms, no "forgot password" emails haunting your inbox at 3 AM.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔗 &lt;strong&gt;Shareable Code Snippets&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Write code in the playground, hit Share, get a unique URL.&lt;/td&gt;
&lt;td&gt;Send exact working code to friends instead of dumping 200 lines into Discord like a ransom note.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 &lt;strong&gt;Universal Search&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Global search overlay — hit ESC or click the icon.&lt;/td&gt;
&lt;td&gt;Find docs, API refs, tutorials, and community posts instantly. Even we use it now.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📱 &lt;strong&gt;Touch-Friendly Design&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Fully responsive interface across desktop, tablet, and phone.&lt;/td&gt;
&lt;td&gt;Build your game from the couch. We don't make the rules, we just enable them.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 &lt;strong&gt;Inbox &amp;amp; Messaging&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Built-in messaging system for updates and collaborator chats.&lt;/td&gt;
&lt;td&gt;Stay in the loop without alt-tabbing to five other apps.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Status: all shipped. All live. Go bother them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, for those of you who like the director's commentary — here's the full story behind each one.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Problems That Kept Us Up At Night
&lt;/h3&gt;

&lt;p&gt;Rule one of building Limn Engine: "Common outcomes should be functions." Edge detection, camera math, collision loops — if we typed it twice, it became &lt;code&gt;move.bound(player)&lt;/code&gt; or &lt;code&gt;camera.shake(5,5)&lt;/code&gt; before we typed it a third time out of spite.&lt;/p&gt;

&lt;p&gt;But the engine's &lt;em&gt;infrastructure&lt;/em&gt; needed the same intervention. Three problems in particular were staging a nightly protest in our brains:&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;Authentication&lt;/strong&gt; — every game needs users, and building sign-up/login/password-reset from scratch takes weeks we do not have and would rather spend on, frankly, anything else.&lt;br&gt;
· &lt;strong&gt;Collaboration&lt;/strong&gt; — "send us your code" in Discord meant receiving 200 unformatted lines that looked like a ransom note.&lt;br&gt;
· &lt;strong&gt;Discovery&lt;/strong&gt; — finding anything on our own website had become a scavenger hunt with no prize at the end.&lt;/p&gt;

&lt;p&gt;So, in the spirit of turning problems into functions, we fixed them. All three. They're live. We already told you that but it bears repeating because we're proud of ourselves.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔐 Google OAuth: One Click, No Passwords — Live Now
&lt;/h3&gt;

&lt;p&gt;Nobody has ever, in the history of the internet, been excited to "Create an account." You see that button, your soul leaves your body a little, and you close the tab. We know. We've done it to other websites while building the fix for our own.&lt;/p&gt;

&lt;p&gt;So Limn Engine now runs on Google OAuth as the primary login method:&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;One click, and you're in.&lt;/strong&gt; No forms, no email verification purgatory, no "forgot password" email arriving at 3 AM to remind you of your own incompetence.&lt;br&gt;
· &lt;strong&gt;Instant onboarding&lt;/strong&gt; — straight to building, zero friction, zero excuses left to procrastinate with.&lt;br&gt;
· &lt;strong&gt;We never see your password&lt;/strong&gt;, mostly because we don't want that responsibility. Google can have it. Google seems more organized than us.&lt;/p&gt;

&lt;p&gt;Prefer not to hand Google the keys? We also added email OTP login, because choice is nice and so is not being cornered.&lt;/p&gt;

&lt;p&gt;Under the hood, this runs on Supabase Auth, a real production-grade auth system built by people who are much better at this than we are. We know our strengths, and "building auth from scratch" is not one of them. We have games to make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; authentication should never be the reason someone bounces off your engine. Consider that reason eliminated. You're welcome.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Shareable Code Snippets: Collaboration Without The Crime Scene — Live Now
&lt;/h3&gt;

&lt;p&gt;This one's personal.&lt;/p&gt;

&lt;p&gt;Every debugging session in Discord went the same way: "send us your code," followed by 200 lines of unindented JavaScript arriving like evidence at a trial nobody asked for. Our DMs looked less like a support channel and more like a crime scene with syntax errors.&lt;/p&gt;

&lt;p&gt;So now the playground has a Share button that generates one clean URL, sendable anywhere — Discord, WhatsApp, Twitter, email, and yes we did consider carrier pigeon and no it did not make the roadmap.&lt;/p&gt;

&lt;p&gt;What that gets you:&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;Debugging that doesn't require detective work&lt;/strong&gt; — stuck on a physics bug? Send the link. Your friend sees exactly what you see, and "works on my machine" officially retires.&lt;br&gt;
· &lt;strong&gt;A place to flex&lt;/strong&gt; — nailed a particle effect in 30 seconds? Send the link and let people watch it run live, no copy-paste required.&lt;br&gt;
· &lt;strong&gt;A Discord server that's actually readable&lt;/strong&gt; — no more scrolling past a wall of code to find the one message that matters. Our eyes, and yours, say thank you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; sharing code is now exactly as easy as sharing a meme, which was frankly always the bar.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 Universal Search: Find Anything, Instantly — Live Now
&lt;/h3&gt;

&lt;p&gt;Our website had grown a lot of rooms and forgotten to build any hallways. Docs, API references, tutorials, community posts — all real, all somewhere, none easily findable, including by us. We have genuinely spent 10 minutes hunting for our own documentation, which is a special kind of humbling.&lt;/p&gt;

&lt;p&gt;So we built a global search overlay. Hit ESC, or click the icon, type your question, get your answer. No reloads, no menu spelunking.&lt;/p&gt;

&lt;p&gt;Searchable: API references, documentation, community threads, game templates, tutorials, and everything else we forgot to list here (which the search bar will also find, conveniently).&lt;/p&gt;

&lt;p&gt;It's fast, it's obvious, and it makes Limn Engine feel like a serious tool built by serious people — a costume we are, at this point, fully committed to wearing in public.&lt;/p&gt;




&lt;h3&gt;
  
  
  📱 Touch-Friendly Design: Build Anywhere — Live Now
&lt;/h3&gt;

&lt;p&gt;Games get played on desktops, tablets, and phones, so it never made sense that you could only &lt;em&gt;build&lt;/em&gt; one hunched over a laptop like it's a ritual. We rebuilt the interface to be genuinely touch-responsive, whether you're:&lt;/p&gt;

&lt;p&gt;· Skimming docs on a tablet in bed&lt;br&gt;
· Managing your community from your phone on a lunch break&lt;br&gt;
· Poking at your game on whatever screen happens to be nearby&lt;/p&gt;

&lt;p&gt;No pinch-to-zoom archaeology, no buttons sized for a smaller species of thumb. Just an interface that works wherever you decided to be productive today, including the couch, which we fully endorse.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Inbox &amp;amp; Messaging: Stay Connected — Live Now
&lt;/h3&gt;

&lt;p&gt;Building alone is fine. Building with people who occasionally message you back is better. So we added a built-in inbox and messaging system for:&lt;/p&gt;

&lt;p&gt;· Getting updates and announcements, so "what's new" isn't a mystery&lt;br&gt;
· Talking to collaborators without leaving the platform&lt;br&gt;
· Staying plugged into the wider Limn Engine community&lt;/p&gt;

&lt;p&gt;It's a small feature that makes us feel disproportionately like a real company — one with an actual office, not just a room, some laptops, and a shared refusal to give up.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎮 What's Next?
&lt;/h3&gt;

&lt;p&gt;Currently in the workshop (these ones, unlike everything above, are genuinely not out yet — we'd tell you):&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;TypeScript support&lt;/strong&gt; — for developers who like their errors caught before runtime, understandably&lt;br&gt;
· &lt;strong&gt;An NPM package&lt;/strong&gt; — &lt;code&gt;npm install limn-engine&lt;/code&gt; is coming, we promise, for real this time&lt;br&gt;
· &lt;strong&gt;More game templates&lt;/strong&gt; — for when the blank canvas is scarier than the actual coding&lt;br&gt;
· &lt;strong&gt;Better physics and particles&lt;/strong&gt; — because if something explodes in your game, it should look &lt;em&gt;incredible&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We're building this for the long haul, and we'd like some company.&lt;/p&gt;




&lt;h3&gt;
  
  
  🙌 Join The Community
&lt;/h3&gt;

&lt;p&gt;Already here? You're basically family at this point, and we mean that with zero legal obligation attached.&lt;/p&gt;

&lt;p&gt;New? Come say hi:&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;#beginner-help&lt;/strong&gt; — no question is too small, we've asked worse&lt;br&gt;
· &lt;strong&gt;#showcase&lt;/strong&gt; — show us your first game, we will cheer, possibly too loudly&lt;br&gt;
· &lt;strong&gt;#engine-dev&lt;/strong&gt; — help build the engine itself, we need every hand we can get&lt;br&gt;
· &lt;strong&gt;#performance&lt;/strong&gt; — help us make this thing run on a toaster, we're only half joking&lt;/p&gt;




&lt;h3&gt;
  
  
  🏁 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;We started with a Toshiba laptop, 4GB of RAM, and one stubborn question: "Why do we have to write the same code in every single game?"&lt;/p&gt;

&lt;p&gt;That question is now a real, live, shipped engine with:&lt;/p&gt;

&lt;p&gt;· Zero configuration, because life is complicated enough already&lt;br&gt;
· 60 FPS on low-end hardware, yes, even that one&lt;br&gt;
· Google OAuth, one click, no passwords, no drama&lt;br&gt;
· Shareable code snippets, because copy-paste had its moment and that moment ended&lt;br&gt;
· Universal search, so nobody has to hunt for their own documentation again (looking at us)&lt;br&gt;
· Touch-friendly design, because the couch is a legitimate workstation&lt;br&gt;
· A community that keeps showing up, which is honestly the part we're proudest of&lt;/p&gt;

&lt;p&gt;Built by a team that refused to give up, mostly out of stubbornness.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Links
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;💬 &lt;strong&gt;Discord&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://discord.gg/kVpSmYWXr" rel="noopener noreferrer"&gt;discord.gg/kVpSmYWXr&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💻 &lt;strong&gt;GitHub&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/terracodes004" rel="noopener noreferrer"&gt;github.com/terracodes004&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✉️ &lt;strong&gt;Support Email&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:evolvedtech004@gmail.com"&gt;evolvedtech004@gmail.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Got questions, bugs, or just want to show off what you built? Drop into the Discord or email us — we read everything, we promise, we're not just saying that like a company that doesn't.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Draw your game into existence — the easy and advanced way.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>How We Upgraded Our Limn Engine Playground Editor To Support Version 4</title>
      <dc:creator>Evolved-Tech</dc:creator>
      <pubDate>Mon, 24 Aug 2026 23:17:17 +0000</pubDate>
      <link>https://dev.to/evolvedtech_27a34e6a5cf9/how-we-upgraded-our-limn-engine-playground-editor-to-support-version-4-2e75</link>
      <guid>https://dev.to/evolvedtech_27a34e6a5cf9/how-we-upgraded-our-limn-engine-playground-editor-to-support-version-4-2e75</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5g87pj9njntt6prql4y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5g87pj9njntt6prql4y.jpg" alt="Limn Engine Playground Editor v4 interface showing version dropdown" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: See What We Built
&lt;/h2&gt;

&lt;p&gt;Every game engine creator dreams of a seamless developer experience. Imagine opening a web-based playground, clicking a version dropdown menu, switching to Version 4, and instantly seeing your game run with brand-new features like built-in particle systems and audio management. Today, we want to walk you through how we updated our custom HTML5 canvas framework editor—Limn Engine—so it dynamically detects and routes Version 4 (epic.js) alongside our older releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Download Limn Engine
&lt;/h2&gt;

&lt;p&gt;Before writing or running any editor logic, you need to acquire the core engine build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the official website and download the core engine script file named &lt;code&gt;epic.js&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Keeping this file hosted and accessible allows your playground editor to inject it directly into runtime previews whenever a developer tests their game.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Teaching Style: Understanding How Version Routing Works
&lt;/h2&gt;

&lt;p&gt;Let me explain what this means for our editor architecture. A web-based code playground does not magically know which engine version a developer wants to use; it has to inspect the user interface dynamically. Here's what each part does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Our editor scans the DOM for any select dropdown elements.&lt;/li&gt;
&lt;li&gt;It evaluates their text content for version numbers.&lt;/li&gt;
&lt;li&gt;It maps that selection to the correct script file URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's look at how we implemented this logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking Down the Code Line by Line
&lt;/h2&gt;

&lt;p&gt;Before looking at code, here is what we are about to build: a two-part update to our editor's &lt;code&gt;runn()&lt;/code&gt; function that checks for Version 4 and maps it to our new asset URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Updating the Scanner Loop
&lt;/h3&gt;

&lt;p&gt;First, let's examine how we updated the scanner loop to recognize V4:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;select&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;allDropdowns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;select&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="c1"&gt;// Include V4 so the version detector targets it correctly&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;V2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;V3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;V4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;select&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;V&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;versionDropdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;select&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;text.includes('V4'):&lt;/strong&gt; We added this check so that when the editor reads our UI elements, it officially registers Version 4 as a valid release option instead of skipping it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Updating Script Routing Conditionals
&lt;/h3&gt;

&lt;p&gt;Next, let's look at how we updated the script routing conditionals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;versionDropdown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;selectedVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;versionDropdown&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectedVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;engineScriptFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tcjsgame-v2.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectedVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;engineScriptFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tcjsgame-v3.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectedVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;engineScriptFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[https://limn-engine-doc.vercel.app/asset/epic.js](https://limn-engine-doc.vercel.app/asset/epic.js)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Points to v4&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;selectedVersion.includes('v4'):&lt;/strong&gt; When a user selects v4 from the dropdown, this conditional matches the string and targets our newly hosted epic.js file for preview injection.
After coding, what we've accomplished is a lightweight, zero-dependency version switcher that connects UI dropdowns directly to our core framework files without requiring a heavy backend server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honesty About Our Limitations
&lt;/h2&gt;

&lt;p&gt;While string-matching UI elements is a fast and straightforward way to build a custom code playground, we have to be honest about its trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If someone alters our HTML label text or renames option values without updating the script check, version routing can fail.&lt;/li&gt;
&lt;li&gt;Larger commercial IDEs use robust configuration objects or package manager manifests instead. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, for a lightweight, custom-built framework like Limn Engine, string filtering keeps things simple and easy to maintain. We believe in letting developers choose the architecture that best fits their project goals.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You've Learned
&lt;/h2&gt;

&lt;p&gt;To summarize the key concepts we covered while making these changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DOM Traversal:&lt;/strong&gt; Dynamically scanning page dropdowns using &lt;code&gt;querySelectorAll('select')&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;String Filtering:&lt;/strong&gt; Extending conditional logic to recognize the V4 keyword.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Script Injection:&lt;/strong&gt; Mapping user version selections directly to the core &lt;code&gt;epic.js&lt;/code&gt; source URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resource Hub
&lt;/h2&gt;

&lt;p&gt;If you want to check out our framework files or connect with our creator community, explore these links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentation &amp;amp; Assets:&lt;/strong&gt; Visit the &lt;a href="https://limn-engine-doc.vercel.app/asset/epic.js" rel="noopener noreferrer"&gt;Limn Engine Vercel Assets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community &amp;amp; Support:&lt;/strong&gt; Join our &lt;a href="https://discord.gg/kVpSmYWXr" rel="noopener noreferrer"&gt;Discord server&lt;/a&gt; to share feedback and get help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code:&lt;/strong&gt; Review updates and templates on &lt;a href="https://github.com/terracodes004/limn-engine-doc" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
