> For the complete documentation index, see [llms.txt](https://docs.viverse.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.viverse.com/how-to-publish.md).

# How to Publish

***

## Introduction

You can upload to VIVERSE from all web-compatible frameworks, including 3D experiences, web applications, and videos! No matter what you are building with, you can upload and manage your builds easily using [VIVERSE Studio](/publishing-with-your-viverse-account.md) or our command-line interface (CLI). Once uploaded, VIVERSE content is associated with your VIVERSE account and profile located at <https://worlds.viverse.com/profile>. This page guides you through the uploading process using both methods!

{% hint style="warning" %}
While 3D experiences and applications can be uploaded using either VIVERSE Studio or the CLI, **currently videos can only be uploaded via Studio, not the CLI.**
{% endhint %}

The VIVERSE Studio offers a user-friendly interface that makes it easy for creators of all skill levels to upload and manage content on VIVERSE. You can learn the process for uploading [APPLICATIONS](#publishing-apps-with-viverse-studio) or [VIDEOS](#publishing-videos-with-viverse-studio) below.

{% hint style="info" %}
Learn more about [specifications for applications and 3D experiences](/standalone-app-publishing/intro-to-standalone-app-publishing.md), including supported file types, requirements, and integrations with our SDKs.
{% endhint %}

### Prerequisites

* VIVERSE account
* Signed in at <https://worlds.viverse.com/>

***

## Open VIVERSE Studio

{% columns %}
{% column %}
{% stepper %}
{% step %}

#### Access VIVERSE Studio

* Sign in to VIVERSE.
* Select your profile avatar in the upper-right corner.
* Select **VIVERSE Studio**.

{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column %}

<figure><img src="/files/3YwDj87z1VFsWNOrnBkS" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

***

## Create A Game

{% columns %}
{% column width="50%" %}
{% stepper %}
{% step %}

#### Games can be created using the following menus:

A. Select **Create** from the VIVERSE Studio navigation bar > **New Game**&#x20;

or

B. Select **Create** from the VIVERSE Studio navigation bar > **New Experience** > **Game Engine**.

{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column width="50%" %}

<figure><img src="/files/74KhCKSpPGFq8llrcdmt" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/9kGx1emeYP9UHTjh8ByO" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

***

### Option 1: Create Game - Uploading the game zip file

{% columns %}
{% column %}
{% stepper %}
{% step %}
Upload Your Game Build

* In the **Upload game file** dialog, use **Option A**.
* Drag and drop a ZIP file into the upload area, or select **Select file** and choose a ZIP file.

{% endstep %}

{% step %}

#### Enter Basic Details

On **Content settings → General**, configure **Basic info**:

* **A:** Verify your uploaded game file, or use **Re-upload** if needed.
* Enter a **Name**.
* **B:** Enter a **Description** (optional).

{% endstep %}

{% step %}

#### Configure Discoverability

On **Content settings → General**, configure **Thumbnail** and **Discoverability**:

* **C:** Upload a **Thumbnail**.
* **D:** Select **Content type**.
* **E:** Choose **Categories**.
* **F:** Select additional **Genres** (optional).
* **G:** Add **Tags**.

{% endstep %}

{% step %}

#### Set Language, Audience, and Permissions

On **Content settings → General**:

* **H:** Set **Content language**.
* **I:** Configure **Audience & Age restriction**.
* **J:** Review **Content headers & permissions**.

  **Content Behavior Permissions**

  * `allow-forms` — Submit forms
  * `allow-modals` — Open modal dialogs
  * `allow-popups` — Open popup windows
  * `allow-top-navigation` — Navigate top window
  * `allow-pointer-lock` — Use pointer lock
  * `allow-presentation` — Start presentations
  * `allow-downloads` — Download files
  * `allow-orientation-lock` — Allow orientation lock
  * `allow-popups-to-escape-sandbox` — Allow popups to escape sandbox
  * `allow-top-navigation-by-user-activation` — Allow top navigation by user activation

  **Device and Sensor Access Permissions**

  * `accelerometer` — Allows access to accelerometer sensor data
  * `camera` — Allows access to device camera
  * `gyroscope` — Allows access to gyroscope sensor data
  * `magnetometer` — Allows access to magnetometer sensor data
  * `midi` — Allows access to MIDI devices
  * `window-management` — Allows multi-window management
  * `xr-spatial-tracking` — Allows access to VR/AR features
    {% endstep %}

{% step %}

#### Configure Media

On **Content settings → Media**:

* **K:** Configure **Device** support.
* **L:** Upload a **Trailer** (optional).
* **M:** Upload **Gallery** images (optional).

{% endstep %}

{% step %}

#### Configure Display Settings

On **Content settings → Display settings**:

* **N:** Configure **Branding overlay appearance**.
* **O:** Configure the **Fullscreen feature**.
* **P:** Add **Share your code** (optional).

.

.

{% endstep %}

{% step %}

#### Configure SDK and Access

On **Content settings → Access & Security**:

* **Q:** Configure **SDK settings**.
* **R:** Configure **Entry** access (optional).
* **S:** Add **Co-owners** if needed.

{% endstep %}

{% step %}

#### Submit for Review

* Select **Submit for Review**.
* Confirm the content permissions.
* Select **Submit**. Moderation usually takes less than 48 hours. If you need support with moderation, please reach out to us through [this form](https://support.viverse.com/hc/en-us/requests/new).

{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column %}

<figure><img src="/files/allGta2vjiTs9Cz2LbA7" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/I9ShhUgQdg3phZPol927" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/7RVJilO17cBWLoCzPk9G" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/OUl7DHEQ1QJAHWZ6Vv7K" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Vg2wbZLEQEr63Okk1VOT" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/CbX5YQuilk9rLzjAWqwD" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Mh6Jkyf2RmAYAA22rXxf" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/9wuJI8bOEZvv7cjkT8SD" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ck4dufvLmj9YcKmXMmTs" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

***

### Option 2: Create Game - Create an App ID

{% columns %}
{% column %}
{% stepper %}
{% step %}

#### Select Viverse SDK Integration

* Select Option B. **Create App ID**. The **App ID** is an important piece of information for anyone [integrating VIVERSE SDKs](/developer-tools/readme.md) into their project.

{% endstep %}

{% step %}

#### Create SDK Content

* Enter an Experience Name.
* Accept the Platform Agreement.
* Select **Create Content**.

{% endstep %}

{% step %}

#### Copy the Generated App ID

* Copy the generated App ID.
* Select **Done**.

{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column %}

<figure><img src="/files/lLcedSHa55rONm8ZmAiv" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/duMEaxwQh21N3fxyCD7B" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/xnCSTHcplOodN7isgkgx" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

***

### Option 3: New Game - Use CLI Upload Tools

{% columns %}
{% column %}
{% stepper %}
{% step %}

#### View CLI Documentation

* Select **Manual**.
* Follow the [CLI upload documentation](#publishing-with-the-cli).

{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column %}

<figure><img src="/files/GTgiHfRufRXduL7mccDs" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

***

## Create A Video

{% hint style="info" %}
Learn more about [specifications for video content](#specifications-for-video-content), including upload limits, output specs, and our transcoding matrix.
{% endhint %}

{% columns %}
{% column %}
{% stepper %}
{% step %}

#### Start a New Video

Select **Create** from the VIVERSE Studio navigation bar > **New Video**

{% endstep %}

{% step %}

#### Upload and Publish a Video

Upload a video file.

{% endstep %}

{% step %}

#### Add Info

A. Video File Name

B. Enter a Name and Description.

C. Upload a Thumbnail.

D. Configure Category, Genres, and Tags.

{% endstep %}

{% step %}

#### Add Access & Security

E. Select the Content Language.

F. Configure Audience & Age Restriction.

G. Configure Access Settings.

H. Add Passcode

I. Add Collaborators
{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column %}

<figure><img src="/files/CzsSggAQCtrSeJG11FjM" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ca6MApGuq7Ep8Tjy9s67" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/cfuTiea9CI9CPAZAUoTC" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/tOm0onBqQ4mb9pj1Uyh2" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

***

## Create An Open Brush Experience

{% columns %}
{% column %}
{% stepper %}
{% step %}

#### Open Brush experiences can be created using the following menu:

Select **Create** from the VIVERSE Studio navigation bar > **New Experience**&#x20;
{% endstep %}

{% step %}

#### View Open Brush Documentation

* Select **View Docs**.
* Follow the Open Brush publishing instructions.

{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column %}

<figure><img src="/files/N4hPZgw0o0Cy6trrUeYl" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/LsaTshqKI5nxrsUeGZ1W" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

***

## Create An Experience Using A Template

{% columns %}
{% column %}
{% stepper %}
{% step %}

#### Experiences can be created using the following menu:

Select **Create** from the VIVERSE Studio navigation bar > **New Experience**&#x20;

{% endstep %}

{% step %}

#### Choose Web Builder

* Select Option B. **Web Builder**.

{% endstep %}

{% step %}

#### Follow Creating From Templates documentation

Documentation for Creating From Templates can be found here: <https://docs.viverse.com/publishing-from-templates/creating-from-templates>
{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column %}

<figure><img src="/files/bgEb5yyCJWnLSIkyZz0k" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/i8uUD0qlkcnKOBcMRXEM" alt=""><figcaption></figcaption></figure>

{% endcolumn %}
{% endcolumns %}

***

## Publishing with the CLI

The [VIVERSE CLI](https://www.npmjs.com/package/@viverse/cli) can be used to publish any web-compatible WebGL / HTML5 build to the VIVERSE platform after an authentication process.

#### Installation

Using npm:

```
npm install -g @viverse/cli
```

> **Note:** This CLI requires Node.js version 22.15.0 or higher.

#### Authentication

Login to VIVERSE platform:

```
viverse-cli auth login
```

<figure><img src="/files/pLTPRlkFyVVuecyfsqSI" alt=""><figcaption></figcaption></figure>

Or directly pass in login credentials for CI/CD integration:

```
viverse-cli auth login -e <email> -p <password>
```

In such CI/CD environments, it's recommended to use environment variables:

```
viverse-cli auth login -e $VVS_EMAIL -p $VVS_PASSWORD
```

After login, check your authentication status:

```
viverse-cli auth status
```

<figure><img src="/files/NtafDYuCvms4ukSwCzcf" alt=""><figcaption></figcaption></figure>

And to logout:

```
viverse-cli auth logout
```

After [install and authentication](#installation), the VIVERSE CLI can be used to publish any working WebGL build to the VIVERSE platform after an authentication process. When publishing, you'll either access your existing projects, or create a new one.

#### Creating Applications

You can use the VIVERSE CLI to create a new application directly:

```
viverse-cli app create
```

<figure><img src="/files/Opa2ZN3rHRIGQixE23NY" alt=""><figcaption></figcaption></figure>

Or specify a name:

```
viverse-cli app create --name <application-name>
```

Alternately, you can use the [VIVERSE Studio](https://studio.viverse.com/) workflow to create an application ID:

<figure><img src="/files/26UZ9ceRhuN3js9sXPEe" alt=""><figcaption><p>From the Upload section, click the light blue "Create New World" button in the top right to open this modal.</p></figcaption></figure>

<figure><img src="/files/i8aIEj5sJIpwWEkVZKug" alt=""><figcaption><p>Once created, your App ID will display on the world page.</p></figcaption></figure>

#### Listing Applications

Once authenticaed, you can view your account's available application list:

```
viverse-cli app list
```

The output will be displayed in a table format with the following columns:

* ID: Application identifier
* STATE: Application state
* TITLE: Application name
* URL: Application preview URL

#### Publishing

Publishing content requires two inputs:

1. **App ID** — the target application to publish to (**required**)
2. **Content path** — the directory containing your content (optional if you're already in that directory)

**Option 1: Specify content path**

```
viverse-cli app publish <path> --app-id <your-app-id>
```

**Option 2: From within content directory**

```
viverse-cli app publish --app-id <your-app-id>
```

> **Note:** The App ID is required. You can use the `viverse-cli app list` command to query your existing application IDs, or view the IDs of newly created applications after using `app create`.

> **Important:** After uploading content successfully, you'll need to visit the Creator Studio website to complete the review and publishing process.

> **Warning:** The `<path>` parameter MUST point to your **build output folder** and NOT your source code folder. Publishing source code folders (containing `src/`, `node_modules/`, or development files like `.tsx`, `.jsx`, `.vue`, `.unity`, etc.) will result in non-functional content and deployment failures.

***

## Specifications for Video Content

#### Input video specifications

<table><thead><tr><th width="264.40625">Feature</th><th>Supported Formats and Types</th></tr></thead><tbody><tr><td>File Format</td><td><ul><li>Audio Video Interleave (.avi)</li><li>MPEG-1 (.mpg)</li><li>MPEG-4 (.mp4, .m4v)</li><li>MPEG transport stream (.ts)</li><li>MPEG-2 Transport Stream (.ts, .m2ts)</li><li>QuickTime Movie (.mov)</li><li>Matroska (.mkv)</li><li>Windows Media Video (.wmv)</li><li>Blu-ray Disc Audio-Video (.m2ts)</li></ul></td></tr><tr><td>File Size</td><td><ul><li>Max: 30 GB</li></ul></td></tr><tr><td>Video Codec</td><td><ul><li>MPEG-1/2/4</li><li>AVC (H.264)</li><li>HEVC (H.265)</li><li>Apple ProRes</li><li>AV1</li></ul></td></tr><tr><td>Video Resolution</td><td><ul><li>Max: 4096x2304</li><li>Min: 128x128</li></ul></td></tr><tr><td>Video Duration</td><td><ul><li>Max: 120 min</li></ul></td></tr><tr><td>Video Bitrate</td><td><ul><li>Max: 60 Mbps (H.264)</li><li>Max: 45 Mbps (H.265)</li><li>Min: 60 Kbps</li></ul></td></tr><tr><td>Audio Codec</td><td><ul><li>AAC</li><li>AC-3</li><li>MPEG Audio</li><li>MP3</li></ul></td></tr><tr><td>Audio Bitrate</td><td><ul><li>Max: 576 Kbps</li><li>Min: 24 Kbps</li></ul></td></tr></tbody></table>

#### Output video specifications

<table><thead><tr><th width="118.80078125">Resolution</th><th width="144.62109375">Codec / Bitrate</th><th width="169.1484375">Audio Specs</th><th>Description</th></tr></thead><tbody><tr><td><code>3840x2160</code></td><td>H.265 (HEVC)<br>15 - 30 Mbps</td><td>AAC-LC<br>384 kbps / 48kHz</td><td>High efficiency for VR/Desktop clarity</td></tr><tr><td><code>2560x1440</code></td><td>H.265 (HEVC)<br>8 - 14 Mbps</td><td>AAC-LC<br>384 kbps / 48kHz</td><td>The sweet spot for quality / speed</td></tr><tr><td><code>1920x1080</code></td><td>H.264 (AVC)<br>4 - 6 Mbps</td><td>AAC-LC<br>192 kbps / 48kHz</td><td>Fallback for compatibility</td></tr><tr><td><code>1280x720</code></td><td>H.264 (AVC)<br>2 - 3 Mbps</td><td>AAC-LC<br>192 kbps / 48kHz</td><td>Mobile optimization</td></tr><tr><td><code>720x480</code></td><td>H.264 (AVC)<br>1 - 1.5 Mbps</td><td>AAC-LC<br>128 kbps / 48kHz</td><td>Data saver mode</td></tr><tr><td><code>640x360</code></td><td>H.264 (AVC)<br>0.8 - 1.0 Mbps</td><td>AAC-LC<br>128 kbps / 48kHz</td><td>Legacy mobile support</td></tr><tr><td><code>400x240</code></td><td>H.264 (AVC)<br>0.4 - 0.6 Mbps</td><td>AAC-LC<br>128 kbps / 48kHz</td><td>Restricted bandwidth</td></tr></tbody></table>

#### Transcoding matrix

<table><thead><tr><th width="147.10546875">If You Upload (Input)</th><th width="340.53515625">Your Viewers Get These Resolutions and Frame Rates</th><th width="160.1171875">Max Audio Quality</th><th width="97.3828125" align="center">Quality Badge</th></tr></thead><tbody><tr><td>4K @ 60fps<br><code>3840x2160</code></td><td><strong>2160p60</strong>, 1440p60, 1080p60, 720p60, <em>480p30</em>, <em>360p30, 240p30</em></td><td><strong>384 kbps</strong> (Hi-Fi)</td><td align="center"><code>4K</code></td></tr><tr><td>4K @ 30fps<br><code>3840x2160</code></td><td><strong>2160p30</strong>, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30</td><td><strong>384 kbps</strong> (Hi-Fi)</td><td align="center"><code>4K</code></td></tr><tr><td>2K @ 60fps<br><code>2560x1440</code></td><td><strong>1440p60</strong>, 1080p60, 720p60, <em>480p30</em>, <em>360p30, 240p30</em></td><td><strong>384 kbps</strong> (Hi-Fi)</td><td align="center"><code>HD</code></td></tr><tr><td>2K @ 30fps<br><code>2560x1440</code></td><td><strong>1440p30</strong>, 1080p30, 720p30, 480p30, 360p30, 240p30</td><td><strong>384 kbps</strong> (Hi-Fi)</td><td align="center"><code>HD</code></td></tr><tr><td>1080p @ 60fps<br><code>1920x1080</code></td><td><strong>1080p60</strong>, 720p60, <em>480p30</em>, <em>360p30, 240p30</em></td><td><strong>192 kbps</strong> (Stereo)</td><td align="center"><code>HD</code></td></tr><tr><td>1080p @ 30fps<br><code>1920x1080</code></td><td><strong>1080p30</strong>, 720p30, 480p30, 360p30, 240p30</td><td><strong>192 kbps</strong> (Stereo)</td><td align="center"><code>HD</code></td></tr><tr><td>720p @ 60fps<br><code>1280x720</code></td><td><strong>720p60</strong>, <em>480p30</em>, <em>360p30, 240p30</em></td><td><strong>128 kbps</strong> (Standard)</td><td align="center"><code>HD</code></td></tr><tr><td>720p @ 30fps<br><code>1280x720</code></td><td><strong>720p30</strong>, 480p30, 360p30, 240p30</td><td><strong>128 kbps</strong> (Standard)</td><td align="center"><code>HD</code></td></tr><tr><td>480p (Any FPS)<br><code>720x480</code></td><td><strong>480p30</strong>, 360p30, 240p30</td><td><strong>128 kbps</strong> (Standard)</td><td align="center"><code>SD</code></td></tr></tbody></table>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.viverse.com/how-to-publish.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
