Websites
Every game, and your studio itself, can have static websites hosted by ASE Brain. Commit your source and a build recipe. Choose any commit in the studio console to generate a private preview, then publish a chosen build separately. Nothing builds or publishes on push.
Layout
websites/
main/ # the game's or studio's home page
build.toml # optional: how to generate the website
src/ # authored input, if using a generator
public/ # generated output, ignored by Git
routes.toml # optional: downloads and outbound links
press/ # any other website, by its folder id
public/
main is the default website. A new game starts with a websites/main starter. Add another website with:
ase website init --website press
init never overwrites existing files. Add the same id as a website in the studio console before its first upload.
Without a recipe, the workflow uploads the authored files in public/ directly. For a generated website, add websites/<id>/build.toml and ignore its output directory:
version = 1
runner = "ubuntu-24.04"
working_directory = "."
command = ["node", "tools/build-website.mjs"]
output = "websites/main/public"
timeout_minutes = 30
The command runs from the selected commit. Your script installs pinned dependencies and generates static HTML, CSS, JavaScript and assets. It can run Astro, Vite, Hugo, a Next.js static export, or custom tooling such as Godot and Python. Use the toolchain's generated directory as output; server rendering requires a static export. The runner can also be windows-2025 or macos-15. Optional lfs and submodules flags prepare those checkout dependencies.
For builds that use Brain's game SDK, set brain_sdk = true. The workflow downloads the signed SDK in a separate trusted job and gives its files to your generator for offline use. Your build scripts receive no upload credentials.
Check locally
ase website plan # inspect the recipe
ase website build --artifact .ase/website-artifact # new destination
ase website check # websites/main
ase website check --website press
check runs the same rules an upload does, without uploading:
- Every file is a regular file of a supported type, not empty and within the size limit. No symbolic links.
index.htmlfiles become directory pages, and other HTML files become extensionless routes. Two files can't have the same route.- Every HTML page has a visible link to the hosting notice:
<a href="/privacy" rel="privacy-policy">Privacy policy</a>
Keep links between pages and to assets relative (style.css, ../about/), so they work at a build's preview address as well as the public one.
Downloads and outbound links
routes.toml gives fixed addresses to files and external pages:
[downloads]
"/download/press-kit" = "/press-kit.zip"
[links]
"/go/steam" = "https://store.steampowered.com/app/1234560"
Outbound links must use HTTPS, with no query string, fragment or credentials. Add only entries whose files or pages exist.
Build, preview and publish
- Commit the website source and recipe.
- In the studio console, open the game's Website page (or your studio's), enter a branch, tag or commit in the build bar and build it. Brain resolves the exact commit and runs its recipe. Every request creates a separate attempt, including rebuilds of the same commit. All commits are selectable; there is no website change detection.
- Open the build's preview. Previews are private: only your studio's staff can open them, after signing in. Each build has its own fixed address, and a later build never replaces it.
- An owner or admin publishes a build from
mainhistory, confirming the exact revision. Branch previews remain private until their source belongs tomainand is built again. Publishing an older build works too, and making a website private takes it down.
Bind your own domain in the console by pointing a CNAME at the address it shows. ASE Brain provisions the certificate.
Request totals
ASE Brain counts public page requests, downloads and outbound link clicks per day, and shows the totals in the console. It keeps no IP address, user agent, referrer or cookie, and adds no script to your pages. Totals include bots and repeat requests, so they count requests, not visitors. Previews aren't counted.
Any scripts or services you add to your own pages are your responsibility for privacy notices and consent.
Privacy reports
Every upload gets a privacy report on what the build loads and stores. The website.yml workflow runs the scanner ase carries in an offline browser:
ase website audit --site game/neon-drift
audit needs Node.js, Docker and SOURCE_COMMIT set to the build's full commit. Use WEBSITE_REVISION when rechecking an existing revision. A report is evidence about a build; it doesn't block publishing.
In CI
website.yml is one of Brain's files and ase sync keeps it current. Separate jobs plan the pinned source, build its static artifact, then validate and upload that artifact. Only trusted jobs have credentials; source build scripts run without them. The upload job runs:
ase website check --website main
ase website upload --site game/neon-drift --website main
ase website audit --site game/neon-drift --website main
--site is game/<id> for a game's website, or company for your studio's own. A game's website uploads with the game's release credential. ase website upload --dry-run checks the upload without sending it.