Repository navigation
Releases: oscargala/openages
Release list
OpenAges v0.1.0
The first release of OpenAges, the client of Myst Online: Uru Live in a web browser: H-uru's Plasma engine compiled
to WebAssembly with Emscripten and drawn with WebGPU. It builds in two flavours from the same source: plClient
(CPython 3.12.9) for shards that serve H-uru's Python 3 game scripts, and plClient-py2 (CPython 2.3.3) for shards
that serve the original Python 2.3 scripts of MOULa.
The release is the source at the tag v0.1.0 (commit 778b8b166fb1eeb2097e70940b554bb685e93bff) and one file: the
source of every third-party component the clients link. The game's Ages, textures and sounds belong to Cyan Worlds and
are not part of it; a shard serves them.
Files
| File | Bytes | SHA-256 |
|---|---|---|
openages-v0.1.0-third-party-sources.tar |
645,191,680 | 98665dfd9da583b53c928165c80c3dda4876f740a08d0dea555d57770b6a5075 |
The archive holds the bundle that web/build/notices/source_bundle.py assemble makes from the pins in
web/build/sources.lock: the pinned downloads, CPython 2.3.3's tree with the proof of its pin, each vcpkg port's
download and port directory, and Emdawnwebgpu's archive, with MANIFEST.json, SHA256SUMS and
THIRD_PARTY_NOTICES.md. Its README.md says what is where. The build tools used unmodified (emsdk, Node.js, CMake,
Ninja, the vcpkg tool, the GNU autotools) are listed in MANIFEST.json and not included. To check it against the
pins, from a checkout of the tag:
tar -xf openages-v0.1.0-third-party-sources.tar
python3 web/build/notices/source_bundle.py check openages-v0.1.0-third-party-sourcesThe release's clients
The release's clients were built from this tag with RELEASE=1, so they record the commit and the tag: the login
dialog reads UruLive.1.918 - v0.1.0 - External.Release. Each build also writes <client>.release.json, which the
deployment tools turn into the deployment's source.json.
| File | Bytes | SHA-256 |
|---|---|---|
plClient.js |
281,255 | c221e993fc6dea766a18f6302bbaa6cd8fc318c6f570cc7a2f3eb1ea5e58586d |
plClient.wasm |
19,441,439 | fa7ab5e09e7bf1fe932aa6f78317eda8197844e150addb4e5e54797873e4c9c4 |
plClient-py2.js |
277,845 | 44877ebdb71fe6c918c38e539b58e47ebee0457d567bedd859e6a72d6d93df93 |
plClient-py2.wasm |
13,908,078 | 03308c9e478abcd03401523505994665e475f8cdcafec1f45a7b344dfc46b228 |
The same builds wrote a symbol map for each client, which a deployment does not serve: plClient.js.symbols
(1,999,771 bytes, 550b0e5bc2165b6aea74ca0e1b8db3f275f16b5fdd00256de90761b8265275dc) and
plClient-py2.js.symbols (1,946,706 bytes, 1185f7aa4f4f50e6d57dcc78e05620b38e1a6bb3ab69518af0ed0c2335551d5b).
Building them again
Docs/Web/Building.md has the prerequisites: Emscripten 6.0.12 through emsdk, the dependency prefix that
web/build/build-deps.sh builds, and vcpkg. With EMSDK, PLASMA_WASM_DEPS and VCPKG_ROOT set as it describes:
git clone --branch v0.1.0 https://github.com/oscargala/openages.git /tmp/openages-v0.1.0/src
cd /tmp/openages-v0.1.0/src
export RELEASE=1 PLASMA_WASM_CMAKE_ARGS=-DCMAKE_EXE_LINKER_FLAGS_RELEASE=--emit-symbol-map
PLASMA_WASM_BUILD=/tmp/openages-v0.1.0/build-py3 web/build/build-client.sh
PLASMA_WASM_PYTHON2_STAGE=/tmp/openages-v0.1.0/py2deps web/build/python2/build.sh build
PLASMA_PYTHON_ABI=2 PLASMA_WASM_PYTHON2=/tmp/openages-v0.1.0/py2deps/python2 \
PLASMA_WASM_BUILD=/tmp/openages-v0.1.0/build-py2 web/build/build-client.shRebuilt this way on the Mac that made the release, every file above came out byte for byte the same. A rebuild on
another machine has not been measured yet.
Why these paths. A release build with a symbol map gives the same bytes only when the checkout and the two build
directories are at the same paths. The paths reach the names that ThinLTO gives to the local functions it promotes,
which the symbol map keeps, and the order of a few functions that share a name. Built from the same tag with the
checkout in another folder, the JavaScript files were the same and the wasm files differed in 1,481 (plClient) and
1,334 (plClient-py2) bytes, all of them that order and those names. /tmp exists on macOS and Linux without root
and names no user. Use the paths exactly as written: on macOS /tmp is a link to /private/tmp, and the build has to
see /tmp. The dependency prefix can be anywhere, since the builds map its path to a fixed name, and which vcpkg
checkout the build reads does not reach the clients.
What was tested
Before the release, on this commit's source, in Chromium 156 on a Dirtsand test shard, with scripted mouse and
keyboard input:
- login and the player list, Relto, the link to Eder Gira, a second login that finds the first session's state, the
intro movies, the links into Ahnonay and Minkata, and the game's Quit; - the Python 2.3 client on a shard that serves MOULa's game code: login, Relto and the link to Eder Gira, with no
Python tracebacks; - six fixed camera poses, compared pixel by pixel with the native client: each gave the same frame as before, and
0.6 % to 31.5 % of the pixels differ from the native client's by more than 16 of 255; - a median of 60 frames per second in every phase, at least 58.9 in every one-second window inside an Age; the
longest frame took 35 ms inside an Age and 0.63 s while a link loads; - 491 MiB of WebAssembly memory over three links, and a peak of about 2.3 GiB for the browser's processes (2.8 GiB in
a private window).
On the release's own plClient above, the player page was played again, served by the origin server and as a static
kit: login, the player list, Relto and the game's Quit, exit code 0, 60 frames per second in Relto.
README.md, "Status", has every Age and what was measured.
Browsers
Chromium 156 is in every check and works. Firefox 157 and Safari 27 were tested once, in October 2026, and are not
in the regular checks; start-up, an online session in Relto and Eder Gira, sound and input worked in both. Windows,
Linux, phones and tablets have not been tested: everything was measured on one Apple-silicon Mac.
Known limits
- The browser's frames are not yet identical to the native client's (above).
- In Firefox a screenshot of the canvas sometimes comes back empty.
- Mouse capture is unverified.
- The Descent and the parts of the Ages that the test shards' state closed are untested.
- The Python 3 client does not load Tomahna on a shard whose
Cleft.pypredates H-uru's fix. - The HD texture pack builder is not part of this release.
Licence
OpenAges is free software under the GNU General Public License, version 3 (LICENSE.txt), with the additional
permissions that H-uru Plasma carries (COPYING.txt). THIRD_PARTY_NOTICES.md names each third-party component and
its licence, and the file above carries their source. A deployment names its repository, its tag and the address of
this file in source.json (Docs/Web/Deploying.md, "Source code and licence files").
Before publication
The commits, files and messages that this repository adds to H-uru's history, and this tag, were scanned for private
paths, network addresses, credentials and game data with the project's own patterns, and the commits again with an
independent second implementation, and then with gitleaks 8.30.1. Neither of the project's scans found anything
private. gitleaks flagged six lines, each reviewed: two WebSocket handshakes that send RFC 6455's sample key, a
made-up test key (the bytes 0 to 63), and three comments that describe a formula or name source files. None is a
secret.
How it was written
The browser port was written with AI coding assistants, with the native C++ client as its specification, and
checked against measured results. See
How it was written in README.md.