[{"data":1,"prerenderedAt":831},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-quickstart":164,"-docs-quickstart-surround":740,"doc-previews":743},[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":733,"extension":734,"links":735,"meta":736,"navigation":737,"path":6,"seo":738,"stem":7,"__hash__":739},"docs\u002Fdocs\u002F01.quickstart.md","Deploy your first service",{"type":168,"value":169,"toc":721},"minimark",[170,174,177,188,681,685,691,696,699,711,714],[171,172,173],"p",{},"By the end of this guide you will have a real application running on the internet: a Next.js feedback board, backed by a PostgreSQL database and an object storage bucket, reachable over HTTPS on a domain of its own.",[171,175,176],{},"It takes about fifteen minutes, most of it spent waiting for a build, and you will not write a Dockerfile, a pipeline config, or a line of YAML along the way.",[171,178,179,180,187],{},"You need a GitHub account. If you don't have one, ",[181,182,186],"a",{"href":183,"rel":184},"https:\u002F\u002Fgithub.com\u002Fsignup",[185],"nofollow","sign up here"," first. Everything else happens in the Lucity dashboard.",[189,190,192,197,211,218,222,226,235,252,259,262,269,274,278,293,299,304,307,322,326,343,349,354,357,364,368,382,388,393,400,411,418,422,440,450,478,484,492,499,502,505,511,516,527,533,538,541,545,563,573,653,667,673],"steps",{"level":191},"2",[193,194,196],"h2",{"id":195},"create-your-lucity-account","Create your Lucity account",[171,198,199,200,205,206,210],{},"Head to ",[181,201,204],{"href":202,"rel":203},"https:\u002F\u002Flucity.cloud\u002Fapp\u002Flogin",[185],"lucity.cloud\u002Fapp\u002Flogin"," and click ",[207,208,209],"strong",{},"Continue with GitHub",".",[171,212,213,214,217],{},"Signing in also installs the Lucity GitHub App, which is how Lucity reads your source code. GitHub will ask which repositories to grant access to. You can pick ",[207,215,216],{},"All repositories"," or select them one by one. Either way you can change it later, and Lucity only ever reads: it never writes to your repository.",[219,220,221],"note",{},"The first 14 days are free, up to €5 of usage, whichever runs out first. No credit card needed to get started. The badge in the dashboard header tracks what's left.",[193,223,225],{"id":224},"fork-the-example-app","Fork the example app",[171,227,228,229,234],{},"The app we're deploying is called ",[181,230,233],{"href":231,"rel":232},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Fvouch",[185],"Vouch",": a small feedback board where people post ideas, vote on them, and optionally attach a screenshot.",[171,236,237,238,242,243,247,248,251],{},"It's worth a quick look at the code before you deploy it. Vouch is a Next.js 15 app that talks to PostgreSQL through ",[239,240,241],"code",{},"pg"," and to any S3-compatible store through the AWS SDK. What it does ",[244,245,246],"em",{},"not"," have is a Dockerfile, and that's the point. Lucity ",[181,249,250],{"href":60},"builds container images straight from source",", detecting the language, framework, build command, and start command on its own.",[171,253,254,255,258],{},"Click ",[207,256,257],{},"Fork"," on the repository page to get your own copy. The rest of this guide assumes you're working from your fork.",[260,261],"fork-button",{},[171,263,264],{},[265,266],"img",{"alt":267,"src":268},"The Fork button on the Vouch repository page","\u002Fimg\u002Fdocs\u002Fquickstart\u002Ffork-button.png",[171,270,271],{},[244,272,273],{},"Your own copy of the repository. Everything after this points at the fork.",[193,275,277],{"id":276},"create-a-project","Create a project",[171,279,280,281,284,285,288,289,292],{},"Signing in drops you on the Projects page, which lists every project in your workspace and is empty on a fresh account. Click ",[207,282,283],{},"New"," in the top right and a command palette opens. Choose ",[207,286,287],{},"GitHub Repository",", pick the account or organization that holds your fork, then search for ",[239,290,291],{},"vouch"," and select it.",[171,294,295],{},[265,296],{"alt":297,"src":298},"The create palette showing the GitHub repository picker","\u002Fimg\u002Fdocs\u002Fquickstart\u002Fcreate-project.png",[171,300,301],{},[244,302,303],{},"The palette lists the repositories the Lucity GitHub App can see.",[171,305,306],{},"Lucity inspects the repository, recognizes a Next.js app, and proposes a project and service name. Confirm those and you land on the project canvas, where your new service is already building.",[171,308,309,310,313,314,317,318,321],{},"A ",[181,311,312],{"href":92},"project"," is the container for everything your application needs. The canvas is where you see it: services, databases, buckets, and how they're wired together. Every project starts with a ",[207,315,316],{},"development"," ",[181,319,320],{"href":96},"environment",", and you can add more later.",[193,323,325],{"id":324},"watch-it-build","Watch it build",[171,327,328,329,331,332,335,336,338,339,342],{},"Click the service node on the canvas to open the service panel, then stay on the ",[207,330,55],{}," tab. You'll see ",[181,333,334],{"href":56},"the deployment move through its phases",", and ",[207,337,119],{}," gives you ",[181,340,341],{"href":120},"the raw build output"," as it streams in.",[171,344,345],{},[265,346],{"alt":347,"src":348},"Build logs streaming in the service panel","\u002Fimg\u002Fdocs\u002Fquickstart\u002Ffirst-build.png",[171,350,351],{},[244,352,353],{},"Build logs stream live: dependency install, framework build, image push.",[171,355,356],{},"First builds usually take two to three minutes, because there is no dependency cache to reuse yet. Later builds are faster.",[171,358,359,360,363],{},"When the image is built and the container is running, the service reports ",[207,361,362],{},"Online",". Your app is up. It just has no way to reach it yet.",[193,365,367],{"id":366},"put-it-on-the-internet","Put it on the internet",[171,369,370,371,374,375,378,379,210],{},"Open the ",[207,372,373],{},"Settings"," tab in the service panel and scroll to ",[207,376,377],{},"Platform Domain",", then click ",[207,380,381],{},"Generate Domain",[171,383,384],{},[265,385],{"alt":386,"src":387},"The Platform Domain section of the service settings tab","\u002Fimg\u002Fdocs\u002Fquickstart\u002Fgenerate-domain.png",[171,389,390],{},[244,391,392],{},"One click issues the hostname, certificate included.",[171,394,395,396,399],{},"A few seconds later you have something like ",[239,397,398],{},"vouch-development-a1b2c3.lucity.app",", with a valid certificate and HTTPS already in place. Click it.",[171,401,402,403,406,407,410],{},"When you are ready to put this on a hostname you own, the ",[207,404,405],{},"Custom Domains"," section right below works the same way. See ",[181,408,409],{"href":68},"domains"," for what that involves.",[171,412,413,414,417],{},"There's your feedback board, live on the internet. It also says ",[207,415,416],{},"Database not connected",", which is fair, because it isn't. Let's fix that.",[193,419,421],{"id":420},"add-a-postgresql-database","Add a PostgreSQL database",[171,423,424,425,428,429,431,432,435,436,439],{},"Back on the canvas, click ",[207,426,427],{},"Create"," in the top right and choose ",[207,430,71],{},". Name it ",[239,433,434],{},"feedback"," and confirm. A ",[181,437,438],{"href":72},"database"," node appears next to your service and starts provisioning.",[171,441,442,443,445,446,449],{},"Now connect the two. Click the service node, open the ",[207,444,63],{}," tab, and click ",[207,447,448],{},"Add Variable",":",[451,452,453,461,464,475],"ol",{},[454,455,456,457,460],"li",{},"Enter ",[239,458,459],{},"DATABASE_URL"," as the key.",[454,462,463],{},"Click the link icon in the value field.",[454,465,466,467,470,471,474],{},"Pick ",[239,468,469],{},"fqdn-uri"," from the ",[207,472,473],{},"Postgres: feedback"," group.",[454,476,477],{},"Save.",[171,479,480],{},[265,481],{"alt":482,"src":483},"The Variables tab with the dynamic variable picker open on the Postgres group","\u002Fimg\u002Fdocs\u002Fquickstart\u002Fvariable-reference.png",[171,485,486],{},[244,487,488,489,491],{},"Linking ",[239,490,459],{}," to a value the platform owns, instead of pasting a connection string.",[171,493,494,495,498],{},"That's a ",[181,496,497],{"href":64},"dynamic variable",": instead of pasting a connection string, you point at a value the platform owns. Lucity keeps it current, the credentials never sit in your repository or in your clipboard, and if the database is ever rebuilt or rotated the variable still resolves.",[171,500,501],{},"Saving variables rolls the service out again with the same image, so it's live in seconds. Only a source change triggers a new build.",[171,503,504],{},"Reload the app. The warning is gone, and the board is now writing to a real database. Add a few posts so there is something to look at.",[171,506,507],{},[265,508],{"alt":509,"src":510},"The Vouch board running on its platform domain","\u002Fimg\u002Fdocs\u002Fquickstart\u002Fapp-live.png",[171,512,513],{},[244,514,515],{},"The board on its own domain, with the posts stored in the linked database.",[171,517,518,519,522,523,526],{},"Now click the database node on the canvas and open the ",[207,520,521],{},"Tables"," tab. Select ",[239,524,525],{},"posts"," and you're looking at the rows you just created, straight from the dashboard.",[171,528,529],{},[265,530],{"alt":531,"src":532},"The database panel on the Tables tab showing the posts rows","\u002Fimg\u002Fdocs\u002Fquickstart\u002Fdatabase-tables.png",[171,534,535],{},[244,536,537],{},"The Tables tab reads straight from the running database.",[219,539,540],{},"Vouch creates its table on the first request, so there's nothing to migrate here. Your own app can run its migrations at startup or as part of its start command.",[193,542,544],{"id":543},"add-an-object-storage-bucket","Add an object storage bucket",[171,546,547,548,550,551,554,555,558,559,562],{},"Vouch can attach images to posts once it has somewhere to put them. On the canvas, click ",[207,549,427],{},", choose ",[207,552,553],{},"Bucket",", and name it ",[239,556,557],{},"attachments",". That is an ",[181,560,561],{"href":76},"object storage bucket",": S3-compatible, private by default.",[171,564,565,566,568,569,572],{},"Back in the service's ",[207,567,63],{}," tab, add five more variables, each linked to the ",[207,570,571],{},"Object Storage: attachments"," group:",[574,575,576,589],"table",{},[577,578,579],"thead",{},[580,581,582,586],"tr",{},[583,584,585],"th",{},"Variable",[583,587,588],{},"Linked to",[590,591,592,605,617,629,641],"tbody",{},[580,593,594,600],{},[595,596,597],"td",{},[239,598,599],{},"S3_BUCKET",[595,601,602],{},[239,603,604],{},"bucket",[580,606,607,612],{},[595,608,609],{},[239,610,611],{},"S3_ACCESS_KEY_ID",[595,613,614],{},[239,615,616],{},"accessKeyId",[580,618,619,624],{},[595,620,621],{},[239,622,623],{},"S3_SECRET_ACCESS_KEY",[595,625,626],{},[239,627,628],{},"secretAccessKey",[580,630,631,636],{},[595,632,633],{},[239,634,635],{},"S3_ENDPOINT",[595,637,638],{},[239,639,640],{},"endpoint",[580,642,643,648],{},[595,644,645],{},[239,646,647],{},"S3_REGION",[595,649,650],{},[239,651,652],{},"region",[171,654,655,656,659,660,663,664,210],{},"Save and reload the app. The feedback form now has an ",[207,657,658],{},"Attach image"," control. Submit a post with an image, then open the bucket node on the canvas and go to the ",[207,661,662],{},"Files"," tab. Your upload is sitting there under ",[239,665,666],{},"uploads\u002F",[171,668,669],{},[265,670],{"alt":671,"src":672},"The bucket panel on the Files tab showing the uploads prefix","\u002Fimg\u002Fdocs\u002Fquickstart\u002Fbucket-files.png",[171,674,675],{},[244,676,677,678,680],{},"Uploads land in the bucket under the ",[239,679,666],{}," prefix.",[193,682,684],{"id":683},"what-you-just-built","What you just built",[171,686,687],{},[265,688],{"alt":689,"src":690},"The project canvas with the service, database and bucket wired together","\u002Fimg\u002Fdocs\u002Fquickstart\u002Fcanvas-complete.png",[171,692,693],{},[244,694,695],{},"One service, one database, one bucket, all in the development environment.",[171,697,698],{},"Three resources, wired together:",[700,701,702,705,708],"ul",{},[454,703,704],{},"A Next.js service, built from source and served over HTTPS on its own domain",[454,706,707],{},"A PostgreSQL database, provisioned and connected through a dynamic variable",[454,709,710],{},"An S3-compatible bucket, holding user uploads",[171,712,713],{},"The service is the only piece with a public address. The database answers on a private hostname that exists inside the environment and nowhere else, and the bucket only opens up to the scoped credentials Lucity injects into the service. Nothing behind the app is reachable from the internet unless you decide to expose it.",[171,715,716,717,720],{},"You wrote no Dockerfile, no Helm values, and no CI config. And none of it is trapped here: everything above is a standard Helm release, a standard PostgreSQL cluster, and a standard bucket. If you ever want to run it yourself, ",[181,718,719],{"href":100},"eject"," hands you the whole setup.",{"title":722,"searchDepth":723,"depth":723,"links":724},"",2,[725,726,727,728,729,730,731,732],{"id":195,"depth":723,"text":196},{"id":224,"depth":723,"text":225},{"id":276,"depth":723,"text":277},{"id":324,"depth":723,"text":325},{"id":366,"depth":723,"text":367},{"id":420,"depth":723,"text":421},{"id":543,"depth":723,"text":544},{"id":683,"depth":723,"text":684},"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.","md",null,{},{"title":5},{"title":166,"description":733},"ZNBjkggHY9rHGv_IHM0NhNjCkdws310api8wdHlnW48",[735,741],{"title":9,"path":10,"stem":11,"description":742,"children":-1},"Deploy guides for the frameworks people actually ship: Next.js, Nuxt, SvelteKit, Astro, Express, FastAPI, Django, Laravel, and Go.",[744,745,747,750,753,756,759,762,765,768,771,774,776,778,780,782,784,786,788,790,792,794,796,798,800,802,804,806,808,810,812,814,816,819,823,827],{"path":6,"title":166,"description":733},{"path":746,"title":9,"description":735},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":748,"description":749},"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":751,"description":752},"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":754,"description":755},"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":757,"description":758},"Deploy an Astro site","Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",{"path":32,"title":760,"description":761},"Deploy an Express API","Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"path":36,"title":763,"description":764},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":766,"description":767},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":769,"description":770},"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":772,"description":773},"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":775,"description":742},"Deploy your framework",{"path":52,"title":51,"description":777},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":779},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":781},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":783},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":785},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":787},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":789},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":791},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":793},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":795},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":797},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":799},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":801},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":803},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":805},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":807},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":809},"CPU and memory for every service, and disk usage for every volume.",{"path":120,"title":119,"description":811},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":813},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":815},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":817,"title":818,"description":735},"\u002Flegal\u002F.navigation","Legal",{"path":820,"title":821,"description":822},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":824,"title":825,"description":826},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":828,"title":829,"description":830},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1791216726227]