About
I'm working on porting the Ren'Py framework to the HTML5 web browser - so you can publish Visual Novel games online :)
![]() |
Test it!
Current version: 7.4.1/2021-01-23
(Shitf+O for dev console, F3 for perfs)
Also available for testing at:
itch.io
Newgrounds

Download
Included version: RenPyWeb is now officially included in Ren'Py and can be run from the Launcher!
Ren'Py download
- 7.4 changes
RED (RenPyWeb Early Downloads): as a thank you for my patrons, I also bundle
Ren'Py + latest RenPyWeb improvements/fixes -- so you don't have to wait for the next official Ren'Py release:
RenPyWeb Early Downloads
Source code: check the official Ren'Py repository at:
github.com/renpy/renpyweb
Contributions much welcome :)
Ren'Py nightly builds provide the unstable/development version of Ren'Py and RenPyWeb (pending review and build delays)
Another project: I also develop the Ren'Py Translator ToolKit for PO files - give it a try :)
Feedback
Feedback welcome!
Patreon -
e-mail -
Lemma Soft Forums -
itch.io -
newgrounds
Games
Here are a few public games that run on RenPyWeb.
This list of games is not curated, use at your own risk.
- TEADmini: freem! - RenPyWeb supporter
- The Villainess Fate: freem! PLiCy itch.io - RenPyWeb supporter
- The Villainess Slap: itch.io - RenPyWeb supporter
- King of the Cul-De-Sac: itch.io - RenPyWeb supporter
- Ikimono High: The Visual Novel: newgrounds - RenPyWeb past supporter
- Little Mauve Riding Hood: self-hosted
- National Civil Defence Cadet Corps (NCDCC): itch.io
- Planet Stronghold [demo]: newgrounds
- Les libératrices du code [intro, french]: github
- ALLBLACK Ch.1/2/3: itch.io
- DW Klondike Solitaire: itch.io
- ABST Practice Quiz: itch.io
- Chimes: itch.io
- Legends of Liability: itch.io
- Memories on the Shoreline [demo]: itch.io
- Квест "Приключения Мундрайв" [russian]: self-hosted
- Blossoms Bloom Brightest: itch.io
- Deity Hook-Up (Not A Romance): itch.io
- first date/can't relate: itch.io
- Dream Avatar: itch.io
- The Show Must Go On: itch.io
- tag your games: itch.io: html5/tag-renpy html5/made-with-renpy
- tag your games: Newgrounds: software/renpyweb
- tag your games: Game Jolt: html/renpy
- NSFW / Adult games (click to unhide if you're 18+)
- Cybergenic Prequel: self-hosted itch.io newgrounds - RenPyWeb supporter
- Down the Black Hole: self-hosted itch.io newgrounds - RenPyWeb supporter
- The DeLuca Family: newgrounds - RenPyWeb supporter
- Elf Enchanter: Arousing Anima [demo]: newgrounds - RenPyWeb supporter
- Magebuster: Amorous Augury [demo]: newgrounds RenPyWeb supporter
- Demon King Domination: newgrounds - RenPyWeb supporter
- Inkubak: self-hosted newgrounds - RenPyWeb supporter
- TrickOrDick: newgrounds - RenPyWeb supporter
- May I Take Your Order: itch.io - RenPyWeb supporter
- Date Ariane: newgrounds - RenPyWeb supporter
- Paradise Lofts: newgrounds - RenPyWeb past supporter
- Other games hosts such as gamcore.com/69games.xxx - RenPyWeb supporter
- Melody: newgrounds
- Infinity Crisis: newgrounds
- Astros: newgrounds
- Sanguine Rose: newgrounds
- S.h.e.l.t.e.r.: newgrounds
- Dear Diary: newgrounds
- City of Broken Dreamers: newgrounds
- Puppets Inc.: newgrounds
- Dany Clicker: newgrounds
- Healslut: self-hosted
- The Rest of our Lives: itch.io newgrounds
- 7 дней лета: Нуар / 7even Summer Days: self-hosted
- Being a DIK: newgrounds
- Seduction: A Night With Raven [demo]: newgrounds
- The Sanctum [demo]: newgrounds
- F.I.L.F. [demo]: newgrounds
- Love Season: gamejolt.com
- And many others :)
Let me know if you made a web version of your game :)
F.A.Q.
RenPyWeb's goal is to run your game without additional work. However the web is a very different environment so here are a couple things to know.
Size: this is the web, so things need to be
light. Think Flash games. Think metered mobile
plan.
RenPyWeb needs to download part of the game before
playing. Keep game.zip under 100MB, or your players will
complain, because they have to download that everytime they play
before it starts! Plus browsers only cache files up to ~50MB.
7.4 now can download some assets while playing (cf. progressive
download below).
Even with that, large assets will mean large downloads, so
think light and optimize your game.
Solutions include: using layered images, making a lower-res or
lossy/jpg version, optimizing images (.webp format, pngquant...),
using flat-shading, use higher compression for audio files (don't
re-encode already-compressed audio though), dropping some audio,
dropping videos (not supported yet), splitting in chapters,
etc.
Note on Python environment: the RenPyWeb Python environment is
minimal for size reasons. You
may ship
additional Python modules in your Ren'Py game. Alternatively you
can try placing additional .pyo
files (e.g. from your
Ren'Py SDK) in /lib/python2.7
in
your game.zip
.
Speed: was significantly improved in 7.4, though
I'm not sure we can do much better at the moment
(gory
details).
Audio glitches: are fixed in 7.4, though some skipping may still happen when the game is very busy or downloads too many assets at once (see Speed above).
Savegame: user savegames are linked to the webpage
domain.
Ideally, provide a stable (sub)domain - like this page.
Some hosts may change your domain on new upload, causing previous
savegames to become unreachable.
In addition, a game can read/modify savegames from other games
hosted at the same domain. Ren'Py will ignore them, but a malicous
game developer could do bad things.
Playing games in incognito/private mode doesn't allow savegames, or
will drop them when quitting the browser.
For itch.io (hosts at XXX.ssl.hwcdn.net, previously at
commondatastorage.googleapis.com) it's not clear how often the
domain may change:
see How to save
data?
and HTML5
game : Save data locally.
For newgrounds all games are hosted at uploads.ungrounded.net so
other games could read your player's data. NG passes the user
identity and session as querystring, though that only helps for
logged-in users.
Last, if the user blocks 3rd-party cookies (by default in iOS and
Debian Chromium) and runs the game in a iframe (most web
game hosts), savegames are lost on reload
(itch.io issue,
emscripten
discussion). Meanwhile, even though this isn't recommended, you
can try
to enable
3rd-party cookies.
For reference, error messages are
like "a mutation operation was attempted on a database that did not
allow mutations" or "the user denied permission to access the
database".
In doubt, remind players to export their savegames from RenPyWeb's
top-left menu.
Memory/RAM: memory may be scarse, especially on
mobile browsers.
To optimize memory usage, make
sure config.cache_surfaces
is set to False, adjust graphics memory (GPU)
using config.image_cache_size_mb,
and/or provide a lower-res version of your game. Also make sure to
remove any unused files from game.zip (notably videos),
since it's extracted in-memory.
Check the system (not GPU) RAM usage using e.g. Firefox's
Console > Memory > Snapshot.
For a lighter game.zip, see progressive download below.
Network: browser outgoing connections are secured
by Same-origin
policy.
In addition, the browser can only
perform XHR
and WebSocket
(i.e. no direct TCP/IP or UDP/IP connections).
Last, it is dangerous if your game waits on a connection (even in
native Ren'Py): any network issue (unplugged cable, out-of-reach
WiFi, etc.) will freeze the game for minutes and the user won't even
be able to save. Usually this can be worked-around with threads
(e.g. Renpytom's analytics)
but they are currently not available in the browser.
I wrote
an asyncrequest.rpy
so you can make asynchronous HTTP requests in both native and web
versions, based on urllib2 and XMLHttpRequest respectively. Example
code included.
You can also experiment with WebSockets, which are initiated
transparently when you make a TCP/IP connection from Python, but you
need a specific server, or a service proxy
(cf. Introduction
to Emscripten Sockets) on the developer's server side.
Avanced usage: avoid calling Emscripten's *_wget* functions
from RenPyWeb: pseudo-synchronous functions require custom
ASYNCIFY_WHITELIST recompilation, and asynchronous functions may
cause memory corruption on callback (Python re-entrancy issues).
Mobile: mobile browsers are a bit behind when it comes to web
technologies, and RenPyWeb currently may run slow on these.
iOS in particular has
long-standing issues
with web games; since iOS requires all browsers to use Apple's
limited web engine (webkit), all iOS browsers are impacted (things
getting better).
Ren'Py now has a limited on-screen keyboard for mobile browsers;
see renpy/common/00touchkeyboard.rpy for details.
Screen Variants
(Ren'Py
doc): RenPyWeb knows how to adapt screen layout to various
devices, like Android and iOS versions:
- the new "web" variant is always set,
- the "mobile" variant is set on mobile browsers,
- "touch" is set on mobile devices with touch support,
- "large/medium/small" is set on mobile depending on screen size and
"large" is always set on pc,
- "pc/phone/tv/android/ios" is NOT
defined as this is reserved for native access to the device.
You can test
with Ren'Py's
Emulator or
your browser's
phone emulator.
Videos: currently not supported. In the future I plan to support renpy.movie_cutscene() first (fullscreen, as an HTML5 video, browser-supported formats only); then we'll see if the web techs evolved enough to support Movie(). Meanwhile, image-based (ATL) animations do work.
IME: complex keyboard input methods are not supported at this point, due to browsers limitations, see #80 for technical details.
Gamepad: game controllers are supported, however
they are not detected on start-up, which is a general HTML5
limitation. Just press a button/axis and Ren'Py will immediately
detect it. This notably adds a new "Gamepad" tab in the default "Help"
screen. Shift+G
has tools to further diagnose gamepad
status.
Presplash: add a web-presplash.png
,
web-presplash.jpg
or web-presplash.webp
(can be animated) at the top-level of your game (above, not inside,
your game
directory, along with
android-presplash.*
).
Hosting on your own server: you upload the game files to your website like any other static files. If you use Apache, see also the provided htaccess file.
Invalidating browser cache on game update: when releasing a new version of your game, I suggest you either change the address where you upload the new version (game hosts usually do that), or use cache control (see the provided htaccess.txt). Otherwise, the browser may mix cached and non-cached versions, causing weird errors.
Hosting on game web hosts: zip all the files from
the build directory
(so index.html
, game.zip
, index.wasm.gz
,
etc. are at the top-level of your zip archive).
More precisely: you don't add files to game.zip
. You
make a new .zip
file
(e.g. myvisualnovel-web.zip
) that contains all the
build directory files (e.g. all the files within
myvisualnovel-1.0.0-dists/myvisualnovel-1.0.0-web/
), including
game.zip
(in the end, there is a zip in a zip,
e.g. game.zip
in
myvisualnovel-web.zip
).
For newgrounds, edit your game again and tick HTML5 Archive
(zip) > Edit Properties > Touchscreen friendly otherwise
it will be marked as incompatible with mobile.
For itch.io, tick This file will be played in the browser
when uploading.
Play offline: browsers now have all kinds of
security limitations, and require that you run your game through a
local webserver (the Ren'Py launcher runs one automatically for
you).
Note: just double-clicking on index.html used to work with
Firefox, but not anymore with version 68; it didn't keep saved games
anyway.
Note: some other web game engines run offline to some extent but
they use different web technologies with different limitations.
Change game.zip extension: apparently cloudflare
does not cache .zip
files in their basic plan, and
maybe you need to change the file extension for whatever reasons.
If you cannot make them change, you can rename game.zip
to game.xyz
and set DEFAULT_GAME_FILENAME
accordingly in your index.html
.
(alternatively you can start your game by adding
?game=game.xyz
.)
Progressive download: RenPyWeb can download images,
music and voices while playing. The game starts-up faster (smaller
.zip), and uses less memory.
A progressive_download.txt
file is created in your game
directory so you can filter (by type and path) what is pre-loaded on
start-up, and what is downloaded while playing.
This uses prediction to download images and sounds
in advance. If your code is complex and/or use translations, you
may need to
increase config.predict_statements. Otherwise,
you may
use renpy.start_predict/stop_predict.
If you
use creator-defined
statements, make sure they support prediction.
If a download didn't finish in time (e.g. when network is slow, when
loading a savegame, or when using skip mode), images are replaced
with a pixellated preview and looping music plays silence
(temporarily); voices and sound effects are just ignored.
To avoid consuming all RAM, image files are kept for 1mn, voice
files for 3mn. They may be downloaded again if needed, leveraging
the browser's cache. Image files, once loaded in the GPU, stay
available longer through Ren'Py's graphics cache.
Note: auto-voicing
currently not supported
itch.io note: if you get a message about too many files, you can ask
the support
to lift the limit.
Interaction with JavaScript: the Python port comes
with an emscripten
module that itself has some
JavaScript integration, e.g.:
import emscripten
emscripten.run_script("alert(1)")
print(emscripten.run_script_int("2+2"))
print(emscripten.run_script_string("location.href"))
Roadmap
(in no definite order)
- Python port for the browser, with Cython support
- Size-optimized minimal Python environment
- Pygame_SDL2 basic port for the browser
- Reconcile asynchronous browser execution with Ren'Py synchronous model (lower perfs / threadless for now) (Emterpreter)
- Reconcile asynchronous browser execution with Ren'Py synchronous model (lower perfs / threadless for now) (Asyncify)
- Run unmodified Ren'Py games
- WebAssembly support for Firefox (+fall-back to asm.js for other/older browsers)
- WebAssembly support for Chrome/Chromium
- Background/on-demand resources download (e.g. images and musics; currently RenPyWeb requires downloading the whole game on startup)
- Alternate port with
experimental browser features (SharedArrayBuffer and threading) so
as to get greater performances, and to be ready when those feature
become default in browsers.
This requires improving emscriptem too. - Sound support
- Sound support without jitter
- Video/movie support
- renpy.movie_cutscene hardware support (i.e. handled by the browser; fullscreen probably tricky)
- WebP image support
- Fix image prediction
- Fix auto-save
- Save persistent (seen texts) when exiting the webpage (in progress)
- Fix opening web links (pop-up warning in Firefox though)
- Test and improve compatibility with popular game hosts (on-going)
- Fallback HTTP compression when gzip is broken (e.g. itch.io) (not LZ4 for file packages, but gzip fallback for .wasm/.js)
- Mitigate cache issues when updating a game at the same URL (typically self-hosted games)
- More responsive game loading
- Splash screen
- Don't unnecessarily recompile/rebuild cache on start-up (very long)
- Optimize memory usage if possible (in particular for mobile) (on-going)
- Load game from an URL
- Load your own game locally (disabled 2019-09)
- Deal with preferred/max screen size (e.g. 1080p game running in smaller browser window) and HDPI
- Define and lock orientation (if screen.orientation.lock works)
- Add "web" variant
- Detect and define more variants (pc/phone, small/medium/large...)
- Design full-window game area with overlays for status/errors (rather than top/side bars)
- Fix full-screen toggle which goes wrong sometimes + handle config.default_fullscreen=True on start-up
- Fix alpha support for imagebutton and imagemap (flicker)
- Fix 1 touch = 2 clicks on mobile
- Bring/mask virtual keyboard on text input in mobile devices (if possible?)
- Detect browser language
- Fix Chromium crash with large (>= 108MB) files
- Quit game cleanly (no error; kill sound)
- Clearer error messages (in particular for mobile where there's no JavaScript console)
- Clearer error when loading a full ren'py game
- Import/export savegames, log.txt
- Simple HTTP requests from Ren'Py
- Upgrade/sync newer Ren'Py (now integrated in official Ren'Py)
- Report and fix Emscripten bugs (ongoing)
- Make all changes generic (clean-up) and merge them to Pygame_SDL2 and Ren'Py (ongoing)
Status reports
2021 week 4 (2021-01-30)
- Ren'Py 7.4.1 is out, 7.4.x is now recommended for releasing games (also means I can start
breakingupgrading things again in development version ;)) - Refresh demos
2021 week 3 (2021-01-23)
- Test Android fix, with success -- I can compare Android and Web builds behavior again on my device :) #2574
- Guide a few new users
2021 week 1 (2021-01-09)
- Clean-up RED 7.3.5 who received no less than 25 releases; RED 7.4 will probably happen as it makes it easier to provide you with new versions for immediate use or testing, even if the upcoming Ren'Py releases are probably going to be more regular.
- Tests on official Ren'Py 7.4, investigate app-not-responding issue on Android #2574
2020 week 53 (2021-01-02)
2020 week 52 (2020-12-26)
- RenPyWeb for 7.4: issue when "restoring" a mobile web game at itch.io should be fixed #2506
- RenPyWeb for 7.4: continue investigating random issue with title screen music: sound initialization may occur at various times depending on the platform and on the game itself, sometimes too late which causes the bug
2020 week 51 (2020-12-19)
- Ren'Py launcher: fix webserver empty response on root address commit
- RenPyWeb for 7.4: investigate and reproduce issue when "restoring" a mobile web game at itch.io #2506
- RenPyWeb for 7.4: investigate and reproduce random issue with title screen music
- Answer several questions and further refine the F.A.Q.
2020 week 47 (2020-11-21)
- Test patches from Renpytom that fix prediction issue #2456
- Backport prediction patches to version red-7.3.5
- Answer help request, slightly rework F.A.Q.
- RED: renpy-7.3.5-sdk+web20201119.zip, demos updated as well
2020 week 46 (2020-11-14)
- Ren'Py: investigate image prediction issue, somehow nobody noticed it so far #2465
- Emscripten: re-test and close old bug #9833
2020 week 45 (2020-11-07)
- zee.js: fix accepted, updated to latest version #12
- Add missing configuration in htaccess template for Apache
- RED: renpy-7.3.5-sdk+web20201107.zip, demos updated as well
2020 week 43 (2020-10-24)
- RenPyWeb: update savegames fix to restore performances in persistent storage #12560
- RenPyWeb: upgrade Emscripten to 2.0.7 and fix resulting breakages
- Emscripten: provide feedback on build regression #12589
- Emscripten: drop #12149 (fixed differently)
- python-emscripten: handle new getentropy support c90a1d71b9
- zee.js: fix build for Emscripten >= 2.0.3 #12
2020 week 42 (2020-10-17)
- Ren'Py: update 6 dependencies to match current Ren'Py 7.4 + a bit of clean-up
- Emscripten: fix SDL2 detection #12538
2020 week 41 (2020-10-10)
- Savegame restore issue accepted and included #12409
- F.A.Q.: improve/clarify sections on cookies, web upload, and JavaScript, following your feedback
- README: move out technical details in a separate file, they were confusing people
- RED: renpy-7.3.5-sdk+web20201010.zip, demos updated as well
2020 week 40 (2020-10-03)
- 2 years anniversary!
- RenPyWeb: investigate savegame restore issue, due to a persistent storage bug
- Emscripten: propose persistent restore bugfix #12348 #12409
- Ren'Py: officially document RenPyWeb changes during 7.3.5->7.4 commit
2020 week 39 (2020-09-26)
- Ren'Py 7.4: debug and fix silent sound (commit)
- Ren'Py 7.4: start checking WebGL compatibility
- Ren'Py 7.4: renpy-build fixes are merged #6
- Answer lots of your questions through various channels (patreon, itch, mail)
2020 week 38 (2020-09-19)
- RED: renpy-7.3.5-sdk+web20200914.zip: fix virtual keyboard
- Ren'Py 7.4: attempt to fix silent audio by upgrading ffmpeg
- Ren'Py 7.4: various build system clean-ups
2020 week 37 (2020-09-12)
- RenPyWeb: upgrade Emscripten (web compiler): 1.39.18->2.0.2
- python-emscripten: upgrade Emscripten: 1.39.18->2.0.2
- Emscripten: fix ffmpeg (cross-)compilation #12148 #12149
- Emscripten: doc fix #12147
- Emscripten: classify old issue #9402 -> #9342
2020 week 36 (2020-09-05)
- Mobile keyboard was reworked by Renpytom and is now included in the next Ren'Py, I also added it to the RED version for you to try.
- iOS savegame export: I found a work-around at last, .zip export should now work. Note: this is different from the iOS savegame issue with 3rd-party cookies/domain (no news from e.g. itch.io)
- F.A.Q.: clearly document that the files number limit at itch.io can be lifted by contacting their support
- RED: renpy-7.3.5-sdk+web20200905.zip, demos updated as well
2020 week 35 (2020-08-29)

