# Upload a build

Push your game files to Wavedash

Source: https://docs.wavedash.com/publishing/upload

A **build** is an immutable snapshot of your game's files. Every time you push, Wavedash creates a new numbered build. Old builds are never deleted — you can always roll back.

## Uploading a build

<Tabs>
  <Tab title="Developer Portal">
    1. Open your game in the [Developer Portal](https://wavedash.com/dev-portal)
    2. Go to the **Builds** tab
    3. Click **"Upload new build"**
    4. Drag and drop your zip file or folder, or click to browse — up to 1 GB

    ![Builds tab with the upload modal open, showing a drag-and-drop area](/images/screenshots/dev-portal-builds.png)

    Once uploaded, the build appears in your builds list. Uploading does not make it live — [publish it](/publishing/publish) when you're ready.
  </Tab>
  <Tab title="CLI">
    Configure `wavedash.toml` with your `game_id` and `upload_dir`, then run:

    ```bash
    wavedash build push
    ```

    The CLI authenticates, uploads the folder, registers the build, and prints its `Build ID`. Each push creates a new build record.

    Uploading does not make the build live. After the upload completes, pass the printed build ID to `wavedash publish`, or open the Developer Portal and publish the build you want players to receive.

    <Tip>
    Run `wavedash auth status` before pushing to make sure you're logged in, and check the `game_id` in `wavedash.toml` before publishing.
    </Tip>
  </Tab>
</Tabs>

## Build immutability

Builds are immutable. You can't patch files in an existing build — push a new one instead. This makes rollbacks reliable since every build is a complete, self-contained snapshot.

## Build size

Large WASM and asset folders increase upload time and load time for players. A few things that help:

- Compress textures
- Strip debug symbols for production builds
- Split optional content behind lazy loads where your engine allows
- Enable Gzip or Brotli compression in your build settings
