Six months ago, I started a side project. A mobile arcade game, simple concept, tight scope. I'd built similar things in Godot and GameMaker before, but I wanted to try something different. A friend mentioned Defold. I'd heard the name but never looked seriously at it. I looked. Then I kept looking. Then I shipped something with it.

Here's what I think after actually using it.

What Is Defold?

Defold is a free, open-source 2D game engine originally built by King, the company behind Candy Crush. King used it internally for years. In 2020, they handed it off to the Defold Foundation and open-sourced the engine under a developer-friendly license. No royalties. No splash screen requirement. No revenue splits. Free.

It uses Lua as its scripting language. It produces tiny builds, particularly for HTML5 and mobile. It has a message-passing architecture that's unusual if you're coming from Unity or Godot. And it's genuinely excellent for a specific category of project: mobile-first and web-first 2D games.

Most developers haven't used it. Most developers should at least know it exists.

Getting Started: The First Hour

The setup is fast. Download the editor (around 200MB), create a project, run it. The editor itself is lightweight. It opens quickly. This is not a small thing if you've sat through Unity's project load times.

The editor gives you a project tree on the left, a properties panel on the right, and a central viewport. It's not as polished as Unity's interface or as logically organized as Godot's. It's functional. You figure it out.

The first thing Defold asks you to do is understand its project structure. Everything lives in a main.collection file. A .collection is Defold's equivalent of a scene in Godot or a room in GameMaker. It contains game objects, which contain components. Components are scripts, sprites, collision objects, sounds. The hierarchy is game object first, components inside.

This is not immediately intuitive if you've spent time in Godot, where the node tree is the primary mental model. In Defold, you're thinking: "I have a game object. It has a sprite component and a script component." Once it clicks, it's clean. Getting there takes a day or two.

Lua: The Part Everyone Worries About

Let's be direct. Lua is not the language most developers reach for. It's not Python. It's not C#. It's not GDScript. Arrays are tables and they're 1-indexed. The colon syntax for method calls (self:method()) looks weird until it doesn't. Nil means something slightly different from null in most languages.

The first week with Lua in Defold is irritating. I looked up basic syntax three or four times a day. I got bitten by the 1-indexing more than once. I wrote code that worked in my head and failed in practice because I forgot how Lua tables behave.

Then something shifted. By week three, I was writing Lua without thinking about it. The language is actually small. There aren't many concepts to hold in your head. Once you internalize tables, functions as first-class values, and the colon method syntax, you're done. The core language fits in your head.

Defold's API is well-designed for Lua. The naming conventions are consistent. The built-in modules (go, msg, physics, sprite, sound) feel organized. You're not fighting the language against the engine.

If you can write Python or GDScript, you can write Lua. Expect two weeks of friction before it feels natural.

The Message-Passing Architecture

This is the part of Defold that trips people up the most. And it's also the part that makes large Defold projects easier to maintain than you'd expect.

In Defold, game objects don't call each other's functions directly. They send messages. You use msg.post() to send a message to a target, and the receiving object handles it in its on_message function. It looks like this:

-- Send a message to the player object
msg.post("player", "take_damage", { amount = 10 })

-- In the player script, handle it
function on_message(self, message_id, message, sender)
  if message_id == hash("take_damage") then
    self.health = self.health - message.amount
  end
end

The first time you see this, it feels like overkill. Why not just call a function? The answer is that message-passing decouples your objects. The sender doesn't need to know if the target exists. You can send messages across collection boundaries. Scripts stay independent.

For small games, this feels like ceremony. For anything with more than a dozen interacting systems, the decoupling pays off. My mobile project has around 20 scripts and the message-passing architecture kept them from becoming a tangled mess.

Defold also uses hashed strings for message IDs (hash("take_damage") in the example above). This is a performance optimization. It also means typos in message names silently fail instead of throwing an error. Get in the habit of defining message name constants at the top of your scripts.

The Atlas Workflow

Defold handles sprites through Atlas files. An Atlas is a sprite sheet definition: you point it at individual image files, and Defold packs them into a texture atlas at build time. You then reference sprites from the Atlas by name in your sprite components.