- Virtual keyboard for mobile devices, take #3: full-Ren'Py route this time, no attempt to reuse the browser's own keyboard which proved too buggy
- Propose addition to Ren'Py #2336
2020 week 33 (2020-08-15)
- Upgrade RenPyWeb's server (serving this page, among others)
2020 week 32 (2020-08-08)
- Add stripped logging module (as in Ren'Py), as it was requested by a couple users
- More discussion/test with Renpytom for renpy-build/7.4
- Create maintenance/7.3.5 branch to avoid conflicts with current 7.4 work
- iOS savegame export issue report: attempt to install Safari for Windows, but not supported by Apple anymore, and the last version doesn't support WASM; also this issue is a bug in Safari AFAICS
- Answer request for smaller .zip, clarify and tidy F.A.Q.
- Doc fixes
- python-emscripten: py2: drop obsolete work-around
- python-emscripten: attempt Python3 3.8.3 -> 3.8.5, pip bug with cross-compilation / OS-detection, I'll have to revisit this later
- RED: renpy-7.3.5-sdk+web20200808.zip, demos updated as well
2020 week 31 (2020-08-01)
- Ren'Py 7.4: upgrade Python2 from 2.7.10 to 2.7.18
- Ren'Py 7.4: integrate new pure-Python static submodule support
- Ren'Py 7.4: more exchanges with Renpytom
- RenPyWeb: mobile virtual keyboard: more (failed) experiments with Firefox
- RenPyWeb: investigate issue with pixel-art-style resolution #11
2020 week 30 (2020-07-25)
- Coordinate building renpyweb for the upcoming Ren'Py 7.4, after Renpytom reached out.
2020 week 29 (2020-07-18)

- New virtual keyboard prototype; use as a basis for conversation with Renpytom #2287
- Ping itch.io but apparently they don't care about iOS
- Study web video decoding some more
2020 week 28 (2020-07-11)
- Ren'Py: tidy red-7.3.5 branch: include improvements validated in master branch
- Ren'Py: doc fix commit
2020 week 27 (2020-07-04)
- Ren'Py: ping open pull requests, they are now merged! #2106 #2156
- RenPyWeb: attempt to implement a fullscreen button in the context menu, give up due to many conflicts and limitations
- RenPyWeb: include small and common bisect/_bisect Python modules
- SDL2: avoid conflict between official project and Emscripten "port" #112
- SDL2: unbreak fullscreen mode #87 #11515
- RED: renpy-7.3.5-sdk+web20200704.zip, demos updated as well
2020 week 26 (2020-06-27)
- iOS and savegames: investigate issue when game is in an external iframe
- iOS and savegames: open ticket at itch.io (please like/comment it)
- on-screen keyboard: follow-up on dev discussion
- on-screen keyboard: SDL2 is probably not an appropriate target layer, reference discussion #80
- emscripten: upgrade 1.39.13 -> 1.39.18; unbreak zlib compilation
- SDL2: report fullscreen breakage #87
- python-emscripten: unbreak python2 compilation with newer Emscripten 1.39.18
- python-emscripten: unbreak python3 compilation with newer Emscripten 1.39.18
- python-emscripten: ping Python project #20854
- answer several support questions from patrons and non-patrons
- update games list
2020 week 25 (2020-06-20)
- Create a reference SDL2 test app to compare desktop/web/android behavior testtextinput.c
- Proof-of-concept: re-use on-screen keyboard from the browsers through an off-screen text input ti1.html
- Consider integrating the experiment with SDL2 (probably not, due to browsers limitations/bugs) #80
- Start discussion with other Emscripten devs/users discuss
- Clean-up GitHub issues
- Clarify compilation documentation #8
- F.A.Q. clarifications/fixes
2020 week 24 (2020-06-13)
- RenPyWeb: virtual keyboard for mobile: start investigating options, ping #80
- Ren'Py: gamecontroller database sync approved #2180 (GNU/Linux start-up issue still open)
- python-emscripten: request config.sub/config.guess update in official Python #20854
- python-emscripten: deal with Python contribution administrativia
2020 week 23 (2020-06-06)
- RenPyWeb: the pygame-example basic demo now works with Python3 + pygame_sdl2, in the browser
- python-emscripten: 3rd-party static modules support (+ fix back Python2)
- pygame_sdl2: fix static modules with Python3 #125
2020 week 22 (2020-05-30)
- python-emscripten: optimize Python3 performance & size; update demo
2020 week 21 (2020-05-23)
- python-emscripten: support most Python3 core modules demo
- python-emscripten: first contact with Python team in the prospect of integrating web-python in official Python #40280
- Ren'Py: ping GL clean-up #2106
- Ren'Py: close stalled corner-case issue #1968
2020 week 19 (2020-05-09)
- python-emscripten: Python 3 initial support demo
- python-emscripten: Python 2 clean-up
- Document SDL2+asyncify wiki
- Deal with support requests #5 #6
2020 week 18 (2020-05-02)
- Gamepads: new F.A.Q. entry
- Propose controllers database update, current one is dated #2180
- Investigate gamepad not activating on GNU/Linux #2181
2020 week 17 (2020-04-25)
- Investigate start-up error with MS Edge (pre-chromium); it was a JavaScript issue introduced with progressive downloads, now fixed
- Tidy some JavaScript and HTML for good measure
- Emscripten: SDL2+asyncify improved integration is now merged #112
- python-emscripten: webprompt: refresh demo with latest changes
- RED: renpy-7.3.5-sdk+web20200420.zip, demos updated as well
2020 week 16 (2020-04-18)
- Add support for web-presplash.webp: browsers now support .webp animations so you can have animated loading screen #2157
- Don't include progressive_download.txt in non-web Distributions
- Git: drop progressive download branch which is now merged, and move all core Ren'Py-related RED changes to branch red-7.3.5
- Emscripten: upgrade 1.39.11 -> 1.39.13, report regression #10872 and identify fix #10951
- Emscripten: un-stale LZ4 write support #8450
- python-emscripten: upgrade to emscripten_log's new 1.39.12 prototype fea1e09c30
2020 week 15 (2020-04-11)
- Start web-presplash.webp discussion (i.e. animated loading screen) #2157
- AudioData: I wrote before that it hanged in RenPyWeb, I did some testing and actually it works fine; maybe I missed something, test/feedback welcome
- Emscripten: allow disabling SDL2+asyncify integration, per user request #112
- Progressive download: complete configuration for the_question and tutorial #2156
- Progressive download: clarify F.A.Q. wrt sound effects
- Progressive download: update demos with music download, set itch.io to 720p (rather than 540p)
2020 week 14 (2020-04-04)
- RED: renpy-7.3.5-sdk+web20200403.zip: now with both better perfs and progressive download
- Games list: now only adding links when I have reasonably confidence that the port was sanctioned by the game devs (contact me if you want your links updated)
- Demos: now using progressive downloads, including the ones at itch.io and newgrounds
- Progressive download: made progressive_download.txt error handling more robust, allow empty lines
- Progressive download: add F.A.Q. note about config.predict_statements
- Clear error message when trying to run a game offline (e.g. double-clicking on index.html)
- Emscripten: provide more feedback on SDL2+asyncify support #10746
2020 week 13 (2020-03-28)
- Ren'Py: progressive-download is merged! #2126
- Ren'Py: push old doc fix without review #2114
- Emscripten: test and apply new fix for 1.39.11 #10745
- Emscripten: answer feedback request on recent SDL2+asyncify support, gather user feedback and suggest fix #10746
- Emscripten: answer feedback request on new linker behavior #10747
2020 week 12 (2020-03-21)
- Investigate EMCC_LOCAL_PORTS issues some more #9342
- Drop EMCC_LOCAL_PORTS and switch to SDL2 port version_19 which got tagged #107
- Upgrade libzip, report new compilation issue, finalize a fix #10709 #10711
- Drop work-around for missing -lXXX support, follow-up on my initial report #8650
- Test generalization of my work-around for Chromium audio policy #10700
- Upgrade Emscripten to 1.39.11; compilation fails again T_T #10745
2020 week 11 (2020-03-14)
- Ren'Py: ping my open pull requests, including progressive download; there should be progress next week.
- RenPyWeb: upgrade Emscripten 1.39.3 -> 1.39.10, some clean-up
- Emscripten: request SDL2 port refresh so we can avoid patching it #107
- Emscripten: check again issue with compiling renpyweb test programs with patched SDL2, found no fix yet #9342
- Emscripten: simplify SDL2 port build, found while investigating the above #10688
2020 week 10 (2020-03-07)
- Progressive download / ODRD: support "voice" statements: now predicted like music, and ignored if not downloaded in time (thanks Kai Fang for the feedback). Auto-voicing currently not supported. Update pull request #2126
- F.A.Q.: add new entry for progressive download, recapping status and gotchas
- F.A.Q.: rework Network section, triaging alternatives as incompatible following past months' experiments
- Update RED version. Testing still welcome :)
2020 week 09 (2020-02-29)
- Progressive download / ODRD: prepare inclusion in official Ren'Py: #2126
- Code clean-up
- No longer warn that RenPyWeb requires the entire game to be downloaded :)
- Fix multiple music downloads (thanks Ivan for the report)
- Remove static image placeholder (since it's replaced by automated thumbnails)
- Test on itch.io and newgrounds (works OK)
- Update online demo and RED version. Last chance for feedback ;)
2020 week 08 (2020-02-22)
On-Demand Resource Download has been my prototype code name for "don't download everything on start-up, download later". Progressive download may be less of a mouthful, so maybe we'll use that as a final name :)
Whatever the name, with this week's additions, I think the feature is fully working. Next week I'll clean-up the code and submit it to Renpytom for inclusion in the next Ren'Py. If you need something more, now is the time to speak up!
- Add a path inclusion/exclusion filter for downloadable files (similar to .rpa configuration). Currently it's a "progressive_download.txt" text file that is created on first build and can be adapted, maybe Renpytom will want to move it to options.rpy. Thoughts?
- Drop size-based filtering.
- Use 32x32 rather than 64x64 pixellated preview, so it's less aggressive visually.
- Handle very small images gracefully.
- Update online demo and RED version. As always, feedback is welcome :)
2020 week 07 (2020-02-15)
2 weeks ago I shared a screenshot of pixellated placeholders, which are shown when a download didn't finish in time. I want to clarify: the player will normally directly see the final image, they only get the pixellated preview briefly when on narrow bandwidth, or when starting from a savegame.
I'd like to share with you a little case study I did this week. A patron showed me their large-ish game (a point-and-click with 720p 3D renders) working with RenPyWeb and on-demand resource download (fast start-up). You can roam from room to room in a big house, and there are some dialogue scenes with lots of additional full-screen renders.
While the scenes worked seamlessly, I noticed that I got the pixellated placeholders often when moving from room to room, while you normally shouldn't see them. So I took some time to ensure RenPyWeb was working alright.
It turns out that the game had a complex scene management system
which didn't play well with Ren'Py's screen prediction, so
(down)loading could not be done in advance. In addition, each room had
lots of large clickable elements, each with idle&hover variants,
which easily took 50MB graphic RAM. Multiply that by ~10 locations,
and the game quickly
exceeded config.image_cache_size_mb,
so the house didn't "fit" in graphic memory all at once.
(Incidentally I also found a memory issue in the game's click masks,
which I reported and may help some.)
So Ren'Py had to regularly unload rooms visited last, and reload them when going back there. Since prediction was prevented, the player got the pixellated placeholders for a brief moment. Importantly, when reloading a room, image files were downloaded again but leveraged the browser's cache, so this was fast while remaining memory-efficient.
All in all, RenPyWeb (and on-demand resource download) behaved robustly even in non-optimal situations :)
In other news:
- On-demand Resource Download: think about an include/exclude system to decide what to place inside or outside game.zip, similar to rsync's: +/- patterns, in order, first match is taken. I also plan to drop size-based filtering since decision should be based on usage frequency rather than the size of each resource. And I also made filename matching case-insensitive.
- Ren'Py: ping GLfloat revert patch #2106
- Ren'Py doc fix: reference homonymous im.AlphaMask() in AlphaMask()'s doc, took me forever to figure that out OTL #2114
2020 week 05 (2020-02-01)

