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.
Republish the latest changes, or put any earlier version back in seconds without a rebuild.
Production database and sign-in
Give the empty production database its tables, then browse its rows from the Database tab.
Monitor and troubleshoot production
Read the live app’s logs and request metrics, and hand an error line to the agent.
Build and publish a landing page
Go from one message to a public page with a working signup form, step by step.
⌘I
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Alpha","colors":{"primary":"#1A54F0","light":"#749FF9","dark":"#1A54F0"},"logo":{"light":"https://mintcdn.com/lyzr-15a99e0f/peFm_Sv4KgaR4cun/images/logo/light.png?fit=max\u0026auto=format\u0026n=peFm_Sv4KgaR4cun\u0026q=85\u0026s=633788f52e3e9a8128bdaf2d7a62fff6","dark":"https://mintcdn.com/lyzr-15a99e0f/peFm_Sv4KgaR4cun/images/logo/dark.png?fit=max\u0026auto=format\u0026n=peFm_Sv4KgaR4cun\u0026q=85\u0026s=cca4899a3c056f427f80610ac85d1170","href":"https://alpha.new"},"favicon":"https://mintcdn.com/lyzr-15a99e0f/peFm_Sv4KgaR4cun/images/favicon.png?fit=max\u0026auto=format\u0026n=peFm_Sv4KgaR4cun\u0026q=85\u0026s=606bf8d8b1dd77e7fc7d13b52bd06f85","appearance":{"default":"system","strict":false},"background":{"color":{"light":"#FAFAF9","dark":"#0E0E0D"}},"navbar":{"primary":{"type":"button","label":"Open Alpha","href":"https://alpha.new"}},"footer":{"socials":{"github":"https://github.com/suyash-lyzr/alpha-documentation"}},"search":{"prompt":"Search docs"},"seo":{"metatags":{"og:site_name":"Alpha docs"}},"fonts":{"family":"Geist"},"icons":{"library":"fontawesome"},"styling":{"eyebrows":"section","codeblocks":"system","latex":false},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"lyzr-15a99e0f","hasAudioNarration":false,"actualSubdomain":"lyzr-15a99e0f","customDomains":[],"gitSource":{"type":"github","owner":"suyash-lyzr","repo":"alpha-documentation","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":"","_id":"6ae0b4f093d54c7ebe38e84c"},"chroma":{"latestBuiltDeploymentHistoryId":"6ae13e48963c9b68664e663c","collectionId":"6f6abaac-a319-483c-b30d-6356d4f82504","liveDeploymentHistoryId":"6ae13e48963c9b68664e663c","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae13f861208be8074bfe6ae","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Build","count":22},{"language":"default","tag":"Get started","count":17},{"language":"default","tag":"Reference","count":12},{"language":"default","tag":"Workspace","count":10},{"language":"default","tag":"Ship","count":8},{"language":"default","tag":"Agents","count":7},{"language":"default","tag":"Connect","count":7},{"language":"default","tag":"Chat with the agent","count":6},{"language":"default","tag":"Sessions","count":6},{"language":"default","tag":"Guides","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n:root{--a-canvas:#f0f0ef;--a-bg:#fafaf9;--a-card:#ffffff;--a-fill:#f2f2f1;--a-fg:#161614;--a-soft:#3c3c39;--a-muted:#636361;--a-border:rgb(22 22 20 / 9%);--a-signal:#1a54f0;--a-signal-soft:rgb(26 84 240 / 8%);--a-radius:0.7rem;--a-shadow-card:0 0 0 1px var(--a-border), 0 1px 2px rgb(22 22 20 / 4%), 0 2px 6px rgb(22 22 20 / 4%);--a-shadow-raised:0 0 0 1px var(--a-border), 0 2px 10px rgb(22 22 20 / 7%)}.dark{--a-canvas:#0e0e0d;--a-bg:#0e0e0d;--a-card:#181817;--a-fill:#20201f;--a-fg:#f5f5f4;--a-soft:#d6d6d3;--a-muted:#9f9f9a;--a-border:rgb(255 255 255 / 8%);--a-signal:#749ff9;--a-signal-soft:rgb(116 159 249 / 10%);--a-shadow-card:0 0 0 1px var(--a-border), inset 0 1px 0 rgb(255 255 255 / 4%), 0 1px 2px rgb(0 0 0 / 25%);--a-shadow-raised:0 0 0 1px var(--a-border), inset 0 1px 0 rgb(255 255 255 / 5%), 0 2px 12px rgb(0 0 0 / 30%)}code,kbd,pre{font-family:\"Geist Mono\",ui-monospace,\"SF Mono\",Menlo,monospace!important}#page-title{font-size:1.75rem!important;line-height:1.2!important;font-weight:600!important;letter-spacing:-.025em!important}#header .eyebrow{font-size:.75rem;font-weight:500;letter-spacing:.01em}#content-area .prose{font-size:.9375rem;line-height:1.7}#content-area .prose h2{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;margin-top:2.5rem}#content-area .prose h3{font-size:1rem;font-weight:600;letter-spacing:-.01em}#content-area .prose li,#content-area .prose p{color:var(--a-soft)}#content-area .prose strong{color:var(--a-fg);font-weight:560}#content-area .prose a{text-decoration-color:color-mix(in oklab,var(--a-signal) 45%,transparent);text-underline-offset:3px}::selection{background:var(--a-signal-soft)}#sidebar-content{font-size:.875rem}#content-area .prose table,#table-of-contents{font-size:.8125rem}.callout,.card{border-radius:var(--a-radius)!important;box-shadow:var(--a-shadow-card)}.card{border-color:transparent!important;background:var(--a-card);transition:box-shadow 150ms ease}.card[role=link]:hover,a.card:hover{box-shadow:0 0 0 1px color-mix(in oklab,var(--a-signal) 55%,transparent),0 2px 10px rgb(22 22 20/6%)}.card [data-component-part=card-content-container]{display:flex;align-items:flex-start;gap:.75rem;padding:.875rem 1rem!important}.card [data-component-part=card-icon]{flex:none;width:1.75rem!important;height:1.75rem!important;margin:0!important;display:grid;place-items:center;border-radius:.45rem;background:var(--a-fill);box-shadow:0 0 0 1px var(--a-border)}.card [data-component-part=card-icon] svg{width:.875rem!important;height:.875rem!important;background-color:var(--a-soft)!important}.card [data-component-part=card-title],.card [data-component-part=card-title] *{margin-top:0!important;padding-top:.25rem;font-size:.875rem!important;line-height:1.3!important;font-weight:600;letter-spacing:-.01em}.card [data-component-part=card-content]{margin-top:0!important;font-size:.8125rem!important;line-height:1.5!important;color:var(--a-muted)}.card [data-component-part=card-content] *{font-size:inherit!important;line-height:inherit!important}.callout{border:0!important;background:var(--a-card)!important;font-size:.875rem}.callout [data-component-part=callout-icon] svg{color:var(--a-muted)!important}.callout[data-callout-type=warning] [data-component-part=callout-icon] svg{color:#c27c0e!important}.callout[data-callout-type=check] [data-component-part=callout-icon] svg{color:#1f8a5b!important}.callout [data-component-part=callout-content],.callout [data-component-part=callout-content] p{color:var(--a-soft)!important}[data-component-part=frame]{border-radius:calc(var(--a-radius)*1.4)!important;background:var(--a-fill)!important;border:0!important;box-shadow:0 0 0 1px var(--a-border);padding:.5rem!important}[data-component-part=frame] img,[data-component-part=frame] video{border-radius:var(--a-radius)!important;box-shadow:var(--a-shadow-raised)}[data-component-part=frame-caption]{font-size:.8125rem;color:var(--a-muted)}[data-component-part=step-number]{font-family:\"Geist Mono\",ui-monospace,monospace;font-size:.75rem!important}[data-component-part=step-title]{font-weight:600;letter-spacing:-.01em}#content-area .prose th{font-weight:560;color:var(--a-muted)}.prose :not(pre)>code{font-size:.8125rem;border-radius:.35rem}kbd{display:inline-block;min-width:1.4em;padding:.05em .4em;font-size:.75rem;line-height:1.5;text-align:center;color:var(--a-fg);background:var(--a-card);border-radius:.35rem;box-shadow:0 0 0 1px var(--a-border),0 1px 0 var(--a-border)}.prompt-card{margin:1.5rem 0;padding:.25rem .75rem .5rem;border-radius:calc(var(--a-radius)*1.4);background:var(--a-fill);box-shadow:0 0 0 1px var(--a-border)}.prompt-card-label{margin:.6rem .25rem -.25rem;font-size:.75rem;font-weight:500;color:var(--a-muted)}@media (max-width:640px){#page-title{font-size:1.5rem!important}#content-area .prose table{display:block;overflow-x:auto}}#content-area .prose table{width:100%;table-layout:fixed}#content-area .prose td,#content-area .prose th{overflow-wrap:anywhere;vertical-align:top}#alpha-top-actions{position:fixed;top:.5rem;right:1.5rem;z-index:40;display:flex;align-items:center;gap:1rem}#alpha-top-actions[hidden]{display:none}#alpha-changelog-link{font-size:.8125rem;font-weight:500;color:var(--a-muted);text-decoration:none;transition:color 150ms ease}#alpha-changelog-link:hover{color:var(--a-fg)}#alpha-ask-ai{display:inline-flex;align-items:center;gap:.4rem;height:2rem;padding:0 .5rem 0 .75rem;border-radius:999px;font-size:.8125rem;font-weight:560;color:var(--a-signal);background:var(--a-signal-soft);box-shadow:0 0 0 1px color-mix(in oklab,var(--a-signal) 35%,transparent);cursor:pointer;transition:background 150ms ease,box-shadow 150ms ease}#alpha-ask-ai:hover{background:color-mix(in oklab,var(--a-signal) 18%,transparent);box-shadow:0 0 0 1px color-mix(in oklab,var(--a-signal) 60%,transparent)}#alpha-ask-ai[hidden]{display:none}#alpha-ask-ai kbd{padding:0 .35em;font-size:.6875rem;color:inherit;background:0 0;box-shadow:0 0 0 1px color-mix(in oklab,var(--a-signal) 30%,transparent)}@media (max-width:1023px){#alpha-top-actions{display:none}}.card-group:is([style*=\"--cols:3\"], [style*=\"--cols: 3\"], [style*=\"--cols:4\"], [style*=\"--cols: 4\"]) .card [data-component-part=card-content-container]{display:block;padding:1rem!important}.card-group:is([style*=\"--cols:3\"], [style*=\"--cols: 3\"], [style*=\"--cols:4\"], [style*=\"--cols: 4\"]) .card [data-component-part=card-icon]{margin-bottom:.75rem!important}.card-group:is([style*=\"--cols:3\"], [style*=\"--cols: 3\"], [style*=\"--cols:4\"], [style*=\"--cols: 4\"]) .card [data-component-part=card-title]{padding-top:0}.card-group:is([style*=\"--cols:3\"], [style*=\"--cols: 3\"], [style*=\"--cols:4\"], [style*=\"--cols: 4\"]) .card [data-component-part=card-content]{margin-top:.25rem!important}:root{--content-width:46rem}html.alpha-sidebar-collapsed{--sidebar-width:0px;--content-width:54rem}html.alpha-sidebar-collapsed #sidebar{display:none!important}#alpha-sidebar-toggle{position:fixed;top:.6875rem;left:calc(var(--sidebar-width, 19rem) + .5rem);z-index:40;display:grid;place-items:center;width:1.625rem;height:1.625rem;border-radius:.45rem;color:var(--a-muted);cursor:pointer;transition:color 150ms ease,background 150ms ease}#alpha-sidebar-toggle:hover{color:var(--a-fg);background:var(--a-fill)}html.alpha-sidebar-collapsed #alpha-sidebar-toggle{color:var(--a-signal)}@media (max-width:1023px){#alpha-sidebar-toggle{display:none}}.update-container{flex-direction:column!important;gap:1rem!important}.update-container>div:first-child{position:static!important;width:100%!important;display:flex!important;flex-direction:row!important;flex-wrap:wrap;align-items:center!important;gap:.5rem;padding-bottom:1rem;border-bottom:1px solid var(--a-border)}.update-container [data-component-part=update-description]{order:-1;flex-basis:100%;max-width:none!important;margin:0 0 .125rem!important;font-size:1.25rem!important;line-height:1.3!important;font-weight:600!important;letter-spacing:-.015em;color:var(--a-fg)!important}.update-container [data-component-part=update-label]{padding:0!important;background:0 0!important;font-size:.8125rem!important;font-weight:500!important;color:var(--a-muted)!important}.update-container [data-component-part=update-label]::after{content:\"·\";margin-left:.5rem;color:var(--a-muted)}.update-container [data-component-part=update-tag-list]{display:flex;flex-wrap:wrap;gap:.375rem;margin:0!important}.update-container [data-component-part=update-tag]{margin:0!important;padding:.0625rem .5rem!important;border-radius:999px;font-size:.75rem!important;font-weight:500!important;line-height:1.5!important;color:var(--a-soft)!important;background:var(--a-fill)!important;box-shadow:0 0 0 1px var(--a-border)}.update-container [data-component-part=update-content]{width:100%}.update-container [data-component-part=update-content],.update-container [data-component-part=update-description]{padding-left:0!important;padding-right:0!important}.update-container [data-component-part=update-content]>:first-child{margin-left:0!important}#pagination [data-component-part=pagination-next]>div{justify-content:space-between!important}#pagination [data-component-part=pagination-next]>div>div:first-child{flex:1;align-items:flex-start!important;gap:.125rem}#pagination [data-component-part=pagination-description],#pagination [data-component-part=pagination-title]{width:100%!important;max-width:none!important;text-align:left!important}#pagination [data-component-part=pagination-description]{font-size:.8125rem}"}],"page":{"pagePath":"publish/publish-your-app","slug":"/publish/publish-your-app","pageMetadata":{"title":"Publish your app","sidebarTitle":"Publish your app","description":"Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.","href":"/publish/publish-your-app"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const PromptCard=({label=`Prompt`,children})=>_jsxs(`div`,{className:`prompt-card not-prose`,children:[_jsx(`div`,{className:`prompt-card-label`,children:label}),children]});const versionsKept=`30 per app`;const instances=`2 (default)`;const memory=`512 MiB (default)`;const publishPerAccount=`20 per account (default)`;const publishPerSession=`3 per session (default)`;const listenMax=`4 minutes`;const buildMax=`20 minutes (default)`;const sourceMax=`48 MB compressed (default)`;function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Frame,Heading,Mermaid,Note,OptimizedImage,Step,Steps,Table,Warning,_MdxComponentBoundary}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Publishing puts your app on the internet at a public `,_jsx(_components.code,{children:`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 `,_jsx(_components.a,{href:`/publish/manage`,children:`Manage a published app`}),`. To show work in progress instead, `,_jsx(_components.a,{href:`/sharing`,children:`share the session`}),`.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Only the session’s owner sees `,_jsx(_components.strong,{children:`Publish`}),`. If you don’t see it beside `,_jsx(_components.strong,{children:`Share`}),` in your own session, publishing isn’t turned on for your Alpha. Ask whoever runs it.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-does-publishing-work`,children:`How does publishing work?`}),`\n`,_jsx(_components.p,{children:`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.`}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n A[Export the source] --> B[Plan the build]\n B --> C[Build the image]\n C --> D[Publish on Cloud Run]\n D -->|Serving| E[Live at your address]\n classDef focus stroke:#1A54F0,stroke-width:1.5px;\n class E focus`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.code,{children:`Dockerfile`}),` in the directory wins and is built as it is; it must listen on `,_jsx(_components.code,{children:`$PORT`}),`. Otherwise Alpha detects the stack from the project’s manifest and picks the install, build and start commands.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Stack`}),_jsx(_components.th,{children:`Frameworks Alpha recognises`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Node, Bun, Deno`}),_jsx(_components.td,{children:`Next.js, Vite, Astro, Nuxt, Remix, Create React App, Express`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Python, Ruby, PHP`}),_jsx(_components.td,{children:`Flask, FastAPI, Django, Rails, Laravel`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Go, Rust, Java, Elixir, .NET, Gleam, C/C++`}),_jsxs(_components.td,{children:[`Detected from `,_jsx(_components.code,{children:`go.mod`}),`, `,_jsx(_components.code,{children:`Cargo.toml`}),` and the other usual manifests`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Static site`}),_jsxs(_components.td,{children:[`A plain `,_jsx(_components.code,{children:`index.html`}),`, or a built Vite, Astro or Create React App site`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`If the app needs a system package the builder doesn’t add by itself, such as `,_jsx(_components.code,{children:`ffmpeg`}),`, the agent names it in a `,_jsx(_components.code,{children:`railpack.json`}),` beside the app, as `,_jsx(_components.code,{children:`\"deploy\": {\"aptPackages\": [\"ffmpeg\"]}`}),` with Debian package names, or writes a `,_jsx(_components.code,{children:`Dockerfile`}),` instead.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`What ships`}),_jsx(_components.th,{children:`What it means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`One app per directory`}),_jsx(_components.td,{children:`A top-level directory, or the workspace root, is one app. A front end and an API in two directories are two apps.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Only that directory`}),_jsxs(_components.td,{children:[`Nothing outside it, and never `,_jsx(_components.code,{children:`node_modules`}),`, `,_jsx(_components.code,{children:`.git`}),`, build outputs or `,_jsx(_components.code,{children:`.env`}),` files. Production installs and builds from scratch.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Only the secrets you pick`}),_jsxs(_components.td,{children:[`The agent asks which of your `,_jsx(_components.a,{href:`/secrets`,children:`secrets`}),` production gets and passes them by name. Values never appear in the transcript.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`The session’s services, not their copies`}),_jsxs(_components.td,{children:[`With the database on, production gets `,_jsx(_components.a,{href:`/publish/production-data`,children:`a database of its own`}),`. With sign-in on, it gets the same app sign-in.`]})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`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 `,_jsx(_components.strong,{children:`Publish`}),` tab. See `,_jsx(_components.a,{href:`/publish/production-data`,children:`Production database and sign-in`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-publish`,children:`Before you publish`}),`\n`,_jsx(_components.p,{children:`The agent checks the project before a first publish and fixes what it finds. An app that already follows these rules goes live unchanged.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Check`}),_jsx(_components.th,{children:`Why`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`It runs in the `,_jsx(_components.a,{href:`/workspace/preview`,children:`Preview`})]}),_jsx(_components.td,{children:`Production builds the same code fresh.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`It listens on `,_jsx(_components.code,{children:`0.0.0.0`}),` and reads `,_jsx(_components.code,{children:`PORT`})]}),_jsxs(_components.td,{children:[`An app bound to `,_jsx(_components.code,{children:`localhost`}),`, or to a port other than the one it’s given, never answers, and the version fails after `,listenMax,`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`It starts with a production server`}),_jsx(_components.td,{children:`A dev server is unminified, and Vite’s dev and preview servers refuse hostnames they weren’t told about. A static site needs no start script.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Keys are in `,_jsx(_components.a,{href:`/secrets`,children:`Secrets`})]}),_jsx(_components.td,{children:`Production gets keys only by name, from your secrets.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Database`}),` or `,_jsx(_components.strong,{children:`Sign-in`}),` is on, if needed`]}),_jsxs(_components.td,{children:[`Turn them on from the `,_jsx(_components.strong,{children:`+`}),` menu. See `,_jsx(_components.a,{href:`/workspace/database`,children:`Your session’s database`}),` and `,_jsx(_components.a,{href:`/workspace/app-sign-in`,children:`Add sign-in to your app`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Data lives in the database, not in files`}),_jsx(_components.td,{children:`Production’s disk is wiped on restart and isn’t shared between copies, so SQLite files and saved uploads vanish.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`publish-your-app`,children:`Publish your app`}),`\n`,_jsx(_components.p,{children:`Publishing is done by the agent, in the session, so you can see and answer everything it does.`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Click Publish`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Publish`}),` beside `,_jsx(_components.strong,{children:`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 `,_jsx(_components.a,{href:`/chat/queue-and-steer`,children:`steer`}),` the turn. The `,_jsx(_components.strong,{children:`Publish to production`}),` box shows what ships: `,_jsx(_components.strong,{children:`Serves`}),` is the process and port serving a page in the Preview, or “detected from the code”. `,_jsx(_components.strong,{children:`Database`}),` reads “its own, in production” or “none”, `,_jsx(_components.strong,{children:`Sign-in`}),` reads “on” or “off”, and `,_jsx(_components.strong,{children:`Access`}),` is always “Public · anyone with the URL”.`]}),_jsx(Frame,{caption:`Check what goes with the app before the agent starts.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/lyzr-15a99e0f/ObBpayiae_4aNgzN/images/publish/publish-confirm-popover.png?fit=max\u0026auto=format\u0026n=ObBpayiae_4aNgzN\u0026q=85\u0026s=afa415c27b23eb4a4a02fcd51c43167c`,alt:`The Publish to production popover open below the Publish pill at the top right of the workspace, which follows the server.js tab, the + button and the GitHub and Share icons. A grey line under the title reads Google Cloud Run · us-east1. Four rows follow: Serves, node · 3000 in monospace; Database, its own, in production; Sign-in, off; Access, Public · anyone with the URL. A grey note reads The agent names it (the name is its address), builds it from source and publishes it; the Publish tab follows the rollout. Cancel and a white Publish button with a rocket icon sit at the bottom right. Behind the popover, code from server.js shows at the left and the files panel, with the public folder open, at the right.`,\"data-og-width\":`1000`,width:`1000`,\"data-og-height\":`782`,height:`782`,\"data-path\":`images/publish/publish-confirm-popover.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/lyzr-15a99e0f/ObBpayiae_4aNgzN/images/publish/publish-confirm-popover.png?w=280\u0026fit=max\u0026auto=format\u0026n=ObBpayiae_4aNgzN\u0026q=85\u0026s=b77da6a2f2d4259977ce12aa0b48ac86 280w, https://mintcdn.com/lyzr-15a99e0f/ObBpayiae_4aNgzN/images/publish/publish-confirm-popover.png?w=560\u0026fit=max\u0026auto=format\u0026n=ObBpayiae_4aNgzN\u0026q=85\u0026s=07325d3e3d0d29e969bc89911c2903d2 560w, https://mintcdn.com/lyzr-15a99e0f/ObBpayiae_4aNgzN/images/publish/publish-confirm-popover.png?w=840\u0026fit=max\u0026auto=format\u0026n=ObBpayiae_4aNgzN\u0026q=85\u0026s=c0cee40ed98758e5d9a5453fe20b8615 840w, https://mintcdn.com/lyzr-15a99e0f/ObBpayiae_4aNgzN/images/publish/publish-confirm-popover.png?w=1100\u0026fit=max\u0026auto=format\u0026n=ObBpayiae_4aNgzN\u0026q=85\u0026s=d017ff72684bf43781965155aa7fe3a8 1100w, https://mintcdn.com/lyzr-15a99e0f/ObBpayiae_4aNgzN/images/publish/publish-confirm-popover.png?w=1650\u0026fit=max\u0026auto=format\u0026n=ObBpayiae_4aNgzN\u0026q=85\u0026s=856096137660193b50da017301a8087a 1650w, https://mintcdn.com/lyzr-15a99e0f/ObBpayiae_4aNgzN/images/publish/publish-confirm-popover.png?w=2500\u0026fit=max\u0026auto=format\u0026n=ObBpayiae_4aNgzN\u0026q=85\u0026s=3c1b798a9e12f3767310854b7c7c8741 2500w`})})]}),_jsx(Step,{title:`Send the request`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Publish`}),` in the box. Alpha sends “Deploy this.” to the agent, as if you had typed it. One click sends one message.`]})}),_jsx(Step,{title:`Answer the question card`,children:_jsxs(_components.p,{children:[`The agent puts everything only you can decide into one `,_jsx(_components.a,{href:`/chat/plan-mode`,children:`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.`]})}),_jsx(Step,{title:`Watch it go live`,children:_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Publish`}),` tab opens by itself and follows the build. The agent posts the address in the transcript when it is live. See `,_jsx(_components.a,{href:`#watch-the-rollout`,children:`Watch the rollout`}),`.`]})})]}),`\n`,_jsxs(_components.p,{children:[`You can also start from the `,_jsx(_components.strong,{children:`Publish`}),` tab: open it from `,_jsx(_components.strong,{children:`+`}),` → `,_jsx(_components.strong,{children:`Publish`}),`. Before anything is published, it reads “Ship this app to production” and lists the three stages, `,_jsx(_components.strong,{children:`Name it`}),`, `,_jsx(_components.strong,{children:`Build`}),` and `,_jsx(_components.strong,{children:`Serve`}),`. `,_jsx(_components.strong,{children:`Publish with the agent`}),` sends the same “Deploy this.” as the pill, and is held at the same times.`]}),`\n`,_jsx(_components.p,{children:`You can also ask the agent: “deploy”, “publish”, “ship it”, “go live” and “put it online” all count. The agent never publishes unasked.`}),`\n`,_jsx(_MdxComponentBoundary,{name:`PromptCard`,children:_jsx(PromptCard,{label:`Publish from the chat`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Publish this as harbor. Production needs STRIPE_SECRET_KEY from my secrets.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})})}),`\n`,_jsx(_components.p,{children:`Alpha will:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Check what would be built, and fix anything that would stop it.`}),`\n`,_jsx(_components.li,{children:`Ask only what you haven’t said. Here the name and the secret are given, so with one directory nothing is left to ask.`}),`\n`,_jsx(_components.li,{children:`Publish the app and post its address.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-a-name`,children:`Choose a name`}),`\n`,_jsxs(_components.p,{children:[`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 `,_jsx(_components.a,{href:`/publish/manage#delete-a-service`,children:`delete the old app`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Rule`}),_jsx(_components.th,{children:`Allowed`}),_jsx(_components.th,{children:`Refused`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Lowercase letters, digits and dashes`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`harbor-bookings`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`harbor_bookings`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Starts with a letter, ends with a letter or digit`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`harbor2`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`2harbor`}),`, `,_jsx(_components.code,{children:`harbor-`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`At most 40 characters`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`harbor-sailing-school`})}),_jsx(_components.td,{children:`Anything longer`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Unique across your Alpha, for every user`}),_jsx(_components.td,{children:`A name nobody has used`}),_jsx(_components.td,{children:`A name anyone has published`})]})]})]}),`\n`,_jsx(_components.p,{children:`A taken name is refused with “the name harbor is taken — pick another”. When that happens, the agent picks another and tells you which.`}),`\n`,_jsx(Heading,{level:`2`,id:`where-does-my-app-live`,children:`Where does my app live?`}),`\n`,_jsxs(_components.p,{children:[`Every app answers at `,_jsx(_components.code,{children:`https://\u003cname>-\u003cproject number>.\u003cregion>.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.`]}),`\n`,_jsxs(_components.p,{children:[`Where your Alpha has its own domain, the app is also at `,_jsx(_components.code,{children:`https://\u003cname>.\u003cdomain>`}),`, mapped after the first successful publish:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Domain state`}),_jsx(_components.th,{children:`What you see`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Pending`}),_jsxs(_components.td,{children:[`”certificate being issued (minutes, sometimes an hour)”. Alpha checks every 30 seconds while the `,_jsx(_components.strong,{children:`Publish`}),` tab is open.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Ready`}),_jsx(_components.td,{children:`The domain becomes the main address everywhere, with “also …run.app” under it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Failed`}),_jsxs(_components.td,{children:[`”could not be mapped” and the reason. The `,_jsx(_components.code,{children:`run.app`}),` address keeps working; a domain problem never fails the publish.`]})]})]})]}),`\n`,_jsx(_components.p,{children:`You can’t attach a domain you own. Where there is a domain, it is the same for every app on your Alpha. `}),`\n`,_jsx(Heading,{level:`2`,id:`watch-the-rollout`,children:`Watch the rollout`}),`\n`,_jsxs(_components.p,{children:[`The build usually takes 2–6 minutes. The `,_jsx(_components.strong,{children:`Publish`}),` tab tracks the version through `,_jsx(_components.strong,{children:`Export`}),`, `,_jsx(_components.strong,{children:`Plan`}),`, `,_jsx(_components.strong,{children:`Build`}),`, `,_jsx(_components.strong,{children:`Publish`}),` and `,_jsx(_components.strong,{children:`Live`}),`, each marked `,_jsx(_components.strong,{children:`Done`}),`, `,_jsx(_components.strong,{children:`In progress`}),`, `,_jsx(_components.strong,{children:`Failed`}),` or `,_jsx(_components.strong,{children:`Waiting`}),`. The pill beside `,_jsx(_components.strong,{children:`Share`}),` reads `,_jsx(_components.strong,{children:`Publishing…`}),` meanwhile. Open the `,_jsx(_components.strong,{children:`Log`}),` fold to read the build as it runs; secret values show as `,_jsx(_components.code,{children:`[redacted]`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The transcript gets a card when the publish starts and one when it ends, visible to anyone who can read the transcript. `,_jsx(_components.strong,{children:`Publish tab`}),` in each card opens the tab.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Card`}),_jsx(_components.th,{children:`It reads`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Started`}),_jsx(_components.td,{children:`”Publishing harbor to Cloud Run — the build runs on Google Cloud Build; follow it in the Publish tab.”`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Live`}),_jsxs(_components.td,{children:[`”Published harbor to Cloud Run in …s”, what went with it, and the address. The pill becomes `,_jsx(_components.strong,{children:`Republish`}),`, with a link icon that copies the address.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Live, in yellow`}),_jsx(_components.td,{children:`The same, plus a hint starting “The service is up, but …”: the app refuses its own hostname. The agent fixes the config and republishes.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Failed`}),_jsxs(_components.td,{children:[`”Publishing harbor failed while building the image: …”, a hint and a foldable log tail. Fixes for each hint are in `,_jsx(_components.a,{href:`/reference/troubleshooting#a-publish-fails`,children:`Troubleshooting and FAQ`}),`.`]})]})]})]}),`\n`,_jsx(_components.p,{children:`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.`}),`\n`,_jsx(Heading,{level:`2`,id:`limits`,children:`Limits`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Limit`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Published apps per session`}),_jsx(_components.td,{children:publishPerSession})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Published apps per account`}),_jsx(_components.td,{children:publishPerAccount})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Size of the source`}),_jsx(_components.td,{children:sourceMax})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Build time`}),_jsx(_components.td,{children:buildMax})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Time for the app to start listening`}),_jsx(_components.td,{children:listenMax})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Memory per copy of the app`}),_jsx(_components.td,{children:memory})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Copies running at once`}),_jsx(_components.td,{children:instances})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Versions kept`}),_jsx(_components.td,{children:versionsKept})]})]})]}),`\n`,_jsxs(_components.p,{children:[`An idle app scales to zero, so the first request after a quiet spell is a little slower. What happens at each limit is on `,_jsx(_components.a,{href:`/reference/limits#publishing`,children:`Limits`}),`.`]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Values marked “(default)” are set by whoever runs your Alpha, and yours may differ.`})}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Manage a published app`,icon:`clock-rotate-left`,href:`/publish/manage`,children:_jsx(_components.p,{children:`Republish the latest changes, or put any earlier version back in seconds without a rebuild.`})}),_jsx(Card,{title:`Production database and sign-in`,icon:`database`,href:`/publish/production-data`,children:_jsx(_components.p,{children:`Give the empty production database its tables, then browse its rows from the Database tab.`})}),_jsx(Card,{title:`Monitor and troubleshoot production`,icon:`chart-line`,href:`/publish/monitor`,children:_jsx(_components.p,{children:`Read the live app’s logs and request metrics, and hand an error line to the agent.`})}),_jsx(Card,{title:`Build and publish a landing page`,icon:`flag-checkered`,href:`/guides/landing-page`,children:_jsx(_components.p,{children:`Go from one message to a public page with a working signup form, step by step.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{PromptCard,versionsKept,instances,memory,publishPerAccount,publishPerSession,listenMax,buildMax,sourceMax,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Publish your app","sidebarTitle":"Publish your app","description":"Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.","href":"/publish/publish-your-app"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[146,314,")=>null;const versio"],[8011,8029,"`4 minutes`,`.`]})]}"],[22433,22465,"`3 per session (default)`})]}),_jsxs(_co"],[22579,22610,"`20 per account (default)`})]}),_jsxs(_c"],[22717,22738,"`48 MB compressed (default)`})]}),_jsxs("],[22839,22865,"`20 minutes (default)`})]}),_jsxs(_compo"],[22985,23003,"`4 minutes`})]}),_js"],[23123,23130,"`512 MiB (default)`}"],[23254,23270,"`2 (default)`})]}),_"],[23379,23399,"`30 per app`})]})]})"]]},"mdxExtracts":{"tableOfContents":[{"title":"How does publishing work?","slug":"how-does-publishing-work","depth":2,"children":[]},{"title":"Before you publish","slug":"before-you-publish","depth":2,"children":[]},{"title":"Publish your app","slug":"publish-your-app","depth":2,"children":[]},{"title":"Choose a name","slug":"choose-a-name","depth":2,"children":[]},{"title":"Where does my app live?","slug":"where-does-my-app-live","depth":2,"children":[]},{"title":"Watch the rollout","slug":"watch-the-rollout","depth":2,"children":[]},{"title":"Limits","slug":"limits","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/lyzr-15a99e0f/f9d02407465743f5/ask-ai.js","/_mintlify/custom/lyzr-15a99e0f/b625f5335bec8a53/sidebar-toggle.js"],"subdomain":"lyzr-15a99e0f","siteName":"Alpha","title":"Publish your app - Alpha","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T23:53:05.291Z","originalFileLocation":"publish/publish-your-app.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Alpha\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Publish your app - Alpha\">\u003cmeta data-mint-head property=\"og:description\" content=\"Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Alpha docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://lyzr-15a99e0f.mintlify.app/_mintlify/api/og/v2?division=Publish\u0026amp;title=Publish+your+app\u0026amp;description=Put+your+app+on+the+internet+at+its+own+https+address.+The+agent+builds+it+from+source+and+you+watch+it+go+live.\u0026amp;theme=47e77850d1920921f207f882\u0026amp;signature=7e3adf90e4662294d99074b6c44b951b62f939761c468b3b3ac3dd06f509c481\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Publish your app - Alpha\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://lyzr-15a99e0f.mintlify.app/_mintlify/api/og/v2?division=Publish\u0026amp;title=Publish+your+app\u0026amp;description=Put+your+app+on+the+internet+at+its+own+https+address.+The+agent+builds+it+from+source+and+you+watch+it+go+live.\u0026amp;theme=47e77850d1920921f207f882\u0026amp;signature=7e3adf90e4662294d99074b6c44b951b62f939761c468b3b3ac3dd06f509c481\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/lyzr-15a99e0f/O3mZitdsDDMzESr8/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Alpha\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1A54F0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/publish/publish-your-app.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://lyzr-15a99e0f.mintlify.app/#organization\",\"name\":\"Alpha\",\"url\":\"https://lyzr-15a99e0f.mintlify.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/lyzr-15a99e0f/peFm_Sv4KgaR4cun/images/logo/light.png?fit=max\u0026auto=format\u0026n=peFm_Sv4KgaR4cun\u0026q=85\u0026s=633788f52e3e9a8128bdaf2d7a62fff6\"}},{\"@type\":\"WebSite\",\"@id\":\"https://lyzr-15a99e0f.mintlify.app#website\",\"name\":\"Alpha\",\"url\":\"https://lyzr-15a99e0f.mintlify.app\",\"publisher\":{\"@id\":\"https://lyzr-15a99e0f.mintlify.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app#webpage\",\"url\":\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app\",\"name\":\"Publish your app\",\"description\":\"Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.\",\"dateModified\":\"2026-10-27T23:53:05.291Z\",\"isPartOf\":{\"@id\":\"https://lyzr-15a99e0f.mintlify.app#website\"},\"breadcrumb\":{\"@id\":\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Alpha\",\"item\":\"https://lyzr-15a99e0f.mintlify.app\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Publish your app\",\"item\":\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app#article\",\"headline\":\"Publish your app\",\"name\":\"Publish your app\",\"description\":\"Put your app on the internet at its own https address. The agent builds it from source and you watch it go live.\",\"url\":\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app\",\"mainEntityOfPage\":{\"@id\":\"https://lyzr-15a99e0f.mintlify.app/publish/publish-your-app#webpage\"},\"dateModified\":\"2026-10-27T23:53:05.291Z\",\"publisher\":{\"@id\":\"https://lyzr-15a99e0f.mintlify.app/#organization\"},\"isPartOf\":{\"@id\":\"https://lyzr-15a99e0f.mintlify.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Alpha\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Alpha","nav":{"global":null,"tabs":[{"tab":"Get started","pages":[{"title":"Get started","href":""}]},{"tab":"Build","pages":[{"title":"Build","href":"/sessions/home-screen"}]},{"tab":"Ship","groups":[{"group":"Publish","pages":[{"title":"Publish your app","sidebarTitle":"Publish your app","href":"/publish/publish-your-app"},{"title":"Manage a published app","sidebarTitle":"Republish and roll back","description":"Republish changes, edit how the app runs, move between versions, and delete a service.","href":"/publish/manage"},{"title":"Production database and sign-in","sidebarTitle":"Production data","href":"/publish/production-data"},{"title":"Monitor and troubleshoot production","sidebarTitle":"Logs, metrics and failures","href":"/publish/monitor"}]},{"group":"GitHub","pages":[{"title":"Connect GitHub and add repositories","sidebarTitle":"Connect GitHub","href":"/github/connect"},{"title":"Branches, commits and pull requests","sidebarTitle":"Commit and open PRs","href":"/github/branches-and-prs"}]},{"group":"Share and automate","pages":[{"title":"Share a session","sidebarTitle":"Share a session","href":"/sharing"},{"title":"Routines","sidebarTitle":"Routines","href":"/routines"}]}]},{"tab":"Connect","pages":[{"title":"Connect","href":"/integrations/overview"}]},{"tab":"Agents","pages":[{"title":"Agents","href":"/agents/build-an-agent"}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/slash-commands"}]}]},"title":"Publish your app - Alpha","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-BbYRHtLl.js","DynamicMarkdown-DN96a4Ur.js","zoom-image-lightbox-D7yRe3On.js","lightbox-handle-r17bVUz3.js"]}