> ## Documentation Index
> Fetch the complete documentation index at: https://companyname-a7d5b98e-ton-storage.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Hosting

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

With Mate's fast and reliable hosting, developers can effectively manage static
assets for their mini applications. Delivering static files efficiently and
securely is vital for optimal performance.

By utilizing a Content Delivery Network (CDN), Mate's hosting boosts reliability
and accelerates file loading for users across various regions, surpassing the
performance of single-server solutions.

The hosting service is free, though there are some limitations on data transfer.

<Aside type="caution">
  If you’re currently using a single server for both static file hosting and server-side operations, transitioning to Mate's hosting may require code adjustments. If your app already distinguishes between static and dynamic requests, integration will be much simpler.
</Aside>

### Important recommendation

When deploying an SPA on a static hosting platform (like Mate's hosting), it’s crucial to choose
routing methods that do not depend on server-side configurations.

Hash-based routing (using the `#` symbol in URLs) is a simple and effective way to manage routes without needing server support. Many frameworks offer built-in solutions or plugins to implement this type of routing.

For instance, if you are using *React*, use `HashRouter` instead of `BrowserRouter`:

```jsx theme={null}
import { HashRouter as Router, Route, Switch } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        {/* Other routes */}
      </Switch>
    </Router>
  );
}

export default App;
```

## Features

### Lightning Speed

The crucial feature of Mate's hosting is its well-configured Content Delivery
Network spread across the world, in countries where mini applications are
commonly used. This feature allows developers to focus on building their
applications rather than worrying about how to deliver static assets as quickly
as possible.

### Version Management System

Another notable hosting feature is the version management system.

Mate allows the creation of up to five deployment tags, enabling developers to
deploy the project with a specific tag without affecting previously deployed
assets.

#### Usage Example

A common use case here is when the project has two versions: `latest` and
`staging`. The developer can use the `latest` version for production and
`staging` for the Quality Assurance team.

After deploying the `staging` assets, the QA team checks if this staging state
is acceptable. Then, the same assets can be deployed with the `latest` tag for
production.

#### About Base URL

When deploying static assets, Mate uses the following base URL pattern:

```
https://{storage_key}.tapps.global/{tag}
```

Here’s some information on these parameters for clarification:

* `storage_key`: a unique key for the deployed project. This value is
  non-configurable and is assigned to the project upon creation.
* `tag`: a deployment tag. This value is set during the deployment process by
  the developer. Examples include `staging`, `latest`, `dev`, etc.

## Getting started

### Register a project

To start using the hosting functionality, you must register the project and
obtain its deployment token. To get the token, go
to [`@tma_mate_bot`](https://t.me/tma_mate_bot) and press the `Start` button to
begin the conversation with the bot.

<p align="center">
  <img src="https://mintcdn.com/companyname-a7d5b98e-ton-storage/FD8IcOsvSzvVWUk1/resources/images/tma-mate/start.png?fit=max&auto=format&n=FD8IcOsvSzvVWUk1&q=85&s=5fd33378e1c01f00ea9b59fc596fbff2" width="320" data-path="resources/images/tma-mate/start.png" />
</p>

Next, press the `Create a Project` button and enter the title of the project to
be created, following the specified rules.

<p align="center">
  <img src="https://mintcdn.com/companyname-a7d5b98e-ton-storage/FD8IcOsvSzvVWUk1/resources/images/tma-mate/create.png?fit=max&auto=format&n=FD8IcOsvSzvVWUk1&q=85&s=790c8c126d3561708307a19858fc4452" width="320" data-path="resources/images/tma-mate/create.png" />
</p>

After this step, the bot will return the created project information, including
the **deployment token**.

### Update the static assets base URL

Before deploying the project, ensure that all static assets have a valid base
URL. You can learn more about how Mate generates the static assets base
URL [here](#about-base-url).

To retrieve the project deployment information using a specific tag, use the
following command:

```bash theme={null}
mate deploy info \
  --token {DEPLOYMENT_TOKEN} \
  --project {PROJECT_ID} \
  --tag {TAG}
```

Here, the `DEPLOYMENT_TOKEN` and `PROJECT_ID` values refer to the deployment
token and project identifier received from the previous step. `TAG` is a
deployment version tag name.

Output example:

```
✔ Fetched deploy information for paper-planes (id 48) project
Project Title: paper-planes
Short title of the project
--------
Base Path (using tag "staging"): https://35f105bd6b.tapps.global/staging
This path will be used as a base path for the uploaded assets associated with this project.
Consider using this value as a base path in your bundler. You can also use different tags using the --tag option.
--------
Allowed file extensions: html, css, js, cjs, mjs, png, jpg, jpeg, webp, ttf, woff, woff2, eot, json, ico
Files extensions that are allowed to be uploaded.
--------
Maximum size: 10485760 bytes
Maximum upload size.
--------
Maximum files count: 100
Maximum number of files a single upload can contain.
```

The value `https://35f105bd6b.tapps.global/staging` is the base URL that should
be used in the project bundler.

Here’s how it can be applied using [Vite](https://vitejs.dev).

```ts theme={null}
import { defineConfig } from 'vite';

export default defineConfig({
  base: 'https://35f105bd6b.tapps.global/staging'
});
```

### Deploy the project

To deploy the project, Mate requires specifying a folder to be uploaded to the
hosting service. The folder must only contain files that can be opened by the
user's browser, so no source files or files for different purposes should be
present in the directory.

Let’s assume the following conditions:

* A project with ID `48` and token `aabbccdd` was created.
* A folder named `dist` contains all the mini application built static assets.
* It is required to deploy the static assets with the tag `latest`.

To deploy the project under these conditions, run the following command:

```bash theme={null}
mate deploy upload \
  --dir dist \
  --token TOKEN \
  --project 48 \
  --tag latest
```

Here’s the possible output:

```
✔ Fetched deploy information for paper-planes (id 48) project
i Assets base path (using tag "latest"):
https://35f105bd6b.tapps.global/latest
i Allowed file extensions: html, css, js, cjs, mjs, png, jpg, jpeg, webp, ttf, woff, woff2, eot, json, ico
i Maximum upload size: 10485760 bytes
i Maximum files count: 100
✔ Directory compressed successfully from 24185 to 7168 bytes
✔ Archive uploaded successfully
📁 dist
╰ 📄 index.js (https://35f105bd6b.tapps.global/latest/index.js)
```

> \[!WARNING]
> The deployed directory must include only standard files and directories,
> excluding private ones (starting with the `.` symbol). All other types of
> files (such as symlinks) are forbidden. If found during the deployment process,
> the CLI tool will throw a corresponding error.

### Verify deployment and configure TMA

After deploying, it’s recommended to verify that your application is working correctly
by accessing it via the direct link:

```
https://{storage_key}.tapps.global/{tag}/index.html
```

If everything functions properly, use this link as the web app URL when creating your Telegram mini-app.

**Example:**

If your `storage_key` is `35f105bd6b` and your tag is `latest`, the link will look like this:

```
https://35f105bd6b.tapps.global/latest/index.html
```

Ensure that when you navigate to this link, your application loads and operates without errors. This guarantees that your Telegram mini-app will work correctly with your hosting setup.

## Using config

To avoid repeatedly specifying parameters, Mate allows creating a special
configuration with all the parameters included.

To start using the Mate config along with the optional commands' options,
create the `mate.yml` or `mate.json` file in the project root directory
with the following example content:

```yml theme={null}
deploy:
  projectId: 48
  directory: dist
  token: TOKEN
  tag: latest
```

```json theme={null}
{
  "deploy": {
    "projectId": 48,
    "directory": "dist",
    "token": "TOKEN",
    "tag": "latest"
  }
}
```

Then, the `info` and `upload` commands will retrieve the values from the
configuration.

```sh theme={null}
# Both of these commands will use
# the options from the Mate config prior:
# --project = 48
# --dir "dist"
# --token "TOKEN"
# --tag "latest"
mate deploy info
mate deploy upload
```

If any parameter override is required, it should be specified in the command.
For example, to override the `tag` option with the `staging` value, use the
following command:

```sh theme={null}
mate deploy info --tag staging
```
