If the download links on this page are missing, please download the SDK from https://www.renpy.org/dl/6.2.0/. Or click here to download the latest version of Ren'Py.

Ren'Py 6.2.0 "Shpadoinkle Day"

Ren'Py 6.2.0 "Shpadoinkle Day" was released on April 26, 2007. The main distributions are:

Each of these files contains the full Ren'Py development environment, which is enough to allow you to develop Ren'Py games on Windows 98 and up, Mac OS X 10.3 and up, and Linux x86. The development environment contains the files needed to produce games for all three platforms. It also includes a text editor and sample games.

Ren'Py is licensed under a very liberal license, that allows for free commercial and non-commercial use. Read the full license for details, but a short summary is that you can distribute Ren'Py games however you want, as long as you include LICENSE.txt.

For your convenience, we've posted the Release Announcement and Changelog. We've also made available the following programs, which can be used to run Windows-only Ren'Py games on non-Windows platforms:

Known Issues

The launcher can produce corrupt distribution files when files exist in the base (not game) directory of a distribution. You should replace renpy-6.2.0/data/distribute.rpy with distribute.rpy before distributing a game.

Occasionally, one will get a "SyntaxError: invalid syntax", even on correct code. Replace renpy-6.2.0/renpy/parser.py with parser.py to fix this.

Release Announcement

I'm happy to announce the release of Ren'Py 6.2.0 "Shpadoinkle Day". This release focuses on adding new features, like language support for calling labels with arguments, auto-saving of games, and a new scrollable viewport.

Downloads and a full release announcement can be found at:


To migrate your game from Ren'Py 5.6.2 or later, copy the directory containing your game into the directory containing the new Ren'Py. Please see the 5.6.2 release notes for information about migrating from older releases.

CHANGELOG for Ren'Py 6.2.0

Added a new "extend" pseudo-character. When "extend" says something, the last character to speak says the last thing to be said, "{fast}", and the new thing being said. This makes it easy to have a character say something, wait for a click, change their expression, and then say something else in the same block of text. For example:

e "Sometimes I'm feeling a bit down..."
show eileen happy
extend " but I get over it!"

Added a {nw} text tag. Including this text tag in a string causes the text to immediately dismiss once the string has been fully shown. This is useful in conjunction with extend, to have a character change expression when slow text gets up to a certain point.

The new nvl_erase function erases the last line of text said in NVL-mode, allowing you to replace it with something else.

Added anim.TransitionAnimation, a way of specifying animations that use a transition between each frame.

Added dynamically-scoped variables. When a variable is declared to be dynamically scoped, changes to its value are reverted when returning from the current call. Variables are declared dynamic using the renpy.dynamic function.

Added the ability to call a label with arguments. These arguments are placed into the parameters specified by the label, which are dynamically-scoped variables.

The return statement can now take an expression, which is placed into the _return variable.

Added auto-saving. This causes Ren'Py to save the game at semi-regular intervals (currently, around every 200 interactions). The saves take place in a background thread, so they shouldn't interfere too much with normal game operation. The saves also only occur when the game has 250ms with nothing scheduled.

Adding autosave required a rewrite and minor redesign of the load/save screens. There is now a new page, "Auto", that contains the autosave files. To make room for this page, we reduced the number of quick page access buttons to 8. (You can still access an unlimited number of pages by hitting "Next".) The text in these screens has been reduced in size by 2 pixels, this is to make room for the longer filenames (like a10).

The scene, show, and hide functions now use , , and , which default to , , and , respectively. By changing the config variables, the user can intercept the guts of these statements.

The character callback now gets the cb_-prefixed keyword arguments that are passed to Character, if any.

There are now three new styles for bars. Along with bar, there is now scrollbar, vbar, and vscrollbar. The roundrect theme styles each kind of bar appropriately.

Added a new Viewport displayable. This lets you display something that is bigger then the area alotted to it, and to use scrollbars to scroll around inside. Viewports can be created with Viewport or .

Modified the {w} text tag, so it can also be written as {w=number}, where number is a number giving the number of seconds to pause for.

The script is now loaded before the persistent object is created. This lets "python early" blocks update config.savedir, which means that a script can now find the save directory by itself, when running off of read-only media. (Try not to be too windows-centric, 'kay?)

In one of those "anticipating future needs" sort of changes, changed Button to set the displayable timebase of its children to 0 each time the button becomes hovered or idle. This makes it possible to animate a button becoming hovered or idle, by using an animation as the background. (Or by using animations in a .) The new initial_time_offset property controls the displayable timebase when the button is first displayed, allowing the animation to be skipped when not invoked by the user. (Note that to use the displayable timebase, you'll often have to set anim_timebase=False.)

Rollback is now disabled when in code called in a new context.

Adjusted spacing in the text box a little bit, so that it's now possible to have four lines of text without stretching the text box.

Lowered the sound buffer size from 4096 to 2048 samples. This should hopefully reduce sound latency. Made code in the Ren'Py module non-blocking, to allow music to run even while the main code is

Switched back to using cPickle for pickling. CPickle will cause a C-level crash when using a highly-nested data structure. (The pickle module we're using will cause a python traceback in the same case.) Setting the new config.use_cpickle module will disable the use of cpickle for save and load.

Recompiled SciTE to include support for Lua scripting.