Lovely
A better way to publish LÖVE games.
Lovely is a GPL-3.0 Rust CLI for turning one LÖVE >= 11 source tree into web and desktop/Steam distribution artifacts.
Note:: This is a work in progress and is 95% vibe coded to get the basics working and validate the idea. Once parity with existing love.js builds is achieved, I'll start focusing on patching existing bugs, pulling in outstanding Pull Requests and Issues, and identifying fixes that were added to forks of love.js that should be upstreamed into a canonical runtime.
This repository currently contains the first implementation slice:
lovely.tomlproject configuration vialovely init.lovely.lockreproducibility metadata pinned to thelove-11-plusruntime channel.- Runtime registry commands for installing local pinned runtimes into
~/.cache/lovely. - Deterministic
.love/ZIP/TAR packaging with normalized file ordering and timestamps. - Target adapter seams for web, Windows, macOS, and Linux.
- Web packaging that consumes Lovely.js runtime bundles, including
lovely-game-loader.js,lovely-web-shims.js, runtime JavaScript/WASM, and the bundle-owned defaultindex.htmltemplate. - Web launch argument configuration for demo/release variants such as
arguments = ["--demo-capture"]. - Compatibility diagnostics for web-native-module hazards and known love.js porting pitfalls.
- GitHub Actions workflow generation with
lovely ci github.
The runtime-heavy work is intentionally separated from ordinary game builds.
Lovely is not intended to host its own runtime distribution service. It should
resolve official upstream or vendor-provided runtimes, cache them locally, and
verify their checksums. For now, lovely runtime fetch installs local runtime
files or directories into the same cache layout a future upstream URL resolver
will use. Web builds copy cached JavaScript/WASM runtime files into dist/web;
desktop builds include cached runtime content in their artifacts and Steam depot
directories.
See docs/web-runtime.md for the love.js fork notes and the runtime patch checklist Lovely is tracking.
Commands
Install the CLI from crates.io with the lovely-packager package. The installed
binary is still named lovely:
JavaScript and TypeScript runtime/tooling work uses ESLint flat config with
eslint-config-love:
Web builds prepend ./game.love for love.js and append any configured
targets.web.arguments. When no project template is configured, Lovely uses
the html template declared by the selected Lovely.js lovely-runtime.json.
Templates can use __GAME_TITLE__, __WEB_ARGUMENTS__, and __WEB_MEMORY__
placeholders. Use html_assets for files referenced by a custom template, such
as logos or fonts; files are copied beside index.html, and directories are
copied under their directory name:
[]
= "src/templates/index.html"
= ["src/templates/logo.png", "src/templates/fonts"]
= "runtimes/web"
= ["--demo-capture"]
Use runtime_path for project-pinned Lovely.js runtime bundles. Lovely copies
the runtime files into dist/web and the upload ZIP during lovely build web,
while rendering index.html from either the project template or the bundle
default.
Scope
Lovely targets LÖVE >= 11. Runtime-specific compatibility is handled through pinned runtime artifacts and project diagnostics rather than assuming a single engine generation.