[{"data":1,"prerenderedAt":580},["ShallowReactive",2],{"navigation":3,"page-\u002Fconfiguration\u002Fapplication-changes":233,"surround-\u002Fconfiguration\u002Fapplication-changes":575},[4,17,52,83,99,122,141,164,175,187,206],{"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":51,"exact":11},"Reference","\u002Freference","10.reference\u002F1.index",[22,23,27,31,35,39,43,47],{"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",{"title":48,"path":49,"stem":50,"exact":11,"children":-1},"Billing","\u002Freference\u002Fbilling","10.reference\u002F8.billing","i-lucide-book-open",{"title":53,"path":54,"stem":55,"children":56,"icon":82,"exact":11},"Troubleshooting","\u002Ftroubleshooting","11.troubleshooting\u002F1.index",[57,58,62,66,70,74,78],{"title":53,"path":54,"stem":55,"exact":11,"children":-1},{"title":59,"path":60,"stem":61,"exact":11,"children":-1},"Build failures","\u002Ftroubleshooting\u002Fbuild-failures","11.troubleshooting\u002F2.build-failures",{"title":63,"path":64,"stem":65,"exact":11,"children":-1},"Start and health failures","\u002Ftroubleshooting\u002Fstart-and-health-failures","11.troubleshooting\u002F3.start-and-health-failures",{"title":67,"path":68,"stem":69,"exact":11,"children":-1},"Reference failures","\u002Ftroubleshooting\u002Freference-failures","11.troubleshooting\u002F4.reference-failures",{"title":71,"path":72,"stem":73,"exact":11,"children":-1},"Failures that are Kuppit's","\u002Ftroubleshooting\u002Ffailures-that-are-kuppits","11.troubleshooting\u002F5.failures-that-are-kuppits",{"title":75,"path":76,"stem":77,"exact":11,"children":-1},"Domain issues","\u002Ftroubleshooting\u002Fdomain-issues","11.troubleshooting\u002F6.domain-issues",{"title":79,"path":80,"stem":81,"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":84,"path":85,"stem":86,"children":87,"icon":98,"exact":11},"Concepts","\u002Fconcepts","2.concepts\u002F1.index",[88,90,94],{"title":89,"path":85,"stem":86,"exact":11,"children":-1},"The Kuppit model",{"title":91,"path":92,"stem":93,"exact":11,"children":-1},"The application graph","\u002Fconcepts\u002Fthe-application-graph","2.concepts\u002F2.the-application-graph",{"title":95,"path":96,"stem":97,"exact":11,"children":-1},"How a service runs","\u002Fconcepts\u002Fhow-a-service-runs","2.concepts\u002F3.how-a-service-runs","i-lucide-shapes",{"title":100,"path":101,"stem":102,"children":103,"icon":121,"exact":11},"Deployments","\u002Fdeployments","3.deployments\u002F1.index",[104,105,109,113,117],{"title":100,"path":101,"stem":102,"exact":11,"children":-1},{"title":106,"path":107,"stem":108,"exact":11,"children":-1},"Builds","\u002Fdeployments\u002Fbuilds","3.deployments\u002F2.builds",{"title":110,"path":111,"stem":112,"exact":11,"children":-1},"Redeploy and roll back","\u002Fdeployments\u002Fredeploy-and-rollback","3.deployments\u002F3.redeploy-and-rollback",{"title":114,"path":115,"stem":116,"exact":11,"children":-1},"Logs","\u002Fdeployments\u002Flogs","3.deployments\u002F4.logs",{"title":118,"path":119,"stem":120,"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":123,"path":124,"stem":125,"children":126,"icon":140,"exact":11},"Resources","\u002Fresources","4.resources\u002F1.index",[127,128,132,136],{"title":123,"path":124,"stem":125,"exact":11,"children":-1},{"title":129,"path":130,"stem":131,"exact":11,"children":-1},"Web services","\u002Fresources\u002Fweb-services","4.resources\u002F2.web-services",{"title":133,"path":134,"stem":135,"exact":11,"children":-1},"PostgreSQL","\u002Fresources\u002Fpostgresql","4.resources\u002F3.postgresql",{"title":137,"path":138,"stem":139,"exact":11,"children":-1},"Workers","\u002Fresources\u002Fworkers","4.resources\u002F4.workers","i-lucide-boxes",{"title":142,"icon":143,"path":144,"stem":145,"children":146,"page":163,"exact":11},"Configuration","i-lucide-sliders-horizontal","\u002Fconfiguration","5.configuration",[147,151,155,159],{"title":148,"path":149,"stem":150,"exact":11,"children":-1},"Environment variables","\u002Fconfiguration\u002Fvariables","5.configuration\u002F1.variables",{"title":152,"path":153,"stem":154,"exact":11,"children":-1},"Connections","\u002Fconfiguration\u002Fconnections","5.configuration\u002F2.connections",{"title":156,"path":157,"stem":158,"exact":11,"children":-1},"External services","\u002Fconfiguration\u002Fexternal-services","5.configuration\u002F3.external-services",{"title":160,"path":161,"stem":162,"exact":11,"children":-1},"Application changes","\u002Fconfiguration\u002Fapplication-changes","5.configuration\u002F4.application-changes",false,{"title":165,"path":166,"stem":167,"children":168,"icon":174,"exact":11},"Networking","\u002Fnetworking","6.networking\u002F1.index",[169,170],{"title":165,"path":166,"stem":167,"exact":11,"children":-1},{"title":171,"path":172,"stem":173,"exact":11,"children":-1},"Reaching a database","\u002Fnetworking\u002Freaching-a-database","6.networking\u002F2.reaching-a-database","i-lucide-network",{"title":176,"path":177,"stem":178,"children":179,"icon":186,"exact":11},"Domains","\u002Fdomains","7.domains\u002F1.index",[180,182],{"title":181,"path":177,"stem":178,"exact":11,"children":-1},"Hostnames",{"title":183,"path":184,"stem":185,"exact":11,"children":-1},"Custom domains","\u002Fdomains\u002Fcustom-domains","7.domains\u002F2.custom-domains","i-lucide-globe",{"title":188,"path":189,"stem":190,"children":191,"icon":205,"exact":11},"Environments","\u002Fenvironments","8.environments\u002F1.index",[192,193,197,201],{"title":188,"path":189,"stem":190,"exact":11,"children":-1},{"title":194,"path":195,"stem":196,"exact":11,"children":-1},"Preview environments","\u002Fenvironments\u002Fpreview-environments","8.environments\u002F2.preview-environments",{"title":198,"path":199,"stem":200,"exact":11,"children":-1},"Named environments","\u002Fenvironments\u002Fnamed-environments","8.environments\u002F3.named-environments",{"title":202,"path":203,"stem":204,"exact":11,"children":-1},"Deleting an environment","\u002Fenvironments\u002Fdeleting-an-environment","8.environments\u002F4.deleting-an-environment","i-lucide-git-branch",{"title":207,"path":208,"stem":209,"children":210,"icon":232,"exact":11},"Guides","\u002Fguides","9.guides\u002F1.index",[211,212,216,220,224,228],{"title":207,"path":208,"stem":209,"exact":11,"children":-1},{"title":213,"path":214,"stem":215,"exact":11,"children":-1},"Deploy a Nuxt application","\u002Fguides\u002Fdeploy-a-nuxt-application","9.guides\u002F2.deploy-a-nuxt-application",{"title":217,"path":218,"stem":219,"exact":11,"children":-1},"Deploy a Next.js application","\u002Fguides\u002Fdeploy-a-nextjs-application","9.guides\u002F3.deploy-a-nextjs-application",{"title":221,"path":222,"stem":223,"exact":11,"children":-1},"Deploy an Express application","\u002Fguides\u002Fdeploy-an-express-application","9.guides\u002F4.deploy-an-express-application",{"title":225,"path":226,"stem":227,"exact":11,"children":-1},"Deploy with a Dockerfile","\u002Fguides\u002Fdeploy-with-a-dockerfile","9.guides\u002F5.deploy-with-a-dockerfile",{"title":229,"path":230,"stem":231,"exact":11,"children":-1},"Create a staging environment","\u002Fguides\u002Fcreate-a-staging-environment","9.guides\u002F6.create-a-staging-environment","i-lucide-map",{"id":234,"title":160,"badge":235,"body":236,"category":235,"description":569,"draft":163,"extension":570,"links":235,"meta":571,"navigation":11,"path":161,"seo":572,"sitemap":573,"stem":162,"__hash__":574},"docs\u002F5.configuration\u002F4.application-changes.md",null,{"type":237,"value":238,"toc":557},"minimark",[239,243,248,256,315,325,329,357,360,364,367,452,455,470,475,483,487,519,522,533,537],[240,241,242],"p",{},"GitHub shows which lines a pull request changed. Kuppit shows what those lines mean for the running application: a variable the code began reading, a service it started using, a database it now requires — and whether the preview that runs it has them. The same read tells every environment what its commit reads and has not configured.",[244,245,247],"h2",{"id":246},"what-kuppit-compares","What Kuppit compares",[240,249,250,251,255],{},"Every deployment's commit is analysed beside the build — never in its way, and never delaying or failing it. For a pull request, the commit is compared with its ",[252,253,254],"strong",{},"merge base",": the commit the pull request branched from, as GitHub's own diff measures it. Kuppit reads, for each service:",[257,258,259,272],"table",{},[260,261,262],"thead",{},[263,264,265,269],"tr",{},[266,267,268],"th",{},"It reads",[266,270,271],{},"Example",[273,274,275,291,304],"tbody",{},[263,276,277,281],{},[278,279,280],"td",{},"The variable names the code reads, or an example environment file lists",[278,282,283,287,288],{},[284,285,286],"code",{},"RESEND_API_KEY",", ",[284,289,290],{},"NEW_INTERNAL_API_URL",[263,292,293,301],{},[278,294,295,296,300],{},"The ",[297,298,299],"a",{"href":157},"external services"," it uses",[278,302,303],{},"Resend, Stripe",[263,305,306,309],{},[278,307,308],{},"The resources it requires, and the names it reads them through",[278,310,311,312],{},"PostgreSQL through ",[284,313,314],{},"DATABASE_URL",[240,316,317,318,320,321,324],{},"Names only, never a value. A variable Kuppit recognises as a service's — ",[284,319,286],{}," — is listed under that service; one it does not recognise is listed all the same. A name the runtime sets, like ",[284,322,323],{},"PORT",", is never listed.",[244,326,328],{"id":327},"on-the-overview","On the Overview",[240,330,331,332,337,338,341,342,345,346,349,350,353,354,356],{},"A preview's box says how much changed and how much of it is worth a look, beside its branch: ",[252,333,334],{},[284,335,336],{},"feature · 3 changes · ⚠ 2 need attention",". Inside the box, a card the pull request changed wears a chip — ",[252,339,340],{},"New"," for a service it began using or a component it added, ",[252,343,344],{},"Changed"," for one whose variables changed, ",[252,347,348],{},"Removed"," for one it stopped using — and a resource card says ",[252,351,352],{},"⚠ 1 issue"," when something it reads is not configured here. The ",[252,355,156],{}," card counts the services with a name that needs attention, and each service behind it counts its own. These chips appear only inside a preview's box: they say what the pull request did, relative to its base.",[240,358,359],{},"Production and named environments get the same findings for their own commit — a variable a push began reading and nobody configured — without the chips, because there is no pull request to be relative to.",[244,361,363],{"id":362},"the-panel","The panel",[240,365,366],{},"Select the preview's box to read the whole of it:",[368,369,370,394,419,446],"ul",{},[371,372,373,287,376,379,380,383,384,287,387,390,391],"li",{},[252,374,375],{},"Ready",[252,377,378],{},"Needs attention"," or ",[252,381,382],{},"Analysing",", with one line: ",[252,385,386],{},"Everything PR #42 reads is configured.",[252,388,389],{},"2 variables aren’t configured.",", or ",[252,392,393],{},"Some of what PR #42 reads is still being analysed.",[371,395,396,398,399,287,401,403,404,407,408,287,411,414,415,418],{},[252,397,160],{},", grouped as ",[252,400,156],{},[252,402,142],{}," and ",[252,405,406],{},"Architecture",". Each row names what changed and who reads it — ",[284,409,410],{},"RESEND_API_KEY · Resend · referenced by web",[284,412,413],{},"PostgreSQL · Required by web"," — and where Kuppit saw it: ",[252,416,417],{},"Detected from: resend package, RESEND_API_KEY",".",[371,420,421,424,425,428,429,432,433,390,436,390,439,442,443,418],{},[252,422,423],{},"In PR #42",": what each change means here. ",[252,426,427],{},"⚠"," marks something worth attention, ",[252,430,431],{},"ℹ"," something worth knowing. A row reads ",[284,434,435],{},"Not configured for PR #42 · New in this pull request",[284,437,438],{},"Configured in Production",[284,440,441],{},"Also listed in .env.example","; a resource's reads ",[284,444,445],{},"Nothing in PR #42 provides it",[371,447,448,451],{},[252,449,450],{},"No longer referenced",": a name the pull request stopped reading that some environment still holds, each environment a link to its Variables. Nothing is deleted from here, or anywhere, on Kuppit's say-so.",[240,453,454],{},"Select a card instead to read only the rows about it.",[240,456,457,458,461,462,465,466,469],{},"A variable is ",[252,459,460],{},"referenced by"," a service, never required by it: ",[284,463,464],{},"process.env.X"," proves the code reads a name, not that the application cannot run without it. Only a resource — a database the code connects to — is ",[252,467,468],{},"Required by"," it.",[471,472,474],"h3",{"id":473},"set-variable","Set variable",[240,476,477,479,480,482],{},[252,478,474],{}," beside a finding opens the same form the Variables tab uses, beneath the finding, with the name filled in and still editable. It sets the variable on the preview's service, exactly as the ",[297,481,24],{"href":149}," tab would. The finding disappears the moment it is saved, and the check on the pull request is written again.",[244,484,486],{"id":485},"ready-and-needs-attention","Ready and needs attention",[257,488,489,499],{},[260,490,491],{},[263,492,493,496],{},[266,494,495],{},"State",[266,497,498],{},"Meaning",[273,500,501,510],{},[263,502,503,507],{},[278,504,505],{},[252,506,375],{},[278,508,509],{},"Everything the commit reads is configured in this environment.",[263,511,512,516],{},[278,513,514],{},[252,515,378],{},[278,517,518],{},"Something the commit reads is not configured here: a name new in this pull request, or one Production has and the preview did not inherit. The deploy proceeds.",[240,520,521],{},"Nothing here blocks a deployment. Kuppit has identified something worth looking at, not decided that you must configure it; a name the code has always read without anyone setting it is listed for information, never as attention.",[240,523,295,524,528,529,532],{},[297,525,527],{"href":526},"\u002Fenvironments\u002Fpreview-environments#the-check-on-the-pull-request","check on the pull request"," carries the same account beneath its summary, and reads ",[252,530,531],{},"Deployed · needs attention"," while something is.",[244,534,536],{"id":535},"what-is-not-decided-for-you","What is not decided for you",[368,538,539,546,554],{},[371,540,541,542,545],{},"A name listed in ",[284,543,544],{},".env.example"," that the pull request did not add is information, not attention: plenty of projects list optional variables there.",[371,547,548,549,553],{},"A preview without Production's database is a ",[297,550,552],{"href":551},"\u002Fenvironments\u002Fpreview-environments#what-a-preview-contains","decision the preview recorded",", so an unchanged requirement only informs; one the pull request introduced is worth attention.",[371,555,556],{},"A variable no longer referenced is never deleted. Kuppit knows the code stopped reading it, not that nothing else does.",{"title":558,"searchDepth":559,"depth":559,"links":560},"",3,[561,563,564,567,568],{"id":246,"depth":562,"text":247},2,{"id":327,"depth":562,"text":328},{"id":362,"depth":562,"text":363,"children":565},[566],{"id":473,"depth":559,"text":474},{"id":485,"depth":562,"text":486},{"id":535,"depth":562,"text":536},"What a pull request adds, removes or changes about the application — the variables it reads, the services it uses, the resources it requires — and what its preview still needs.","md",{},{"title":160,"description":569},{"loc":161},"R6Bq8fU8gRR9R_WNw6Tra2_PD-sEHvJ1YOvVfxRKtEk",[576,578],{"title":156,"path":157,"stem":158,"description":577,"children":-1},"The services your application depends on that Kuppit does not run — Stripe, OpenAI, Resend, Sentry and others — detected in the repository, confirmed by you, and drawn on the graph beside the environments.",{"title":165,"path":166,"stem":167,"description":579,"children":-1},"How a request reaches your service, what Kuppit's edge does to it on the way, how services reach each other, and what is not there.",1789095063996]