Aether
Sign inGet started
All posts
Release Notes · 5 min read

Aether v0.7.0: marketplace installs reach the open table

Publish a supported package, choose a compatible world, and deliver mods or declarative content without stopping the session.

Aether Team
Aether Team
The team
A running tavern world beside the Content panel, where marketplace packs are ready to import or already installed without relaunching the table.

The marketplace no longer asks a running table to wait for its next launch. A GM can add a content pack or install a mod while everyone remains connected, and the world server tells each client what changed through the same authoritative channel that owns the rest of the session.

What changed

An install written behind the running server
An acknowledged command to the world that is already open
Store category choosing the installer
A persisted mod, content-pack or unavailable install contract
A pack trusted after its URL was approved
Raw bytes checked against the approved id, version and hash before import
New mod state after a relaunch
Each connected client stages the sandboxed mod, then keeps or replaces its working copy

One storefront, separate lifecycles

Systems, mods, sheets, maps, collections and audio remain useful ways to browse the store. They are not six interchangeable package formats.

A published version now carries an install descriptor alongside its editorial category. Mods are sandboxed SDK bundles with a mod.json. Maps and collections are declarative content packs. Sheet packs may provide a compiled sheet only for a runtime type declared by that same pack. Audio packs import assets, but do not promise playlists, stingers or playback. System packages can be listed and inspected, but have no install button yet because the current system registry runs trusted setup code inside the world server.

That distinction also appears before publication. Creator Studio sends the category the creator chose through inspection and publication, then reports the package kind, install kind, compatibility, direct dependencies and limitations before Review. A generic module is installable only when it contains a valid root pack.json; module code is neither imported nor executed.

Why the running world acknowledges the install

For an open world, the control plane resolves the creator's immutable version, entitlement, compatible systems, direct dependencies, requested grants, origin and artifact hash. It mints a short-lived token for the initiating GM, joins the existing world endpoint, sends the existing install command, and waits for the matching modules or contentPacks broadcast.

The world server remains the only writer of the running registry and its YAML manifest. A success message therefore means the authoritative process observed and broadcast the exact change. If the world stops during the command, the control plane rechecks its state and safely uses the next-launch path. If the world remains open but never acknowledges, the marketplace reports a retryable failure instead of claiming the install worked.

This reuses protocol 23. No message or patch shape changed, so PROTOCOL_VERSION does not move in this release.

Declarative packs arrive ready for a GM decision

When a pack is added, every connected client receives the new desired-content list immediately. The Content panel updates in place, and GMs get an import prompt without reconnecting. Players do not get that prompt. Imported types, documents and assets then travel through the ordinary server-authority and projection rules, including document visibility.

Before the first mutation, the client hashes the fetched pack.json bytes and checks the approved hash, id, version, schema, system compatibility, direct dependencies and sheet-to-type relationships. A preflight failure creates nothing. If an unexpected failure occurs partway through an import, Aether removes the documents and types created by that attempt where possible and leaves the pack unstamped so the GM can retry. Content-addressed asset blobs may remain as harmless, reusable orphans.

Dependencies are deliberately direct and explicit. A missing requirement is shown on the world selector and blocks the install; Aether does not silently install a dependency tree or solve ranges transitively.

Sandboxed mods replace only after staging

A modules broadcast asks each connected client to fetch and sandbox-load the pinned mod with the grants the GM approved. Upgrades stage their panels, tools, bindings, iframe and bridge resources in a temporary registry. The prior version is removed only after staging succeeds.

One client's load failure does not uninstall the world record or interrupt clients that loaded the mod successfully. The affected client keeps the previous working version when there is one and shows the local error with Retry. A GM can also disable or uninstall the mod through the existing authoritative actions.

Content, Roll Tables and Player View share a frame

The Content panel now gives desired packs, URL and file import, export, loading, failure, retry and remove states one consistent hierarchy. Roll Tables has a named empty state with its create action. Player View has a header and explicit no-player, unsupported, loading, selected-player and error frames. The latter two changes are visual only; no roll or projection behavior moved into the marketplace work.

What it does not do

Third-party systems still cannot become a world's ruleset. That needs a separately sandboxed or declarative system-definition model, versioned migrations and its own ADR before hosted Aether can offer it safely. Audio content imports assets only. A contributed sheet cannot override a system's built-in type, and one listing cannot combine executable mod grants with content-pack import consent. Creators publish those as separate packages.

This release also does not add a transitive dependency solver or system-version ranges. Compatible systems are exact ids because a running world does not yet advertise a system package version.

Try the loop

Open Creator Studio to inspect a .zip bundle or .aetherpack.json, or browse the marketplace and choose a world you run. A running world's Content panel or Mods dialog should change without a stop, launch or reconnect; a stopped world receives the same pinned version on its next launch.

Aether Team
Aether Team
The team at Aether

Everyone who ships Aether, writing together. Release notes and anything that does not belong to one person.

Keep reading