LoveIDE

In-browser · single-file · LÖVE / Love2D

The notebook that is a main.lua.

LoveIDE is an in-browser IDE for authoring LÖVE (Love2D) games — a notebook-style view over a real main.lua, with a live preview of the game beside it. Your prose and your code live in one file, and that file is always a valid, runnable game.

The whole app is one HTML file. No build step, no install, no account — open it and write. An independent community tool, not affiliated with or endorsed by the LÖVE project.

main.lua — what the notebook edits
--[[ # Bouncing ball
This block is a Markdown cell in the notebook —
and an ordinary comment in the file. ]]

-- %%  ← an invisible code-cell separator
function love.load()
  x, y, dx, dy = 200, 120, 140, 100
end

-- %%
function love.update(dt)
  x, y = x + dx * dt, y + dy * dt
  if x < 10 or x > 390 then dx = -dx end
  if y < 10 or y > 290 then dy = -dy end
end

-- %%
function love.draw()
  love.graphics.circle("fill", x, y, 10)
end

1

file is the whole app — and 1 file, main.lua, is your whole project

0

installs, build steps, or accounts — it runs where your browser runs

byte-exact

round-trip: parse then serialize returns the file unchanged, verified by in-page self-tests

offline

editing, the doc model, and Markdown keep working when the CDNs don't load

The core idea

Notebook tools usually invent their own file format, and your code becomes an export. LoveIDE inverts that: main.lua is the single source of truth, and the notebook is a pure projection over it.

01

The file is the truth

What you edit is a real main.lua that LÖVE can run at any moment. There is no export step and no notebook format — the notebook is just a way of looking at the file.

02

Comments become prose

A top-level --[[ … ]] block comment renders as a Markdown cell; a -- %% line is an invisible code-cell separator. The md ⇄ lua toggle on a cell is nothing more than comment / uncomment.

03

Round-trip is byte-exact

serialize(parse(file)) === file — whitespace, separators, everything. Idempotence is verified by the self-tests built into the app (the Tests button in the topbar runs them).

The consequence is that LoveIDE never owns your project. Load any main.lua and it becomes a notebook; save at any moment and what comes out is the same kind of file that went in, runnable in desktop LÖVE whether or not LoveIDE ever sees it again.

What's in the box

An editor, a renderer, a runtime, and the housekeeping around them — all inside the one file.

A real Lua editor

Code cells are CodeMirror 6 — syntax highlighting, indentation, the editing you expect — with a plain-editor fallback when its CDN is unreachable.

Markdown cells, WYSIWYG

Prose cells render with marked.js (with a built-in renderer as the offline fallback) and support in-place WYSIWYG editing, so documentation lives beside the code it explains.

Live preview

Run builds your project into a .love in the browser and boots it with love.js, so the game runs beside the notebook. See the one requirement it has.

Export a runnable .love

One click packages the project as a .love archive that runs in desktop LÖVE — the preview is a convenience, not a dependency.

Autosave and snapshots

Work persists in your browser's IndexedDB with a snapshot history, so closing the tab loses nothing. Nothing is sent anywhere: there is no server side at all.

Assets and an AI assistant

A basic asset manager rides in the left activity bar. The optional assistant is project-aware chat: fully local in-browser models via WebLLM, or bring your own API key for remote ones.

The theme is LoveIDE's own Paper × Ink engine — continuous sliders from light to dark paper and steel to pink ink, rather than a list of named themes. This page borrows its palette.

The live preview, honestly

Everything on this page works by just opening the app — except Run, which has one technical requirement worth knowing about.

What Run needs

love.js — the runtime that boots LÖVE in a browser — needs SharedArrayBuffer, and browsers only grant that to pages that are cross-origin isolated. Served from this site, a bundled service worker supplies the isolation headers automatically: the page reloads once on first visit and Run just works.

Opening the file straight from disk (file://) can't be isolated, so there Run explains itself in the console instead of running — and everything else still works.

What never needed it

Editing, the doc model, Markdown, autosave, and — once its library has loaded at least once — Export. The exported .love runs in desktop LÖVE regardless of anything about your browser.

To work locally, any static server does it: python3 -m http.server next to the app's two files, then open it on localhost.

Open it and write a game

The IDE is a page on this site — no install, nothing to sign up for. Your work stays in your browser, and what you save is always a runnable main.lua.