- On-Demand Resource Download: when predictive download didn't finish in time, instead of a download icon, show pixellated image preview. An effect much reminiscent of progressive jpeg from the web 1.0 era ;) - with a very small size in game.zip.
- Investigate bug report (and had nothing to fix :)) #3
- Ren'Py: revert a work-around which is not needed anymore for the web #2106
- Emscripten: ask maintainer to reopen a bug closed by mistake #7631
- Update online demo and RED version. As always, feedback is welcome :)
2020 week 04 (2020-01-25)
I fixed bugs in "On-demand resource download" (which shortens loading time) that you didn't even find and report, this is good sign, things are stabilizing! I plan to finish automatic low-res image placeholders (rather than same-old stretched download icon), and add some configuration in the Ren'Py launcher. Next I have some overdue compiler upgrades (plus Renpytom is revamping the build system). And next... some of you expressed interest in supporting videos in RenPyWeb. This ain't gonna be easy, but we'll try!- On-demand resource downloads: fix download loop for long image-based animations with no prediction
- Experiment again with auto-pixellated images as placeholders, with more size-optimization tricks so game.zip stays light
- Consider save-as-webp support in pygame_sdl2 #121
- Document ODRD principle of operation, now that things stabilize
- Investigate very short ahead-of-time download in an ODRD game; actually caused by too small config.predict_statements, as well as automatic Translation/EndTranslate nodes
- Ren'Py doc: fix config.predict_statements default value commit
- F.A.Q.: improve Videos entry
- Update online demo and RED version. Feedback more than welcome :)
2020 week 03 (2020-01-18)
- On-Demand Resource Download: start downloading music files in advance and play them when ready; this approach can't work for one-time sounds, so it currently only works for files in game/music/ (to be made configurable)
- F.A.Q.: new Videos entry, rework entries on RAM
- Emscripten: follow-up on improved SDL2+ASYNCIFY support #70
- Update online demo and RED version. Your feedback has been useful and appreciated, keep going :)
2020 week 02 (2020-01-11)
Hopefully this time I'm done with downloading images on-demand, massively reducing the initial game download on start-up. Every time I think I'm done, I get happy early users who find new corner cases, let's see how this update holds up :)- Use same-size placeholders, by saving all remote images dimensions and stretching the default placeholder accordingly
- Exclude video files from game.zip because they are currently not supported and porters tend not to drop them (resulting in large game.zip-s).
- Experiment some more with auto-pixellated images as placeholders; optimizing placeholders manually, I only reduce their size by half, so perhaps this will be an option
- Ren'Py Launcher: when building game.zip, clarify when it's preparing on-demand resource download, this can be long for large games (a dozen seconds or two)
- Update online demo and RED version. Feedback welcome :)
2020 week 01 (2020-01-04)
Where are we? I continue my work on downloading images and musics as-needed (rather than everything on game loading). There are lots of corner cases to address for images, and I fixed some of them. There's one more to fix, then hopefully I'll focus on musics again, as well as better configurability.- On-Demand Resource Download: finalize support for manipulated images, with delayed downloads pruning
- On-Demand Resource Download: add support for DynamicImage-s (e.g. "eileen[var].png")
- On-Demand Resource Download: experiment with low-res images as placeholders; heavily pixellated images still take some space, maybe there's a way to add a better JPG/PNG optimizer in Ren'Py, meanwhile I'll focus on providing same-size placeholders
- Update online demo and RED version. Feedback welcome :)
2019 week 52 (2019-12-29)
On-Demand Resource Download: experiments with downloadable manipulated images, following discussion with Renpytom + reworking downloads clean-ups; first results are promising, meaning more games should support downloadable images without changes.2019 week 51 (2019-12-22)
- On-Demand Resource Download: I continued experimenting with downloading musics in advance, and studying the arcane Ren'Py resource loader. Renpytom looks busy and I couldn't discuss the current download limitation with derived/manipulated images.
- Documentation fix
2019 week 50 (2019-12-15)
This week I mostly tracked down issues with on-demand resource download, reported by users; asynchronous errors are so tricky and time-consuming!I also converted my local patches to a longer-term public Git branch, available for browsing.
- Fix MemoryError when repackaging large files
- Detect and report when a placeholder can't be updated after download, which notably happens with manipulated images; I'm discussing with Renpytom whether this can be automatically addressed
- Exclude images/gui/ from on-demand downloads, to avoid black background on start-up; this will be configurable later
- Update online demo and RED version. Feedback welcome :)
- Emscripten: un-stall iframe focus issue #7631
2019 week 49 (2019-12-08)
- On-Demand Resource Download: track down issue with filename case sensitivity (thanks FGN for the report)
- Apply fix to RED ODRD version. Feedback welcome :)
- Study Ren'Py prediction code to see how we can download music/sounds in advance
2019 week 48 (2019-12-01)
More progress with on-demand resource download. Initial support for images is stable, so I'll move to sound support next, then start polishing (control what to keep preloaded, tackle title screen readiness, better placeholders with identical dimensions so loaded images don't "jump", etc.).- Better error handling again
- Thanks to VirtualPassion for the early testing
- More discussion with Renpytom to prepare official integration
- Update online demo and RED version. Feedback welcome :)
2019 week 47 (2019-11-24)
Progress with on-demand resource download:- Better error handling (don't crash/quit game, more precise error messages)
- Fix issue with multiple search paths (e.g. game/ vs. game/images/)
- Refactor Ren'Py changes following Renpytom's review
- Update online demo and RED version. Still downloading images only. Feedback welcome :)
2019 week 46 (2019-11-17)
- On-demand resource download: we got a first testable version! All large images are skipped and downloaded as-needed while playing: online test / RED version for your games. Feedback welcome :)
- Answered patrons requests
- Emscripten: upgrade to 1.39.3, several patches got included, LLVM error fixed #9797
- Emscripten: EMCC_LOCAL_PORTS (and hence pygame_sdl2 examples) broke again #9342
- Emscripten: report corner-case compilation error #9833
2019 week 45 (2019-11-10)
- itch.io: ask staff how we can compress the Ren'Py game code on their platform; they don't answer so feel free to comment there: community feedback #394
- On-demand resource download: discuss proposal with Renpytom some more
- RenPyWeb: build fixes following python compilation rework
- SDL2: asyncify support will be included in the next version - hopefully no more patches! #97
- Emscripten/LLVM: build fails when upgrading to 1.39.2, revert upgrade #9797
- Emscripten: test EMCC_LOCAL_PORTS fix, pygame_sdl2 examples build again #9342 #9788
- python-emscripten: size-optimize _sysconfigdata.pyo
- python-emscripten: adapt to stricter linking: move Fetch to a separate optional module, drop sleep_with_yield (Emterpreter-only); this also size-optimizes RenPyWeb's executable a little more
- pygame4web: early experiments
- RED: renpy-7.3.5-sdk+web20191104.zip: quickly detect and fix a savegame issue in last week's upload
2019 week 44 (2019-11-03)

