Make games and apps in Lua, and publish them

One Lua API covers 2D and 3D, charts and data, physics, sound, interface and online play, and every app runs in its own sandbox. The tools to test, debug and profile come with it, and publishing on datumhue.app lets anyone open your work in a browser.

Your first picture

Your first picture takes three lines

Here is the whole program, and what it draws.

hello.lua
local canvas = datumhue.draw.new({ width = 1280, height = 720 })
canvas:mount({ width = "100%", height = "100%", fit = "contain" })
canvas:circle({ radius = 240, color = datumhue.color("#e69875") })
A smooth orange circle in the middle of a plain background.A smooth orange circle in the middle of a plain background.
  1. Write. Save these lines as hello.lua in any editor.
  2. Run. In a terminal, type the DatumHue program's name, then run --watch hello.lua. The picture opens. Get started has the exact command for your system.
  3. Change. Edit a number and save. The picture redraws.

What you can make

From heatmaps to voxel islands, in one API

Every picture is one of the example programs on the home page, drawn by the Lua you can read there.

A heatmap of bike trips by day and hour, with a color key of trip counts beside it. Weekday trips peak around 8 in the morning and 5 in the afternoon, weekend trips around midday, and the nights stay empty.A heatmap of bike trips by day and hour, with a color key of trip counts beside it. Weekday trips peak around 8 in the morning and 5 in the afternoon, weekend trips around midday, and the nights stay empty.
57 lines of Lua

Charts & data

Query and join CSV and Parquet files, even whole folders, with SQL. Save results in either format. Draw heatmaps, box plots, bubbles and stacked bars on log or time scales. Pan, zoom, drag to filter, and split one chart into a grid of small charts.

A round voxel island seen at an angle from above: sand beaches, green hills and a grey rocky peak in a ring of shallow water, with orange lanterns glowing among the hills.A round voxel island seen at an angle from above: sand beaches, green hills and a grey rocky peak in a ring of shallow water, with orange lanterns glowing among the hills.
50 lines of Lua

Voxels

Build editable voxel volumes, or large worlds that load chunk by chunk. Blocks can be see-through or glow, and a glowing block lights the cells around it. Raise terrain from noise or an image, bake in sunlight, and add physics colliders that follow every edit.

Swirling bands of green and orange on dark slate, warped like marbled paper, behind a glossy ball wrapped in the same bands and lit from the upper left.Swirling bands of green and orange on dark slate, warped like marbled paper, behind a glossy ball wrapped in the same bands and lit from the upper left.
53 lines of Lua

Shaders

Write fragment shaders in WGSL, the WebGPU shading language, for panels, shapes, 3D meshes, voxels or the whole scene. Feed in your values and up to four textures, even a live scene. They reload live, keeping the last good version if a new one fails.

A pixel-art dusk: stars over dithered bands of sky, a pale sun setting beside a dark green mountain, its orange reflection striping the water, and the word DUSK.A pixel-art dusk: stars over dithered bands of sky, a pale sun setting beside a dark green mountain, its orange reflection striping the water, and the word DUSK.
39 lines of Lua

Pixels and 2D drawing

Paint on your own canvas, pixel by pixel. Fill shapes, dither with fill patterns, print in a bitmap font, then scale it up crisp. Or, instead of pixels, draw shapes, paths, text, sprites, animated sprite sheets and tilemaps, and move and restyle them every frame.

A pixel-art dungeon seen from above: grey rooms joined by corridors, one room lit warm orange by the torch of an @ hero, red k monsters in the dark rooms, and a dotted gold path to a $ hoard.A pixel-art dungeon seen from above: grey rooms joined by corridors, one room lit warm orange by the torch of an @ hero, red k monsters in the dark rooms, and a dotted gold path to a $ hoard.
58 lines of Lua

A kit for games

Give any grid pathfinding, field of view, Dijkstra maps, Voronoi regions, cellular automata and torchlight. Add seeded randomness, noise, and storage for saved games. Players can rebind their controls, and you can use up to 8 gamepads, with rumble.

A lesson page titled "How a square wave hides in sines": two lines of prose, a Harmonics slider set to 5, and a line chart of a sum of sines squaring off.A lesson page titled "How a square wave hides in sines": two lines of prose, a Harmonics slider set to 5, and a line chart of a sum of sines squaring off.
40 lines of Lua

Pages that compute

Write pages in Markdown and drop in charts, sliders, buttons or any other widget. Your Lua fills in their values. A code block can run hidden, or show its source as it runs. Join chapters into a book and teach a class with it.

Read the code behind each picture

Also in the same API

3D scenes

Load glTF models, a standard 3D format, and blend their animations. Add point, spot and sun lights with shadows, a skybox, and image-based lighting. Finish with bloom, fog and tonemapping. Sprites in a 3D world can switch between 8 sides as the camera circles them.

Particles

Particles glow with textures and additive blending. Send them out in bursts or steady streams, from a point, a sphere, a box or a cone. Gravity pulls them, and each one changes size and color over its life.

