[{"data":1,"prerenderedAt":785},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-guides-nuxt":164,"-docs-guides-nuxt-surround":693,"doc-previews":698},[4,8,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126],{"title":5,"path":6,"stem":7},"Quickstart","\u002Fdocs\u002Fquickstart","docs\u002F01.quickstart",{"title":9,"path":10,"stem":11,"children":12},"Guides","\u002Fdocs\u002Fguides","docs\u002F02.guides\u002Findex",[13,14,18,22,26,30,34,38,42,46],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17},"Next.js","\u002Fdocs\u002Fguides\u002Fnextjs","docs\u002F02.guides\u002F1.nextjs",{"title":19,"path":20,"stem":21},"Nuxt","\u002Fdocs\u002Fguides\u002Fnuxt","docs\u002F02.guides\u002F2.nuxt",{"title":23,"path":24,"stem":25},"SvelteKit","\u002Fdocs\u002Fguides\u002Fsveltekit","docs\u002F02.guides\u002F3.sveltekit",{"title":27,"path":28,"stem":29},"Astro","\u002Fdocs\u002Fguides\u002Fastro","docs\u002F02.guides\u002F4.astro",{"title":31,"path":32,"stem":33},"Express","\u002Fdocs\u002Fguides\u002Fexpress","docs\u002F02.guides\u002F5.express",{"title":35,"path":36,"stem":37},"FastAPI","\u002Fdocs\u002Fguides\u002Ffastapi","docs\u002F02.guides\u002F6.fastapi",{"title":39,"path":40,"stem":41},"Django","\u002Fdocs\u002Fguides\u002Fdjango","docs\u002F02.guides\u002F7.django",{"title":43,"path":44,"stem":45},"Laravel","\u002Fdocs\u002Fguides\u002Flaravel","docs\u002F02.guides\u002F8.laravel",{"title":47,"path":48,"stem":49},"Go","\u002Fdocs\u002Fguides\u002Fgo","docs\u002F02.guides\u002F9.go",{"title":51,"path":52,"stem":53},"Services","\u002Fdocs\u002Fservices","docs\u002F03.services",{"title":55,"path":56,"stem":57},"Deployments","\u002Fdocs\u002Fdeployments","docs\u002F04.deployments",{"title":59,"path":60,"stem":61},"Builds","\u002Fdocs\u002Fbuilds","docs\u002F05.builds",{"title":63,"path":64,"stem":65},"Variables","\u002Fdocs\u002Fvariables","docs\u002F06.variables",{"title":67,"path":68,"stem":69},"Domains","\u002Fdocs\u002Fdomains","docs\u002F07.domains",{"title":71,"path":72,"stem":73},"PostgreSQL","\u002Fdocs\u002Fpostgres","docs\u002F08.postgres",{"title":75,"path":76,"stem":77},"Object storage","\u002Fdocs\u002Fobject-storage","docs\u002F09.object-storage",{"title":79,"path":80,"stem":81},"Volumes","\u002Fdocs\u002Fvolumes","docs\u002F10.volumes",{"title":83,"path":84,"stem":85},"Key-value store","\u002Fdocs\u002Fredis","docs\u002F11.redis",{"title":87,"path":88,"stem":89},"Workspaces","\u002Fdocs\u002Fworkspaces","docs\u002F12.workspaces",{"title":91,"path":92,"stem":93},"Projects","\u002Fdocs\u002Fprojects","docs\u002F13.projects",{"title":95,"path":96,"stem":97},"Environments","\u002Fdocs\u002Fenvironments","docs\u002F14.environments",{"title":99,"path":100,"stem":101},"Eject","\u002Fdocs\u002Feject","docs\u002F15.eject",{"title":103,"path":104,"stem":105},"API","\u002Fdocs\u002Fapi","docs\u002F16.api",{"title":107,"path":108,"stem":109},"CLI","\u002Fdocs\u002Fcli","docs\u002F17.cli",{"title":111,"path":112,"stem":113},"Claude Plugin & MCP","\u002Fdocs\u002Fclaude-plugin","docs\u002F18.claude-plugin",{"title":115,"path":116,"stem":117},"Metrics","\u002Fdocs\u002Fmetrics","docs\u002F19.metrics",{"title":119,"path":120,"stem":121},"Logs","\u002Fdocs\u002Flogs","docs\u002F20.logs",{"title":123,"path":124,"stem":125},"Billing","\u002Fdocs\u002Fbilling","docs\u002F21.billing",{"title":127,"path":128,"stem":129},"Self-hosting","\u002Fdocs\u002Fself-hosting","docs\u002F22.self-hosting",[131,132,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],{"title":5,"path":6,"stem":7},{"title":9,"path":10,"stem":11,"children":133},[134,135,136,137,138,139,140,141,142,143],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17},{"title":19,"path":20,"stem":21},{"title":23,"path":24,"stem":25},{"title":27,"path":28,"stem":29},{"title":31,"path":32,"stem":33},{"title":35,"path":36,"stem":37},{"title":39,"path":40,"stem":41},{"title":43,"path":44,"stem":45},{"title":47,"path":48,"stem":49},{"title":51,"path":52,"stem":53},{"title":55,"path":56,"stem":57},{"title":59,"path":60,"stem":61},{"title":63,"path":64,"stem":65},{"title":67,"path":68,"stem":69},{"title":71,"path":72,"stem":73},{"title":75,"path":76,"stem":77},{"title":79,"path":80,"stem":81},{"title":83,"path":84,"stem":85},{"title":87,"path":88,"stem":89},{"title":91,"path":92,"stem":93},{"title":95,"path":96,"stem":97},{"title":99,"path":100,"stem":101},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109},{"title":111,"path":112,"stem":113},{"title":115,"path":116,"stem":117},{"title":119,"path":120,"stem":121},{"title":123,"path":124,"stem":125},{"title":127,"path":128,"stem":129},{"id":165,"title":166,"body":167,"description":686,"extension":687,"links":688,"meta":689,"navigation":690,"path":20,"seo":691,"stem":21,"__hash__":692},"docs\u002Fdocs\u002F02.guides\u002F2.nuxt.md","Deploy a Nuxt app",{"type":168,"value":169,"toc":678},"minimark",[170,174,203,216,221,240,253,264,270,336,352,356,359,370,374,381,387,393,411,415,433,618,625,629,651,655,674],[171,172,173],"p",{},"Nuxt is the easiest of the JavaScript frameworks to deploy here, because its default build output is already a plain Node server. There is no platform preset to choose and no adapter to install.",[175,176,181],"pre",{"className":177,"code":178,"language":179,"meta":180,"style":180},"language-bash shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","npx nuxi@latest init my-app\n","bash","",[182,183,184],"code",{"__ignoreMap":180},[185,186,189,193,197,200],"span",{"class":187,"line":188},"line",1,[185,190,192],{"class":191},"sX5TD","npx",[185,194,196],{"class":195},"sQLXx"," nuxi@latest",[185,198,199],{"class":195}," init",[185,201,202],{"class":195}," my-app\n",[171,204,205,206,210,211,215],{},"Push that to GitHub, connect it as described in the ",[207,208,209],"a",{"href":6},"quickstart",", and it runs. If you would rather not scaffold your own, ",[207,212,214],{"href":213},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Fnuxt-example","zeitlos\u002Fnuxt-example"," is exactly the above, deployed.",[217,218,220],"h2",{"id":219},"the-start-command-and-where-it-comes-from","The start command, and where it comes from",[171,222,223,224,227,228,231,232,235,236,239],{},"The ",[207,225,226],{"href":60},"build"," runs ",[182,229,230],{},"npm run build",", which produces ",[182,233,234],{},".output\u002F",". For the start command, detection looks for a ",[182,237,238],{},"start"," script first. A stock Nuxt project has none, so it falls through to the Nitro default:",[175,241,243],{"className":177,"code":242,"language":179,"meta":180,"style":180},"node .output\u002Fserver\u002Findex.mjs\n",[182,244,245],{"__ignoreMap":180},[185,246,247,250],{"class":187,"line":188},[185,248,249],{"class":191},"node",[185,251,252],{"class":195}," .output\u002Fserver\u002Findex.mjs\n",[171,254,255,256,259,260,263],{},"That is the same command ",[182,257,258],{},"nuxt preview"," wraps, and it reads the ",[182,261,262],{},"PORT"," Lucity injects. Nothing to configure.",[171,265,266,267,269],{},"Add a ",[182,268,238],{}," script and it wins. That is the hook to use if you want to run migrations before the server, or pass Node flags:",[175,271,275],{"className":272,"code":273,"language":274,"meta":180,"style":180},"language-json shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","{\n  \"scripts\": {\n    \"start\": \"node --max-old-space-size=1024 .output\u002Fserver\u002Findex.mjs\"\n  }\n}\n","json",[182,276,277,283,302,324,330],{"__ignoreMap":180},[185,278,279],{"class":187,"line":188},[185,280,282],{"class":281},"si-ur","{\n",[185,284,286,289,293,296,299],{"class":187,"line":285},2,[185,287,288],{"class":281},"  \"",[185,290,292],{"class":291},"slqHI","scripts",[185,294,295],{"class":281},"\"",[185,297,298],{"class":281},":",[185,300,301],{"class":281}," {\n",[185,303,305,308,310,312,314,317,321],{"class":187,"line":304},3,[185,306,307],{"class":281},"    \"",[185,309,238],{"class":291},[185,311,295],{"class":281},[185,313,298],{"class":281},[185,315,316],{"class":281}," \"",[185,318,320],{"class":319},"sIi04","node --max-old-space-size=1024 .output\u002Fserver\u002Findex.mjs",[185,322,323],{"class":281},"\"\n",[185,325,327],{"class":187,"line":326},4,[185,328,329],{"class":281},"  }\n",[185,331,333],{"class":187,"line":332},5,[185,334,335],{"class":281},"}\n",[337,338,339,340,343,344,347,348,351],"note",{},"Commit your ",[182,341,342],{},"package-lock.json",". A Nuxt project without one failed in our own build with\n",[182,345,346],{},"npm error Cannot read properties of null (reading 'edgesOut')",", an npm resolution failure that\nnever shows up locally because your ",[182,349,350],{},"node_modules"," is already there. The lockfile also makes the\nbuild reproducible, which is the real reason to commit it.",[217,353,355],{"id":354},"leave-the-nitro-preset-alone","Leave the Nitro preset alone",[171,357,358],{},"Nitro can target Vercel, Netlify, Cloudflare Workers and a dozen other hosts, and every one of those presets produces output that only runs on that host. The default preset produces a Node server, which is what a container wants.",[171,360,361,362,365,366,369],{},"So: do not set ",[182,363,364],{},"nitro.preset"," in ",[182,367,368],{},"nuxt.config.ts",", and remove it if you inherited a config that has one. That single line is the difference between a deployment that works anywhere and one that is pinned to a vendor. Lucity has nothing to add here, and that is the point.",[217,371,373],{"id":372},"runtime-config-and-variables","Runtime config and variables",[171,375,376,377,380],{},"Nuxt splits configuration in a way that maps neatly onto how ",[207,378,379],{"href":64},"variables"," behave.",[171,382,383,386],{},[182,384,385],{},"runtimeConfig"," values are read at runtime, so they behave like any other variable: change one, the service rolls out in seconds with the same image and the new value is live.",[171,388,389,392],{},[182,390,391],{},"runtimeConfig.public"," values are exposed to the browser and inlined during the build. Changing one needs a new build, not just a rollout. If a public value differs between environments, that means one build per environment, which is worth knowing before you rely on it.",[171,394,395,396,399,400,403,404,399,407,410],{},"The environment variable names follow Nuxt's convention: ",[182,397,398],{},"NUXT_API_SECRET"," fills ",[182,401,402],{},"runtimeConfig.apiSecret",", and ",[182,405,406],{},"NUXT_PUBLIC_SITE_URL",[182,408,409],{},"runtimeConfig.public.siteUrl",".",[217,412,414],{"id":413},"server-routes-and-a-database","Server routes and a database",[171,416,417,418,421,422,425,426,429,430,298],{},"Nuxt server routes run in the same container, so a ",[207,419,420],{"href":72},"PostgreSQL database"," is just a connection away. Link ",[182,423,424],{},"DATABASE_URL"," to the database's ",[182,427,428],{},"fqdn-uri",", then use it from ",[182,431,432],{},"server\u002Fapi\u002F",[175,434,438],{"className":435,"code":436,"language":437,"meta":180,"style":180},"language-ts shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","\u002F\u002F server\u002Fapi\u002Fposts.get.ts\nimport { Pool } from 'pg';\n\nconst pool = new Pool({ connectionString: process.env.DATABASE_URL });\n\nexport default defineEventHandler(async () => {\n  const { rows } = await pool.query('SELECT id, title FROM posts ORDER BY id DESC LIMIT 20');\n  return rows;\n});\n","ts",[182,439,440,446,476,482,531,535,560,598,608],{"__ignoreMap":180},[185,441,442],{"class":187,"line":188},[185,443,445],{"class":444},"sIIdi","\u002F\u002F server\u002Fapi\u002Fposts.get.ts\n",[185,447,448,452,455,458,461,464,467,470,473],{"class":187,"line":285},[185,449,451],{"class":450},"sJHtc","import",[185,453,454],{"class":281}," {",[185,456,457],{"class":319}," Pool",[185,459,460],{"class":281}," }",[185,462,463],{"class":450}," from",[185,465,466],{"class":281}," '",[185,468,469],{"class":195},"pg",[185,471,472],{"class":281},"'",[185,474,475],{"class":281},";\n",[185,477,478],{"class":187,"line":304},[185,479,481],{"emptyLinePlaceholder":480},true,"\n",[185,483,484,488,491,495,498,500,504,507,510,512,515,517,520,522,524,526,529],{"class":187,"line":326},[185,485,487],{"class":486},"sjx4h","const",[185,489,490],{"class":319}," pool",[185,492,494],{"class":493},"s3drp"," =",[185,496,497],{"class":486}," new",[185,499,457],{"class":191},[185,501,503],{"class":502},"spvMa","(",[185,505,506],{"class":281},"{",[185,508,509],{"class":502}," connectionString",[185,511,298],{"class":281},[185,513,514],{"class":319}," process",[185,516,410],{"class":281},[185,518,519],{"class":319},"env",[185,521,410],{"class":281},[185,523,424],{"class":319},[185,525,460],{"class":281},[185,527,528],{"class":502},")",[185,530,475],{"class":281},[185,532,533],{"class":187,"line":332},[185,534,481],{"emptyLinePlaceholder":480},[185,536,538,541,544,547,549,552,555,558],{"class":187,"line":537},6,[185,539,540],{"class":450},"export",[185,542,543],{"class":450}," default",[185,545,546],{"class":191}," defineEventHandler",[185,548,503],{"class":502},[185,550,551],{"class":486},"async",[185,553,554],{"class":281}," ()",[185,556,557],{"class":486}," =>",[185,559,301],{"class":281},[185,561,563,566,568,571,573,575,578,580,582,585,587,589,592,594,596],{"class":187,"line":562},7,[185,564,565],{"class":486},"  const",[185,567,454],{"class":281},[185,569,570],{"class":319}," rows",[185,572,460],{"class":281},[185,574,494],{"class":493},[185,576,577],{"class":450}," await",[185,579,490],{"class":319},[185,581,410],{"class":281},[185,583,584],{"class":191},"query",[185,586,503],{"class":502},[185,588,472],{"class":281},[185,590,591],{"class":195},"SELECT id, title FROM posts ORDER BY id DESC LIMIT 20",[185,593,472],{"class":281},[185,595,528],{"class":502},[185,597,475],{"class":281},[185,599,601,604,606],{"class":187,"line":600},8,[185,602,603],{"class":450},"  return",[185,605,570],{"class":319},[185,607,475],{"class":281},[185,609,611,614,616],{"class":187,"line":610},9,[185,612,613],{"class":281},"}",[185,615,528],{"class":502},[185,617,475],{"class":281},[171,619,620,621,624],{},"Uploads belong in a ",[207,622,623],{"href":76},"bucket"," rather than on the container's disk, which resets on every rollout.",[217,626,628],{"id":627},"if-you-are-building-a-static-site","If you are building a static site",[171,630,631,634,635,637,638,640,641,643,644,646,647,650],{},[182,632,633],{},"nuxt generate"," produces a static site instead of a server, and Lucity will happily serve it, but detection keys on the ",[182,636,226],{}," script. Point your ",[182,639,226],{}," script at ",[182,642,633],{}," and set a ",[182,645,238],{}," script that serves ",[182,648,649],{},".output\u002Fpublic",", or keep the server build. Mixing the two, generating in the build and then starting a server, gives you the costs of both.",[217,652,654],{"id":653},"next-steps","Next steps",[656,657,658,664,669],"ul",{},[659,660,661,663],"li",{},[207,662,63],{"href":64}," for the runtime and build-time split",[659,665,666,668],{},[207,667,71],{"href":72}," for the database behind your server routes",[659,670,671,673],{},[207,672,55],{"href":56}," for what happens on each push",[675,676,677],"style",{},"html pre.shiki code .sX5TD, html code.shiki .sX5TD{--shiki-light:#FABD2F;--shiki-default:#FABD2F;--shiki-dark:#FABD2F}html pre.shiki code .sQLXx, html code.shiki .sQLXx{--shiki-light:#B8BB26;--shiki-default:#B8BB26;--shiki-dark:#B8BB26}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);}html pre.shiki code .si-ur, html code.shiki .si-ur{--shiki-light:#A89984;--shiki-default:#A89984;--shiki-dark:#A89984}html pre.shiki code .slqHI, html code.shiki .slqHI{--shiki-light:#689D6A;--shiki-default:#689D6A;--shiki-dark:#689D6A}html pre.shiki code .sIi04, html code.shiki .sIi04{--shiki-light:#83A598;--shiki-default:#83A598;--shiki-dark:#83A598}html pre.shiki code .sIIdi, html code.shiki .sIIdi{--shiki-light:#928374;--shiki-light-font-style:italic;--shiki-default:#928374;--shiki-default-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic}html pre.shiki code .sJHtc, html code.shiki .sJHtc{--shiki-light:#FB4934;--shiki-default:#FB4934;--shiki-dark:#FB4934}html pre.shiki code .sjx4h, html code.shiki .sjx4h{--shiki-light:#FE8019;--shiki-default:#FE8019;--shiki-dark:#FE8019}html pre.shiki code .s3drp, html code.shiki .s3drp{--shiki-light:#8EC07C;--shiki-default:#8EC07C;--shiki-dark:#8EC07C}html pre.shiki code .spvMa, html code.shiki .spvMa{--shiki-light:#EBDBB2;--shiki-default:#EBDBB2;--shiki-dark:#EBDBB2}",{"title":180,"searchDepth":285,"depth":285,"links":679},[680,681,682,683,684,685],{"id":219,"depth":285,"text":220},{"id":354,"depth":285,"text":355},{"id":372,"depth":285,"text":373},{"id":413,"depth":285,"text":414},{"id":627,"depth":285,"text":628},{"id":653,"depth":285,"text":654},"Deploy a Nuxt app on Lucity. Nitro output, runtime config, and a database, with no preset to pick.","md",null,{},{"title":19},{"title":166,"description":686},"1tSToFOLP_GmSOIG2CwMB2A15D1nYLg5l55HvbyYwSI",[694,696],{"title":15,"path":16,"stem":17,"description":695,"children":-1},"Deploy a Next.js app on Lucity, with a database, environment variables that behave, and no Dockerfile.",{"title":23,"path":24,"stem":25,"description":697,"children":-1},"Deploy a SvelteKit app on Lucity. One adapter change stands between a fresh project and a running service.",[699,702,704,706,707,709,712,715,718,721,724,727,730,732,734,736,738,740,742,744,746,748,750,752,754,756,758,760,762,764,766,768,770,773,777,781],{"path":6,"title":700,"description":701},"Deploy your first service","Deploy an app to Lucity, put it on a public domain, and connect a PostgreSQL database and an object storage bucket in about fifteen minutes.",{"path":703,"title":9,"description":688},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":705,"description":695},"Deploy a Next.js app",{"path":20,"title":166,"description":686},{"path":24,"title":708,"description":697},"Deploy a SvelteKit app",{"path":28,"title":710,"description":711},"Deploy an Astro site","Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",{"path":32,"title":713,"description":714},"Deploy an Express API","Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"path":36,"title":716,"description":717},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":719,"description":720},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":722,"description":723},"Deploy a Laravel application","Deploy a Laravel application on Lucity, with migrations, caches and a queue worker, and no server to configure.",{"path":48,"title":725,"description":726},"Deploy a Go service","Deploy a Go service on Lucity. Compiled in the build, shipped as a binary, nothing else in the image.",{"path":10,"title":728,"description":729},"Deploy your framework","Deploy guides for the frameworks people actually ship: Next.js, Nuxt, SvelteKit, Astro, Express, FastAPI, Django, Laravel, and Go.",{"path":52,"title":51,"description":731},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":733},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":735},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":737},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":739},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":741},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":743},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":745},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":747},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":749},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":751},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":753},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":755},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":757},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":759},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":761},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":763},"CPU and memory for every service, activity for every database, and disk usage for every volume.",{"path":120,"title":119,"description":765},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":767},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":769},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":771,"title":772,"description":688},"\u002Flegal\u002F.navigation","Legal",{"path":774,"title":775,"description":776},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":778,"title":779,"description":780},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":782,"title":783,"description":784},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1793630525969]