- On-demand resource download: first proof-of-concept, download images in advance through modifying the Ren'Py cache system, reuse browser cache and memory (cf. screenshot)
- On-demand resource download: send two technical proposals to Renpytom with pros/cons. Renpytom suggested using placeholders in case the download isn't ready yet. Discussion is on-going.
- Speed: faster RenPyWeb now available in nightly builds, thanks to all the work towards clean Emscripten 1.39.1 upgrade
- RenPyWeb: fix "unreachable" error on exit
- RenPyWeb: embed minimal debug info including Emscripten version
- F.A.Q.: rework entry on Variants, clarify that Ren'Py layout changes on mobile devices
- Emscripten: use less memory for downloaded resources when memory growth is enabled #9716 (merged)
- Emscripten: ping fullscreen fix inclusion #9097 #9765
- Emscripten: error on creating compilation archive #9733 (fixed)
- Emscripten: reopen build issue with EMCC_LOCAL_PORTS preventing testing RenPyWeb's pygame-example #9342
- Emscripten: update documention with newer async techniques #9707 #9735 (merged)
- Emscripten: proposal to ease dynamic builds (.so libraries) #9770 but support is not good enough yet
- SDL2: progress on official (no patch!) support for pausing/resuming the engine #70 #9734 (merged) #97 (reviewed)
- python-emscripten: emscripten.pyx: bindings for pseudo-synchronous download and debugging functions, polish Fetch API
- python-emscripten: emscripten.pyx: fix crash when calling cancel_main_loop() with no loop set
- python-emscripten: proper static/dynamic support for third-party Python modules, ensure the same Python version is used everywhere
- python-emscripten: webprompt: support asyncify build
- pygame4web: early experiments
- RED: prepare renpy-7.3.5-sdk+web20191103.zip with latest RenPyWeb changes, update demos
2019 week 43 (2019-10-27)
- On-demand resource download: figure out, at last, a copy-less share of large download resources between the browser and Ren'Py (smaller memory requirements, better reactivity)
- RenPyWeb: smaller memory usage when downloading game.zip
- python-emscripten: textarea for multi-line code tests, smaller base memory, update demo
- emscripten.pyx: full object-oriented wrapper for Emscripten Fetch, headers support, callbacks refactoring
- Ren'Py: emscripten.async_call considered unsafe for now, stop using in Ren'Py commit
- Emscripten: fix memory optimization for downloaded resources when memory growth is enabled #9716
- Emscripten: clarify file_packager a little bit #9700 #9717
- Emscripten: Fetch: document limitations in headers support #7026
- Emterpreter: update documention with newer async techniques #9707
- Studies/experiments: memory management, async support, Python web environment from Pyodide, Ren'Py resource loading and caching (images/audio/fonts/scripts)
2019 week 42 (2019-10-20)
- On-demand resource download: initial Cython bindings for the Fetch API; analyze memory usage
- python-emscripten: update demo with emscripten.fetch()
- Emscripten: document that emscripten_fetch_close() is unsafe #8234 #9678
- F.A.Q.: more clarifications, reference audio glitch status
- RED: prepare renpy-7.3.5-sdk+web20191018.zip, update demos
2019 week 41 (2019-10-13)
- On-demand resource download: improve Cython bindings for async_wget_data, prepare Fetch support (which provides IndexedDB caching)
- Safari/iOS: investigate issues, apparently the browser itself needs fixing :/ discuss #181723
- Request Ren'Py git tags publication #2031
- python-emscripten: size-optimize some more: strip docstrings and build path + some clean-ups
- python-emscripten: webprompt: now a true read-eval-print loop as it displays the return value; clean-up & optimize demo
- Emscripten: discuss testing popular dependencies before new releases (cont'd) discuss
- RED: fix .zip timestamps when repackaging (caused .pyo recompilation and build path leak); make it easier to inspect changes (notably don't rename the top-level directory)
- RED: prepare renpy-7.3.4-sdk+web20191009.zip, update demos
2019 week 40 (2019-10-06)
- On-demand resource download: wrote Cython bindings for emscripten_async_wget_data tricky commit
- On-demand resource download: confirm there's a file number limit at itch.io, which will most probably annoy us, though it seems it can be lifted easily enough
- RenPyWeb build: add wave/sunau/chunk Python modules for AudioData (though AudioData currently hangs :/)
- Emscripten: 1.38.46: my ASYNCIFY_WHITELIST wildcard feature was included in the release, document it #9568
- Emscripten: ping #2354 (whitelist wildcard) for future direction
- Emscripten: 1.38.46: report new undefined symbols on link #9566
- Emscripten: 1.38.46: report new link failure #9565
- Emscripten: really disable shared builds for our ffmpeg build (works around #9565)
- Emscripten: discuss testing popular dependencies before new releases
- python-emscripten: improve web Python demo some more
- RED: prepare renpy-7.3.3-sdk+web20191002.zip, update itch.io & newgrounds demos
2019 week 39 (2019-09-29) - nearly a year!
- On-demand resource download: experiment with asynchronous networking techs
- Python-Emscripten: revamp webprompt to prepare for exposing (and testing) more networking techs; you can play with a bare-bones web Python demo
- Ren'Py: doc fixes #2006 ad5e11c710a
- F.A.Q.: new entry on Memory/RAM, rework Networking entry
- Emscripten: binaryen: refactor asyncify whitelist wildcard support (merged) #9381 #2344
- Emscripten: binaryen: provide feedback on potential issue with wildcards #2354
2019 week 38 (2019-09-22)
- Continue streamlining changes in the compiler:
- Emscripten: share positive feedback about faster RenPyWeb version discuss
- Emscripten: binaryen: first patch for asyncify whitelist wildcard support #2344
- Emscripten: binaryen: typo #2346
- Emscripten: LLVM: ping static linking with -fPIC? #9317
Emscripten: fastcomp: request tags update so our builds don't break #264 - Emscripten: zee.js: support recent Emscripten (merged) #10
- Emscripten: un-stall a few old issues #6759 #2387
- Emscripten: answer to automated tests suggestion discuss
- F.A.Q.: insist a little more that web games need to be LIGHT ;)
- The hosting platform that I contacted (following a game rejection) explained they blacklisted
.zip
among other extensions (to avoid getting flagged for hosting malware, maybe as an alternative to running a costly regular AV scan).game.zip
can be renamed, see the F.A.Q.. They also complain aboutindex.wasm.gz
because of.gz
; for this and other reasons I may test another extension in the future such as.wasmgz
(used by UnrealEngine) - Answer questions from several patrons
- Prepare web release notes for Ren'Py 7.3.3
- List still more games. We're at 60+ identified web releases :)
2019 week 37 (2019-09-15)
- Emscripten: bump to 1.38.45
- Emscripten: local ports: rework parallel build (merged) #9342 #9391
- Emscripten: asyncify: provide testing for hidden Python functions issue #9408
- Emscripten: decompression support: more debugging/testing with single-file .js #9380
- Emscripten: decompression support: corrupted memory (fixed independently) #9430
- zee.js: improve build system (merged) #8
- zee.js: better error reporting (merged) #9
- zee.js: support newer Emscripten #10
- Test Microsoft Chromium Edge Beta (WebAssembly/threads support OK -- Firefox, what are you waiting for?!?) discuss
- Drop fallback GUI that allowed loading a local game.zip (and most likely failed)
- Ren'Py: test Renpytom's fix for Accessibility popping up #1990
- Contacted a game host following a patron's report of submission rejection on technical (file formats??) grounds.
- Rework F.A.Q. on size, speed and .zip extension.
2019 week 36 (2019-09-08)
- Emscripten: discuss how to improve contribution workflow discuss
- Emscripten: diagnose issues with new-async technique discuss
- Emscripten: request and justify ASYNCIFY_WHITELIST wildcard #9381
- Emscripten: request better debugging support for new-async, direly needed to keep RenPyWeb in shape #9389
- Emscripten: rework SDL2 async support + discuss proper integration (cnt'd) #70
- Emscripten: suggest better structure for ports #8650
- Emscripten: fix parallel builds with custom ports #9391
- Emscripten: SDL2_* build errors with local SDL2 port #9402
- Emscripten: issue with newer version and SINGLE_FILE=1 (for our compression fallback) #9380
- Emscripten: doc improvement for compiling from sources (useful to test fixes in advance) #9383
- RenPyWeb: enable pygame.draw module which was missing (needed for creator-defined displayables)
- RenPyWeb: add renpyweb-version.txt to help diagnose issues
2019 week 35 (2019-09-01)
- Emscripten direction: discuss the status of our current and future options, detail RenPyWeb's needs discuss
- Emscripten direction: confirm that some bugs won't be fixed on the default, to-be-obsoleted version, prompting change #9257
- Emscripten upgrade: apply work-around and finish following current/old 'fastcomp' branch (1.38.37->1.38.42)
- Emscripten 'upstream': experiment with this new version as it will soon be mandatory; I hope to experiment with the 'new-async' technique which may bring some performance improvements to RenPyWeb. For now I can say it links faster.
- Emscripten 'upstream': report error assertion error when linking, discuss and provide way to test fixes #9317
- Emscripten 'upstream': adapt ffmpeg build configuration #9329
- Emscripten: ping old linking issue that got worse, provide rationale anew #8650
- Emscripten: rework SDL2 async support + discuss official integration #70
- Emscripten: report parallelism issue with custom ports #9342
- RenPyWeb: report accessibility being mistakenly triggered #1990
- RenPy: ping webgl/highp fix #1965
2019 week 34 (2019-08-25)
Emscripten upgrade (1.38.32->1.38.37, with SDL port 2.0.7->2.0.9; final target: 1.38.42)- Track down hidden crash altering system detection #9257
- Track down update error in emsdk #320
- Request missing tags #264
- Request fixing tags #9282
- LANG detection clean-up #9257
- Doc typo #320
- Study the new async option some more, it might work for us with the latest improvements but there are still a few regressions AFAICS so far
- Request status of our current and future options: discuss
- Request status of threaded multimedia stack (private mail, no answer, doesn't seem to have progressed recently: still only basic GL functions, no SDL2)
2019 week 33 (2019-08-18)
- Portable HTTP requests (native/renpyweb): better error handling, fix example: asyncrequest.rpy
- Ping Renpytom so you can test recent RenPyWeb changes in the nightly builds: #1953 (Screen Variants) and #1961 (fullscreen fixes) now merged (though not rebuilt yet)
- SDL2 port: detect when the player leaves the page so we have a chance to save Ren'Py's persistent data (notably seen texts); currently 'persistent' is only written when the player goes back to the main menu #88 #89
2019 week 32 (2019-08-11)
- Portable HTTP requests (native+renpyweb); you can add this RPY files in your project: renpyweb/utils/asyncrequest.rpy
- Make RenPyWeb work with the new development version of Ren'Py (bug Renpytom if nightly builds are not recent enough ;))
- Modify Screen Variants proposal #1953
- Ping fullscreen and webgl/highp fixes #1961 #1965
- Start enabling networking in Python port for testing WebSockets; you can start experimenting with transparent WS using the Python 'socket' module.
- Emscripten: report compilation issues with networking functions #9154
- Ren'Py doc clarifications #1969 #1970
2019 week 31 (2019-08-04)
- Document good caching practices in the F.A.Q., evaluate lots of different options, improve default Apache config file, fix caching/compression conflict for index.wasm.gz
- Fix WebGL compatibility with some graphic cards #1963 #1965
- Even more new RenPyWeb games were released!
- Start working on asynchronous HTTP fetch functions that work both in Ren'Py and RenPyWeb #1968
2019 week 30 (2019-07-28)
- Fullscreen support improved: this needed fixes in both the base web tech #87/#9097 and Ren'Py itself #1961 hence why it took so long to figure out.
This is not 100% perfect and patches need to be properly integrated, but this fixes the past resizing bugs and fullscreen loops when the user pressed "Escape". - Discussion on handling Screen Variants in the browser #1953
- Started investigating a WebGL/tablet issue reported by a patron #1963
- More RenPyWeb-powered games listed at renpy.beuc.net#games
- Android Universal APK patch: accepted #28
- Ren'Py doc fix
- Web tech news: RenPyWeb needs to stop/resume Ren'Py; but Emscripten (the base code converter for RenPyWeb) is experiencing changes: the technique we use (Emterpreter) is not available in the new version yet, however there's a new technique (new-asyncify) which may be better. Possibly I'll (have to) experiment with that in the future.
- Development version: Renpytom is making changes in Ren'Py's low-level graphics code; RenPyWeb's nightly development version won't work for a short while.
2019 week 29 (2019-07-21)
- Detect and set Screen Variants (screen size, mobile vs. desktop, touch...) so your RenPyWeb game automatically adapts to the user's device; proposed for review at #1953
- Android Universal APK patch: bug Renpytom again about it #28
- Clean-up extra file
- Make RenPyWeb homepage mobile-friendly :)
2019 week 28 (2019-07-14)
- (renpy-but-not-renpyweb) RAPT: offer support for universal APKs (single .apk file for all devices) #28
2019 week 27 (2019-07-07)
- Answer lots of questions from you :)
- Fix broken encoding in Korean environment #1
- Clean-ups: tidy homepage (clarify official inclusion, remove old manual instructions, regroup documentation, 3 more games listed), refresh all web demos on all web hosts to 7.3.2.320, tidy error messages (missing newlines), better notify users blocking 3rd-party cookies, tidy Git repository tags
- Allow importing savegames file twice
- Ren'Py(not web): RAPT: prevent gradle from pausing Ren'Py when run in the background #1921
2019 week 26 (2019-06-30) [renpy-7.3.2.320]
- Preserve dates when importing savegames, as they are displayed in the load/save screens
- Emscripten: browser language detection officially accepted at last #8751
- Upgrade libzip to 1.5.2 and contribute fix to their documentation #109
2019 week 25 (2019-06-23)
- More on savegame issue (discuss):
this concerns players who disable third-party cookies (and forks that do it by default such as Debian Chromium) only.
These players are now warned, no work-around AFAICS. - Source code: properly tag renpyweb 7.3.0.271.
- Emscripten: more work to officially integrate browser language detection #8751
- Answer user feedback (thanks!), more entries in the Games section
2019 week 24 (2019-06-16) [renpy-7.3.0.271]
- Ren'Py 7.3.0 may be released today! This is the first official version with built-in RenPyWeb support :)
- Investigate savegame issue with Chromium and iframe in a different domain (discuss). Typically, itch and newgrounds. Honestly I'm surprised nobody reported this before? Meanwhile I added a warning for players when saving fails. No issues with Firefox.
- Provide clear message for old browsers: "Unsupported browser - please upgrade! (WebAssembly support needed)"
- Move
game/presplash.png
toweb-presplash.png
(png or jpg) - Update documentation
- Emscripten: follow-up on default language detection #8751 discuss
- More entries in the Games section
2019 week 23 (2019-06-09)
- I noticed a RenPyWeb slow-down/lock-up issue with Ren'Py's June 1st pre-release, due to build issues. A new (fixed) one is available.
- emscripten: expose browser language #8751, allowing you to leverage config.enable_language_autodetect
2019 week 22 (2019-06-02)
- Start fixing fullscreen support: different control and authorization model, as well as glitches in low-level parts makes it long to investigate and fix, I'll need to continue later
- Upscale presplash screen if the browser window is larger (downscaling was already supported)
- Launcher: shortcut to web build directory
- Automate the_question and tutorial fix-ups required for stand-alone (web) publishing
- New Caveat section on mobile browsers
- Ren'Py Translator ToolKit: ignore voice statements in translate blocks, support unicode in original text, minor fixes
- Clarify "show text" is not directly scanned for translation #1848
2019 week 21 (2019-05-26)
- Upgrade to emscripten 1.38.32 #8650
- Track and list more public RenPyWeb games
- Translation improvements in Ren'Py #1827 #1834 #1837
- Improvements and bugfixes on Ren'Py Translator ToolKit: regroup dialogs and menus translations, more stable sort, slight GUI improvements, documentation, clean-ups
2019 week 20 (2019-05-19)
- First version of the Ren'Py Translator ToolKit
2019 week 19 (2019-05-12)
- Add a "web" screen variant and remove "pc" (by Renpytom). I expect that we'll add back variants in the future depending on the detected web environment (pc/mobile, screen size...)
- Document that ASMJS support was dropped along with the merge in Ren'Py, to focus on (newer) WebAssembly and avoid multiplying targets to test
- Do not minify index.html so it can be customized more easily
- Start investigating virtual keyboard for mobile browsers #80
- Link some public RenPyWeb games (with a NSFW spoiler block) at the RenPyWeb homepage
2019 week 18 (2019-05-05)


- Renpytom integrated RenPyWeb in the official Ren'Py launcher! Please test the current development SDK at http://nightly.renpy.org/current/
- Fix flickering in imagemap/imagebutton with alpha
- More investigation on networking, following user requests
- Request no minification for index.html so you can modify it more easily #8547
- Fix rebuild error #8546
- Minor build fixes
- 2019-05-06: for a various reasons, the ASMJS fallback was missing in this release (replaced with WebAssembly support). Following discussion with Renpytom we decided not to support ASMJS further - let us know if that's a problem for you.
2019 week 17 (2019-04-28)
- More audio tuning to avoid a jitter/silence right after playing a sound
- Size/start-up optimization: drop video codecs since video support is currently not implemented (-25% for index.wasm)
- Start investigating flickering in imagemap/imagebutton with alpha (reported by a new user, thanks!); AFAICS there is a related issue in mobile versions
- Minor fixes to Ren'Py web integration (not ready yet)
- WebGL tuning: using FrameBufferObjects for RenderToTexture
2019 week 16 (2019-04-21)
- Renpytom has been working some more on RenPyWeb integration in official Ren'Py. This week's release is probably one of the last with the current game.zip layout, the next ones should be generated by the Ren'Py launcher directly!
- Hot-fix bug release on the 16th: disable LZ4 compression as this causes problems #8450. Impacted files will soon be moved to game.zip anyway.
- Size optimization: fallback gzip decompression of the index.wasm file (15MB->4MB) when the web host doesn't do it (itch.io/newgrounds...)
- Size-optimize base Ren'Py files some more (removed 1MB)
- Warn player when unzipping game.zip fails (instead of trying to load an incomplete game)
- Improve this webpage's documentation
- Update to Emscripten 1.38.30
- zee.js: refresh prebuilts with Emscripten 1.38.30 #7
- python-emscripten: now builds fully in parallel
- python-emscripten: LZ4 compression support for pythonhome.data
2019 week 15 (2019-04-14)
- Improved sound at last! Sound jitter should be mostly fixed, feedback welcome.
- Work-around chromium's (controversed) autoplay policy, as Newgrounds users reported sound was sometimes muted #6511
- Freshen-up zee.js, laying ground for index.wasm compression (15MB->4MB) on Itch & Newgrounds. Spammed the project tracker ;)
#1
#2
#3
#4
#5
#6
Kuddos to kripken for starting this project and staying such a responsive maintainer.
2019 week 14 (2019-04-07)
- Add playable test on Newgrounds: https://www.newgrounds.com/portal/view/729314
- Start-up time optimization by adding more download compression methods
- Add web server configuration for compressed JavaScript/Python code assets
- Alternate compression (LZ4) of Python assets for hosts that don't support it (itch.io, newgrounds...)
- Complain that zee.js (gzip in JavaScript) doesn't run anymore #1
- Document the current sound jitter, comments welcome: README.md
- Panic when Renpytom started moving things around in the renpyweb repo ;)
2019 week 13 (2019-03-31)
- Ren'Py 7.2.1 and 7.2.2 support
- New Caveats section on game size
2019 week 12 (2019-03-25)
- Discussion with Renpytom on RenPyWeb integration
- Emscripten build script by Renpytom
- Build system fixes
2019 week 9 (2019-03-03)
- Ren'Py 7.2 support
- Keep investigating pesky random crashes - found a bug in the debugger instead #8229 ;) (see also cf. #6724)
- Document network/socket caveats
- Next steps: Renpytom plans to work on integrating RenPyWeb in the Ren'Py launcher during March; keep RenPyWeb stable meanwhile
2019 week 8 (2019-02-24)

