[{"data":1,"prerenderedAt":548},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-guides-astro":164,"-docs-guides-astro-surround":456,"doc-previews":461},[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":449,"extension":450,"links":451,"meta":452,"navigation":453,"path":28,"seo":454,"stem":29,"__hash__":455},"docs\u002Fdocs\u002F02.guides\u002F4.astro.md","Deploy an Astro site",{"type":168,"value":169,"toc":443},"minimark",[170,174,203,218,223,242,245,259,263,266,285,292,358,365,379,391,395,402,409,416,420,439],[171,172,173],"p",{},"An Astro project deploys as one of two quite different things, and your config decides which. Knowing which one you are getting is most of what there is to know.",[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","npm create astro@latest my-site\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","npm",[185,194,196],{"class":195},"sQLXx"," create",[185,198,199],{"class":195}," astro@latest",[185,201,202],{"class":195}," my-site\n",[171,204,205,206,210,211,217],{},"Push it to GitHub and connect it as in the ",[207,208,209],"a",{"href":6},"quickstart",", or fork ",[207,212,216],{"href":213,"rel":214},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Fastro-example",[215],"nofollow","zeitlos\u002Fastro-example",", which is the minimal template unchanged.",[219,220,222],"h2",{"id":221},"static-by-default","Static by default",[171,224,225,226,229,230,233,234,237,238,241],{},"A stock Astro project has no adapter and no ",[182,227,228],{},"output: 'server'",". The ",[207,231,232],{"href":60},"build"," runs ",[182,235,236],{},"npm run build",", produces ",[182,239,240],{},"dist\u002F",", and Lucity serves those files from a small static web server. No Node process runs at all.",[171,243,244],{},"That is the cheapest way to run a site here. It also means anything that executes per request is unavailable: no API endpoints, no server islands, no session handling, no reading a database on page load. Content is fixed at build time, so publishing new content means a new build.",[171,246,247,248,251,252,255,256,258],{},"If your ",[182,249,250],{},"astro.config.mjs"," sets ",[182,253,254],{},"outDir",", the builder reads it rather than assuming ",[182,257,240],{},".",[219,260,262],{"id":261},"server-rendering-when-you-need-it","Server rendering when you need it",[171,264,265],{},"Add the Node adapter and the deployment changes shape:",[175,267,269],{"className":177,"code":268,"language":179,"meta":180,"style":180},"npx astro add node\n",[182,270,271],{"__ignoreMap":180},[185,272,273,276,279,282],{"class":187,"line":188},[185,274,275],{"class":191},"npx",[185,277,278],{"class":195}," astro",[185,280,281],{"class":195}," add",[185,283,284],{"class":195}," node\n",[171,286,287,288,291],{},"That writes an adapter into your config and switches the build to produce a server. Detection then starts it through your ",[182,289,290],{},"start"," script, so make sure you have one:",[175,293,297],{"className":294,"code":295,"language":296,"meta":180,"style":180},"language-json shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","{\n  \"scripts\": {\n    \"start\": \"node .\u002Fdist\u002Fserver\u002Fentry.mjs\"\n  }\n}\n","json",[182,298,299,305,324,346,352],{"__ignoreMap":180},[185,300,301],{"class":187,"line":188},[185,302,304],{"class":303},"si-ur","{\n",[185,306,308,311,315,318,321],{"class":187,"line":307},2,[185,309,310],{"class":303},"  \"",[185,312,314],{"class":313},"slqHI","scripts",[185,316,317],{"class":303},"\"",[185,319,320],{"class":303},":",[185,322,323],{"class":303}," {\n",[185,325,327,330,332,334,336,339,343],{"class":187,"line":326},3,[185,328,329],{"class":303},"    \"",[185,331,290],{"class":313},[185,333,317],{"class":303},[185,335,320],{"class":303},[185,337,338],{"class":303}," \"",[185,340,342],{"class":341},"sIi04","node .\u002Fdist\u002Fserver\u002Fentry.mjs",[185,344,345],{"class":303},"\"\n",[185,347,349],{"class":187,"line":348},4,[185,350,351],{"class":303},"  }\n",[185,353,355],{"class":187,"line":354},5,[185,356,357],{"class":303},"}\n",[171,359,360,361,364],{},"The adapter reads the ",[182,362,363],{},"PORT"," Lucity injects. From that point on you have API routes, per-request rendering and everything else a server can do, and you are paying for a running container.",[171,366,367,368,371,372,375,376,378],{},"Use ",[182,369,370],{},"output: 'static'"," with selected pages marked ",[182,373,374],{},"export const prerender = false",", or ",[182,377,228],{}," with the reverse, depending on which side the majority of your pages fall on.",[380,381,382,383,386,387,390],"note",{},"Adapters for other hosts, ",[182,384,385],{},"@astrojs\u002Fvercel"," and friends, produce output shaped for those platforms. On Lucity use ",[182,388,389],{},"@astrojs\u002Fnode",", which produces a plain Node server that runs anywhere.",[219,392,394],{"id":393},"content-images-and-data","Content, images and data",[171,396,397,398,401],{},"A static Astro build talks to APIs at build time, so any database or CMS it reads must be reachable from the build. For a ",[207,399,400],{"href":72},"PostgreSQL database"," on Lucity, that means the static path will not work: the database is only reachable from inside the environment at runtime. Use the Node adapter if your pages need live data.",[171,403,404,405,408],{},"Images processed by ",[182,406,407],{},"astro:assets"," are optimized during the build, which is memory-hungry on large sites. If a build dies without an error message, that is usually why.",[171,410,411,412,415],{},"User uploads belong in a ",[207,413,414],{"href":76},"bucket"," regardless of which mode you choose, since neither a static server nor a container keeps files between rollouts.",[219,417,419],{"id":418},"next-steps","Next steps",[421,422,423,429,434],"ul",{},[424,425,426,428],"li",{},[207,427,59],{"href":60}," for detection and build caching",[424,430,431,433],{},[207,432,67],{"href":68}," to put the site on your own hostname",[424,435,436,438],{},[207,437,75],{"href":76}," for anything users upload",[440,441,442],"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}",{"title":180,"searchDepth":307,"depth":307,"links":444},[445,446,447,448],{"id":221,"depth":307,"text":222},{"id":261,"depth":307,"text":262},{"id":393,"depth":307,"text":394},{"id":418,"depth":307,"text":419},"Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.","md",null,{},{"title":27},{"title":166,"description":449},"IRkh9zcHvoy2UrNAr_x5JFgDTM0iNWOBWJ3XHTttEko",[457,459],{"title":23,"path":24,"stem":25,"description":458,"children":-1},"Deploy a SvelteKit app on Lucity. One adapter change stands between a fresh project and a running service.",{"title":31,"path":32,"stem":33,"description":460,"children":-1},"Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",[462,465,467,470,473,475,476,478,481,484,487,490,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,536,540,544],{"path":6,"title":463,"description":464},"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":466,"title":9,"description":451},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":468,"description":469},"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":471,"description":472},"Deploy a Nuxt app","Deploy a Nuxt app on Lucity. Nitro output, runtime config, and a database, with no preset to pick.",{"path":24,"title":474,"description":458},"Deploy a SvelteKit app",{"path":28,"title":166,"description":449},{"path":32,"title":477,"description":460},"Deploy an Express API",{"path":36,"title":479,"description":480},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":482,"description":483},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":485,"description":486},"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":488,"description":489},"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":491,"description":492},"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":494},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":496},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":498},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":500},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":502},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":504},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":506},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":508},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":510},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":512},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":514},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":516},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":518},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":520},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":522},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":524},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":526},"CPU and memory for every service, and disk usage for every volume.",{"path":120,"title":119,"description":528},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":530},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":532},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":534,"title":535,"description":451},"\u002Flegal\u002F.navigation","Legal",{"path":537,"title":538,"description":539},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":541,"title":542,"description":543},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":545,"title":546,"description":547},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1791216729196]