A complete game engine.
Kept compact.

A small, batteries-included C library for 2D and 3D graphics, physics, spatial audio, input and assets. Built for simple, enjoyable development of apps and games - link one library, or start with Lua.

One codebase

Cross-platform. By default.
Fully native. By design.

One library, one header - nothing else to assemble. A C API with an official Lua runtime, and one rendering API over every graphics backend.

Built as one system

The engine handles the machinery.
You keep the game.

GPU

2D and 3D, together

Draw primitives, text, sprites and glTF models through the same compact rendering API. Automatic batching keeps the common path fast.

NSL

One shader source

Write one NSL shader. Natiny compiles it for Vulkan, Direct3D 12, Metal, OpenGL or WebGPU at load time.

ENT

One transform hierarchy

Models, rigid bodies, cameras and sounds share the same entity system. Parent them once; movement stays in sync.

PHY

3D physics included

Rigid bodies, mesh colliders, impulses and raycasts are built in with Box3D. A rendered mesh can also become its collider.

3D

Spatial audio that belongs in 3D

Sources live in the scene and feed a third-order ambisonic mix, with binaural HRTF output for headphones.

IO

The rest is already there

Windows, input, cameras, fonts and asynchronous resource loading are part of the engine-not another integration job.

Small surface area

An actual window. An actual frame.
No project ceremony.

main.lua
local natiny = require("natiny")

natiny.backend.init()
local window = natiny.window.create("Hello, Natiny!", 800, 600)

natiny.backend.loop(function()
    natiny.window.bind(window, function()
        natiny.render.clear(0.90, 0.92, 0.96)
        natiny.render.set_color(0.776, 0.871, 0.376, 1)
        natiny.render.clear(0.07, 0.09, 0.13)
        natiny.render.set_color(0.66, 0.76, 0.22, 1)
        natiny.render.circle(400, 300, 80)
    end)
end)
Hello, Natiny!

Use it your way

Native at the boundary.
Lua when iteration matters.

C SDK

Plain C API

Link libnatiny into your executable, or load the shared library beside it, from C, C++, Rust, Zig, Go, or any toolchain that speaks C. The API stays explicit and the engine stays behind it.

Native API reference
Official runtime

Lua wrapper

The same engine through a direct Lua interface. Fast startup, short edit-run cycles, and no second-class scripting layer.

Start with Lua

Natiny 0.12.1

It is early. It already works.
Complete where it matters.

Still growing - see what we are building next.

Download Natiny