Skip to content

Headless Export ​

A headless export turns a saved .awaken project into a shipped game from the terminal, with no editor window open, through the same code File menu exports run. Use it from a build script or a CI job.

What runs ​

There is no separate exporter. The editor's own modules open the project in a headless editor store and call the same export functions the File menu calls. vitest is the host that loads those modules under Node, which is why each command is a vitest run gated on environment variables rather than a standalone script.

Run both commands from the engine's folder (the one pnpm dev runs the editor from). Paths are resolved from that folder.

Export game.html ​

bash
AWAKEN_EXPORT_IN=path/to/game.awaken AWAKEN_EXPORT_OUT=path/to/game.html pnpm export:project
VariableMeaning
AWAKEN_EXPORT_INThe saved project. It is opened as File > Open opens it, and an export without App Settings is named after the file.
AWAKEN_EXPORT_OUTWhere game.html is written. Missing folders are created.

The file written is the file Export Game would write: the same used-asset filtering, compression and player template (see Export game.html). One difference: there is no canvas under Node, so every texture ships as lossless PNG.

On success it prints one line starting [awaken export] with the output path, the file size in bytes, the entity count, meshes and textures shipped out of those in the project (96/140 meshes), the time taken in ms, and the export's own summary.

Progress goes to standard error with an [export] prefix. With either variable unset the export test is skipped and nothing is written. The command runs Node with a 16 GB heap (--max-old-space-size=16384) for large projects.

Export for Mobile ​

bash
AWAKEN_EXPORT_IN=path/to/game.awaken AWAKEN_MOBILE_DIR=path/to/mobile pnpm export:mobile
VariableMeaning
AWAKEN_EXPORT_INThe saved project.
AWAKEN_MOBILE_DIRThe React Native folder to write.
AWAKEN_ANDROID_KEYOptional. A JSON file holding the Android release key, for a project that keeps the key out of the project file.

It writes the same files, byte for byte, as File > Export for Mobile, and prints the same log lines to standard output:

  • An empty folder, or one that does not exist yet, gets the whole project, as a first export does.
  • A folder an earlier export of the same app wrote (its awaken.config.json names the bundle id) gets an update: the game, the generated files and the fields App Settings own. Everything else is kept. See Re-exporting into the same directory.
  • Any other folder is refused with the editor's message and nothing is written. A different release key or save key is refused too.

It exits with code 1 when the export is refused or fails, and with a usage line when a variable is missing.

It never saves the project. A save key it creates for a project without one stays in the folder's saveKey.ts, and later exports into that folder read it from there. A build number it raises stays in the folder's native files; the log names the number to enter in App Settings so the project keeps it as well.

The Android key file ​

AWAKEN_ANDROID_KEY names a JSON file with the fields App Settings hold: p12, alias, storePassword, keyPassword, fingerprintSha256 and created, either at the top level or inside {"androidKey": {...}}. It is checked as App Settings check it and never printed. If the project already holds a different key, the export is refused and the message gives both SHA-256 fingerprints. See Android release key.

The player template must be current ​

Both commands embed apps/assets/player-template.html, the built player. A template built before an engine change ships a game running the older engine, so a feature that works in the editor can be missing from the export. Rebuild it after any change under packages/ or apps/player/:

bash
pnpm build:player-template

The two commands treat an old template differently:

  • export:project warns. When the template is a day old or more, standard error carries the template's age and the rebuild command, as the editor's Console does.
  • export:mobile refuses a stale template. It compares the engine commit stamped in the template (awaken-template-commit) with the engine's git history, and refuses when there is an engine commit since the build or uncommitted engine changes newer than it. The mobile template itself is rebuilt from mobile-template/ on every run.

A build script ​

bash
#!/usr/bin/env bash
set -euo pipefail
cd path/to/awaken/editor
pnpm build:player-template
AWAKEN_EXPORT_IN=../../games/mygame/project/mygame.awaken \
AWAKEN_EXPORT_OUT=../../games/mygame/web/game.html pnpm export:project
AWAKEN_EXPORT_IN=../../games/mygame/project/mygame.awaken \
AWAKEN_MOBILE_DIR=../../games/mygame/mobile pnpm export:mobile

set -e stops the script on the mobile export's exit code 1.

See also ​

Awaken: browser-native WebGPU game engine.