Releases / v0.91.1

v0.91.1 Your Own Data

2026-09-12 Engine

A script can read and write its own data files now. A rhythm chart, a dialogue tree, a table of enemy stats — anything you would rather author as JSON than as a Lua table — is a file under Assets/, and a script gets it in one call.

Data files, in and out

json.encode and json.decode have been here since v0.20.0, but a script had no way to open a file: assets.getFile answers a path, which is what a model or a material wants and nothing a script can read. So a chart authored outside the game had to be rewritten as Lua, or pushed through save.* a kilobyte at a time. Four calls close that gap:

lua
local chart, why = assets.readJson("charts/neon.json")
if not chart then return log("no chart: " .. why) end
for _, note in ipairs(chart.notes) do
  spawnNote(note.t, note.lane)
end
  • assets.readJson(path) — a JSON file decoded straight to a Lua value, by json.decode's rules: objects are tables, arrays are 1-based lists that stay lists on the way back out, null is nil.
  • assets.writeJson(path, value [, { pretty = true }]) — the reverse. pretty indents it for a person, or for a git diff.
  • assets.readText(path) / assets.writeText(path, text) — the same for any text file, when the format is your own.

Writing back is the half that makes a chart editor a scene in your game rather than a tool outside it: record the hits, call assets.writeJson, and the file it wrote is one the Asset Browser shows, git diffs and the export ships. A write creates the folders on the way.

Every one of them answers value, why rather than raising — a data file is content, and a file that is missing, not text, or not JSON is a message in the Console and a nil the script can handle, never an error that stops the script loading. Paths are relative to Assets/ and stay inside it, the same rule assets.getFile follows; a path that would leave the project is refused and says so. The same calls work in an exported build and in a browser, where a read comes from the bundle and a write lands in the page's own storage.

Floptle Hub

Linux x86_64 7.9 MB Download → sha256 176c6fafbc45a1260f31b0dcb435d5b102a26507ae785c9debbb05edfa68eecb
macOS Apple Silicon 5.9 MB Download → sha256 04120625de438af66b71d350f0c535a4b6efe8ee0ca5e8187dc98eebb3a23bf3
macOS Intel 6.4 MB Download → sha256 3f87a9411571cacbd1d7fd11c7a9a332af8424a8178ccaf613039ff9aaeb528b
Windows x86_64 7.3 MB Download → sha256 ea2ab4fb2f098bce426a4da6cecf0c67f0b80fea9035cf835f06187d568eaa61

Engine

Linux x86_64 33.7 MB Download → sha256 0da120a49d173186d3a8b1753dcfd65016b859e6867f044fbdf774021a17297d
macOS Apple Silicon 27.4 MB Download → sha256 1e4e955ba05d52dd79e8ef80bd8212bf5e9d7a4035d4ab7deb981eb838ff33f5
macOS Intel 29.6 MB Download → sha256 64bafc1b8615d989dcac2fbbebf8cf53b11c2d4b008ec6c616ad03b9d6588b34
web 4.3 MB Download → sha256 3360d78798d7aa032bdaef3e991e021cfc38655186e4c1f9bbd0c776ee72bdc2
Windows x86_64 33.4 MB Download → sha256 4a70ee8725bb3e96b2846ea26df587cd469cb0bd0d08c7c874593d143368deff

The binaries are not signed yet. On macOS, right-click the app and pick Open the first time. On Windows, if SmartScreen appears, pick More info then Run anyway.