[{"data":1,"prerenderedAt":1112},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-api":164,"-docs-api-surround":1019,"doc-previews":1024},[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":103,"body":166,"description":1012,"extension":1013,"links":1014,"meta":1015,"navigation":1016,"path":104,"seo":1017,"stem":105,"__hash__":1018},"docs\u002Fdocs\u002F16.api.md",{"type":167,"value":168,"toc":1004},"minimark",[169,187,192,198,282,449,469,543,546,549,558,570,574,577,668,671,675,678,727,734,738,744,910,914,929,991,1000],[170,171,172,173,176,177,181,182,186],"p",{},"Everything the dashboard and the ",[174,175,107],"a",{"href":108}," do goes through one GraphQL API at ",[178,179,180],"code",{},"https:\u002F\u002Flucity.cloud\u002Fgraphql",", which you can call yourself. The ",[174,183,185],{"href":184},"#playground","playground"," documents every query, mutation and type.",[188,189,191],"h2",{"id":190},"authentication","Authentication",[170,193,194,195,197],{},"Every request carries an access token as a bearer token. The ",[174,196,107],{"href":108}," prints one for your session and the active workspace:",[199,200,206],"pre",{"className":201,"code":202,"filename":203,"language":204,"meta":205,"style":205},"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\": \"{ project(id: \\\"zeitlos-software\u002Fvouch\\\") { name environments { name } } }\"}'\n","Request","bash","",[178,207,208,225,252,267],{"__ignoreMap":205},[209,210,213,217,221],"span",{"class":211,"line":212},"line",1,[209,214,216],{"class":215},"sX5TD","curl",[209,218,220],{"class":219},"sQLXx"," https:\u002F\u002Flucity.cloud\u002Fgraphql",[209,222,224],{"class":223},"s1Tsi"," \\\n",[209,226,228,231,235,238,241,244,247,250],{"class":211,"line":227},2,[209,229,230],{"class":223},"  -H",[209,232,234],{"class":233},"si-ur"," \"",[209,236,237],{"class":219},"Authorization: Bearer ",[209,239,240],{"class":233},"$(",[209,242,243],{"class":215},"lucity",[209,245,246],{"class":219}," token",[209,248,249],{"class":233},")\"",[209,251,224],{"class":223},[209,253,255,257,259,262,265],{"class":211,"line":254},3,[209,256,230],{"class":223},[209,258,234],{"class":233},[209,260,261],{"class":219},"Content-Type: application\u002Fjson",[209,263,264],{"class":233},"\"",[209,266,224],{"class":223},[209,268,270,273,276,279],{"class":211,"line":269},4,[209,271,272],{"class":223},"  -d",[209,274,275],{"class":233}," '",[209,277,278],{"class":219},"{\"query\": \"{ project(id: \\\"zeitlos-software\u002Fvouch\\\") { name environments { name } } }\"}",[209,280,281],{"class":233},"'\n",[199,283,288],{"className":284,"code":285,"filename":286,"language":287,"meta":205,"style":205},"language-json shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","{\n  \"data\": {\n    \"project\": {\n      \"name\": \"vouch\",\n      \"environments\": [\n        {\n          \"name\": \"development\"\n        },\n        {\n          \"name\": \"production\"\n        }\n      ]\n    }\n  }\n}\n","Response","json",[178,289,290,295,312,326,349,364,370,390,396,401,419,425,431,437,443],{"__ignoreMap":205},[209,291,292],{"class":211,"line":212},[209,293,294],{"class":233},"{\n",[209,296,297,300,304,306,309],{"class":211,"line":227},[209,298,299],{"class":233},"  \"",[209,301,303],{"class":302},"slqHI","data",[209,305,264],{"class":233},[209,307,308],{"class":233},":",[209,310,311],{"class":233}," {\n",[209,313,314,317,320,322,324],{"class":211,"line":254},[209,315,316],{"class":233},"    \"",[209,318,319],{"class":302},"project",[209,321,264],{"class":233},[209,323,308],{"class":233},[209,325,311],{"class":233},[209,327,328,331,334,336,338,340,344,346],{"class":211,"line":269},[209,329,330],{"class":233},"      \"",[209,332,333],{"class":302},"name",[209,335,264],{"class":233},[209,337,308],{"class":233},[209,339,234],{"class":233},[209,341,343],{"class":342},"sIi04","vouch",[209,345,264],{"class":233},[209,347,348],{"class":233},",\n",[209,350,352,354,357,359,361],{"class":211,"line":351},5,[209,353,330],{"class":233},[209,355,356],{"class":302},"environments",[209,358,264],{"class":233},[209,360,308],{"class":233},[209,362,363],{"class":233}," [\n",[209,365,367],{"class":211,"line":366},6,[209,368,369],{"class":233},"        {\n",[209,371,373,376,378,380,382,384,387],{"class":211,"line":372},7,[209,374,375],{"class":233},"          \"",[209,377,333],{"class":302},[209,379,264],{"class":233},[209,381,308],{"class":233},[209,383,234],{"class":233},[209,385,386],{"class":342},"development",[209,388,389],{"class":233},"\"\n",[209,391,393],{"class":211,"line":392},8,[209,394,395],{"class":233},"        },\n",[209,397,399],{"class":211,"line":398},9,[209,400,369],{"class":233},[209,402,404,406,408,410,412,414,417],{"class":211,"line":403},10,[209,405,375],{"class":233},[209,407,333],{"class":302},[209,409,264],{"class":233},[209,411,308],{"class":233},[209,413,234],{"class":233},[209,415,416],{"class":342},"production",[209,418,389],{"class":233},[209,420,422],{"class":211,"line":421},11,[209,423,424],{"class":233},"        }\n",[209,426,428],{"class":211,"line":427},12,[209,429,430],{"class":233},"      ]\n",[209,432,434],{"class":211,"line":433},13,[209,435,436],{"class":233},"    }\n",[209,438,440],{"class":211,"line":439},14,[209,441,442],{"class":233},"  }\n",[209,444,446],{"class":211,"line":445},15,[209,447,448],{"class":233},"}\n",[170,450,451,452,456,457,460,461,464,465,468],{},"For automation, use a workspace ",[174,453,455],{"href":454},"\u002Fdocs\u002Fworkspaces#api-tokens","API token",". The API doesn't accept the ",[178,458,459],{},"lucity_…"," value itself, so let the CLI exchange it. With the token in ",[178,462,463],{},"LUCITY_API_TOKEN",", ",[178,466,467],{},"lucity token"," prints an access token that carries the API token's role:",[199,470,472],{"className":201,"code":471,"filename":203,"language":204,"meta":205,"style":205},"export LUCITY_API_TOKEN=lucity_…\ncurl https:\u002F\u002Flucity.cloud\u002Fgraphql \\\n  -H \"Authorization: Bearer $(lucity token)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"query\": \"{ projects { id } }\"}'\n",[178,473,474,494,502,520,532],{"__ignoreMap":205},[209,475,476,480,483,487,490],{"class":211,"line":212},[209,477,479],{"class":478},"sjx4h","export",[209,481,482],{"class":342}," LUCITY_API_TOKEN",[209,484,486],{"class":485},"s3drp","=",[209,488,489],{"class":342},"lucity_",[209,491,493],{"class":492},"spvMa","…\n",[209,495,496,498,500],{"class":211,"line":227},[209,497,216],{"class":215},[209,499,220],{"class":219},[209,501,224],{"class":223},[209,503,504,506,508,510,512,514,516,518],{"class":211,"line":254},[209,505,230],{"class":223},[209,507,234],{"class":233},[209,509,237],{"class":219},[209,511,240],{"class":233},[209,513,243],{"class":215},[209,515,246],{"class":219},[209,517,249],{"class":233},[209,519,224],{"class":223},[209,521,522,524,526,528,530],{"class":211,"line":269},[209,523,230],{"class":223},[209,525,234],{"class":233},[209,527,261],{"class":219},[209,529,264],{"class":233},[209,531,224],{"class":223},[209,533,534,536,538,541],{"class":211,"line":351},[209,535,272],{"class":223},[209,537,275],{"class":233},[209,539,540],{"class":219},"{\"query\": \"{ projects { id } }\"}",[209,542,281],{"class":233},[170,544,545],{},"Access tokens are short-lived, so fetch a new one for every run instead of storing it. A token also decides the workspace, and every request runs against the workspace its token belongs to.",[188,547,548],{"id":185},"Playground",[170,550,551,557],{},[174,552,556],{"href":553,"rel":554},"https:\u002F\u002Flucity.cloud\u002Fplayground",[555],"nofollow","lucity.cloud\u002Fplayground"," is an interactive editor for the API, with autocomplete as you type. The book icon in its sidebar opens the documentation, which describes every query, mutation and type, so it doubles as the API reference.",[170,559,560,561,565,566,569],{},"To run queries against your workspace, add your token in the ",[562,563,564],"strong",{},"Headers"," tab as ",[178,567,568],{},"{\"Authorization\": \"Bearer …\"}",".",[188,571,573],{"id":572},"ids","Ids",[170,575,576],{},"Resources are addressed by ids that start with the workspace, and each kind of id has its own scalar type:",[578,579,580,596],"table",{},[581,582,583],"thead",{},[584,585,586,590,593],"tr",{},[587,588,589],"th",{},"Scalar",[587,591,592],{},"Format",[587,594,595],{},"Example",[597,598,599,617,634,651],"tbody",{},[584,600,601,607,612],{},[602,603,604],"td",{},[178,605,606],{},"ProjectID",[602,608,609],{},[178,610,611],{},"workspace\u002Fproject",[602,613,614],{},[178,615,616],{},"zeitlos-software\u002Fvouch",[584,618,619,624,629],{},[602,620,621],{},[178,622,623],{},"EnvironmentID",[602,625,626],{},[178,627,628],{},"workspace\u002Fproject\u002Fenvironment",[602,630,631],{},[178,632,633],{},"zeitlos-software\u002Fvouch\u002Fproduction",[584,635,636,641,646],{},[602,637,638],{},[178,639,640],{},"ServiceID",[602,642,643],{},[178,644,645],{},"workspace\u002Fproject\u002Fenvironment\u002Fservice",[602,647,648],{},[178,649,650],{},"zeitlos-software\u002Fvouch\u002Fproduction\u002Fvouch",[584,652,653,658,663],{},[602,654,655],{},[178,656,657],{},"DatabaseID",[602,659,660],{},[178,661,662],{},"workspace\u002Fproject\u002Fenvironment\u002Fdatabase",[602,664,665],{},[178,666,667],{},"zeitlos-software\u002Fvouch\u002Fproduction\u002Ffeedback",[170,669,670],{},"Key-value stores, buckets and volumes follow the same pattern as databases. Unlike the CLI, the API always takes the full id.",[188,672,674],{"id":673},"roles","Roles",[170,676,677],{},"Every token carries a role, and it can only call the operations that role allows:",[578,679,680,690],{},[581,681,682],{},[584,683,684,687],{},[587,685,686],{},"Role",[587,688,689],{},"Who has it",[597,691,692,702,712],{},[584,693,694,699],{},[602,695,696],{},[562,697,698],{},"Admin",[602,700,701],{},"Workspace admins, and API tokens created with the admin role",[584,703,704,709],{},[602,705,706],{},[562,707,708],{},"Member",[602,710,711],{},"Workspace members, and API tokens created with the member role",[584,713,714,719],{},[602,715,716],{},[562,717,718],{},"Deployer",[602,720,721,722,726],{},"Keyless ",[174,723,725],{"href":724},"\u002Fdocs\u002Fcli#github-actions","GitHub Actions"," sessions",[170,728,729,733],{},[174,730,732],{"href":731},"\u002Fdocs\u002Fworkspaces#members-and-roles","Members and roles"," describes what each role can do.",[188,735,737],{"id":736},"errors","Errors",[170,739,740,741,743],{},"A failed operation still answers with HTTP 200. The reason is in the ",[178,742,736],{}," list, next to whatever data could be returned:",[199,745,747],{"className":284,"code":746,"filename":286,"language":287,"meta":205,"style":205},"{\n  \"errors\": [\n    {\n      \"message\": \"project with id \\\"zeitlos-software\u002Fnope\\\" not found\",\n      \"path\": [\n        \"project\"\n      ],\n      \"locations\": [\n        {\n          \"line\": 1,\n          \"column\": 3\n        }\n      ]\n    }\n  ],\n  \"data\": null\n}\n",[178,748,749,753,765,770,801,814,823,828,841,845,860,874,878,882,886,891,905],{"__ignoreMap":205},[209,750,751],{"class":211,"line":212},[209,752,294],{"class":233},[209,754,755,757,759,761,763],{"class":211,"line":227},[209,756,299],{"class":233},[209,758,736],{"class":302},[209,760,264],{"class":233},[209,762,308],{"class":233},[209,764,363],{"class":233},[209,766,767],{"class":211,"line":254},[209,768,769],{"class":233},"    {\n",[209,771,772,774,777,779,781,783,786,789,792,794,797,799],{"class":211,"line":269},[209,773,330],{"class":233},[209,775,776],{"class":302},"message",[209,778,264],{"class":233},[209,780,308],{"class":233},[209,782,234],{"class":233},[209,784,785],{"class":342},"project with id ",[209,787,788],{"class":223},"\\\"",[209,790,791],{"class":342},"zeitlos-software\u002Fnope",[209,793,788],{"class":223},[209,795,796],{"class":342}," not found",[209,798,264],{"class":233},[209,800,348],{"class":233},[209,802,803,805,808,810,812],{"class":211,"line":351},[209,804,330],{"class":233},[209,806,807],{"class":302},"path",[209,809,264],{"class":233},[209,811,308],{"class":233},[209,813,363],{"class":233},[209,815,816,819,821],{"class":211,"line":366},[209,817,818],{"class":233},"        \"",[209,820,319],{"class":342},[209,822,389],{"class":233},[209,824,825],{"class":211,"line":372},[209,826,827],{"class":233},"      ],\n",[209,829,830,832,835,837,839],{"class":211,"line":392},[209,831,330],{"class":233},[209,833,834],{"class":302},"locations",[209,836,264],{"class":233},[209,838,308],{"class":233},[209,840,363],{"class":233},[209,842,843],{"class":211,"line":398},[209,844,369],{"class":233},[209,846,847,849,851,853,855,858],{"class":211,"line":403},[209,848,375],{"class":233},[209,850,211],{"class":302},[209,852,264],{"class":233},[209,854,308],{"class":233},[209,856,857],{"class":223}," 1",[209,859,348],{"class":233},[209,861,862,864,867,869,871],{"class":211,"line":421},[209,863,375],{"class":233},[209,865,866],{"class":302},"column",[209,868,264],{"class":233},[209,870,308],{"class":233},[209,872,873],{"class":223}," 3\n",[209,875,876],{"class":211,"line":427},[209,877,424],{"class":233},[209,879,880],{"class":211,"line":433},[209,881,430],{"class":233},[209,883,884],{"class":211,"line":439},[209,885,436],{"class":233},[209,887,888],{"class":211,"line":445},[209,889,890],{"class":233},"  ],\n",[209,892,894,896,898,900,902],{"class":211,"line":893},16,[209,895,299],{"class":233},[209,897,303],{"class":302},[209,899,264],{"class":233},[209,901,308],{"class":233},[209,903,904],{"class":223}," null\n",[209,906,908],{"class":211,"line":907},17,[209,909,448],{"class":233},[188,911,913],{"id":912},"live-logs","Live logs",[170,915,916,917,920,921,924,925,928],{},"Logs stream as GraphQL subscriptions over a WebSocket at ",[178,918,919],{},"wss:\u002F\u002Flucity.cloud\u002Fgraphql",", using the ",[178,922,923],{},"graphql-transport-ws"," protocol. Put the token in the ",[178,926,927],{},"connection_init"," payload:",[199,930,932],{"className":284,"code":931,"language":287,"meta":205,"style":205},"{ \"type\": \"connection_init\", \"payload\": { \"Authorization\": \"Bearer \u003Ctoken>\" } }\n",[178,933,934],{"__ignoreMap":205},[209,935,936,939,941,944,946,948,950,952,954,957,959,962,964,966,969,971,974,976,978,980,983,985,988],{"class":211,"line":212},[209,937,938],{"class":233},"{",[209,940,234],{"class":233},[209,942,943],{"class":302},"type",[209,945,264],{"class":233},[209,947,308],{"class":233},[209,949,234],{"class":233},[209,951,927],{"class":342},[209,953,264],{"class":233},[209,955,956],{"class":233},",",[209,958,234],{"class":233},[209,960,961],{"class":302},"payload",[209,963,264],{"class":233},[209,965,308],{"class":233},[209,967,968],{"class":233}," {",[209,970,234],{"class":233},[209,972,973],{"class":302},"Authorization",[209,975,264],{"class":233},[209,977,308],{"class":233},[209,979,234],{"class":233},[209,981,982],{"class":342},"Bearer \u003Ctoken>",[209,984,264],{"class":233},[209,986,987],{"class":233}," }",[209,989,990],{"class":233}," }\n",[170,992,993,994,999],{},"Any client that speaks the protocol works, such as ",[174,995,998],{"href":996,"rel":997},"https:\u002F\u002Fgithub.com\u002Fenisdenjo\u002Fgraphql-ws",[555],"graphql-ws"," for JavaScript.",[1001,1002,1003],"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);}html pre.shiki code .sjx4h, html code.shiki .sjx4h{--shiki-light:#FE8019;--shiki-default:#FE8019;--shiki-dark:#FE8019}html pre.shiki code .sIi04, html code.shiki .sIi04{--shiki-light:#83A598;--shiki-default:#83A598;--shiki-dark:#83A598}html pre.shiki code .s3drp, html code.shiki .s3drp{--shiki-light:#8EC07C;--shiki-default:#8EC07C;--shiki-dark:#8EC07C}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}",{"title":205,"searchDepth":227,"depth":227,"links":1005},[1006,1007,1008,1009,1010,1011],{"id":190,"depth":227,"text":191},{"id":185,"depth":227,"text":548},{"id":572,"depth":227,"text":573},{"id":673,"depth":227,"text":674},{"id":736,"depth":227,"text":737},{"id":912,"depth":227,"text":913},"The GraphQL API behind the dashboard, with an interactive playground.","md",null,{},true,{"title":103,"description":1012},"yFSsywuPiMShV2G3S-Ymh_kcXRroVNedkzDaf8ZBHzc",[1020,1022],{"title":99,"path":100,"stem":101,"description":1021,"children":-1},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"title":107,"path":108,"stem":109,"description":1023,"children":-1},"Deploy and manage your services from a terminal or a CI pipeline.",[1025,1028,1030,1033,1036,1039,1042,1045,1048,1051,1054,1057,1060,1062,1064,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084,1085,1086,1087,1089,1091,1093,1095,1097,1100,1104,1108],{"path":6,"title":1026,"description":1027},"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":1029,"title":9,"description":1014},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":1031,"description":1032},"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":1034,"description":1035},"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":1037,"description":1038},"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":1040,"description":1041},"Deploy an Astro site","Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",{"path":32,"title":1043,"description":1044},"Deploy an Express API","Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"path":36,"title":1046,"description":1047},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":1049,"description":1050},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":1052,"description":1053},"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":1055,"description":1056},"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":1058,"description":1059},"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":1061},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":1063},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":1065},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":1067},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":1069},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":1071},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":1073},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":1075},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":1077},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":1079},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":1081},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":1083},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":1021},{"path":104,"title":103,"description":1012},{"path":108,"title":107,"description":1023},{"path":112,"title":111,"description":1088},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":1090},"CPU and memory for every service, and disk usage for every volume.",{"path":120,"title":119,"description":1092},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":1094},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":1096},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":1098,"title":1099,"description":1014},"\u002Flegal\u002F.navigation","Legal",{"path":1101,"title":1102,"description":1103},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":1105,"title":1106,"description":1107},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":1109,"title":1110,"description":1111},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1791216728701]