[{"data":1,"prerenderedAt":655},["ShallowReactive",2],{"navigation":3,"page-\u002Fconfiguration\u002Fexternal-services":229,"surround-\u002Fconfiguration\u002Fexternal-services":650},[4,17,52,83,99,122,141,160,171,183,202],{"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":159,"exact":11},"Configuration","i-lucide-sliders-horizontal","\u002Fconfiguration","5.configuration",[147,151,155],{"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",false,{"title":161,"path":162,"stem":163,"children":164,"icon":170,"exact":11},"Networking","\u002Fnetworking","6.networking\u002F1.index",[165,166],{"title":161,"path":162,"stem":163,"exact":11,"children":-1},{"title":167,"path":168,"stem":169,"exact":11,"children":-1},"Reaching a database","\u002Fnetworking\u002Freaching-a-database","6.networking\u002F2.reaching-a-database","i-lucide-network",{"title":172,"path":173,"stem":174,"children":175,"icon":182,"exact":11},"Domains","\u002Fdomains","7.domains\u002F1.index",[176,178],{"title":177,"path":173,"stem":174,"exact":11,"children":-1},"Hostnames",{"title":179,"path":180,"stem":181,"exact":11,"children":-1},"Custom domains","\u002Fdomains\u002Fcustom-domains","7.domains\u002F2.custom-domains","i-lucide-globe",{"title":184,"path":185,"stem":186,"children":187,"icon":201,"exact":11},"Environments","\u002Fenvironments","8.environments\u002F1.index",[188,189,193,197],{"title":184,"path":185,"stem":186,"exact":11,"children":-1},{"title":190,"path":191,"stem":192,"exact":11,"children":-1},"Preview environments","\u002Fenvironments\u002Fpreview-environments","8.environments\u002F2.preview-environments",{"title":194,"path":195,"stem":196,"exact":11,"children":-1},"Named environments","\u002Fenvironments\u002Fnamed-environments","8.environments\u002F3.named-environments",{"title":198,"path":199,"stem":200,"exact":11,"children":-1},"Deleting an environment","\u002Fenvironments\u002Fdeleting-an-environment","8.environments\u002F4.deleting-an-environment","i-lucide-git-branch",{"title":203,"path":204,"stem":205,"children":206,"icon":228,"exact":11},"Guides","\u002Fguides","9.guides\u002F1.index",[207,208,212,216,220,224],{"title":203,"path":204,"stem":205,"exact":11,"children":-1},{"title":209,"path":210,"stem":211,"exact":11,"children":-1},"Deploy a Nuxt application","\u002Fguides\u002Fdeploy-a-nuxt-application","9.guides\u002F2.deploy-a-nuxt-application",{"title":213,"path":214,"stem":215,"exact":11,"children":-1},"Deploy a Next.js application","\u002Fguides\u002Fdeploy-a-nextjs-application","9.guides\u002F3.deploy-a-nextjs-application",{"title":217,"path":218,"stem":219,"exact":11,"children":-1},"Deploy an Express application","\u002Fguides\u002Fdeploy-an-express-application","9.guides\u002F4.deploy-an-express-application",{"title":221,"path":222,"stem":223,"exact":11,"children":-1},"Deploy with a Dockerfile","\u002Fguides\u002Fdeploy-with-a-dockerfile","9.guides\u002F5.deploy-with-a-dockerfile",{"title":225,"path":226,"stem":227,"exact":11,"children":-1},"Create a staging environment","\u002Fguides\u002Fcreate-a-staging-environment","9.guides\u002F6.create-a-staging-environment","i-lucide-map",{"id":230,"title":156,"badge":231,"body":232,"category":231,"description":644,"draft":159,"extension":645,"links":231,"meta":646,"navigation":11,"path":157,"seo":647,"sitemap":648,"stem":158,"__hash__":649},"docs\u002F5.configuration\u002F3.external-services.md",null,{"type":233,"value":234,"toc":630},"minimark",[235,244,249,252,327,334,343,364,368,382,388,392,410,457,463,469,474,498,502,511,515,528,531,534,543,565,575,582,586,617,621,624],[236,237,238,239,243],"p",{},"An external service is something your application depends on that Kuppit does not provision: a payment processor, a model API, an email sender, an error tracker, an internal API of your own. Kuppit creates nothing for it and manages nothing about it. It is part of the architecture, so it is drawn on the project's ",[240,241,242],"strong",{},"Overview"," — outside every environment, with an edge from each service that uses it — and it is where the variable names those services read for it are kept in view.",[245,246,248],"h2",{"id":247},"what-kuppit-detects","What Kuppit detects",[236,250,251],{},"When Kuppit analyses a repository it looks for the services the code uses, from the names it finds and nothing else:",[253,254,255,268],"table",{},[256,257,258],"thead",{},[259,260,261,265],"tr",{},[262,263,264],"th",{},"Evidence",[262,266,267],{},"Example",[269,270,271,291,304,314],"tbody",{},[259,272,273,282],{},[274,275,276,277,281],"td",{},"A package in ",[278,279,280],"code",{},"package.json",", or an import of one",[274,283,284,287,288],{},[278,285,286],{},"stripe",", ",[278,289,290],{},"@sentry\u002Fnextjs",[259,292,293,296],{},[274,294,295],{},"A variable name read in code, or listed in an example environment file",[274,297,298,287,301],{},[278,299,300],{},"STRIPE_SECRET_KEY",[278,302,303],{},"NEXT_PUBLIC_STRIPE_KEY",[259,305,306,309],{},[274,307,308],{},"A hostname addressed over HTTP",[274,310,311],{},[278,312,313],{},"api.openai.com",[259,315,316,319],{},[274,317,318],{},"A file named for the service",[274,320,321,287,324],{},[278,322,323],{},"app\u002Fapi\u002Fwebhooks\u002Fstripe\u002Froute.ts",[278,325,326],{},"sentry.client.config.ts",[236,328,329,330,333],{},"Kuppit never reads the value of a variable, in your code or in an example file. A key pasted into ",[278,331,332],{},".env.example"," is recognised by the name beside it and never stored.",[236,335,336,337,342],{},"The services Kuppit recognises today are Stripe, OpenAI, Anthropic, Resend, Sentry, Clerk and Supabase. Anything else is ",[338,339,341],"a",{"href":340},"#services-you-add-yourself","added by hand",".",[236,344,345,346,349,350,287,353,287,356,359,360,363],{},"Each finding is weighed. A package on its own is worth a look and is marked ",[240,347,348],{},"Review","; a variable name on its own is not enough to mention; the two together are a service in use. The list says how sure Kuppit is — ",[240,351,352],{},"Detected · likely",[240,354,355],{},"very confident",[240,357,358],{},"possible"," — and ",[240,361,362],{},"Why?"," opens every piece of evidence behind it.",[245,365,367],{"id":366},"when-you-create-a-project","When you create a project",[236,369,370,371,374,375,378,379,381],{},"The ",[240,372,373],{},"New project"," page lists what it found under ",[240,376,377],{},"External services detected",", beside the resources it proposes. A service Kuppit is sure of starts checked; one worth a look starts unchecked, marked ",[240,380,348],{},". Checked services are drawn on the graph from the moment the project exists.",[236,383,384,385,387],{},"Unchecked is a decision: the service is ignored, and Kuppit does not suggest it again. An ignored service can be brought back from the ",[240,386,242],{}," (below).",[245,389,391],{"id":390},"on-the-overview","On the Overview",[236,393,394,395,397,398,401,402,405,406,409],{},"Beside each environment that uses anything outside Kuppit stands one ",[240,396,156],{}," card: how many, and either ",[240,399,400],{},"Configured"," or how many of them ",[240,403,404],{},"need configuration"," in that environment. A dotted line runs to it from every service in the environment that uses something, with no label — the line is the relationship, and the card says how many. Open the card with its chevron and the services stand behind it, one short card each: the ",[240,407,408],{},"External"," chip beside its name, then the kind of service and who uses it there. Each environment opens and closes on its own, and the picture makes room for what is open; nothing about it is remembered between visits. The same service stands behind every environment that uses it, while Kuppit still holds it once. Select the group, a service, or a line, to open the panel.",[236,411,412,413,416,417,420,421,424,425,287,428,431,432,434,435,438,439,442,443,416,446,449,450,416,453,456],{},"The group's panel lists every service in that environment with a check or how many names it is missing; a row opens the service, seen from that environment, and ",[240,414,415],{},"Add external service"," and ",[240,418,419],{},"Detect external services"," are there too. A service's panel shows what it is, who uses it in that environment, its ",[240,422,423],{},"Required variables"," each with a check or ",[240,426,427],{},"Missing",[240,429,430],{},"Set on"," — each service with a link to its ",[240,433,24],{}," — ",[240,436,437],{},"Why Kuppit detected it",", when it was last detected and at which commit, and where else in the project it is used. ",[240,440,441],{},"Open"," leads to the service's site. Its menu, on a right-click or behind the ellipsis, offers ",[240,444,445],{},"Open service",[240,447,448],{},"Ignore"," for a detected service; ",[240,451,452],{},"Edit…",[240,454,455],{},"Delete external service"," for one you added.",[236,458,459,460,462],{},"A line from a service to the group names the services it uses and leads to the group; a line from the group to a service names the ",[240,461,423],{},". Neither is a connection: they summarise bindings and can be changed nowhere. Kuppit reads the names, never the values.",[236,464,465,466,468],{},"On a phone, each environment lists ",[240,467,156],{}," beneath its cards, opening onto them.",[470,471,473],"h3",{"id":472},"services-waiting-for-a-decision","Services waiting for a decision",[236,475,476,477,481,482,484,485,416,488,490,491,494,495,497],{},"When Kuppit has found a service nobody has decided about, a line above the picture says so — ",[478,479,480],"em",{},"An external service was detected in the repository: Resend"," — with ",[240,483,348],{},". The panel then lists each one with ",[240,486,487],{},"Add to graph",[240,489,448],{},", and, under ",[240,492,493],{},"Ignored",", the services you have ignored before, each with ",[240,496,487],{}," to restore it.",[470,499,501],{"id":500},"detecting-again","Detecting again",[236,503,504,505,507,508,510],{},"Right-click empty canvas and choose ",[240,506,419],{},". Kuppit reads the production branch's head again, exactly as it does for a new project, and records what it finds beside what it already knew. A decision you have made is kept: a confirmed service stays confirmed, an ignored one stays ignored, and only a service that is new to the project is suggested. Variable names already configured on your production services count as evidence too — a service you set ",[278,509,300],{}," on by hand is a service that uses Stripe.",[470,512,514],{"id":513},"detection-follows-your-deployments","Detection follows your deployments",[236,516,517,518,521,522,287,525,342],{},"Every deployment's source is read the same way, for the service that deployed. What it shows is recorded beside what the project knew: a service the code began using is suggested, a service that component stopped referencing is unbound from it — the service stays, with whatever else still uses it, and a decision about it is kept — and the project's ",[240,519,520],{},"Activity"," says which: ",[478,523,524],{},"web uses Resend as of a1b2c3d",[478,526,527],{},"worker no longer references Stripe as of a1b2c3d",[236,529,530],{},"Detection runs when you create a project, on every deployment, and when you ask for it. It never holds a deployment up and never fails one.",[245,532,142],{"id":533},"configuration",[236,535,536,537,287,539,542],{},"Once a service is on the graph, Kuppit compares what each component reads for it against what each environment has set. The names come from the code — ",[278,538,300],{},[278,540,541],{},"STRIPE_WEBHOOK_SECRET"," — and each environment's copy of the component either has each name, as its own variable or one inherited from the environment, or does not. Kuppit reads the names, never the values.",[236,544,545,546,548,549,551,552,554,555,558,559,561,562,564],{},"A name an environment has not set is ",[240,547,427],{},". That environment's ",[240,550,156],{}," card says how many services ",[240,553,404],{},", the line from the group to the service turns amber, as a line into Production does, and is labelled with how many — ",[240,556,557],{},"1 missing"," — and the service's panel lists every name with a check or ",[240,560,427],{},", beside the link to the service's ",[240,563,24],{}," where it is set:",[566,567,573],"pre",{"className":568,"code":570,"language":571,"meta":572},[569],"language-text","Staging · web                    Variables →\n  STRIPE_SECRET_KEY       ✓\n  STRIPE_WEBHOOK_SECRET   Missing\n","text","",[278,574,570],{"__ignoreMap":572},[236,576,577,578,342],{},"Set the variable and the warning goes; nothing is redeployed for it, and the running deployment is unchanged until the next one, as with any ",[338,579,581],{"href":580},"\u002Fconfiguration\u002Fvariables#when-a-change-takes-effect","variable change",[245,583,585],{"id":584},"services-you-add-yourself","Services you add yourself",[236,587,504,588,591,592,595,596,599,600,603,604,606,607,610,611,613,614,616],{},[240,589,590],{},"Add external service…"," for anything Kuppit cannot detect: an internal API, a vendor it does not know. Give it a ",[240,593,594],{},"Name",", a ",[240,597,598],{},"Kind",", optionally a ",[240,601,602],{},"URL"," for ",[240,605,441],{}," to lead to, and tick the components under ",[240,608,609],{},"Used by"," that depend on it. It is drawn at once, with the same card and the same edges as a detected one. ",[240,612,452],{}," changes any of that later; ",[240,615,455],{}," removes it from the graph and changes nothing that runs.",[245,618,620],{"id":619},"what-an-external-service-is-not","What an external service is not",[236,622,623],{},"It has no status, no deployments, no logs and no variables of its own. It cannot be connected to, copied into an environment or deleted with one. The application graph draws it so that the whole architecture is in one picture; what runs is still exactly the resources inside the environments.",[236,625,626,627,629],{},"The project's ",[240,628,520],{}," records each decision — a service added to the graph, ignored, added by hand or removed — and each change a deployment revealed.",{"title":572,"searchDepth":631,"depth":631,"links":632},3,[633,635,636,641,642,643],{"id":247,"depth":634,"text":248},2,{"id":366,"depth":634,"text":367},{"id":390,"depth":634,"text":391,"children":637},[638,639,640],{"id":472,"depth":631,"text":473},{"id":500,"depth":631,"text":501},{"id":513,"depth":631,"text":514},{"id":533,"depth":634,"text":142},{"id":584,"depth":634,"text":585},{"id":619,"depth":634,"text":620},"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.","md",{},{"title":156,"description":644},{"loc":157},"Pk9TvmWqVrVwcFyEs0yoiX-ZKo8DgAB2GMLqppyvm6o",[651,653],{"title":152,"path":153,"stem":154,"description":652,"children":-1},"Connect a service to a database as one act. A connection injects the database's variables into the service, owns them, and is where they are renamed, re-pointed or removed.",{"title":161,"path":162,"stem":163,"description":654,"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.",1789068307442]