Renpy Release check — check your script free

A Ren’Py script can compile and run on your machine yet still break in a player’s save. Check for unescaped [ and {, define used instead of default, tab indentation, and developer settings shipped in the game. The free check scans one .rpy file in your browser and identifies each issue with a fix.

Catch the Ren'Py script bugs that compile fine and only crash in a player's save: unescaped [ and {, define-instead-of-default, tab indents, developer mode shipped. Runs entirely in your browser — nothing is uploaded.

Same engine as the VS Code extension, byte for byte.

Install free

Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.

VS Code MarketplaceOpen VSX (Cursor, VSCodium)npmMCP server (npx)Docker Hub
ext install ReadyStack.renpy-release-gate
npx @readystack/renpy-release-gate <file>
npx @readystack/renpy-release-gate --mcp

Team? One key for every ReadyStack linter, 5 seats, $149 once

Get the full rule table as a PDF
All 14 rules Ren'Py Release Gate checks, each with its source and date, on printable pages you can hand to your team or auditor. We email it now, and once more only if a rule changes. No newsletter.

Get the full version $29

Sweep every .rpy file in the workspace in one pass and export a release report you keep, for CI and for your publisher.

One payment, one licence key for this tool. The key is shown right after payment.

Putting one title on Steam costs $100 in Steam Direct fees before a single crash report arrives, and every crash fix after that is another build, another store update and another refund.

Buy the full version — $29
ENDEJAESPT

Find a tool

· ReadyStack

Worked example

Real numbers from this tool, line by line.

Ren'Py Release Gate

A 28-line Ren'Py script that compiles without one complaint returns 14 findings - 10 errors and 4 warnings - the moment a solo visual novel developer running a Steam page puts a release gate over it.

Not one of those 14 is a syntax error. Ren'Py already accepted the file. That is the trap: the Ren'Py compiler checks that your script parses, and almost nothing about whether a stranger can play it.

Here is the fixture, _fixtures/dirty.rpy, trimmed to the lines that matter:

define config.developer = True
define config.version = "1.0"
define affection = 0

label start:
    "Welcome back, [ player_name]."
    "{i}Late again, she thought."
    $ affection += 1
    if persistent.seen_ending_a:
        "You have stood on this pier before."

Every one of those lines runs on your machine.

[ player_name] is the clearest one. Ren'Py reads a square bracket in dialogue as an interpolation. The space makes the name unknown, and the error does not arrive at build time - it arrives when a player reaches that line of that scene. If the line lives in chapter three, you find out from a forum post.

{i}Late again, she thought. opens an italic tag and never closes it. The scene keeps rendering, slanted, until something else closes it or the screen dies.

define affection = 0 is subtler and more expensive. In Ren'Py, define values are not written into saves and are not rolled back. A variable the player changes must be default. Ship it as define and your save files quietly disagree with your script, forever, for everyone who already bought the game.

persistent.seen_ending_a is read with no default persistent.seen_ending_a anywhere. You will never see this bug. Your persistent file has held that key since the first test build. A first-time player reads None on the first run.

And config.developer = True hands every player the console and the developer menu.

Two more findings in that fixture never appear on a single line at all. There is no config.save_directory in the project, so saves are keyed to a generated directory and the next rename orphans them. And the build rules classify game/.txt but never game/.rpy, so readable script source travels inside the distribution.

Those last two are the reason a chatbot cannot close this. A chatbot sees the snippet you paste. Whether persistent.seen_ending_a is defaulted in some other file, and whether config.save_directory exists anywhere in the project, are facts about the whole project, and they are the two findings that cost you player saves.

The gate is 14 rules, grouped by what they take from you: four that break a player's session, two that break their saves, four that ship something you did not mean to ship, four that break on a machine that is not yours.

The same 28-line fixture, gated, is _fixtures/clean.rpy: same scene, same dialogue, 0 findings. \[07:40\] escaped, {i}...{/i} closed, default affection = 0, default persistent.seen_ending_a = False, config.developer = "auto", config.save_directory set once and never touched again, build.classify('game/**.rpy', None).

The cost of getting this wrong is not abstract. Putting one title on Steam costs $100 in Steam Direct fees before a single crash report arrives, and every fix after launch is another build, another store update.

Open a .rpy file, run the check, read the line numbers. One file is free, with no key and no counter.

15 seconds — what it actually does

Questions people ask

What does Ren'Py Release Gate actually do?

It reads your .rpy files and reports the lines that pass Ren'Py's compile step but fail later: a bare square bracket that Ren'Py reads as a variable, a text tag opened and never closed, define used where default belongs, a persistent value with no default, tab indentation, and shipped developer settings. Fourteen rules, each with the fix.

Who is it for?

Solo and small-team Ren'Py developers shipping visual novels to Steam, itch.io and Android. It is aimed at the moment before you press build: the point where your own save file hides bugs that a first-time player will hit on line one of chapter three.

Why is a chatbot not enough?

A chatbot only sees the snippet you paste. It cannot tell you that persistent.seen_ending_a is read in script.rpy and defaulted in none of your other files, or that config.save_directory is missing from the project. Those two findings need every file at once, and they are the two that lose player saves.

What is free and what needs a licence?

Free: open a .rpy file, run the check, get every finding in that file with line numbers and fixes. That is a finished job for a single file, forever, with no key. The licence adds the other axis: one sweep across every .rpy file in the workspace and an exported release report you keep.

What would this cost without the tool?

Putting one title on Steam costs $100 in Steam Direct fees before you see a crash report. After launch, each fix is a rebuild. The licence is $29 once, one key per person or CI seat,.

Why not just ask ChatGPT or another AI chat?

A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Ren'Py Release Gate checks the file you open against 14 rules from a rule set dated 2026-09-20, and points at the exact line with the fix. For a filing, an audit or a client you need that dated result on your own files.

Ask about this tool

One question, answered by the person who built it. Your email only if you want the answer sent.

Embed this tool on your site (free)

Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.

 All embeddable tools

For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →