mit einem Klick
love
// Load when working with LÖVE 2D, the LÖVE engine, love2d, .love archives, Lua 5.1/LuaJIT 2.1 game development, or LÖVE callbacks, modules, conf.lua, and packaging.
// Load when working with LÖVE 2D, the LÖVE engine, love2d, .love archives, Lua 5.1/LuaJIT 2.1 game development, or LÖVE callbacks, modules, conf.lua, and packaging.
Use when creating, updating, refactoring, or reviewing an AI assistant or sub-agent system prompt - persona, role, capabilities, tools, output format, examples, and constraints. Covers Claude Code agents, OpenAI Codex / Responses-API agents, Pi assistants, and OpenCode agents. Use even if the user only says "agent prompt", "assistant", "subagent", "persona", or names the artefact by file path.
Use when creating, updating, or reviewing a slash command - shims that delegate to a skill or agent, standalone commands with an inline output format, and the `description` / `argument-hint` / `model` headers per provider. Covers Claude Code custom commands and the merged skill-as-command format, OpenCode commands, Pi prompt templates, and the legacy Codex `/prompts:` route. Use even if the user only says "slash command", "prompt template", "command shim", "create-command", or names the artefact by path.
Load when working with Nix, NixOS, Home Manager, nix-darwin, nixpkgs, flakes, derivations, overlays, modules, options, or registries; with .nix files such as configuration.nix, home.nix, default.nix, shell.nix, or flake.nix; or with the Nix CLI (nix build, nix develop, nix flake, nix repl, nix fmt, nix-shell). Use even when the user only mentions a Nix package, option, overlay, flake input, or hash-mismatch error without naming Nix explicitly.
Use when creating, updating, consolidating, or reviewing an AGENTS.md (or CLAUDE.md, CLAUDE.local.md, .claude/rules/*.md, .cursorrules, .cursor/rules/*.mdc, AGENTS.override.md, or .github/instructions/*.instructions.md) project instruction file. Covers the open agents.md spec, Codex precedence rules, Claude Code memory loading, and migration from legacy formats. Use even if the user only says "instructions", "rules", "project memory", or names a single legacy filename.
Use when creating, updating, or reviewing an Agent Skill - authoring or revising a `SKILL.md`, its frontmatter, layout, references, and progressive disclosure. Use when the user mentions writing, editing, splitting, renaming, or auditing a skill, even if they do not say "skill" explicitly. Covers cross-platform portability across Claude Code, Codex, OpenCode, and Pi.
Condensed prose rules for docs, READMEs, blog posts, guides, scripts, and long-form content; do not load for routine status, implementation reports, audit findings, or delegation responses.
| name | love |
| description | Load when working with LÖVE 2D, the LÖVE engine, love2d, .love archives, Lua 5.1/LuaJIT 2.1 game development, or LÖVE callbacks, modules, conf.lua, and packaging. |
Use expert LÖVE 2D judgement across the LÖVE 11.x API, Lua 5.1/LuaJIT 2.1 idioms, game loop callbacks, graphics, audio, physics, input, filesystem, threads, math, shaders, packaging, and performance. Target the LÖVE runtime semantics, not stock Lua: assume LuaJIT, 1-based indexing, and the LÖVE event loop unless told otherwise.
Verify callback names, module functions, enums, and constants against the current LÖVE wiki or Context7 before recommending APIs. Names move between versions (notably 0.10 → 11.x); do not rely on memory.
| Need | Source |
|---|---|
| LÖVE API surface and callbacks | Start at references/api/love/SKILL.md (vendored index describing every love.* module); it cross-links each per-module reference via ../love-*/SKILL.md. Fall back to Context7 love2d docs for version-specific changes. |
| Library APIs | Library README/source (HUMP, anim8, bump, STI, etc); Shove (https://github.com/Oval-Tutu/shove); smiti18n (https://github.com/Oval-Tutu/smiti18n) |
| Platform packaging | bootstrap-love2d-project (https://github.com/Oval-Tutu/bootstrap-love2d-project); LÖVE wiki "Game Distribution" page |
The references/api/ tree is a verbatim snapshot of the per-module LÖVE API skills from RedKenrok/skills (MIT, Ron Dekker). See references/api/UPSTREAM.md for commit and retrieval metadata, and references/api/LICENSE-upstream.md for the license text.
love.load, love.update(dt), love.draw, love.quit, love.run (override only for custom loops).love.keypressed/released, love.mousepressed/released/moved/wheelmoved, love.textinput, love.touchpressed/released/moved, love.gamepadpressed/released/axis, love.joystick*.love.resize, love.focus, love.visible, love.displayrotated, love.lowmemory, love.threaderror, love.errorhandler.dt is seconds since the last frame. Multiply all movement, timers, and physics steps by dt; never assume a fixed framerate.conf.lua configures t.window, t.modules, t.identity, t.version, t.console, and t.audio. Disable unused modules (t.modules.physics = false, etc.) to cut startup cost when packaging.main.lua and conf.lua at the root; package as a .love zip (no top-level folder) for distribution, or fuse with the LÖVE binary per platform.love.graphics.push/pop/translate/rotate/scale for transforms; reset state explicitly after custom blend modes, shaders, or canvases.love.graphics.clear only inside love.draw or canvas passes; do not call it from update.SpriteBatch, text with Text, and static geometry with Mesh to cut draw calls.setCanvas(nil) to restore the screen; respect canvas formats and MSAA capability via love.graphics.getCanvasFormats.TransformMatrix, ProjectionMatrix, love_PixelColor, VaryingTexCoord). Validate with love.graphics.newShader error returns.love.graphics.setDefaultFilter("nearest", "nearest") for pixel art; pair with integer scaling.love.audio.newSource(path, "static" | "stream"). Use "static" for short sfx (decoded once), "stream" for music.:clone() or use love.audio.play(source, true) style pooling.:setRelative(true) for HUD-attached sounds.love.audio.setVolume master and per-source :setVolume separately; expose both as user settings.love.keyboard.isDown, love.mouse.isDown, love.joystick:isGamepadDown. Use callbacks for edge events.love.keyboard.setKeyRepeat deliberately; default is off.love.textinput provides UTF-8 text; do not derive text from keypressed.gamepad* callbacks (SDL mappings) over raw joystick* axes/buttons.love.filesystem is sandboxed. Read access covers the game source (zip or directory); write access only the save directory (love.filesystem.getSaveDirectory).love.filesystem.read/write/append/lines, not stock io.*, for portability and sandbox compliance.t.identity in conf.lua or love.filesystem.setIdentity) controls the save directory name; set it before any writes.love.filesystem.load(path) returns a chunk; prefer it over loadstring/loadfile for sandboxed code.love.thread.newThread(source) runs Lua in isolation; share via love.thread.getChannel(name) with push/pop/demand/peek/supply.love.filesystem, love.image, love.sound, love.data, love.timer, love.system, love.event, love.thread. No graphics/audio/window calls.love.timer.getDelta, getFPS, getTime, and sleep cover frame timing; for fixed-step logic, accumulate dt and step in fixed slices.love.physics wraps Box2D. Set the meter with love.physics.setMeter before creating worlds; Box2D works in metres, not pixels.world:update(dt). Use callbacks via world:setCallbacks(beginContact, endContact, preSolve, postSolve)."static", "dynamic", or "kinematic". Apply forces/impulses, do not teleport dynamic bodies without body:setAwake(true).love.math.random*, love.math.newRandomGenerator, and love.math.noise are deterministic and seedable; prefer them over stock math.random for reproducibility.love.data provides pack/unpack, encode/decode (base64, hex), compress/decompress (lz4, zlib, gzip), and hash (md5, sha1, sha256, sha512).love.timer.getFPS, love.graphics.getStats (drawcalls, canvasswitches, textures, fonts, images, drawcallsbatched).newImage/newFont.local sin = math.sin).love.graphics.setCanvas to render expensive static content once, then draw the canvas each frame..love is a zip with main.lua at the root. Test with love path/to/game.love.love.exe + .love then ship the LÖVE DLLs from the same release..love into LÖVE.app/Contents/Resources/, update Info.plist (CFBundleIdentifier, CFBundleName), then re-sign.org.love2d.love.conf.lua to shrink runtime memory and startup.love.graphics.print ignores the current font's line height unless you use printf with a wrap limit.Image:setFilter("nearest", "nearest", 0) per-image overrides the default filter.love.event.quit only triggers after the current frame; do not assume immediate exit.require paths use dots, not slashes, and are rooted at the game directory.pairs/ipairs corrupts iteration; build a removal list and apply after the loop.goto, no integer division //, no bitwise operators in the language. Use bit (LuaJIT built-in: bit.band, bor, bxor, lshift, rshift, arshift, bnot).__pairs/__ipairs metamethods, no table.pack/table.unpack (use unpack), no integer subtype.\z, no \xNN in pure 5.1 (LuaJIT accepts \xNN); prefer string.char for portability.#t is only defined for sequences (no nil holes); track length explicitly for sparse arrays.local M = {} modules returning the table; avoid module(...) (deprecated).require("ffi")) is LuaJIT-only and bypasses the LÖVE sandbox; use it sparingly and never with untrusted input.goto, //, bitwise operators, _ENV, table.unpack).dt.love.filesystem save directory; never os.execute or stock io.open for game data.