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
- In the dashboard open App Settings › Emails & Hosting and enter your domain as Host Name, e.g.
api.example.com. - At your DNS provider, add a CNAME record for that name (or for
<service>.api.example.com, as the dashboard shows) pointing topg-app-<service>.scalabl.cloud. The dashboard shows the exact names for your app. - 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.