[{"data":1,"prerenderedAt":450},["ShallowReactive",2],{"navigation":3,"page-\u002Fconcepts\u002Fthe-application-graph":213,"surround-\u002Fconcepts\u002Fthe-application-graph":445},[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":87,"badge":215,"body":216,"category":215,"description":439,"draft":143,"extension":440,"links":215,"meta":441,"navigation":11,"path":88,"seo":442,"sitemap":443,"stem":89,"__hash__":444},"docs\u002F2.concepts\u002F2.the-application-graph.md",null,{"type":217,"value":218,"toc":431},"minimark",[219,223,228,251,255,258,261,278,285,289,292,302,315,318,344,348,428],[220,221,222],"p",{},"Kuppit keeps one picture of your application and derives everything else from it. The picture has three kinds of thing in it: components, nodes and references. Understanding them explains why environments behave as they do, what a reference costs and does not cost, and why the overview looks the way it does.",[224,225,227],"h2",{"id":226},"components","Components",[220,229,230,231,235,236,239,240,242,243,246,247,250],{},"A component is a thing your application is made of, named once per project: the ",[232,233,234],"code",{},"web"," service, the ",[232,237,238],{},"database"," database. The component owns the name and the kind. That is why the same component is ",[232,241,234],{}," in Production, in staging and in every preview, and why nothing can be ",[232,244,245],{},"api"," in one environment and ",[232,248,249],{},"backend"," in another.",[224,252,254],{"id":253},"nodes","Nodes",[220,256,257],{},"An environment has a node for each component it includes. The node is the environment's instance of the component: the service that deploys this environment's branch, the database this environment's services connect to. A node's status, hostname, deployments and variables are its own.",[220,259,260],{},"A node normally is its own instance. Two decisions change that:",[262,263,264,272],"ul",{},[265,266,267,271],"li",{},[268,269,270],"strong",{},"Share."," The node points at another environment's instance. It reports that instance's status and credentials, keeps its own place in this environment, and creates nothing new.",[265,273,274,277],{},[268,275,276],{},"Clone."," The node is its own instance, seeded from a copy of another environment's data when the environment was created. Afterwards it is independent, and Kuppit records where the data came from and consults it for nothing.",[220,279,280,281,284],{},"An environment also records the components it deliberately does not have, so ",[268,282,283],{},"Don't include"," stays distinguishable from a component added to the project later.",[224,286,288],{"id":287},"references","References",[220,290,291],{},"A reference is a variable on one node whose value is a variable another node exposes:",[293,294,300],"pre",{"className":295,"code":297,"language":298,"meta":299},[296],"language-text","database ── DATABASE_URL ──▶ web\n","text","",[232,301,297],{"__ignoreMap":299},[220,303,304,305,307,308,310,311,314],{},"Read it as: ",[232,306,234],{}," references a variable exposed by ",[232,309,238],{},". The arrow follows the data. The database provides the value; the service consumes it. That direction is what the overview draws, and what the ",[268,312,313],{},"Connections"," list beneath it says in words.",[220,316,317],{},"Three rules give references their character:",[262,319,320,332,338],{},[265,321,322,325,326,328,329,331],{},[268,323,324],{},"A reference targets a node in the same environment",", always. Staging's ",[232,327,234],{}," references staging's ",[232,330,238],{},"; a database in another environment is, to it, indistinguishable from one that does not exist. Sharing is how an environment deliberately brings another environment's instance inside that rule.",[265,333,334,337],{},[268,335,336],{},"A reference is resolved when a deployment is prepared",", from the target's state at that moment, and the resolved value is frozen into that deployment. The service is connected to the database as it is now, and a rollback restores the connection as it was then.",[265,339,340,343],{},[268,341,342],{},"A reference is a dependency, and Kuppit treats it as one."," A deployment waits for a database still being created, fails clearly for one that no longer exists, and names every connected service before a database is deleted.",[224,345,347],{"id":346},"what-is-derived-from-the-graph","What is derived from the graph",[349,350,351,364],"table",{},[352,353,354],"thead",{},[355,356,357,361],"tr",{},[358,359,360],"th",{},"Surface",[358,362,363],{},"What it reads",[365,366,367,386,401,412,420],"tbody",{},[355,368,369,376],{},[370,371,372,373],"td",{},"The environment's ",[268,374,375],{},"Overview",[370,377,378,379,382,383,385],{},"Nodes as cards, references as edges, at the ",[232,380,381],{},"sm"," breakpoint and up; cards and a ",[268,384,313],{}," list on a phone.",[355,387,388,398],{},[370,389,390,391,394,395,397],{},"A service's ",[268,392,393],{},"Connect"," and ",[268,396,24],{}," tabs",[370,399,400],{},"The references it holds, and what it inherits.",[355,402,403,409],{},[370,404,405,406,408],{},"A database's ",[268,407,393],{}," tab",[370,410,411],{},"Which services reference it.",[355,413,414,417],{},[370,415,416],{},"The plan for a new environment",[370,418,419],{},"Every component, what it may become, and every reference to re-create.",[355,421,422,425],{},[370,423,424],{},"Deleting anything",[370,426,427],{},"What would be disconnected, named before you confirm.",[220,429,430],{},"Nothing reads the raw list of resources or connections; a third rendering would read the same graph.",{"title":299,"searchDepth":432,"depth":432,"links":433},3,[434,436,437,438],{"id":226,"depth":435,"text":227},2,{"id":253,"depth":435,"text":254},{"id":287,"depth":435,"text":288},{"id":346,"depth":435,"text":347},"Components, the node each environment has for them, and references as the edges between them. The one picture the rest of Kuppit is drawn from.","md",{},{"title":87,"description":439},{"loc":88},"8aYub5dM_AaZFJ-ehPol8tK4oxumf56S_VkYGvy2hyk",[446,448],{"title":85,"path":81,"stem":82,"description":447,"children":-1},"Projects, environments, resources and deployments, and how they connect into one application graph.",{"title":91,"path":92,"stem":93,"description":449,"children":-1},"[object Object]",1788549618946]