2D and 3D, one API
Primitives, text, sprites and glTF models go through the same calls. 2D piles into one batch until the texture or the material changes.
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.
Made with Natiny, running here
Built as one system
Primitives, text, sprites and glTF models go through the same calls. 2D piles into one batch until the texture or the material changes.
One NSL file becomes Vulkan, D3D12, Metal, OpenGL, GLES or WebGPU at load time - uniform blocks and skinning included.
Mark a material instanced and 500 copies of a mesh cost one draw call per part. render.tag picks what to draw.
A layer is one clip with a weight and a bone mask. Clips cross-fade while both keep running; the pose is built once a tick.
Models, rigid bodies, cameras and sounds are one entity system. Parent them once; movement stays in sync.
Rigid bodies, mesh colliders, impulses and raycasts, on Box3D. A rendered mesh can become its own collider.
Rows, columns, grids and free layout in a tree of rectangles. One call lays it out, routes the pointer and draws it.
Sources are entities, feeding a third-order ambisonic mix with binaural HRTF output for headphones.
Windows, input, fonts and asynchronous loading. Assets come off a stack of mounted folders, so a mod replaces a file.
Small surface area
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)
Use it your way
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.
The same engine through a direct Lua interface. Fast startup, short edit-run cycles, and no second-class scripting layer.
Start with LuaNatiny 0.14.0
Still growing - see what we are building next.