DEV Community

Cover image for Announcing Limn Engine — Draw Your Game Into Existence
Kehinde Owolabi
Kehinde Owolabi

Posted on

Announcing Limn Engine — Draw Your Game Into Existence

🎨 Announcing Limn Engine — Draw Your Game Into Existence

The 2D Game Engine That Puts Creativity First

After years of development, countless late nights, and more cups of coffee than I can count, I'm thrilled to announce Limn Engine — a zero‑configuration, browser‑based 2D game engine designed for people who want to make games, not fight with tools.


What is Limn Engine?

Limn (verb) — to draw, paint, or portray.

It's the perfect name for an engine that helps you bring your game ideas to life, one line of code at a time.

Limn is a zero‑configuration, browser‑based 2D game engine that prioritizes creativity over complexity.

  • No build steps — just HTML and JavaScript
  • No package managers — one file, that's it
  • No complex tooling — start coding in seconds
<script src="limn.js"></script>
<script>
const display = new Display();
display.start(800, 600);

const player = new Component(40, 40, "blue", 400, 300);
display.add(player);

function update(dt) {
    if (display.keys[39]) player.speedX = 300 * dt;
    if (display.keys[37]) player.speedX = -300 * dt;
    move.bound(player);
}
</script>
Enter fullscreen mode Exit fullscreen mode

That's it. Your first game, ready in seconds.


Why Another Game Engine?

Most game engines fall into two categories:

Category Problem
Visual/no-code engines Limited control, hard to extend
Professional engines Steep learning curve, complex setup

Limn bridges the gap. It's powerful enough for real games, yet simple enough for beginners. Every feature exists because I was tired of writing the same code over and over:

  • move.bound(player) — no more edge detection boilerplate
  • fixed() — UI follows the camera automatically
  • destroy() — memory management without headaches

"Common outcomes should be functions." That's the philosophy.


What's Inside

⚡ Dual-Renderer Performance

Limn uses a hidden "fake canvas" to cache static content (tilemaps, backgrounds). The result? 60 FPS on a Toshiba with 4GB RAM. Static elements render once, dynamic elements render on top. Simple. Fast. Effective.

📷 Professional Camera System

display.camera.follow(player, true);   // smooth follow
display.camera.shake(8, 8);            // screen shake
display.camera.setZoom(1.5);           // zoom in
display.camera.shakeRotation(0.07);    // rotational shake
Enter fullscreen mode Exit fullscreen mode

🎯 Circle Collision

Perfect for coins, balls, and round enemies:

coin.enableCircleCollision(15);
if (player.crashWithCircle(coin)) collect();
Enter fullscreen mode Exit fullscreen mode

🖼️ Dynamic Images

Swap images at runtime — perfect for power-ups or damage states:

player.setImage("hero_powered.png");
player.setColor("red"); // back to rectangle
Enter fullscreen mode Exit fullscreen mode

🎨 Particle System with Presets

move.particles.explosion(ps, x, y, 30);
move.particles.sparkle(ps, x, y);
move.particles.blood(ps, x, y, 15);
move.particles.magic(ps, x, y);
Enter fullscreen mode Exit fullscreen mode

🔊 Complete Audio System

const soundManager = new SoundManager();
soundManager.load("coin", "coin.wav");
soundManager.play("coin");
soundManager.playMusic("theme.mp3");
Enter fullscreen mode Exit fullscreen mode

🗺️ Tilemap System

Levels as native JavaScript arrays — no external editors required:

const level = [
    [1,1,1,1,1],
    [1,0,2,0,1],
    [1,0,0,0,1],
    [1,1,1,1,1]
];
const tilemap = new TileMap(display, level, tiles, 800, 600);
tilemap.show();
Enter fullscreen mode Exit fullscreen mode

🎭 Sprite Animation

One image, many frames. The engine handles the rest:

const hero = new AnimatedSprite("hero.png", 64, 64, 400, 300);
hero.addAnimation("idle", 0, 0, 1);
hero.addAnimation("walk", 1, 4, 8);
hero.playAnimation("walk");
Enter fullscreen mode Exit fullscreen mode

📝 Rich Text with Tctxt

const score = new Tctxt("24px", "Arial", "white", 20, 40,
    "left", false, "alphabetic", "rgba(0,0,0,0.5)", 10, 5);
score.setText("Score: 0");
Enter fullscreen mode Exit fullscreen mode

The Numbers

Category Rating
Overall Score 94/100
Ease of Learning 96/100
Performance 95/100
API Design 96/100
AI Readiness 97/100

The Story

Limn Engine started on a Toshiba laptop with 4GB RAM, offline W3Schools, and borrowed siblings' laptops. No team. No funding. Just determination.

  • 2023: JGame (unpublished)
  • 2024: TCGame, TCJSGame V3
  • 2025: Dual-renderer breakthrough (4 FPS → 60 FPS)
  • 2026: Limn Engine V1

From a Toshiba to a professional game engine. That's the journey.


Who Is Limn For?

You are... Limn is for you
A beginner Most approachable code-first engine
A solo developer Get games shipped faster
A game jam participant Zero setup, instant prototyping
A teacher Students learn in hours, not weeks
An AI-assisted coder API designed for predictability

What's Next

Limn Engine is production-ready and free forever under the MIT license.

  • 📥 Download: limn-engine.vercel.app
  • 📚 Documentation: Beginner → Intermediate → Advanced → 10x guides
  • 💬 Discord: Join the community
  • 🧪 Try it now: Copy the example above and paste it into an HTML file

The One‑Line Summary

"Limn Engine is a 94/100 professional-grade 2D game engine that prioritises simplicity, performance, and developer joy — built by one developer who refused to give up."


Draw Your Game Into Existence

Limn Engine V1 is ready.

No more fighting with tools. No more boilerplate. No more excuses.

Download Limn Engine · Read the Docs · Join Discord


Owolabi Kehinde

Creator of Limn Engine

Built on a Toshiba with 4GB RAM. Powered by determination. 🚀

Top comments (0)