[{"data":1,"prerenderedAt":875},["ShallowReactive",2],{"navigation":3,"page-\u002Fguides\u002Fdeploy-an-express-application":213,"surround-\u002Fguides\u002Fdeploy-an-express-application":870},[4,17,48,79,95,118,133,144,155,167,186],{"title":5,"path":6,"stem":7,"children":8,"icon":16,"exact":11},"Getting started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"exact":11,"children":-1},"Introduction",true,{"title":13,"path":14,"stem":15,"exact":11,"children":-1},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-rocket",{"title":18,"path":19,"stem":20,"children":21,"icon":47,"exact":11},"Reference","\u002Freference","10.reference\u002F1.index",[22,23,27,31,35,39,43],{"title":18,"path":19,"stem":20,"exact":11,"children":-1},{"title":24,"path":25,"stem":26,"exact":11,"children":-1},"Variables","\u002Freference\u002Fvariables","10.reference\u002F2.variables",{"title":28,"path":29,"stem":30,"exact":11,"children":-1},"Hostnames and DNS","\u002Freference\u002Fhostnames-and-dns","10.reference\u002F3.hostnames-and-dns",{"title":32,"path":33,"stem":34,"exact":11,"children":-1},"Statuses","\u002Freference\u002Fstatuses","10.reference\u002F4.statuses",{"title":36,"path":37,"stem":38,"exact":11,"children":-1},"Limits","\u002Freference\u002Flimits","10.reference\u002F5.limits",{"title":40,"path":41,"stem":42,"exact":11,"children":-1},"Sizes","\u002Freference\u002Fsizes","10.reference\u002F6.sizes",{"title":44,"path":45,"stem":46,"exact":11,"children":-1},"The GitHub App","\u002Freference\u002Fgithub-app","10.reference\u002F7.github-app","i-lucide-book-open",{"title":49,"path":50,"stem":51,"children":52,"icon":78,"exact":11},"Troubleshooting","\u002Ftroubleshooting","11.troubleshooting\u002F1.index",[53,54,58,62,66,70,74],{"title":49,"path":50,"stem":51,"exact":11,"children":-1},{"title":55,"path":56,"stem":57,"exact":11,"children":-1},"Build failures","\u002Ftroubleshooting\u002Fbuild-failures","11.troubleshooting\u002F2.build-failures",{"title":59,"path":60,"stem":61,"exact":11,"children":-1},"Start and health failures","\u002Ftroubleshooting\u002Fstart-and-health-failures","11.troubleshooting\u002F3.start-and-health-failures",{"title":63,"path":64,"stem":65,"exact":11,"children":-1},"Reference failures","\u002Ftroubleshooting\u002Freference-failures","11.troubleshooting\u002F4.reference-failures",{"title":67,"path":68,"stem":69,"exact":11,"children":-1},"Failures that are Kuppit's","\u002Ftroubleshooting\u002Ffailures-that-are-kuppits","11.troubleshooting\u002F5.failures-that-are-kuppits",{"title":71,"path":72,"stem":73,"exact":11,"children":-1},"Domain issues","\u002Ftroubleshooting\u002Fdomain-issues","11.troubleshooting\u002F6.domain-issues",{"title":75,"path":76,"stem":77,"exact":11,"children":-1},"No preview for a pull request","\u002Ftroubleshooting\u002Fno-preview-for-a-pull-request","11.troubleshooting\u002F7.no-preview-for-a-pull-request","i-lucide-life-buoy",{"title":80,"path":81,"stem":82,"children":83,"icon":94,"exact":11},"Concepts","\u002Fconcepts","2.concepts\u002F1.index",[84,86,90],{"title":85,"path":81,"stem":82,"exact":11,"children":-1},"The Kuppit model",{"title":87,"path":88,"stem":89,"exact":11,"children":-1},"The application graph","\u002Fconcepts\u002Fthe-application-graph","2.concepts\u002F2.the-application-graph",{"title":91,"path":92,"stem":93,"exact":11,"children":-1},"How a service runs","\u002Fconcepts\u002Fhow-a-service-runs","2.concepts\u002F3.how-a-service-runs","i-lucide-shapes",{"title":96,"path":97,"stem":98,"children":99,"icon":117,"exact":11},"Deployments","\u002Fdeployments","3.deployments\u002F1.index",[100,101,105,109,113],{"title":96,"path":97,"stem":98,"exact":11,"children":-1},{"title":102,"path":103,"stem":104,"exact":11,"children":-1},"Builds","\u002Fdeployments\u002Fbuilds","3.deployments\u002F2.builds",{"title":106,"path":107,"stem":108,"exact":11,"children":-1},"Redeploy and roll back","\u002Fdeployments\u002Fredeploy-and-rollback","3.deployments\u002F3.redeploy-and-rollback",{"title":110,"path":111,"stem":112,"exact":11,"children":-1},"Logs","\u002Fdeployments\u002Flogs","3.deployments\u002F4.logs",{"title":114,"path":115,"stem":116,"exact":11,"children":-1},"When a deployment fails","\u002Fdeployments\u002Fwhen-a-deployment-fails","3.deployments\u002F5.when-a-deployment-fails","i-lucide-cloud-upload",{"title":119,"path":120,"stem":121,"children":122,"icon":132,"exact":11},"Resources","\u002Fresources","4.resources\u002F1.index",[123,124,128],{"title":119,"path":120,"stem":121,"exact":11,"children":-1},{"title":125,"path":126,"stem":127,"exact":11,"children":-1},"Web services","\u002Fresources\u002Fweb-services","4.resources\u002F2.web-services",{"title":129,"path":130,"stem":131,"exact":11,"children":-1},"PostgreSQL","\u002Fresources\u002Fpostgresql","4.resources\u002F3.postgresql","i-lucide-boxes",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":143,"exact":11},"Configuration","i-lucide-sliders-horizontal","\u002Fconfiguration","5.configuration",[139],{"title":140,"path":141,"stem":142,"exact":11,"children":-1},"Environment variables","\u002Fconfiguration\u002Fvariables","5.configuration\u002F1.variables",false,{"title":145,"path":146,"stem":147,"children":148,"icon":154,"exact":11},"Networking","\u002Fnetworking","6.networking\u002F1.index",[149,150],{"title":145,"path":146,"stem":147,"exact":11,"children":-1},{"title":151,"path":152,"stem":153,"exact":11,"children":-1},"Reaching a database","\u002Fnetworking\u002Freaching-a-database","6.networking\u002F2.reaching-a-database","i-lucide-network",{"title":156,"path":157,"stem":158,"children":159,"icon":166,"exact":11},"Domains","\u002Fdomains","7.domains\u002F1.index",[160,162],{"title":161,"path":157,"stem":158,"exact":11,"children":-1},"Hostnames",{"title":163,"path":164,"stem":165,"exact":11,"children":-1},"Custom domains","\u002Fdomains\u002Fcustom-domains","7.domains\u002F2.custom-domains","i-lucide-globe",{"title":168,"path":169,"stem":170,"children":171,"icon":185,"exact":11},"Environments","\u002Fenvironments","8.environments\u002F1.index",[172,173,177,181],{"title":168,"path":169,"stem":170,"exact":11,"children":-1},{"title":174,"path":175,"stem":176,"exact":11,"children":-1},"Preview environments","\u002Fenvironments\u002Fpreview-environments","8.environments\u002F2.preview-environments",{"title":178,"path":179,"stem":180,"exact":11,"children":-1},"Named environments","\u002Fenvironments\u002Fnamed-environments","8.environments\u002F3.named-environments",{"title":182,"path":183,"stem":184,"exact":11,"children":-1},"Deleting an environment","\u002Fenvironments\u002Fdeleting-an-environment","8.environments\u002F4.deleting-an-environment","i-lucide-git-branch",{"title":187,"path":188,"stem":189,"children":190,"icon":212,"exact":11},"Guides","\u002Fguides","9.guides\u002F1.index",[191,192,196,200,204,208],{"title":187,"path":188,"stem":189,"exact":11,"children":-1},{"title":193,"path":194,"stem":195,"exact":11,"children":-1},"Deploy a Nuxt application","\u002Fguides\u002Fdeploy-a-nuxt-application","9.guides\u002F2.deploy-a-nuxt-application",{"title":197,"path":198,"stem":199,"exact":11,"children":-1},"Deploy a Next.js application","\u002Fguides\u002Fdeploy-a-nextjs-application","9.guides\u002F3.deploy-a-nextjs-application",{"title":201,"path":202,"stem":203,"exact":11,"children":-1},"Deploy an Express application","\u002Fguides\u002Fdeploy-an-express-application","9.guides\u002F4.deploy-an-express-application",{"title":205,"path":206,"stem":207,"exact":11,"children":-1},"Deploy with a Dockerfile","\u002Fguides\u002Fdeploy-with-a-dockerfile","9.guides\u002F5.deploy-with-a-dockerfile",{"title":209,"path":210,"stem":211,"exact":11,"children":-1},"Create a staging environment","\u002Fguides\u002Fcreate-a-staging-environment","9.guides\u002F6.create-a-staging-environment","i-lucide-map",{"id":214,"title":201,"badge":215,"body":216,"category":215,"description":864,"draft":143,"extension":865,"links":215,"meta":866,"navigation":11,"path":202,"seo":867,"sitemap":868,"stem":203,"__hash__":869},"docs\u002F9.guides\u002F4.deploy-an-express-application.md",null,{"type":217,"value":218,"toc":856},"minimark",[219,236,241,386,390,396,657,686,690,705,708,722,726,758,835,838,842,852],[220,221,222,223,227,228,231,232,235],"p",{},"Kuppit detects an Express application from the ",[224,225,226],"code",{},"express"," dependency together with a ",[224,229,230],{},"start"," script, and starts it with that script. Express does nothing with ",[224,233,234],{},"PORT"," on its own, so the server has to.",[237,238,240],"h2",{"id":239},"what-kuppit-detects","What Kuppit detects",[242,243,244,260],"table",{},[245,246,247],"thead",{},[248,249,250,254,257],"tr",{},[251,252,253],"th",{},"Setting",[251,255,256],{},"Value",[251,258,259],{},"From",[261,262,263,287,311,328,345,370],"tbody",{},[248,264,265,272,275],{},[266,267,268],"td",{},[269,270,271],"strong",{},"Framework",[266,273,274],{},"Express",[266,276,277,278,280,281,283,284,286],{},"The ",[224,279,226],{}," dependency and a ",[224,282,230],{}," script. Without a ",[224,285,230],{}," script, nothing is detected.",[248,288,289,294,305],{},[266,290,291],{},[269,292,293],{},"Node version",[266,295,296,297,300,301,304],{},"24, or what ",[224,298,299],{},"engines.node"," in ",[224,302,303],{},"package.json"," admits",[266,306,307,308,310],{},"Only ",[224,309,299],{}," is read. 24 and 22 are supported.",[248,312,313,318,321],{},[266,314,315],{},[269,316,317],{},"Package manager",[266,319,320],{},"pnpm, npm or Yarn",[266,322,323,324,327],{},"The lockfile, or the ",[224,325,326],{},"packageManager"," field.",[248,329,330,335,342],{},[266,331,332],{},[269,333,334],{},"Build command",[266,336,337,338,341],{},"Your ",[224,339,340],{},"build"," script, if there is one",[266,343,344],{},"A TypeScript compile, say. Absent for plain JavaScript.",[248,346,347,352,365],{},[266,348,349],{},[269,350,351],{},"Start command",[266,353,354,357,358,361,362],{},[224,355,356],{},"npm start",", ",[224,359,360],{},"pnpm start"," or ",[224,363,364],{},"yarn start",[266,366,337,367,369],{},[224,368,230],{}," script.",[248,371,372,377,380],{},[266,373,374],{},[269,375,376],{},"Port",[266,378,379],{},"3000",[266,381,382,383,385],{},"A default; ",[224,384,234],{}," overrides it at runtime.",[237,387,389],{"id":388},"before-you-deploy","Before you deploy",[220,391,392,393,395],{},"Kuppit starts the container with ",[224,394,234],{}," set and sends every request, and the health check, to that port. Listen on it, on all interfaces:",[397,398,404],"pre",{"className":399,"code":400,"filename":401,"language":402,"meta":403,"style":403},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import express from 'express'\n\nconst app = express()\n\napp.get('\u002F', (request, response) => {\n    response.send('ok')\n})\n\nconst port = Number(process.env.PORT ?? 3000)\n\napp.listen(port, '0.0.0.0', () => {\n    console.log(`listening on ${port}`)\n})\n","server.ts","ts","",[224,405,406,432,438,460,465,513,537,545,550,584,589,620,650],{"__ignoreMap":403},[407,408,411,415,419,422,426,429],"span",{"class":409,"line":410},"line",1,[407,412,414],{"class":413},"sVHd0","import",[407,416,418],{"class":417},"su5hD"," express ",[407,420,421],{"class":413},"from",[407,423,425],{"class":424},"sjJ54"," '",[407,427,226],{"class":428},"s_sjI",[407,430,431],{"class":424},"'\n",[407,433,435],{"class":409,"line":434},2,[407,436,437],{"emptyLinePlaceholder":11},"\n",[407,439,441,445,449,453,457],{"class":409,"line":440},3,[407,442,444],{"class":443},"sbsja","const",[407,446,448],{"class":447},"s_hVV"," app",[407,450,452],{"class":451},"smGrS"," =",[407,454,456],{"class":455},"sGLFI"," express",[407,458,459],{"class":417},"()\n",[407,461,463],{"class":409,"line":462},4,[407,464,437],{"emptyLinePlaceholder":11},[407,466,468,471,475,478,481,484,487,489,492,495,499,501,504,507,510],{"class":409,"line":467},5,[407,469,470],{"class":417},"app",[407,472,474],{"class":473},"sP7_E",".",[407,476,477],{"class":455},"get",[407,479,480],{"class":417},"(",[407,482,483],{"class":424},"'",[407,485,486],{"class":428},"\u002F",[407,488,483],{"class":424},[407,490,491],{"class":473},",",[407,493,494],{"class":473}," (",[407,496,498],{"class":497},"s99_P","request",[407,500,491],{"class":473},[407,502,503],{"class":497}," response",[407,505,506],{"class":473},")",[407,508,509],{"class":443}," =>",[407,511,512],{"class":473}," {\n",[407,514,516,519,521,524,527,529,532,534],{"class":409,"line":515},6,[407,517,518],{"class":417},"    response",[407,520,474],{"class":473},[407,522,523],{"class":455},"send",[407,525,480],{"class":526},"skxfh",[407,528,483],{"class":424},[407,530,531],{"class":428},"ok",[407,533,483],{"class":424},[407,535,536],{"class":526},")\n",[407,538,540,543],{"class":409,"line":539},7,[407,541,542],{"class":473},"}",[407,544,536],{"class":417},[407,546,548],{"class":409,"line":547},8,[407,549,437],{"emptyLinePlaceholder":11},[407,551,553,555,558,560,563,566,568,571,573,575,578,582],{"class":409,"line":552},9,[407,554,444],{"class":443},[407,556,557],{"class":447}," port",[407,559,452],{"class":451},[407,561,562],{"class":455}," Number",[407,564,565],{"class":417},"(process",[407,567,474],{"class":473},[407,569,570],{"class":417},"env",[407,572,474],{"class":473},[407,574,234],{"class":447},[407,576,577],{"class":451}," ??",[407,579,581],{"class":580},"srdBf"," 3000",[407,583,536],{"class":417},[407,585,587],{"class":409,"line":586},10,[407,588,437],{"emptyLinePlaceholder":11},[407,590,592,594,596,599,602,604,606,609,611,613,616,618],{"class":409,"line":591},11,[407,593,470],{"class":417},[407,595,474],{"class":473},[407,597,598],{"class":455},"listen",[407,600,601],{"class":417},"(port",[407,603,491],{"class":473},[407,605,425],{"class":424},[407,607,608],{"class":428},"0.0.0.0",[407,610,483],{"class":424},[407,612,491],{"class":473},[407,614,615],{"class":473}," ()",[407,617,509],{"class":443},[407,619,512],{"class":473},[407,621,623,626,628,631,633,636,639,642,645,648],{"class":409,"line":622},12,[407,624,625],{"class":417},"    console",[407,627,474],{"class":473},[407,629,630],{"class":455},"log",[407,632,480],{"class":526},[407,634,635],{"class":424},"`",[407,637,638],{"class":428},"listening on ",[407,640,641],{"class":424},"${",[407,643,644],{"class":417},"port",[407,646,647],{"class":424},"}`",[407,649,536],{"class":526},[407,651,653,655],{"class":409,"line":652},13,[407,654,542],{"class":473},[407,656,536],{"class":417},[220,658,659,660,663,664,667,668,670,671,361,674,677,678,681,682,685],{},"A server that listens on a fixed port, or on ",[224,661,662],{},"localhost",", starts fine and then fails the health check with ",[269,665,666],{},"The application did not become healthy",". A ",[224,669,230],{}," script that runs ",[224,672,673],{},"ts-node",[224,675,676],{},"tsx"," is fine as long as it is in ",[224,679,680],{},"dependencies"," rather than ",[224,683,684],{},"devDependencies","; the build installs what production needs.",[237,687,689],{"id":688},"deploy","Deploy",[220,691,692,693,696,697,700,701,704],{},"Follow the ",[694,695,13],"a",{"href":14},": install the GitHub App, choose the repository and branch, confirm the proposal, and choose ",[269,698,699],{},"Deploy analyzed commit",". When the deployment reaches ",[269,702,703],{},"Live",", the service's hostname answers.",[237,706,134],{"id":707},"configuration",[220,709,710,711,714,715,717,718,721],{},"Everything your server reads from ",[224,712,713],{},"process.env"," comes from the service's ",[269,716,24],{}," tab and what the environment provides. Add a value, mark it secret if it is one, and ",[269,719,720],{},"Redeploy now",": a variable changes the next deployment, never the running one.",[237,723,725],{"id":724},"add-a-database","Add a database",[220,727,728,729,357,732,357,735,737,738,741,742,745,746,748,749,751,752,754,755,757],{},"On the environment's ",[269,730,731],{},"Overview",[269,733,734],{},"Add resource",[269,736,129],{},". Keep the name ",[224,739,740],{},"database",". Add ",[224,743,744],{},"DATABASE_URL"," on the ",[269,747,24],{}," tab as a ",[269,750,18],{}," to ",[224,753,740],{}," → ",[224,756,744],{},", then redeploy:",[397,759,762],{"className":399,"code":760,"filename":761,"language":402,"meta":403,"style":403},"import { Pool } from 'pg'\n\nexport const db = new Pool({ connectionString: process.env.DATABASE_URL })\n","db.ts",[224,763,764,787,791],{"__ignoreMap":403},[407,765,766,768,771,774,777,780,782,785],{"class":409,"line":410},[407,767,414],{"class":413},[407,769,770],{"class":473}," {",[407,772,773],{"class":417}," Pool",[407,775,776],{"class":473}," }",[407,778,779],{"class":413}," from",[407,781,425],{"class":424},[407,783,784],{"class":428},"pg",[407,786,431],{"class":424},[407,788,789],{"class":409,"line":434},[407,790,437],{"emptyLinePlaceholder":11},[407,792,793,796,799,802,804,807,809,811,814,817,820,823,825,827,829,831,833],{"class":409,"line":440},[407,794,795],{"class":413},"export",[407,797,798],{"class":443}," const",[407,800,801],{"class":447}," db",[407,803,452],{"class":451},[407,805,806],{"class":451}," new",[407,808,773],{"class":455},[407,810,480],{"class":417},[407,812,813],{"class":473},"{",[407,815,816],{"class":526}," connectionString",[407,818,819],{"class":473},":",[407,821,822],{"class":417}," process",[407,824,474],{"class":473},[407,826,570],{"class":417},[407,828,474],{"class":473},[407,830,744],{"class":447},[407,832,776],{"class":473},[407,834,536],{"class":417},[220,836,837],{},"A pool is the right shape for a long-running server; open it once at start-up rather than per request.",[237,839,841],{"id":840},"from-here","From here",[220,843,844,845,848,849,851],{},"Every push to the branch deploys again, and every pull request gets a ",[694,846,847],{"href":175},"preview environment",". If the revision starts and then stops, or never answers, ",[694,850,59],{"href":60}," is the page.",[853,854,855],"style",{},"html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":403,"searchDepth":440,"depth":440,"links":857},[858,859,860,861,862,863],{"id":239,"depth":434,"text":240},{"id":388,"depth":434,"text":389},{"id":688,"depth":434,"text":689},{"id":707,"depth":434,"text":134},{"id":724,"depth":434,"text":725},{"id":840,"depth":434,"text":841},"From an Express repository to a live URL. The one requirement is that your server listens where Kuppit routes.","md",{},{"title":201,"description":864},{"loc":202},"Yk6kwHgYzI3rY66ORYW9ZMCKpi4nLkwl0Yz52B6Da3M",[871,873],{"title":197,"path":198,"stem":199,"description":872,"children":-1},"From a Next.js repository to a live URL, and where public and server values live when the build cannot see your variables.",{"title":205,"path":206,"stem":207,"description":874,"children":-1},"Any language, any runtime. Kuppit builds your Dockerfile as written, caches its layers, and routes to port 8080.",1788549619881]