[{"data":1,"prerenderedAt":902},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-guides-sveltekit":164,"-docs-guides-sveltekit-surround":810,"doc-previews":815},[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":803,"extension":804,"links":805,"meta":806,"navigation":807,"path":24,"seo":808,"stem":25,"__hash__":809},"docs\u002Fdocs\u002F02.guides\u002F3.sveltekit.md","Deploy a SvelteKit app",{"type":168,"value":169,"toc":796},"minimark",[170,179,184,237,248,407,418,476,487,491,519,522,537,541,544,571,581,760,764,771,775,792],[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,486],{},"That is the whole setup. ",[480,481,485],"a",{"href":482,"rel":483},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Fsveltekit-example",[484],"nofollow","zeitlos\u002Fsveltekit-example"," is a minimal project with exactly these changes applied.",[180,488,490],{"id":489},"why-it-fails-without-them","Why it fails without them",[171,492,493,494,496,497,499,500,503,504,507,508,510,511,514,515,518],{},"Worth understanding, because the failure is quiet. With ",[175,495,177],{}," and no ",[175,498,412],{}," script, the ",[480,501,502],{"href":60},"build"," succeeds: ",[175,505,506],{},"npm run build"," runs, files are produced, the image is pushed. Detection then looks for a way to start the app, finds no ",[175,509,412],{}," script, no ",[175,512,513],{},"main"," field and no ",[175,516,517],{},"index.js",", and derives an empty start command. The deployment has nothing to run.",[171,520,521],{},"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,523,524,525,528,529,532,533,536],{},"With the two changes above, detection resolves the start command to ",[175,526,527],{},"npm run start",", and ",[175,530,531],{},"adapter-node"," reads the ",[175,534,535],{},"PORT"," Lucity provides without further configuration.",[180,538,540],{"id":539},"environment-variables","Environment variables",[171,542,543],{},"SvelteKit is strict about the difference, and the strictness is useful:",[545,546,547,554,564],"ul",{},[548,549,550,553],"li",{},[175,551,552],{},"$env\u002Fstatic\u002Fprivate"," is inlined at build time. Changing one of these values needs a rebuild.",[548,555,556,559,560,563],{},[175,557,558],{},"$env\u002Fdynamic\u002Fprivate"," is read at runtime from ",[175,561,562],{},"process.env",". Changing one of these takes effect on the next rollout, in seconds.",[548,565,566,567,570],{},"The ",[175,568,569],{},"PUBLIC_"," prefixed variants of both are exposed to the browser.",[171,572,573,574,577,578,580],{},"For anything that comes from a Lucity ",[480,575,576],{"href":64},"dynamic variable",", a database URL or bucket credentials, use ",[175,579,558],{},". Those values can change without your code changing, and a build-time import would freeze whatever was true when the image was made.",[185,582,584],{"className":250,"code":583,"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,585,586,591,612,634,638,678,682,700,737,755],{"__ignoreMap":190},[194,587,588],{"class":196,"line":197},[194,589,590],{"class":259},"\u002F\u002F src\u002Froutes\u002F+page.server.ts\n",[194,592,593,595,597,600,602,604,606,608,610],{"class":196,"line":214},[194,594,266],{"class":265},[194,596,293],{"class":276},[194,598,599],{"class":269}," env",[194,601,299],{"class":276},[194,603,273],{"class":265},[194,605,277],{"class":276},[194,607,558],{"class":204},[194,609,283],{"class":276},[194,611,286],{"class":276},[194,613,614,616,618,621,623,625,627,630,632],{"class":196,"line":223},[194,615,266],{"class":265},[194,617,293],{"class":276},[194,619,620],{"class":269}," Pool",[194,622,299],{"class":276},[194,624,273],{"class":265},[194,626,277],{"class":276},[194,628,629],{"class":204},"pg",[194,631,283],{"class":276},[194,633,286],{"class":276},[194,635,636],{"class":196,"line":313},[194,637,340],{"emptyLinePlaceholder":339},[194,639,640,643,646,650,653,655,657,659,662,664,666,669,672,674,676],{"class":196,"line":336},[194,641,642],{"class":217},"const",[194,644,645],{"class":269}," pool",[194,647,649],{"class":648},"s3drp"," =",[194,651,652],{"class":217}," new",[194,654,620],{"class":200},[194,656,355],{"class":354},[194,658,378],{"class":276},[194,660,661],{"class":354}," connectionString",[194,663,367],{"class":276},[194,665,599],{"class":269},[194,667,668],{"class":276},".",[194,670,671],{"class":269},"DATABASE_URL",[194,673,299],{"class":276},[194,675,404],{"class":354},[194,677,286],{"class":276},[194,679,680],{"class":196,"line":343},[194,681,340],{"emptyLinePlaceholder":339},[194,683,684,686,689,692,695,698],{"class":196,"line":361},[194,685,346],{"class":265},[194,687,688],{"class":217}," async",[194,690,691],{"class":217}," function",[194,693,694],{"class":200}," load",[194,696,697],{"class":276},"()",[194,699,445],{"class":276},[194,701,702,705,707,710,712,714,717,719,721,724,726,728,731,733,735],{"class":196,"line":399},[194,703,704],{"class":217},"  const",[194,706,293],{"class":276},[194,708,709],{"class":269}," rows",[194,711,299],{"class":276},[194,713,649],{"class":648},[194,715,716],{"class":265}," await",[194,718,645],{"class":269},[194,720,668],{"class":276},[194,722,723],{"class":200},"query",[194,725,355],{"class":354},[194,727,283],{"class":276},[194,729,730],{"class":204},"SELECT title FROM posts ORDER BY votes DESC LIMIT 10",[194,732,283],{"class":276},[194,734,404],{"class":354},[194,736,286],{"class":276},[194,738,740,743,745,748,750,752],{"class":196,"line":739},9,[194,741,742],{"class":265},"  return",[194,744,293],{"class":276},[194,746,747],{"class":354}," posts",[194,749,367],{"class":276},[194,751,709],{"class":269},[194,753,754],{"class":276}," };\n",[194,756,758],{"class":196,"line":757},10,[194,759,475],{"class":276},[180,761,763],{"id":762},"prerendered-routes-need-their-data-at-build-time","Prerendered routes need their data at build time",[171,765,766,767,770],{},"If a route is prerendered and it queries a ",[480,768,769],{"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,772,774],{"id":773},"next-steps","Next steps",[545,776,777,782,787],{},[548,778,779,781],{},[480,780,59],{"href":60}," for what the builder detects and how to override it",[548,783,784,786],{},[480,785,51],{"href":52}," for health checks, resources and replicas",[548,788,789,791],{},[480,790,63],{"href":64}," for the static and dynamic split",[793,794,795],"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":797},[798,799,800,801,802],{"id":182,"depth":214,"text":183},{"id":489,"depth":214,"text":490},{"id":539,"depth":214,"text":540},{"id":762,"depth":214,"text":763},{"id":773,"depth":214,"text":774},"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":803},"muHd71sJnh3iHMWHDm9IOI8GTshLwdMwMHoeyNbjt-o",[811,813],{"title":19,"path":20,"stem":21,"description":812,"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":814,"children":-1},"Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",[816,819,821,824,826,827,829,832,835,838,841,844,847,849,851,853,855,857,859,861,863,865,867,869,871,873,875,877,879,881,883,885,887,890,894,898],{"path":6,"title":817,"description":818},"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":820,"title":9,"description":805},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":822,"description":823},"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":825,"description":812},"Deploy a Nuxt app",{"path":24,"title":166,"description":803},{"path":28,"title":828,"description":814},"Deploy an Astro site",{"path":32,"title":830,"description":831},"Deploy an Express API","Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"path":36,"title":833,"description":834},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":836,"description":837},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":839,"description":840},"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":842,"description":843},"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":845,"description":846},"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":848},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":850},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":852},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":854},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":856},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":858},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":860},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":862},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":864},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":866},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":868},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":870},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":872},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":874},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":876},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":878},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":880},"CPU and memory for every service, and disk usage for every volume.",{"path":120,"title":119,"description":882},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":884},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":886},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":888,"title":889,"description":805},"\u002Flegal\u002F.navigation","Legal",{"path":891,"title":892,"description":893},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":895,"title":896,"description":897},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":899,"title":900,"description":901},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1791216729179]