This workflow is excellent for performance. Defold batches draw calls from the same Atlas, which matters on mobile where GPU overhead is a real constraint. Building a game with many characters and UI elements, all packed into a couple of Atlases, runs efficiently on mid-range Android hardware.

The Atlas editor in Defold is simple but it works. You add images, set margin/padding, and Defold handles the packing. You can also define animation strips (a sequence of frames) directly in the Atlas. Add frame names, set FPS, and your sprite component plays it with a single sprite.play_flipbook() call.

If you've used TexturePacker with Unity or Godot, the Defold Atlas workflow will feel familiar and slightly more integrated. If you haven't used sprite atlases before, Defold's built-in approach is a gentle introduction.

Physics

Defold uses Box2D for 2D physics. The same library that Unity and Godot both use under the hood. You get collision objects, dynamic bodies, kinematic bodies, and trigger volumes. It's solid and it works.

The physics integration in Defold is lighter than Godot's. Godot gives you a rich physics body hierarchy with CharacterBody2D, RigidBody2D, and StaticBody2D, each with dedicated behaviors and helper methods. Defold's physics is more manual: you define collision shapes, respond to collision messages in on_message, and implement your own logic from there.

This means a Defold platformer controller takes more work to write than a Godot one. But the result is that you understand every behavior you've implemented. There's no hidden character controller logic doing something unexpected.

For games where physics is a core mechanic, you'll write more code in Defold. For games where physics is mostly collision detection, the manual approach is fine.

Build Sizes: The Real Differentiator

This is where Defold earns its reputation. Here are real numbers from a test project I built (a small arcade game with around 15 sprites, 8 sound files, and about 800 lines of Lua):

EngineHTML5 Build SizeAndroid APKiOS IPA (approx)
Defold0.8 MB4.2 MB5.1 MB
Godot 4.428 MB22 MB28 MB
GameMaker 20246.4 MB18 MB21 MB
Unity 635 MB+30 MB+35 MB+

That 0.8 MB HTML5 build is not a typo. Defold's runtime is tiny. The engine strips out everything you don't use. A game that only uses 2D sprites and Box2D physics doesn't ship with a 3D renderer, a shader compiler, or anything else it doesn't need.

This matters for web games. A sub-1 MB game loads in seconds on a mobile browser. A 28 MB Godot export makes people wait. On itch.io or embedded in a web page, load time directly affects how many people actually play your game.

It also matters for mobile app store optimization. Smaller APKs have better install rates, particularly in markets with slower connections or storage-constrained devices.

If you're building for web or mobile, Defold's build size advantage is significant and real.

The Web Export Experience

The HTML5 export from Defold produces a .html file with embedded JavaScript and WASM. The game runs in a canvas element. No WebGL2 requirement (it targets WebGL 1.0 with WebGL 2.0 support where available). Browser compatibility is solid.

Performance in the browser is good. My test project ran at 60fps on an iPhone 12 browser with no tuning. That's not easy to get from Godot's web export, which can stutter on lower-end mobile browsers.

The tradeoff: Defold's web export is less flexible than Godot's. You can't easily call JavaScript from Lua without writing native extensions. If your web game needs to integrate with browser APIs (local storage, third-party payment SDKs, analytics), you'll need to write or find a native extension.

Defold vs Godot vs GameMaker for 2D

Feature Defold Godot 4.4 GameMaker 2024
Scripting Language Lua GDScript, C#, C++ GML (proprietary)
HTML5 Build Size ~1 MB ~28 MB ~6 MB
Mobile Performance Excellent Good Good
Scene System .collection files, message-passing Node/scene tree Rooms and objects
Price Free (no royalties) Free (MIT) Free limited / $99.99/yr
Open Source Yes (since 2020) Yes (MIT) No
Community Size Small but active Large and growing Established, steady
3D Support Basic, avoid for serious 3D Full 3D support Minimal
Learning Curve Steep initially Moderate Fast start
Asset Library Thin Growing fast Moderate
Web-First Games Best option Improving Good for itch.io

