[{"data":1,"prerenderedAt":900},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-guides-sveltekit":164,"-docs-guides-sveltekit-surround":808,"doc-previews":813},[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":801,"extension":802,"links":803,"meta":804,"navigation":805,"path":24,"seo":806,"stem":25,"__hash__":807},"docs\u002Fdocs\u002F02.guides\u002F3.sveltekit.md","Deploy a SvelteKit app",{"type":168,"value":169,"toc":794},"minimark",[170,179,184,237,248,407,418,476,485,489,517,520,535,539,542,569,579,758,762,769,773,790],[171,172,173,174,178],"p",{},"SvelteKit is the one framework in this list where a brand new project will not deploy as-is. Not because of anything Lucity does, but because the scaffold ships with ",[175,176,177],"code",{},"adapter-auto",", which produces nothing runnable outside the four hosts it knows about. Two small changes fix it permanently.",[180,181,183],"h2",{"id":182},"the-two-changes","The two changes",[185,186,191],"pre",{"className":187,"code":188,"language":189,"meta":190,"style":190},"language-bash shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","npx sv create my-app\ncd my-app\nnpm install -D @sveltejs\u002Fadapter-node\n","bash","",[175,192,193,212,221],{"__ignoreMap":190},[194,195,198,202,206,209],"span",{"class":196,"line":197},"line",1,[194,199,201],{"class":200},"sX5TD","npx",[194,203,205],{"class":204},"sQLXx"," sv",[194,207,208],{"class":204}," create",[194,210,211],{"class":204}," my-app\n",[194,213,215,219],{"class":196,"line":214},2,[194,216,218],{"class":217},"sjx4h","cd",[194,220,211],{"class":204},[194,222,224,227,230,234],{"class":196,"line":223},3,[194,225,226],{"class":200},"npm",[194,228,229],{"class":204}," install",[194,231,233],{"class":232},"s1Tsi"," -D",[194,235,236],{"class":204}," @sveltejs\u002Fadapter-node\n",[171,238,239,240,243,244,247],{},"Then swap the adapter. In current SvelteKit the adapter lives in ",[175,241,242],{},"vite.config.ts",", not in ",[175,245,246],{},"svelte.config.js"," as older guides say:",[185,249,253],{"className":250,"code":251,"language":252,"meta":190,"style":190},"language-ts shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","\u002F\u002F vite.config.ts\nimport adapter from '@sveltejs\u002Fadapter-node';\nimport { sveltekit } from '@sveltejs\u002Fkit\u002Fvite';\nimport { defineConfig } from 'vite';\n\nexport default defineConfig({\n  plugins: [sveltekit({ adapter: adapter() })],\n});\n","ts",[175,254,255,261,287,311,334,341,359,397],{"__ignoreMap":190},[194,256,257],{"class":196,"line":197},[194,258,260],{"class":259},"sIIdi","\u002F\u002F vite.config.ts\n",[194,262,263,267,271,274,278,281,284],{"class":196,"line":214},[194,264,266],{"class":265},"sJHtc","import",[194,268,270],{"class":269},"sIi04"," adapter",[194,272,273],{"class":265}," from",[194,275,277],{"class":276},"si-ur"," '",[194,279,280],{"class":204},"@sveltejs\u002Fadapter-node",[194,282,283],{"class":276},"'",[194,285,286],{"class":276},";\n",[194,288,289,291,294,297,300,302,304,307,309],{"class":196,"line":223},[194,290,266],{"class":265},[194,292,293],{"class":276}," {",[194,295,296],{"class":269}," sveltekit",[194,298,299],{"class":276}," }",[194,301,273],{"class":265},[194,303,277],{"class":276},[194,305,306],{"class":204},"@sveltejs\u002Fkit\u002Fvite",[194,308,283],{"class":276},[194,310,286],{"class":276},[194,312,314,316,318,321,323,325,327,330,332],{"class":196,"line":313},4,[194,315,266],{"class":265},[194,317,293],{"class":276},[194,319,320],{"class":269}," defineConfig",[194,322,299],{"class":276},[194,324,273],{"class":265},[194,326,277],{"class":276},[194,328,329],{"class":204},"vite",[194,331,283],{"class":276},[194,333,286],{"class":276},[194,335,337],{"class":196,"line":336},5,[194,338,340],{"emptyLinePlaceholder":339},true,"\n",[194,342,344,347,350,352,356],{"class":196,"line":343},6,[194,345,346],{"class":265},"export",[194,348,349],{"class":265}," default",[194,351,320],{"class":200},[194,353,355],{"class":354},"spvMa","(",[194,357,358],{"class":276},"{\n",[194,360,362,365,368,371,374,376,379,381,383,385,388,391,394],{"class":196,"line":361},7,[194,363,364],{"class":354},"  plugins",[194,366,367],{"class":276},":",[194,369,370],{"class":354}," [",[194,372,373],{"class":200},"sveltekit",[194,375,355],{"class":354},[194,377,378],{"class":276},"{",[194,380,270],{"class":354},[194,382,367],{"class":276},[194,384,270],{"class":200},[194,386,387],{"class":354},"() ",[194,389,390],{"class":276},"}",[194,392,393],{"class":354},")]",[194,395,396],{"class":276},",\n",[194,398,400,402,405],{"class":196,"line":399},8,[194,401,390],{"class":276},[194,403,404],{"class":354},")",[194,406,286],{"class":276},[171,408,409,410,413,414,417],{},"And add a ",[175,411,412],{},"start"," script, because the adapter writes a server to ",[175,415,416],{},"build\u002F"," but nothing runs it for you:",[185,419,423],{"className":420,"code":421,"language":422,"meta":190,"style":190},"language-json shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","{\n  \"scripts\": {\n    \"start\": \"node build\"\n  }\n}\n","json",[175,424,425,429,446,466,471],{"__ignoreMap":190},[194,426,427],{"class":196,"line":197},[194,428,358],{"class":276},[194,430,431,434,438,441,443],{"class":196,"line":214},[194,432,433],{"class":276},"  \"",[194,435,437],{"class":436},"slqHI","scripts",[194,439,440],{"class":276},"\"",[194,442,367],{"class":276},[194,444,445],{"class":276}," {\n",[194,447,448,451,453,455,457,460,463],{"class":196,"line":223},[194,449,450],{"class":276},"    \"",[194,452,412],{"class":436},[194,454,440],{"class":276},[194,456,367],{"class":276},[194,458,459],{"class":276}," \"",[194,461,462],{"class":269},"node build",[194,464,465],{"class":276},"\"\n",[194,467,468],{"class":196,"line":313},[194,469,470],{"class":276},"  }\n",[194,472,473],{"class":196,"line":336},[194,474,475],{"class":276},"}\n",[171,477,478,479,484],{},"That is the whole setup. ",[480,481,483],"a",{"href":482},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Fsveltekit-example","zeitlos\u002Fsveltekit-example"," is a minimal project with exactly these changes applied.",[180,486,488],{"id":487},"why-it-fails-without-them","Why it fails without them",[171,490,491,492,494,495,497,498,501,502,505,506,508,509,512,513,516],{},"Worth understanding, because the failure is quiet. With ",[175,493,177],{}," and no ",[175,496,412],{}," script, the ",[480,499,500],{"href":60},"build"," succeeds: ",[175,503,504],{},"npm run build"," runs, files are produced, the image is pushed. Detection then looks for a way to start the app, finds no ",[175,507,412],{}," script, no ",[175,510,511],{},"main"," field and no ",[175,514,515],{},"index.js",", and derives an empty start command. The deployment has nothing to run.",[171,518,519],{},"You get a service that built cleanly and never becomes healthy, which is a more confusing outcome than a failed build. If you see that, this is almost always why.",[171,521,522,523,526,527,530,531,534],{},"With the two changes above, detection resolves the start command to ",[175,524,525],{},"npm run start",", and ",[175,528,529],{},"adapter-node"," reads the ",[175,532,533],{},"PORT"," Lucity provides without further configuration.",[180,536,538],{"id":537},"environment-variables","Environment variables",[171,540,541],{},"SvelteKit is strict about the difference, and the strictness is useful:",[543,544,545,552,562],"ul",{},[546,547,548,551],"li",{},[175,549,550],{},"$env\u002Fstatic\u002Fprivate"," is inlined at build time. Changing one of these values needs a rebuild.",[546,553,554,557,558,561],{},[175,555,556],{},"$env\u002Fdynamic\u002Fprivate"," is read at runtime from ",[175,559,560],{},"process.env",". Changing one of these takes effect on the next rollout, in seconds.",[546,563,564,565,568],{},"The ",[175,566,567],{},"PUBLIC_"," prefixed variants of both are exposed to the browser.",[171,570,571,572,575,576,578],{},"For anything that comes from a Lucity ",[480,573,574],{"href":64},"dynamic variable",", a database URL or bucket credentials, use ",[175,577,556],{},". Those values can change without your code changing, and a build-time import would freeze whatever was true when the image was made.",[185,580,582],{"className":250,"code":581,"language":252,"meta":190,"style":190},"\u002F\u002F src\u002Froutes\u002F+page.server.ts\nimport { env } from '$env\u002Fdynamic\u002Fprivate';\nimport { Pool } from 'pg';\n\nconst pool = new Pool({ connectionString: env.DATABASE_URL });\n\nexport async function load() {\n  const { rows } = await pool.query('SELECT title FROM posts ORDER BY votes DESC LIMIT 10');\n  return { posts: rows };\n}\n",[175,583,584,589,610,632,636,676,680,698,735,753],{"__ignoreMap":190},[194,585,586],{"class":196,"line":197},[194,587,588],{"class":259},"\u002F\u002F src\u002Froutes\u002F+page.server.ts\n",[194,590,591,593,595,598,600,602,604,606,608],{"class":196,"line":214},[194,592,266],{"class":265},[194,594,293],{"class":276},[194,596,597],{"class":269}," env",[194,599,299],{"class":276},[194,601,273],{"class":265},[194,603,277],{"class":276},[194,605,556],{"class":204},[194,607,283],{"class":276},[194,609,286],{"class":276},[194,611,612,614,616,619,621,623,625,628,630],{"class":196,"line":223},[194,613,266],{"class":265},[194,615,293],{"class":276},[194,617,618],{"class":269}," Pool",[194,620,299],{"class":276},[194,622,273],{"class":265},[194,624,277],{"class":276},[194,626,627],{"class":204},"pg",[194,629,283],{"class":276},[194,631,286],{"class":276},[194,633,634],{"class":196,"line":313},[194,635,340],{"emptyLinePlaceholder":339},[194,637,638,641,644,648,651,653,655,657,660,662,664,667,670,672,674],{"class":196,"line":336},[194,639,640],{"class":217},"const",[194,642,643],{"class":269}," pool",[194,645,647],{"class":646},"s3drp"," =",[194,649,650],{"class":217}," new",[194,652,618],{"class":200},[194,654,355],{"class":354},[194,656,378],{"class":276},[194,658,659],{"class":354}," connectionString",[194,661,367],{"class":276},[194,663,597],{"class":269},[194,665,666],{"class":276},".",[194,668,669],{"class":269},"DATABASE_URL",[194,671,299],{"class":276},[194,673,404],{"class":354},[194,675,286],{"class":276},[194,677,678],{"class":196,"line":343},[194,679,340],{"emptyLinePlaceholder":339},[194,681,682,684,687,690,693,696],{"class":196,"line":361},[194,683,346],{"class":265},[194,685,686],{"class":217}," async",[194,688,689],{"class":217}," function",[194,691,692],{"class":200}," load",[194,694,695],{"class":276},"()",[194,697,445],{"class":276},[194,699,700,703,705,708,710,712,715,717,719,722,724,726,729,731,733],{"class":196,"line":399},[194,701,702],{"class":217},"  const",[194,704,293],{"class":276},[194,706,707],{"class":269}," rows",[194,709,299],{"class":276},[194,711,647],{"class":646},[194,713,714],{"class":265}," await",[194,716,643],{"class":269},[194,718,666],{"class":276},[194,720,721],{"class":200},"query",[194,723,355],{"class":354},[194,725,283],{"class":276},[194,727,728],{"class":204},"SELECT title FROM posts ORDER BY votes DESC LIMIT 10",[194,730,283],{"class":276},[194,732,404],{"class":354},[194,734,286],{"class":276},[194,736,738,741,743,746,748,750],{"class":196,"line":737},9,[194,739,740],{"class":265},"  return",[194,742,293],{"class":276},[194,744,745],{"class":354}," posts",[194,747,367],{"class":276},[194,749,707],{"class":269},[194,751,752],{"class":276}," };\n",[194,754,756],{"class":196,"line":755},10,[194,757,475],{"class":276},[180,759,761],{"id":760},"prerendered-routes-need-their-data-at-build-time","Prerendered routes need their data at build time",[171,763,764,765,768],{},"If a route is prerendered and it queries a ",[480,766,767],{"href":72},"database",", that database has to be reachable while the build runs, not just at runtime. Either drop the prerender on those routes or load their data from a source available during the build.",[180,770,772],{"id":771},"next-steps","Next steps",[543,774,775,780,785],{},[546,776,777,779],{},[480,778,59],{"href":60}," for what the builder detects and how to override it",[546,781,782,784],{},[480,783,51],{"href":52}," for health checks, resources and replicas",[546,786,787,789],{},[480,788,63],{"href":64}," for the static and dynamic split",[791,792,793],"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 pre.shiki code .sjx4h, html code.shiki .sjx4h{--shiki-light:#FE8019;--shiki-default:#FE8019;--shiki-dark:#FE8019}html pre.shiki code .s1Tsi, html code.shiki .s1Tsi{--shiki-light:#D3869B;--shiki-default:#D3869B;--shiki-dark:#D3869B}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 .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 .sIi04, html code.shiki .sIi04{--shiki-light:#83A598;--shiki-default:#83A598;--shiki-dark:#83A598}html pre.shiki code .si-ur, html code.shiki .si-ur{--shiki-light:#A89984;--shiki-default:#A89984;--shiki-dark:#A89984}html pre.shiki code .spvMa, html code.shiki .spvMa{--shiki-light:#EBDBB2;--shiki-default:#EBDBB2;--shiki-dark:#EBDBB2}html pre.shiki code .slqHI, html code.shiki .slqHI{--shiki-light:#689D6A;--shiki-default:#689D6A;--shiki-dark:#689D6A}html pre.shiki code .s3drp, html code.shiki .s3drp{--shiki-light:#8EC07C;--shiki-default:#8EC07C;--shiki-dark:#8EC07C}",{"title":190,"searchDepth":214,"depth":214,"links":795},[796,797,798,799,800],{"id":182,"depth":214,"text":183},{"id":487,"depth":214,"text":488},{"id":537,"depth":214,"text":538},{"id":760,"depth":214,"text":761},{"id":771,"depth":214,"text":772},"Deploy a SvelteKit app on Lucity. One adapter change stands between a fresh project and a running service.","md",null,{},{"title":23},{"title":166,"description":801},"AdIHeV-xnv9QcEsIQf2ywJR7xXLIEuTaXeB570Jt5u8",[809,811],{"title":19,"path":20,"stem":21,"description":810,"children":-1},"Deploy a Nuxt app on Lucity. Nitro output, runtime config, and a database, with no preset to pick.",{"title":27,"path":28,"stem":29,"description":812,"children":-1},"Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",[814,817,819,822,824,825,827,830,833,836,839,842,845,847,849,851,853,855,857,859,861,863,865,867,869,871,873,875,877,879,881,883,885,888,892,896],{"path":6,"title":815,"description":816},"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":818,"title":9,"description":803},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":820,"description":821},"Deploy a Next.js app","Deploy a Next.js app on Lucity, with a database, environment variables that behave, and no Dockerfile.",{"path":20,"title":823,"description":810},"Deploy a Nuxt app",{"path":24,"title":166,"description":801},{"path":28,"title":826,"description":812},"Deploy an Astro site",{"path":32,"title":828,"description":829},"Deploy an Express API","Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"path":36,"title":831,"description":832},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":834,"description":835},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":837,"description":838},"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":840,"description":841},"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":843,"description":844},"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":846},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":848},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":850},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":852},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":854},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":856},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":858},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":860},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":862},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":864},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":866},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":868},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":870},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":872},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":874},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":876},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":878},"CPU and memory for every service, activity for every database, and disk usage for every volume.",{"path":120,"title":119,"description":880},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":882},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":884},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":886,"title":887,"description":803},"\u002Flegal\u002F.navigation","Legal",{"path":889,"title":890,"description":891},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":893,"title":894,"description":895},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":897,"title":898,"description":899},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1793630525991]