Home›Developer docs›Hosting and domains

Web hosting and custom domains

Updated Nov 14, 20262 min read

Host a website and your own routes next to your SashiDo app, and serve the app's API, files and email links from your own domain with a free SSL certificate.

Your app's server also serves a website: static files from your repository, and your own Express routes. With a custom domain, the website, the API and the links in your emails all use your domain.

Static files

Files in the public/ folder of your app's repository are served as they are at your app's public URL, https://pg-app-<id>.scalabl.cloud/:

public/index.html      →  https://pg-app-<id>.scalabl.cloud/
public/css/main.css    →  https://pg-app-<id>.scalabl.cloud/css/main.css

Push to deploy, like cloud code. A built single-page app (React, Vue) works too: commit its build output to public/.

Your own routes

cloud/app.js exports an Express app mounted at the same root: landing pages, OAuth callbacks, webhooks from Stripe or GitHub. See Cloud code › Your own routes.

A custom domain

  1. In the dashboard open App Settings › Emails & Hosting and enter your domain as Host Name, e.g. api.example.com.
  2. At your DNS provider, add a CNAME record for that name (or for <service>.api.example.com, as the dashboard shows) pointing to pg-app-<service>.scalabl.cloud. The dashboard shows the exact names for your app.
  3. When the record has propagated, turn on Free SSL Certificate by Let's Encrypt in the same section. The certificate is issued and renewed for you.

Saving the host name redeploys the app with it as its public URL:

  • the API answers at https://api.example.com/1/: point your SDKs' server URL there;
  • email verification and password reset links use your domain;
  • your website and routes answer on it too.

The original pg-app-<id>.scalabl.cloud address keeps working, so apps already released don't break.

To go back, Remove the host name in the same section.

Scripts and AI assistants can do the same: the Management API (GET, PUT and DELETE /apps/{appObjectId}/domain, scopes settings:read and settings:write) and the MCP server's get_custom_domain, set_custom_domain and remove_custom_domain. Both name the CNAME record your domain needs, and refuse the domain until it points to the app.

Reading this with an AI assistant? This page as Markdown.