- Upgrade Ren'Py to current 7.1.4.0 pre-release (including my first direct commit)
- Upgrade Emscripten to 1.38.28 (merged #8054 and #8056)
- python-webbrowser: escape URLs to avoid potential JavaScript error/execution
- Improve build system and documentation
- Renpytom plans to work on official integration as soon as the 7.1.4 is ready!
- Update default splash screen :) What do you think?
2019 week 6 (2019-02-10)
- Upgrade Ren'Py to new 7.1.4 official pre-release
- Upgrade Emscripten to 1.38.27
- Disable downloading game.zip from another website for security (XSS-like)
2019 week 5 (2019-02-03)
- Publish consolidated source at the official Ren'Py GitHub: github.com/renpy/renpyweb
- Clean-up build system
- Bundle multiple pygame-example variants to quickly experiment
- python-emscripten fixes beuc.net/python-emscripten/python
- Emscripten:
2019 week 4 (2019-01-27)
- Difficult upgrade to Emscripten 1.38.25:
- Fix Chrome crash with large files, improve .zip extraction speed and memory usage #7630
- Push for Emterpreter (async) support in SDL2 #70 discussion
- Investigate video support:
- Document (roadmap) the need for 2 levels of video support: fullscreen w/ hardware acceleration, displayable w/o hardware acceleration
- Failed experiments, in the current Ren'Py, hard to sync the separate audio and video processing without threading
- Hardware video detection slight inconsistency #1698
- Doc improvement for videos #1697
2019 week 3 (2019-01-20)
2018 week 52 (2018-12-30)
- Start cleaning-up the
chaosbuild system, especially the Python port - Discuss how to use asynchronous features more cleanly (no patch) at emscripten-discuss
- Fix browser detection #1675
- With more such clean-up I hope to properly include this in Ren'Py
2018 week 50 (2018-12-16)