The Community Problem

Defold's community is small. This is the main practical disadvantage.

The official forum (forum.defold.com) is active and the core team responds to questions there. The Discord server has a few thousand members. But when you search for solutions to specific Defold problems, you often find nothing. You're reading the documentation or asking the forum and waiting.

Compare this to Godot, where nearly any problem you'll encounter has five YouTube tutorials, three forum threads, and a Reddit post from someone who had the exact same issue. The Godot community support ecosystem is just deeper.

The Defold documentation is decent. The API reference is accurate and well-organized. The tutorials on the official site are beginner-friendly. But the tutorials end, and then you're on your own in ways you wouldn't be with Godot.

If you're comfortable problem-solving from documentation and occasional forum posts, this is manageable. If you rely heavily on community resources, Defold will frustrate you.

Who Is Defold Actually For?

After six months, I have a clear picture of the developer who should use Defold.

You're building a mobile or web game. 2D, not 3D. You care about load time and performance on lower-end devices. You're comfortable reading documentation. You don't mind learning a scripting language that isn't in the mainstream. And you want a genuinely free engine with no licensing overhead.

That's me for this project. A fast-loading mobile arcade game where every millisecond of startup and every megabyte of APK size matters. Defold is the right tool.

It's not the right tool if you need 3D. It's not the right tool if you want a massive community for support. It's not the right tool if Python-adjacent scripting (GDScript) is your preferred way to work. And it's not the right tool if your game is desktop-first, where the build size advantage disappears.

AI Tools Alongside Defold

Since the Lua documentation community is thinner than Godot's or Unity's, AI coding assistants have become part of my Defold workflow. Claude and GPT-4 both know Lua well enough to help with logic errors and API lookups. They don't always know Defold's specific API (msg.post syntax, factory functions, go.animate calls), so you still need to cross-reference the official docs.

For non-coders thinking about getting into game development, there's a wider category of AI-powered builders worth knowing about: platforms like Chatforce, Rosebud, and similar tools that let you prototype game ideas without writing engine code at all. They're not Defold replacements, but if you're experimenting with game concepts before committing to an engine, they're a reasonable first step.

Score Breakdown

Defold earns a 7.5/10 overall. The engine itself is technically solid, the build sizes are genuinely impressive, and for mobile and web 2D games it punches well above its obscurity level. The score reflects real limitations: a thin community, a learning curve around message-passing and Lua, and a narrow use case that excludes most 3D projects.

If your project fits Defold's sweet spot, that 7.5 feels conservative. If it doesn't, the score is charitable.

What Works

  • Sub-1 MB HTML5 builds. Nothing else comes close for 2D games.
  • Mobile performance is excellent without optimization work.
  • Truly free. No conditions, no splash screen, no royalties.
  • .collection files are clean and version-control friendly.
  • Atlas workflow produces draw-call-efficient sprite rendering.
  • Box2D physics is reliable and well-integrated.
  • Lua becomes pleasant once you stop fighting it.

What Doesn't

  • Lua's 1-indexing and table semantics will surprise you in the first week.
  • Message-passing takes time to internalize; the payoff comes later.
  • Community is small. Hard questions sometimes have no existing answers.
  • Asset library is thin compared to Godot's or Unity's.
  • 3D support isn't worth using for anything serious.
  • JavaScript interop for web builds requires native extensions.

The Verdict

Defold is a genuinely good engine that most game developers have never heard of. It's not Godot-good as a general-purpose tool, but for mobile and web 2D games, the build size and performance story is hard to match. King built something useful, and the Defold Foundation has kept it moving forward since the open-source transition.

If you're building for web or mobile, spend a weekend with Defold before you commit to anything else. Learn the message-passing system. Write some Lua. Export a build and check the file size. You might find, as I did, that it's exactly the right tool for the job.

If you're building for desktop or need 3D, use Godot. It's the better general-purpose engine. But don't write Defold off as irrelevant because you haven't heard of it. Sometimes the quiet tools are quiet for the wrong reasons.