# 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](https://docs.viverse.com/publishing-with-your-viverse-account) 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 %}

## Publishing with VIVERSE Studio

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.

### Publishing Apps with VIVERSE Studio

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

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

### Begin Upload

Open **VIVERSE Studio**, navigate to the **Worlds** section, select the **Upload** tab, and click **Create New World.**

**Worlds** are containers for content on VIVERSE and, once created, you can upload your 3D experience or application to your World.
{% endstep %}

{% step %}

### Complete Upload Details

Enter a **Name** and **Description** for your project and agree to VIVERSE's Platform Agreement.

Once completed, select **Create**.
{% endstep %}

{% step %}

### View the Overview Tab

Once your World is created, you can view and adjust settings for your content in the **Overview Tab, such as its Name and App ID.**&#x20;

The **App ID** is an important piece of information for anyone [integrating VIVERSE SDKs](https://app.gitbook.com/s/StEZJb1cl50eSxquMjc5/) into their project.
{% endstep %}

{% step %}

### Upload a .zip File

Within the **Content Versions Tab,** drag-and-drop or click the **Select File** button to begin the upload process.

Select your .zip file and click Upload.
{% endstep %}

{% step %}

### (Optional) Add Additional Permissions

Many projects may want additional permissions, allowing access to advanced features, such as the ability to download content from your application or open a new tab:

**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

Select **Apply iframe Settings** to apply your desired settings.
{% endstep %}

{% step %}

### Preview and Test Content

Select **Preview** for a link that is only accessible to the account that created the world.

Select **Guest Preview** for a 15-minute link that you may share with any other testers.
{% endstep %}

{% step %}

### Submitting for Review

Once you are satisfied with your creation, select **Submit for Review** to submit your world for moderation. 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 width="33.33333333333334%" %}

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FCiNoUAZ10VcMvOehlJGt%2Fimage.png?alt=media&#x26;token=89d49c20-5924-4df6-9d44-e050d1dd5693" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FaN3nOzBDcBvlrW9UGauB%2Fimage.png?alt=media&#x26;token=d0800982-e8ad-4530-b221-18b52590775e" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FCHj4IETQMTBwkHUjKseg%2Fimage.png?alt=media&#x26;token=0fa3db34-452c-4737-b632-b9c7588a2f64" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FU7RMI6uxAVumLmsTGHk7%2Fimage.png?alt=media&#x26;token=bb296902-4d04-4781-b5f4-40ecd1534d17" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2Fh97OGPStT6FlHXFF241k%2Fimage.png?alt=media&#x26;token=e4b92a35-eef4-401b-9906-99ebedaf791d" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FYVbKNU1L27SERExtMxHX%2Fimage.png?alt=media&#x26;token=e2295215-a3db-4c23-a250-6251afa7cee5" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2Fx9vxNmzzw97ojdaoDsm0%2Fimage.png?alt=media&#x26;token=7ba59c91-8d6a-48fa-a0c1-fe9461f95a48" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FkEzE65EwpIZK6PeYDvrP%2Fimage.png?alt=media&#x26;token=715ac05a-6218-4de9-b256-386132a2cccb" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FvctcHOUx6CxPhYvsw1jR%2Fimage.png?alt=media&#x26;token=4c785622-d595-4e7f-8d5e-5da20657d778" alt="" width="375"><figcaption></figcaption></figure>

{% endcolumn %}
{% endcolumns %}

### Publishing Videos with VIVERSE Studio

{% 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 width="66.66666666666666%" %}
{% stepper %}
{% step %}

#### Upload your video file

Open **VIVERSE Studio**, navigate to **Videos** section, and drag-n-drop your video file to start uploading. As alternative, click **Upload** button at the right upper corner.

Please make sure your video is authored in [correct format](#input-specifications), otherwise the uploading process will return an error
{% endstep %}

{% step %}

#### Fill in content details

While the video is processing, feel free to fill in content details:

* Video title
* Description (optional)
* Thumbnail image
* Genre tags
  {% endstep %}

{% step %}

#### Preview your content

Once the video is uploaded and processed, it is available for preview!

Click **View** button to see your video in a new tab. You can adjust **Quality Settings** on the fly to check how it was [transcoded](#transcoding-matrix) into different resolutions.
{% endstep %}

{% step %}

#### Adjust visibility

The visibility is set to **Private** by default, but you can always set it to **Public** or **Unlisted** in the dropdown at the top of the page
{% endstep %}

{% step %}

#### Save and publish

When you're happy with everything, click **Create** button at the top right corner — this will save your video with the **Visibility Settings** you adjusted earlier.

And when you're ready to publish — just click **Edit** and set your video to **Public.** Congratulations, it's now live and can be viewed by entire VIVERSE community!

Please note that you can always hide your video later by setting its **Visibility** back to **Private**
{% endstep %}
{% endstepper %}
{% endcolumn %}

{% column width="33.33333333333334%" %}

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FDoqa23laf7mzmmeqlUUg%2Fvid1.png?alt=media&#x26;token=3f1f59f0-f58f-4f06-97f6-d959792c0592" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FavqbFu8CLKmIOHXRXhV8%2Fvid2b.png?alt=media&#x26;token=8a82bbc3-49fe-4d04-a24f-b6c06ea76f2f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2Fs25AOmbN0Ao235wKM4Ox%2Fvid4a.png?alt=media&#x26;token=da06125a-45bc-4b3d-918f-921fcde1345a" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FBNIFLwjyF45Y13stiwjc%2Fvid4b.png?alt=media&#x26;token=c6e534f4-5f2c-4c05-ad7c-6974617ed4fa" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FkcQSXk7nTx2lBJg17vEe%2Fvid4c.png?alt=media&#x26;token=d13e5187-009c-425b-905c-5632b69f82c4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FPYB39TMJ4sj6Gsc72nIx%2Fvid5.png?alt=media&#x26;token=c42c9794-7ff5-47f7-8768-845219f5aba4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FFaFnV5yvRZCxsTlriokz%2Fviverse_thumbnail.jpg?alt=media&#x26;token=91c87be8-05f9-4b34-8baf-90c6d57438c9" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FKaB3TOHV2z0fiTZsNvSK%2Fvid6.png?alt=media&#x26;token=bed47df7-4146-4e9e-9591-dbbd0b0aa58e" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FnLgFc602TtUpIDX1deTP%2Fvid7.png?alt=media&#x26;token=fc4085d7-dfcc-41a4-84a0-231a1f2eb6d1" 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="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FK7xFSsfMkOyqXWNgXNWe%2Fimage.png?alt=media&#x26;token=f4f41069-6a08-4fdd-8a3c-8f37608370d3" 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="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FsUgitPgxUhnm7msFmc1o%2Fimage.png?alt=media&#x26;token=094d2d7a-2aae-42fe-b74e-798bc8b19409" 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="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FniDfGKpvZgskQXhgqYIJ%2Fimage.png?alt=media&#x26;token=775a49ae-2391-49e3-bc29-dfda0dd95cda" 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="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2Fix4He96yqQtczw1LT8vd%2Fimage.png?alt=media&#x26;token=faa35706-3712-4d08-b7ef-56daa44de6da" 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="https://1140075852-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pMiThqqrBzfvP8uy5am%2Fuploads%2FvIhatQ0JevPPetSih90V%2Fimage.png?alt=media&#x26;token=14b0bd81-a8a8-46e7-83dc-5eea235fd35f" 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: 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:

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

The question should be specific, self-contained, and written in natural language.
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.