- New context (pop-up) menu:
- Saves import/export using ZIP format
- Access to Ren'Py log (useful for debugging and performance analysis)
- Bugs reports and follow-ups:
- Chromium: crash with large files #7630 / #913861
- Emscripten: investigate random crashes: emterpreter+fpcast discussion + made more Python functions asynchronous
- Emscripten: root-cause of the itch.io/iframe focus issue #7631
- Ren'Py screen size constraints #1661
- Ren'Py: suggest full-screen toggle rather than destroy/recreate window #1665
- Ren'Py: persistent data sync #1631
2018 week 49 (2018-12-09)
- Bug reporting fest:
- Ren'Py: suggest alleviating screen size constraints esp. for mobile platforms #1661
- Ren'Py: fix for static modules #1660
- Ren'Py: minor lint #1662
- SDL2: fix for duplicate touch events accepted at last #64
- Emscripten: investigated and reproduced Chromium crash report with large (>110MB) files #7630
- Emscripten: suggest fix for the itch.io keyword bug #7631
- Upgrade to Emscripten 1.38.21
2018 week 48 (2018-12-02)

- Improved design:
- The game now adapts to the screen size
(from large desktops to medium laptops to tiny mobile phones) - Cleaner status messages that auto-hide
All screen space for the game :)
I plan to add a square drop-down menu at the top-left to import/export savegames and logs in the future, let me know if you've got other design ideas.
- The game now adapts to the screen size
- Screenshots: typing 's' now automatically prompts a screenshot download!
- Fixed "The_Question" demo whose latest updates uses fonts from the Ren'Py launcher #1656
- Technology (SDL2) bug fixes:
2018 week 47 (2018-11-25)
- Bug fixes and clean-ups:
- Fix duplicate click events on touch devices; SDL2 bug #64
- Fix fatal error when attempting to open a local URL (such as Help/README.html in old-style VNs)
- Disable memory growth on asmjs target to avoid performance drop
- Non-RenPyWeb: better error handling in RAPT #20
- Separate and rename Python/Ren'Py archives for clarity; further optimize (trim) them
- Upgrade to Ren'Py 7.1.3.1092
- (Unconclusive) experiments with taming the popup blocker and with the Chrome audio stutter :/
- Experiment with faster, threads-based, alternate port: new browsers are becoming ready for it, but a lot of work is still needed in the lower-level Emscripten project.
I would need your support to progress on this faster port.
2018 week 46 (2018-11-18)
- Optimized start-up time by avoiding recompiling Python snippets from .rpyc files; you need to ship renpy/common/ in your game.zip file to leverage this (discussion at #1647). RenPyWeb now can run unmodified renpy/common/ files. Also the browser is more responsive during game loading.
- Better mobile support by optimizing memory on start-up (Firefox 63 runs reasonably well).
- Quit the game cleanly: no crash, and stop audio #1639; also found a bug in Ren'Py in the process #1642
- More code clean-up; optimized out unnecessary libraries SDL2_mixer and SDL2_ttf.
- SDL2: patch audio issue #4176 #63
- Emscripten: clarified cryptic error message in Emscripten and improved documentation #7516 #7523 #7524 #7526; reported bug when using pristine SDL2 #7525; upgraded to 1.38.17.
- Investigated how to optimize downloads with unfriendly CDNs (discuss)
- Clarified Roadmap - feedback welcome.
2018 week 45 (2018-11-11)
- Downloadable version for game developers with instructions
- Fixed itch.io integration issues:
- fix issues with lost keyboard focus
- automatically download and play game.zip if no game is given in URL (instead of displaying the "Open local Game" button)
- only one index.html file otherwise itch.io selects the slower asmjs fallback by default
- smaller uploads: the asmjs/ fallback now can use the same game files (instead of requiring duplicates or .zip-unfriendly symlinks)
- updated https://beuc.itch.io/the-question-web accordingly
- Pushed 2 more patches to standard Ren'Py (#1631, #1632)
- Not web-related but I made a couple fixes to the French translation (#11624, #1625, #1630) and reported a minor info-leak (#1628)
2018 week 44 (2018-11-04)
- WebP image support
- More detailed/clearer error messages
- Autosave fixed
- More testing (resulting in more entries in the roadmap ;))
- More Python-Emscripten integration (technically: emscripten.async_call with argument)
- Upgraded Emscripten to 1.38.16
2018 week 43 (2018-10-29)
- Updated RenPyWeb logo to mention RenPyWeb works on MS Edge
- Updated to Ren'Py 7.1.1
- Started structuring patch sets
- Sent a few patches for consideration to Ren'Py and Pygame_SDL2 (1 2 3)
- Started separating Python-related effort to python-emscripten
2018 week 42 (2018-10-21)
- Presplash image (doc)
- Image prediction now working
- Open web links in a new tab (you'll get a popup warning though, I don't think that can be bypassed)
- emscripten: now can query current WebGL attributes (notably alpha/transparency): #7243, commit
- Audio optimization tests. My current opinion is we'll need multithreading support to get better perfs; this requires me to contribute more with the Emscripten project (see multithreading label) as well as incoming support in the browsers (more precisely "SharedArrayBuffer" - Chrome starts enabling it but it doesn't work for me yet, and in Firefox you can enable it with a few clicks).
- SharedArrayBuffer experiments
2018 week 41 (2018-10-14)
- Improve performances (WASM support) for Chrome/Chromium
- Contribute transparency (alpha) fix in official Emscripten #7227/#7242
- Start structuring the compilation process to test multiple emscripten versions/patches
2018 week 40 (2018-10-07)
- Better performance for Firefox (not Chrome due to WebAssembly size limitations)
- Initial sound support
- Load your own game locally! (provide a .zip containing a game/ folder)
- Load game from an URL: The Question Tutorial
2018 week 39 (2018-09-30)
- The base engine works with Firefox; it works with Chromium too though it required some performances compromise
- Sound is currently disabled (working on it)
- Game was not modified, just repacked. Ren'Py however was butchered a little bit ;)
- Game must be entirely downloaded first
- Game performances were improved enough for playability. Better performances are possible but require more work
- itch.io downloads are way larger than here due to long-standing compression issues (#394); work-arounds could be implemented with some work
- Official Python 2.7 ported for the web, but without threads
- Some fixes were included in Emscripten though not all yet
Before
- A hell lot of experiments :)