[{"data":1,"prerenderedAt":910},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-builds":164,"-docs-builds-surround":817,"doc-previews":822},[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":59,"body":166,"description":810,"extension":811,"links":812,"meta":813,"navigation":814,"path":60,"seo":815,"stem":61,"__hash__":816},"docs\u002Fdocs\u002F05.builds.md",{"type":167,"value":168,"toc":798},"minimark",[169,173,181,186,210,217,238,250,254,265,318,321,325,339,342,346,350,360,444,466,492,496,503,512,516,527,536,542,625,640,652,656,659,662,692,695,703,706,710,718,721,727,730,742,746,761,768,772,794],[170,171,172],"p",{},"A build takes a commit from your repository and produces a container image that Lucity can run. You do not describe how: the builder reads your project, works out what language and framework it is, installs the right toolchain, installs your dependencies, runs your build script, and assembles an image around the result.",[170,174,175,176,180],{},"This happens on every ",[177,178,179],"a",{"href":56},"deployment"," of a service built from a repository. Services created from an existing image skip all of it.",[182,183,185],"h2",{"id":184},"detection","Detection",[170,187,188,189,193,194,197,198,201,202,205,206,209],{},"Detection runs against the files already in your project. A ",[190,191,192],"code",{},"package.json"," makes it a Node project, a ",[190,195,196],{},"go.mod"," a Go project, a ",[190,199,200],{},"requirements.txt"," or ",[190,203,204],{},"pyproject.toml"," a Python one. The same goes for Bun, Deno, PHP, Ruby, Rust, Java, .NET, Elixir, Gleam and C++, and a repository with none of those still builds if it has a ",[190,207,208],{},"Procfile",", a shell script, or a directory of static files.",[170,211,212,213,216],{},"Frameworks get their own handling on top of the language. Next.js, Astro, Vite, Angular, React Router and Expo are recognized on the Node side, Django on the Python side, Laravel on the PHP side, each with the build and start commands that framework expects. The ",[177,214,215],{"href":10},"guides"," cover the ones people ship most.",[170,218,219,220,223,224,226,227,230,231,233,234,237],{},"Toolchain versions come from wherever your project already declares them: the ",[190,221,222],{},"go"," directive in ",[190,225,196],{},", ",[190,228,229],{},"engines"," in ",[190,232,192],{},", a ",[190,235,236],{},".python-version"," file. If nothing says, you get a current stable version, and you can pin one explicitly with a variable.",[170,239,240,241,244,245,249],{},"The start command is derived the same way, from your ",[190,242,243],{},"start"," script, your entrypoint, or the binary that was just compiled. You can ",[177,246,248],{"href":247},"\u002Fdocs\u002Fservices#start-command","override it on the service"," afterwards.",[182,251,253],{"id":252},"build-steps","Build steps",[170,255,256,257,260,261,264],{},"Every step shows up in the build log, which you find in the service's ",[258,259,55],"strong",{}," tab, under the ",[258,262,263],{},"Build"," step of the deployment. It streams while the build runs.",[266,267,268,275,281,287,293,312],"ol",{},[269,270,271,274],"li",{},[258,272,273],{},"Clone."," The repository is fetched at the commit being deployed.",[269,276,277,280],{},[258,278,279],{},"Detect."," The builder inspects the repository and produces a plan containing the toolchain to install, the commands to run, and how to assemble the image.",[269,282,283,286],{},[258,284,285],{},"Install."," The toolchain goes in first, then your dependencies. Your lockfile and manifest are copied in on their own before the install command runs, without the rest of the project.",[269,288,289,292],{},[258,290,291],{},"Copy the source."," The rest of your project goes in after the dependencies are already there.",[269,294,295,298,299,226,302,226,305,201,308,311],{},[258,296,297],{},"Build."," Your build command runs. This is the step where ",[190,300,301],{},"next build",[190,303,304],{},"vite build",[190,306,307],{},"go build",[190,309,310],{},"mix compile"," happens.",[269,313,314,317],{},[258,315,316],{},"Assemble and push."," The toolchain, your dependencies and your built application are combined into a runtime image, which is pushed to the platform registry and tagged with the short commit hash.",[170,319,320],{},"Installing dependencies before the rest of your source is copied in is what makes rebuilds fast. Change application code without touching your lockfile and the dependency install is cached.",[182,322,324],{"id":323},"build-time-variables","Build-time variables",[170,326,327,328,331,332,226,335,338],{},"Every ",[177,329,330],{"href":64},"variable"," on the service is available while it builds, not just while it runs. That is what makes ",[190,333,334],{},"NEXT_PUBLIC_*",[190,336,337],{},"VITE_*"," and friends work, and it is also how you configure the builder itself.",[170,340,341],{},"It cuts both ways. A variable that is read at build time is baked into the image, so changing it does not take effect until the next build, even though saving it rolls the service out. Anything read at runtime picks up the new value on that rollout.",[343,344,345],"note",{},"Keep secrets out of the parts of your build that write to the image. An API key inlined into a JavaScript bundle ships to every visitor, and one baked into an image layer stays readable to anyone who can pull that image. Read secrets at runtime instead, where a rotation reaches the service on the next rollout.",[182,347,349],{"id":348},"build-configuration","Build configuration",[170,351,352,353,356,357,359],{},"The builder reads ",[190,354,355],{},"RAILPACK_","-prefixed variables as instructions. Set them like any other ",[177,358,330],{"href":64}," on the service:",[361,362,363,376],"table",{},[364,365,366],"thead",{},[367,368,369,373],"tr",{},[370,371,372],"th",{},"Variable",[370,374,375],{},"What it does",[377,378,379,390,400,410,424,434],"tbody",{},[367,380,381,387],{},[382,383,384],"td",{},[190,385,386],{},"RAILPACK_INSTALL_CMD",[382,388,389],{},"Replaces the detected dependency install",[367,391,392,397],{},[382,393,394],{},[190,395,396],{},"RAILPACK_BUILD_CMD",[382,398,399],{},"Replaces the detected build command",[367,401,402,407],{},[382,403,404],{},[190,405,406],{},"RAILPACK_START_CMD",[382,408,409],{},"Replaces the detected start command",[367,411,412,417],{},[382,413,414],{},[190,415,416],{},"RAILPACK_PACKAGES",[382,418,419,420,423],{},"Extra toolchain packages, for example ",[190,421,422],{},"python@3.12"," alongside Node",[367,425,426,431],{},[382,427,428],{},[190,429,430],{},"RAILPACK_BUILD_APT_PACKAGES",[382,432,433],{},"System packages available while building",[367,435,436,441],{},[382,437,438],{},[190,439,440],{},"RAILPACK_DEPLOY_APT_PACKAGES",[382,442,443],{},"System packages present in the final image",[170,445,446,447,226,450,226,453,226,456,226,459,226,462,465],{},"Versions get their own variables per language: ",[190,448,449],{},"RAILPACK_NODE_VERSION",[190,451,452],{},"RAILPACK_PYTHON_VERSION",[190,454,455],{},"RAILPACK_GO_VERSION",[190,457,458],{},"RAILPACK_RUBY_VERSION",[190,460,461],{},"RAILPACK_RUST_VERSION",[190,463,464],{},"RAILPACK_JDK_VERSION",", and so on.",[170,467,468,469,472,473,476,477,480,481,484,485,491],{},"Some providers add their own. Go reads ",[190,470,471],{},"RAILPACK_GO_BIN"," when a repository has several binaries under ",[190,474,475],{},"cmd\u002F",", Angular reads ",[190,478,479],{},"RAILPACK_ANGULAR_PROJECT",", PHP reads ",[190,482,483],{},"RAILPACK_PHP_ROOT_DIR",". Railpack's ",[177,486,490],{"href":487,"rel":488},"https:\u002F\u002Frailpack.com\u002Fconfig\u002Fenvironment-variables",[489],"nofollow","environment variables reference"," has the full list.",[182,493,495],{"id":494},"custom-build-plans","Custom build plans",[170,497,498,499,502],{},"For anything the variables cannot express, put a ",[190,500,501],{},"railpack.json"," at the root of your build directory. It is read as configuration and gives you direct control over the plan: the packages to install, the steps to run, what each step depends on, and what ends up in the final image.",[170,504,505,506,511],{},"Railpack's ",[177,507,510],{"href":508,"rel":509},"https:\u002F\u002Frailpack.com\u002Fconfig\u002Ffile\u002F",[489],"configuration file reference"," documents the format.",[182,513,515],{"id":514},"root-directory","Root directory",[170,517,518,519,522,523,526],{},"A service does not have to build from the top of the repository. Each one has a root directory, and pointing each service at its own folder is how a monorepo works here: ",[190,520,521],{},"apps\u002Fapi"," for the API, ",[190,524,525],{},"apps\u002Fweb"," for the web app, one service each.",[170,528,529,530,535],{},"Everything resolves relative to that directory: detection, the install and build commands, and any ",[177,531,533],{"href":532},"#custom-build-plans",[190,534,501],{},". The clone still covers the whole repository, so shared packages outside the root directory are on disk, but whether your tooling can reach them is down to your package manager rather than to Lucity.",[170,537,538,539,541],{},"The root directory is set when the service is created and cannot be changed afterwards. The dashboard does not offer the field yet, so today it is set through the ",[177,540,103],{"href":104},":",[543,544,549],"pre",{"className":545,"code":546,"language":547,"meta":548,"style":548},"language-bash shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","curl https:\u002F\u002Flucity.cloud\u002Fgraphql \\\n  -H \"Authorization: Bearer $(lucity token)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\":\"mutation { addService(environment: \\\"acme\u002Fshop\u002Fproduction\\\", input: { name: \\\"api\\\", repository: \\\"acme\u002Fshop\\\", contextPath: \\\"apps\u002Fapi\\\" }) { id } }\"}'\n","bash","",[190,550,551,568,595,610],{"__ignoreMap":548},[552,553,556,560,564],"span",{"class":554,"line":555},"line",1,[552,557,559],{"class":558},"sX5TD","curl",[552,561,563],{"class":562},"sQLXx"," https:\u002F\u002Flucity.cloud\u002Fgraphql",[552,565,567],{"class":566},"s1Tsi"," \\\n",[552,569,571,574,578,581,584,587,590,593],{"class":554,"line":570},2,[552,572,573],{"class":566},"  -H",[552,575,577],{"class":576},"si-ur"," \"",[552,579,580],{"class":562},"Authorization: Bearer ",[552,582,583],{"class":576},"$(",[552,585,586],{"class":558},"lucity",[552,588,589],{"class":562}," token",[552,591,592],{"class":576},")\"",[552,594,567],{"class":566},[552,596,598,600,602,605,608],{"class":554,"line":597},3,[552,599,573],{"class":566},[552,601,577],{"class":576},[552,603,604],{"class":562},"Content-Type: application\u002Fjson",[552,606,607],{"class":576},"\"",[552,609,567],{"class":566},[552,611,613,616,619,622],{"class":554,"line":612},4,[552,614,615],{"class":566},"  -d",[552,617,618],{"class":576}," '",[552,620,621],{"class":562},"{\"query\":\"mutation { addService(environment: \\\"acme\u002Fshop\u002Fproduction\\\", input: { name: \\\"api\\\", repository: \\\"acme\u002Fshop\\\", contextPath: \\\"apps\u002Fapi\\\" }) { id } }\"}",[552,623,624],{"class":576},"'\n",[170,626,627,628,631,632,635,636,639],{},"Asking the ",[177,629,630],{"href":112},"Claude plugin"," to add the service does the same thing without the GraphQL, since its ",[190,633,634],{},"add_service"," tool takes the root directory as ",[190,637,638],{},"context_path",".",[343,641,642,643,647,648,651],{},"A push to the tracked branch deploys every service that tracks it, whether or not anything under its directory changed. There is no path filtering, so in a busy repository turn off auto-deploy and ",[177,644,646],{"href":645},"\u002Fdocs\u002Fdeployments#triggering-a-deployment","deploy from a workflow"," instead, where the ",[190,649,650],{},"paths"," filter in GitHub Actions decides which services a commit should touch.",[182,653,655],{"id":654},"caching","Caching",[170,657,658],{},"Every service has a build cache. Each successful build fills it, and the next one starts from it, which is why a first build takes minutes and the ones after it usually take far less.",[170,660,661],{},"What gets reused follows the order of the steps:",[663,664,665,672,679,685],"ul",{},[269,666,667,668,671],{},"Changing your ",[258,669,670],{},"lockfile"," reinstalls dependencies, and everything after that runs again.",[269,673,674,675,678],{},"Changing ",[258,676,677],{},"application code"," reuses the dependency install and reruns the build command.",[269,680,681,682,684],{},"Changing a ",[258,683,330],{}," invalidates the build from the point where variables are read onwards.",[269,686,687,688,691],{},"The ",[258,689,690],{},"toolchain install"," is reused until you change the version.",[170,693,694],{},"The very first build for a service has nothing to import, and the log says so with a line that looks alarming and is not:",[543,696,701],{"className":697,"code":699,"language":700},[698],"language-text","#1 importing cache manifest from ...:buildcache\n#1 ERROR: failed to configure registry cache importer: ...:buildcache: not found\n","text",[190,702,699],{"__ignoreMap":548},[170,704,705],{},"That is the cache being absent on a first build. The build carries on and populates it.",[182,707,709],{"id":708},"troubleshooting","Troubleshooting",[170,711,712,713,260,715,717],{},"If a build fails, start with the build log. You find it in the service's ",[258,714,55],{},[258,716,263],{}," step of the deployment that failed. Nothing is deployed when a build fails, so the version that was already running keeps running and there is no rush.",[170,719,720],{},"Most failures are ordinary and the log says so plainly: a dependency that will not install, a type error, a script that does not exist. Two are worth knowing about because the log is less forthcoming. A build that stops mid-command without printing an error has usually run out of memory, and deploying again is worth trying before you go hunting for a cause. A build still running after 30 minutes is cancelled, and builds are never retried automatically.",[170,722,723,724,726],{},"If the log does not make it obvious, hand it to the ",[177,725,630],{"href":112},". It can read the failing build's log alongside your local checkout, work out which change broke it, and usually fix it and deploy again.",[170,728,729],{},"Deploying a commit that is already building joins the build in progress rather than starting a second one.",[343,731,732,733,736,737,741],{},"A ",[190,734,735],{},"Dockerfile"," in your repository is ignored. The builder works from your project files rather than from build instructions you write. When you need exact control over the image, build it yourself, publish it, and add it as a ",[177,738,740],{"href":739},"\u002Fdocs\u002Fservices#source-builds-and-prebuilt-images","service from an image"," instead.",[182,743,745],{"id":744},"under-the-hood","Under the hood",[170,747,748,749,754,755,760],{},"Detection and the build plan come from ",[177,750,753],{"href":751,"rel":752},"https:\u002F\u002Frailpack.com",[489],"Railpack",". The Railway team open-sourced the one part of their platform that felt like magic, and we took them up on it. The plan is compiled into a ",[177,756,759],{"href":757,"rel":758},"https:\u002F\u002Fgithub.com\u002Fmoby\u002Fbuildkit",[489],"BuildKit"," build graph and solved by a shared BuildKit daemon, which is what does the layer caching and the parallelism you can see in the log.",[170,762,763,764,767],{},"What comes out is an ordinary OCI image in the platform's registry. There is nothing Lucity-specific inside it, so the same image runs under any container runtime, which is part of what makes ",[177,765,766],{"href":100},"ejecting"," work.",[182,769,771],{"id":770},"next-steps","Next steps",[663,773,774,779,784,789],{},[269,775,776,778],{},[177,777,55],{"href":56}," for what happens once the image exists",[269,780,781,783],{},[177,782,63],{"href":64}," for the build-time and runtime split",[269,785,786,788],{},[177,787,51],{"href":52}," for ports, health checks and resources",[269,790,791,793],{},[177,792,9],{"href":10}," for what the builder does with your particular framework",[795,796,797],"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 .s1Tsi, html code.shiki .s1Tsi{--shiki-light:#D3869B;--shiki-default:#D3869B;--shiki-dark:#D3869B}html pre.shiki code .si-ur, html code.shiki .si-ur{--shiki-light:#A89984;--shiki-default:#A89984;--shiki-dark:#A89984}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);}",{"title":548,"searchDepth":570,"depth":570,"links":799},[800,801,802,803,804,805,806,807,808,809],{"id":184,"depth":570,"text":185},{"id":252,"depth":570,"text":253},{"id":323,"depth":570,"text":324},{"id":348,"depth":570,"text":349},{"id":494,"depth":570,"text":495},{"id":514,"depth":570,"text":515},{"id":654,"depth":570,"text":655},{"id":708,"depth":570,"text":709},{"id":744,"depth":570,"text":745},{"id":770,"depth":570,"text":771},"How Lucity turns your source code into a container image.","md",null,{},true,{"title":59,"description":810},"Ve81VIAa149ejyORdnO2L2GN86wKLljTU_egjMhZoU4",[818,820],{"title":55,"path":56,"stem":57,"description":819,"children":-1},"How a deployment goes live on Lucity, and the ways to trigger one.",{"title":63,"path":64,"stem":65,"description":821,"children":-1},"Configuration for your services: service variables, shared variables, and dynamic variables.",[823,826,828,831,834,837,840,843,846,849,852,855,858,860,861,862,863,865,867,869,871,873,875,877,879,881,883,885,887,889,891,893,895,898,902,906],{"path":6,"title":824,"description":825},"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":827,"title":9,"description":812},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":829,"description":830},"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":832,"description":833},"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":835,"description":836},"Deploy a SvelteKit app","Deploy a SvelteKit app on Lucity. One adapter change stands between a fresh project and a running service.",{"path":28,"title":838,"description":839},"Deploy an Astro site","Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",{"path":32,"title":841,"description":842},"Deploy an Express API","Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"path":36,"title":844,"description":845},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":847,"description":848},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":850,"description":851},"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":853,"description":854},"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":856,"description":857},"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":859},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":819},{"path":60,"title":59,"description":810},{"path":64,"title":63,"description":821},{"path":68,"title":67,"description":864},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":866},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":868},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":870},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":872},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":874},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":876},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":878},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":880},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":882},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":884},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":886},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":888},"CPU and memory for every service, and disk usage for every volume.",{"path":120,"title":119,"description":890},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":892},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":894},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":896,"title":897,"description":812},"\u002Flegal\u002F.navigation","Legal",{"path":899,"title":900,"description":901},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":903,"title":904,"description":905},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":907,"title":908,"description":909},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1791216727970]