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.3.5/red-2020-09-14



(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



RED (RenPyWeb Early Downloads): as a thank you for my patrons, I also bundle Ren'Py + latest RenPyWeb improvements/fixes such as better perfs and progressive download -- 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.

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 7.3.5 needs to download the full game before playing. ~100MB tops, 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.

However I recently added progressive download (cf. entry below), see the RED version.

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: browser apps are pretty different than desktop/mobile apps, and fitting Ren'Py currently requires a speed compromise (gory details).

Things are improving, for a first boost see the RED version (this optimization will also be included in the next Ren'Py official release, >7.3.5, and is also included in Ren'Py's unstable nightly builds).

Audio glitches: this is due to Speed, see entry above for a fix.

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.

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).

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 the RED version with progressive download (cf. entry 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).



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 due to technical limitations. 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.

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.* ).

Web hosts format: 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).

Notes:

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.

Invalidating browser cache on game update: when releasing a new version of your game, I suggest you either change the path where you upload the new version (game hosts usually do that), or control cache (see the provided htaccess.txt). Otherwise, the browser may mix cached and non-cached versions, causing errors.

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: the RED version 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 customize 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.

Roadmap

(in no definite order)

Python port for the browser, with Cython support

Python port for the browser, with Cython support Size-optimized minimal Python environment

Size-optimized minimal Python environment Pygame_SDL2 basic port for the browser

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) (Emterpreter) Reconcile asynchronous browser execution with Ren'Py synchronous model (lower perfs / threadless for now) (Asyncify)

Reconcile asynchronous browser execution with Ren'Py synchronous model (lower perfs / threadless for now) (Asyncify) Run unmodified Ren'Py games

Run unmodified Ren'Py games WebAssembly support for Firefox (+fall-back to asm.js for other/older browsers)

WebAssembly support for Firefox (+fall-back to asm.js for other/older browsers) WebAssembly support for Chrome/Chromium

WebAssembly support for Chrome/Chromium Background/on-demand resources download (e.g. images and musics; currently RenPyWeb requires downloading the whole game on startup)

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.

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 Sound support without jitter

Sound support without jitter Video/movie support

Video/movie support renpy.movie_cutscene hardware support (i.e. handled by the browser; fullscreen probably tricky)

renpy.movie_cutscene hardware support (i.e. handled by the browser; fullscreen probably tricky) WebP image support

WebP image support Fix image prediction

Fix image prediction Fix auto-save

Fix auto-save Save persistent (seen texts) when exiting the webpage (in progress)

Save persistent (seen texts) when exiting the webpage (in progress) Fix opening web links (pop-up warning in Firefox though)

Fix opening web links (pop-up warning in Firefox though) Test and improve compatibility with popular game hosts (on-going)

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)

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)

Mitigate cache issues when updating a game at the same URL (typically self-hosted games) More responsive game loading

More responsive game loading Splash screen

Splash screen Don't unnecessarily recompile/rebuild cache on start-up (very long)

Don't unnecessarily recompile/rebuild cache on start-up (very long) Optimize memory usage if possible (in particular for mobile) (on-going)

Optimize memory usage if possible (in particular for mobile) (on-going) Load game from an URL

Load game from an URL Load your own game locally (disabled 2019-09)

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

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)

Define and lock orientation (if screen.orientation.lock works) Add "web" variant

Add "web" variant Detect and define more variants (pc/phone, small/medium/large...)

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)

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 full-screen toggle which goes wrong sometimes + handle config.default_fullscreen=True on start-up Fix alpha support for imagebutton and imagemap (flicker)

Fix alpha support for imagebutton and imagemap (flicker) Fix 1 touch = 2 clicks on mobile

Fix 1 touch = 2 clicks on mobile Bring/mask virtual keyboard on text input in mobile devices (if possible?)

Bring/mask virtual keyboard on text input in mobile devices (if possible?) Detect browser language

Detect browser language Fix Chromium crash with large (>= 108MB) files

Fix Chromium crash with large (>= 108MB) files Quit game cleanly (no error; kill sound)

Quit game cleanly (no error; kill sound) Clearer error messages (in particular for mobile where there's no JavaScript console)

Clearer error messages (in particular for mobile where there's no JavaScript console) Clearer error when loading a full ren'py game

Clearer error when loading a full ren'py game Import/export savegames, log.txt

Import/export savegames, log.txt Simple HTTP requests from Ren'Py

Simple HTTP requests from Ren'Py Upgrade/sync newer Ren'Py (now integrated in official Ren'Py)

Upgrade/sync newer Ren'Py (now integrated in official Ren'Py) Report and fix Emscripten bugs (ongoing)

Report and fix Emscripten bugs (ongoing) Make all changes generic (clean-up) and merge them to Pygame_SDL2 and Ren'Py (ongoing)

Status reports

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)

renpy-ttk: embed .po -> .mo converter, request testing

renpy-ttk: fix errors when running from freshly installed Ren'Py

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)

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 :)

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!

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)

(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)

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 :)

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 :)

2020 week 01 (2020-01-04)

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 :)

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.

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)

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

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

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

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)

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 :)

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.).

2019 week 47 (2019-11-24)

Better error handling (don't crash/quit game, more precise error messages)

Fix issue with multiple search paths (e.g. game/ vs. game/images/ )

vs. ) Refactor Ren'Py changes following Renpytom's review

Update online demo and RED version. Still downloading images only. Feedback welcome :)

Progress with on-demand resource download:

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

Documentation and support: 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 about index.wasm.gz because of .gz ; for this and other reasons I may test another extension in the future such as .wasmgz (used by UnrealEngine)

among other extensions (to avoid getting flagged for hosting malware, maybe as an alternative to running a costly regular AV scan). can be renamed, see the F.A.Q.. They also complain about because of ; for this and other reasons I may test another extension in the future such as (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)

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)

Emscripten upgrade (1.38.32->1.38.37, with SDL port 2.0.7->2.0.9; final target: 1.38.42)

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".

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.

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 to web-presplash.png (png or jpg)

to (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 Fix broken EMCC_LOCAL_PORTS #8054 Follow up and provide patch for Emterpreter white-listing #7988 #8056

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: Document dynamic linking wiki discuss #7974 #1 Follow-up on Emterpreter/SDL2 integration #70 Try to make EMTERPRETIFY_WHITELIST more stable #7988



2019 week 4 (2019-01-27)

Difficult upgrade to Emscripten 1.38.25: Investigate Emscripten/SDL2 gamepad-related breakage #7840 Investigate Emscripten/SDL2port/SDL_AddTimer breakage #67 More breakages for my other GNU FreeDink project XD

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)

Follow-up on Chromium crash with large files #913861

Doc fixes #1685 #1689

2018 week 52 (2018-12-30)

Start cleaning-up the chaos build system, especially the Python port

build 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.

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: convincing the maintainer some more about duplicate events ;) #64 fix issue when exiting fullscreen with the Escape key #65 tracking down issue with resizing the screen #66



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.

files; you need to ship in your file to leverage this (discussion at #1647). RenPyWeb now can run unmodified 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)

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