Physics

Give a drawn shape, sprite or 3D model a body, and it moves with the simulation. The 2D and 3D physics have joints, sensors, collision layers, forces and raycasts, and a character controller comes with them.

Audio

Synthesize sounds from waveforms, sequence notes and music patterns, or play recorded samples. Mix through named buses, such as one for music and one for effects. Fade volume and pitch, and place one-shot sounds in space.

Interface

Build it from buttons, sliders, text and number inputs, sortable tables, menus and popovers, plus pickers for dates, times and colors. Open and save buttons use your system's file dialogs. Pages and tabs stay just as people left them. Theme and translate your app.

Online together

Sign people in with their own accounts. Send messages to everyone running your app, see who else is there, and keep shared documents in step between their computers.

How you work

Save the file, see the change

A debugger, tests, coverage, a profiler and packaging come with the workstation app.

Reload as you save

Run your file with --watch, and every save redraws it. If a save doesn't compile, the last working version keeps running and the error is printed. Changed images, sounds and scenes swap in place, and your app keeps its state.

datumhue run --watch hello.lua

datumhue stands for the program in your download. Get started has the full command for your system.

Your editor, fully typed

Every project comes with type definitions that match the DatumHue version you run. Any editor with the Lua language server gets completion and type checks for every call.

Breakpoints in your editor

Run an app or a test suite under your editor's debugger. Set breakpoints, including conditional ones, and logpoints. Step through your code, and inspect or change variables.

A test runner

Write describe-and-it tests that run inside the workstation. They wait for frames, press keys and move the pointer. Every run prints a seed, so you can repeat it with the same random numbers. Results come as TAP, a standard test format, and an HTML report.

Branch coverage

See which lines and branches your tests reach, file by file. Fail the run when coverage drops below a threshold, or export a standard file that coverage viewers read.

A profiler

Record any run or test suite and see where each frame's time went, function by function. Open the recording as a flame graph in a standard profile viewer, or read the HTML report. An app can show its frame budget and memory as it runs.

A live console

Start an app with a console attached and read or change its state while it runs. In watch mode, the console stays attached across reloads.

A project in one command

One command sets up an app, library, theme, book, dataset or template. The folder layout, editor setup and formatting rules are in place from the start. An app or library begins with a test that already passes.

Pack and share

Pack a creation and its files into one archive. Any DatumHue workstation app can run it.

Jobs without a window

Run a script with no window, for batch data work or automated checks in CI. A script that fails exits with an error code your pipeline can see.

The manual in every download

One searchable page holds the guide and every function of the version you run. It opens in your browser.

Read the manual (opens datumhue.dev)Which editions have them

Publish

Put your work in the datumhue.app store

People open what you publish in their browser, with nothing to install, or in the workstation app.

Claim your @name

Sign in with your Google account and claim an @name of your own. You decide who may publish under it.

Run your package server

Your work is served from a small package server you run on a computer that stays on. The registry manual sets it up step by step.

Push a version

One command publishes a version from your project folder. A published version never changes, so players get exactly what you tested. Push a new version to update.

Sell it, if you like

Mark a package paid and set its price. Buyers pay you through your own Stripe account. Each paid sale carries a 15% fee, plus Stripe's processing fees.

Share your work in #showcase on the DatumHue Discord (opens discord.gg). From time to time we send creators there a code that waives the monthly publishing price for as long as they publish.

What publishing costs Read the registry manual (opens datumhue.dev)

The language

One small language for all of it

One Lua API

Your update function runs every frame and can read keys, mouse, touch and gamepads. Timers and tweens animate values. Charts, pixels, 3D, sound and widgets share one set of rules, so a chart can sit inside a game, and a game inside a lesson.

Wait without callbacks

A call that waits for a file, a query or a timer just returns its answer, so the very next line can use it. Start several at once and wait for all of them together. Callbacks are for events, not results.

Data streams in

Opening a data table doesn't load it into memory. Query it with SQL, read the results column by column, or hand it to a chart. The chart draws what fits on screen and recomputes its summary of the data as you zoom.

A versioned API

Each project states the API version it needs, and DatumHue checks it before launch. Every release lists its API changes, breaking ones first.

Learn Lua with Datum and Hue (opens datumhue.app)

Under the hood

Each app runs in its own space

A Lua error stops only its app

Several apps can run at once. When one app's Lua hits an error, that app stops and the others keep running. The log names the app that failed.

A runaway script slows only itself

Every app's Lua gets a fair share of each frame. A loop that never ends slows its own app and no other. An app waiting for a file or a timer uses nothing until the answer arrives.

Apps reach only what you hand them

An app opens only the files and folders it's given. If it starts other apps, they get no more access than it has. Each app runs in its own interpreter, with its own memory ceiling.

What DatumHue is built on

Start making things

All of this comes with the free workstation app. To share what you make with anyone, publish it on datumhue.app.

Free · No sign-up · Windows, macOS (Apple Silicon), Linux