ScriptsApr 15, 2026·3 min read

Ebitengine — A Dead Simple 2D Game Engine for Go

Ebitengine is a simple 2D game library for Go with a tiny API that takes minutes to learn. It compiles to WASM, iOS, Android, Nintendo Switch, and desktop — ideal for game jams and indie titles written in Go.

TL;DR
Ebitengine is a minimal 2D game library for Go that compiles to desktop, mobile, WASM, and Nintendo Switch.
§01

What it is

Ebitengine (formerly Ebiten) is a 2D game library for the Go programming language created by Hajime Hoshi. It offers a tiny API surface that takes minutes to learn. The engine handles rendering, input, audio, and window management while compiling to desktop (Windows, macOS, Linux), mobile (iOS, Android), WebAssembly, and Nintendo Switch.

Ebitengine is ideal for game jams, indie titles, and educational projects where developers want Go's simplicity and type safety without the complexity of larger engines.

§02

How it saves time or tokens

Ebitengine's API consists of three methods: Update(), Draw(), and Layout(). There is no entity-component system to learn, no scene graph to configure, and no editor to install. You write standard Go code, run go build, and get a working game. Cross-compilation to WASM or mobile requires only a build flag change, not a separate toolchain.

§03

How to use

  1. Initialize a Go module and install Ebitengine.
  2. Implement the three-method Game interface.
  3. Run with go run . for immediate feedback.
go mod init mygame
go get github.com/hajimehoshi/ebiten/v2
go run .
§04

Example

A complete Ebitengine program that opens a window and renders text:

package main

import (
    "github.com/hajimehoshi/ebiten/v2"
    "github.com/hajimehoshi/ebiten/v2/ebitenutil"
    "log"
)

type Game struct{}

func (g *Game) Update() error { return nil }
func (g *Game) Draw(screen *ebiten.Image) {
    ebitenutil.DebugPrint(screen, "Hello, Ebitengine!")
}
func (g *Game) Layout(ow, oh int) (int, int) { return 320, 240 }

func main() {
    ebiten.SetWindowSize(640, 480)
    ebiten.SetWindowTitle("Hello")
    if err := ebiten.RunGame(&Game{}); err != nil {
        log.Fatal(err)
    }
}
§05

Related on TokRepo

§06

Common pitfalls

  • Ebitengine is 2D only. There is no 3D rendering support. For 3D games in Go, consider G3N or Raylib Go bindings.
  • Audio playback requires careful sample rate management. Mixing audio sources at different sample rates causes distortion.
  • WASM builds need a specific HTML wrapper file. The Ebitengine docs provide a template, but missing it causes a blank browser page.

Frequently Asked Questions

What platforms does Ebitengine support?+

Ebitengine compiles to Windows, macOS, Linux, iOS, Android, WebAssembly, and Nintendo Switch. Desktop and WASM builds work out of the box with standard Go tooling. Mobile builds use gomobile. Nintendo Switch requires the licensed SDK.

Is Ebitengine suitable for commercial games?+

Yes. Ebitengine is Apache 2.0 licensed and has been used in published indie games. Performance is sufficient for 2D games with hundreds of sprites, particle effects, and real-time audio. It handles 60fps consistently on modern hardware.

How does Ebitengine compare to Unity or Godot?+

Ebitengine is a code-only library, not a full engine with an editor. It has no visual scene editor, no asset pipeline, and no built-in physics. It trades features for simplicity. Developers who prefer writing all game logic in code and want Go's compile-time safety will prefer Ebitengine.

Can I use shaders in Ebitengine?+

Yes. Ebitengine supports custom shaders written in Kage, a GLSL-like shading language designed for the engine. Kage shaders compile to the appropriate backend (OpenGL, Metal, DirectX, WebGL) automatically.

Does Ebitengine have a physics engine?+

No built-in physics engine. You can integrate third-party Go physics libraries like cp (Chipmunk2D bindings) or write simple collision detection yourself. Many 2D games only need AABB or circle collision, which is straightforward to implement.

Citations (3)

Discussion

Sign in to join the discussion.
No comments yet. Be the first to share your thoughts.

Related Assets