Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.
Publishing puts your app on the internet at a public https:// address that starts with a name you choose. The agent asks for the name, then Alpha builds a fresh copy from your source and runs it outside the session’s machine, so it stays up while the machine sleeps. To change or roll back an app that is already live, see Manage a published app. To show work in progress instead, share the session.
Only the session’s owner sees Publish. If you don’t see it beside Share in your own session, publishing isn’t turned on for your Alpha. Ask whoever runs it.
Alpha copies one directory out of the session’s machine, works out how to build it, builds an image on Google Cloud Build and runs it on Google Cloud Run. Each publish is a new version. Traffic moves to it only once it serves, so a failed build never takes down what is already live.A Dockerfile in the directory wins and is built as it is; it must listen on $PORT. Otherwise Alpha detects the stack from the project’s manifest and picks the install, build and start commands.
Detected from go.mod, Cargo.toml and the other usual manifests
Static site
A plain index.html, or a built Vite, Astro or Create React App site
If the app needs a system package the builder doesn’t add by itself, such as ffmpeg, the agent names it in a railpack.json beside the app, as "deploy": {"aptPackages": ["ffmpeg"]} with Debian package names, or writes a Dockerfile instead.
What ships
What it means
One app per directory
A top-level directory, or the workspace root, is one app. A front end and an API in two directories are two apps.
Only that directory
Nothing outside it, and never node_modules, .git, build outputs or .env files. Production installs and builds from scratch.
Only the secrets you pick
The agent asks which of your secrets production gets and passes them by name. Values never appear in the transcript.
The session’s services, not their copies
With the database on, production gets a database of its own. With sign-in on, it gets the same app sign-in.
The production database starts empty. Rows in the session’s database don’t move across. The agent migrates from the app’s start command, or you push the session’s tables from the Publish tab. See Production database and sign-in.
Publishing is done by the agent, in the session, so you can see and answer everything it does.
1
Click Publish
Click Publish beside Share. While the agent is working, the pill is held and its tooltip reads “The agent is busy — ask once it is done”, because a message then would steer the turn. The Publish to production box shows what ships: Serves is the process and port serving a page in the Preview, or “detected from the code”. Database reads “its own, in production” or “none”, Sign-in reads “on” or “off”, and Access is always “Public · anyone with the URL”.
Check what goes with the app before the agent starts.
2
Send the request
Click Publish in the box. Alpha sends “Deploy this.” to the agent, as if you had typed it. One click sends one message.
3
Answer the question card
The agent puts everything only you can decide into one question card: the name, with a suggestion first; the directory, when there is more than one; and which secrets production gets, when the app reads keys. The port and start command are the agent’s to settle.
4
Watch it go live
The Publish tab opens by itself and follows the build. The agent posts the address in the transcript when it is live. See Watch the rollout.
You can also start from the Publish tab: open it from + → Publish. Before anything is published, it reads “Ship this app to production” and lists the three stages, Name it, Build and Serve. Publish with the agent sends the same “Deploy this.” as the pill, and is held at the same times.You can also ask the agent: “deploy”, “publish”, “ship it”, “go live” and “put it online” all count. The agent never publishes unasked.Alpha will:
Check what would be built, and fix anything that would stop it.
Ask only what you haven’t said. Here the name and the secret are given, so with one directory nothing is left to ask.
The name is the first part of the address, so it can’t be changed later. Republishing keeps it. For a new address, publish under a new name and delete the old app.
Rule
Allowed
Refused
Lowercase letters, digits and dashes
harbor-bookings
harbor_bookings
Starts with a letter, ends with a letter or digit
harbor2
2harbor, harbor-
At most 40 characters
harbor-sailing-school
Anything longer
Unique across your Alpha, for every user
A name nobody has used
A name anyone has published
A taken name is refused with “the name harbor is taken — pick another”. When that happens, the agent picks another and tells you which.
Every app answers at https://<name>-<project number>.<region>.run.app. Access is public and https is included, so anyone with the address can open it once it is live. On some Alphas a short prefix sits in front of the name.Where your Alpha has its own domain, the app is also at https://<name>.<domain>, mapped after the first successful publish:
Domain state
What you see
Pending
”certificate being issued (minutes, sometimes an hour)”. Alpha checks every 30 seconds while the Publish tab is open.
Ready
The domain becomes the main address everywhere, with “also …run.app” under it.
Failed
”could not be mapped” and the reason. The run.app address keeps working; a domain problem never fails the publish.
You can’t attach a domain you own. Where there is a domain, it is the same for every app on your Alpha.
The build usually takes 2–6 minutes. The Publish tab tracks the version through Export, Plan, Build, Publish and Live, each marked Done, In progress, Failed or Waiting. The pill beside Share reads Publishing… meanwhile. Open the Log fold to read the build as it runs; secret values show as [redacted].The transcript gets a card when the publish starts and one when it ends, visible to anyone who can read the transcript. Publish tab in each card opens the tab.
Card
It reads
Started
”Publishing harbor to Cloud Run — the build runs on Google Cloud Build; follow it in the Publish tab.”
Live
”Published harbor to Cloud Run in …s”, what went with it, and the address. The pill becomes Republish, with a link icon that copies the address.
Live, in yellow
The same, plus a hint starting “The service is up, but …”: the app refuses its own hostname. The agent fixes the config and republishes.
Failed
”Publishing harbor failed while building the image: …”, a hint and a foldable log tail. Fixes for each hint are in Troubleshooting and FAQ.
A session publishes one app at a time; meanwhile the buttons are held with “A rollout is in progress”. You can close the browser. The publish runs on Alpha’s side, and the machine stays awake until it ends.