[{"data":1,"prerenderedAt":1234},["ShallowReactive",2],{"repo-tree":3,"repo-\u002Finfra\u002Fdokploy\u002Freadme":283},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,69,72,75,78,81,84,86,88,90,93,96,99,102,105,108,111,114,117,120,123,125,127,129,131,133,135,138,141,143,146,149,152,155,158,161,164,167,169,172,175,178,180,183,186,189,192,195,198,201,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281],{"path":5,"title":6},"\u002Fagents\u002Fbackend-code-style","Backend Conventions",{"path":8,"title":9},"\u002Fagents\u002Fdatabase","Database",{"path":11,"title":12},"\u002Fagents\u002Fportal-code-style","Portal Conventions",{"path":14,"title":15},"\u002Fagents\u002Ftranslation","Translation",{"path":17,"title":18},"\u002Fconventions\u002Fbackend-coding","Backend coding conventions",{"path":20,"title":21},"\u002Fconventions\u002Ffrontend-coding","Frontend coding conventions",{"path":23,"title":24},"\u002Fdevelopment-process","Development process",{"path":26,"title":27},"\u002Flearning-api-preview-hetzner-setup","Learning API Preview on Hetzner + Cloudflare",{"path":29,"title":30},"\u002Flearning-api-preview-vm-plan","Learning API Preview VM Plan",{"path":32,"title":33},"\u002Fmonorepo-structure","Monorepo structure",{"path":35,"title":36},"\u002Foperations","Operations — bugs and support",{"path":38,"title":39},"\u002Fpostmortems\u002F2026-03-16_onboarding-currency-regression","Onboarding Zod transform silently broken — web signups assigned wrong checkout currency",{"path":41,"title":42},"\u002Fpostmortems\u002Freadme","Postmortems",{"path":44,"title":45},"\u002Fpostmortems\u002F_template","TEMPLATE",{"path":47,"title":48},"\u002Fpostmortems\u002Fposthog-comparison","Postmortem practice — comparison with PostHog",{"path":50,"title":51},"\u002Fpreview-environment-plan","Preview Environment Plan",{"path":53,"title":54},"\u002Fprinciples","Engineering principles",{"path":56,"title":57},"\u002Fworking-with-ai","Working with AI",{"path":59,"title":60},"\u002F.claude\u002Fskills\u002Feval-playground\u002Fskill","Eval Playground — Co-development Skill",{"path":62,"title":63},"\u002F.claude\u002Fskills\u002Ffigma-diff-section\u002Fskill","Figma Diff Section Pipeline",{"path":65,"title":66},"\u002Fagents","AGENTS.md",{"path":68,"title":66},"\u002Fclaude",{"path":70,"title":71},"\u002Freadme","Studyflash",{"path":73,"title":74},"\u002Fapps\u002Fcore-api\u002Fagents","Core API (apps\u002Fcore-api)",{"path":76,"title":77},"\u002Fapps\u002Fcore-api\u002Freadme","README",{"path":79,"title":80},"\u002Fapps\u002Femail-previews\u002Fagents","Email Previews (apps\u002Femail-previews)",{"path":82,"title":83},"\u002Fapps\u002Flanding-page\u002Fagents","Landing Page (apps\u002Flanding-page)",{"path":85,"title":83},"\u002Fapps\u002Flanding-page\u002Fclaude",{"path":87,"title":66},"\u002Fapps\u002Flearning-api\u002Fagents",{"path":89,"title":77},"\u002Fapps\u002Flearning-api\u002Freadme",{"path":91,"title":92},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Feval_metrics_design","Surface-Specific Eval Metrics Design",{"path":94,"title":95},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ftest_set","Quiz Eval Test Set",{"path":97,"title":98},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ffrontend\u002Freadme","React + TypeScript + Vite",{"path":100,"title":101},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fcontent-pillar-shallow-coverage\u002Freadme","Content pillar misses subtopics in dense documents",{"path":103,"title":104},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-empty-section-headers\u002Freadme","Empty section headers dropped by docling chunker",{"path":106,"title":107},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-table-reading-order\u002Freadme","Table\u002Fbox layout causes wrong reading order",{"path":109,"title":110},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fmetrics\u002Freadme","Quiz eval metrics — canonical rubrics",{"path":112,"title":113},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-12-quiz-summary-feedback-current-state","Quiz and Summary Feedback Current State",{"path":115,"title":116},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-24-quiz-eval-metrics","Quiz Evaluation Metrics",{"path":118,"title":119},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-05-01-quiz-eval-current-state","Quiz Eval Current State",{"path":121,"title":122},"\u002Fapps\u002Flearning-api\u002Fmonitoring\u002Freadme","Monitoring Stack",{"path":124,"title":77},"\u002Fapps\u002Flearning-api\u002Fshared\u002Freadme",{"path":126,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fflashcard_agent\u002Freadme",{"path":128,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fingestion_agent\u002Freadme",{"path":130,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fquiz_agent\u002Freadme",{"path":132,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fsummary_agent\u002Freadme",{"path":134,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Fparser\u002Freadme",{"path":136,"title":137},"\u002Fapps\u002Fmarketing-emails-preview\u002Fagents","Marketing Emails Preview (apps\u002Fmarketing-emails-preview)",{"path":139,"title":140},"\u002Fapps\u002Fmobile-app\u002Fagents","StudyFlash Mobile App - Claude Code Configuration",{"path":142,"title":140},"\u002Fapps\u002Fmobile-app\u002Fclaude",{"path":144,"title":145},"\u002Fapps\u002Fmountain-max\u002Fagents","Mountain Max (apps\u002Fmountain-max)",{"path":147,"title":148},"\u002Fapps\u002Fmountain-max\u002Fgame\u002Freadme","Mountain Max Game",{"path":150,"title":151},"\u002Fapps\u002Fportal\u002Fagents","Portal (apps\u002Fportal)",{"path":153,"title":154},"\u002Fapps\u002Fportal\u002Freadme","Nuxt Minimal Starter",{"path":156,"title":157},"\u002Fapps\u002Fportal\u002Fapp\u002Fcomposables\u002Ffiles\u002Freadme","File Upload Composables",{"path":159,"title":160},"\u002Fapps\u002Fportal\u002Fdocs\u002Flibrary-routing","Library Routing Documentation",{"path":162,"title":163},"\u002Fapps\u002Fsupabase\u002Fagents","Supabase (apps\u002Fsupabase)",{"path":165,"title":166},"\u002Fapps\u002Fwrapped\u002Fagents","Wrapped (apps\u002Fwrapped)",{"path":168,"title":98},"\u002Fapps\u002Fwrapped\u002Freadme",{"path":170,"title":171},"\u002Finfra\u002Freadme","infra\u002F",{"path":173,"title":174},"\u002Finfra\u002Fdns\u002Freadme","DNS Infrastructure",{"path":176,"title":177},"\u002Finfra\u002Fdokploy\u002Freadme","studyflash-dokploy",{"path":179,"title":77},"\u002Finfra\u002Fdokploy\u002Fsdk\u002Fnodejs\u002Freadme",{"path":181,"title":182},"\u002Finfra\u002Finfisical\u002Freadme","Infisical Infrastructure",{"path":184,"title":185},"\u002Finfra\u002Flearning-api\u002Freadme","Pulumi GCP TypeScript Template",{"path":187,"title":188},"\u002Finfra\u002Fopenreplay\u002Freadme","OpenReplay on Hetzner",{"path":190,"title":191},"\u002Finfra\u002Fscripts\u002Freadme","infra\u002Fscripts\u002F",{"path":193,"title":194},"\u002Finfra\u002Fturborepo-cache\u002Freadme","Turborepo Remote Cache Infrastructure",{"path":196,"title":197},"\u002Finternal\u002Fchatwoot\u002Freadme","Chatwoot Infrastructure",{"path":199,"title":200},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Freadme","studyflash-chatwoot-provider",{"path":202,"title":77},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Fsdk\u002Fnodejs\u002Freadme",{"path":204,"title":205},"\u002Finternal\u002Fdocs\u002Freadme","internal\u002Fdocs",{"path":207,"title":208},"\u002Finternal\u002Fsupport-bot\u002Fclaude","Support Bot (Maximilian)",{"path":210,"title":211},"\u002Finternal\u002Fsupport-bot\u002Freadme","Studyflash Customer Support Bot (Maximilian)",{"path":213,"title":214},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Faccount_issues","Account Issues",{"path":216,"title":217},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fbilling_invoice","Billing Invoice",{"path":219,"title":220},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fcontent_upload","Content Upload",{"path":222,"title":223},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fdata_loss","Data Loss",{"path":225,"title":226},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fflashcard_issues","Flashcard Issues",{"path":228,"title":229},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgarbage","Garbage",{"path":231,"title":232},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgeneral_how_to","General How To",{"path":234,"title":235},"\u002Finternal\u002Fsupport-bot\u002Fkb","Knowledge Base Index",{"path":237,"title":238},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Flanguage_issues","Language Issues",{"path":240,"title":241},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmindmap_issues","Mindmap Issues",{"path":243,"title":244},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmisunderstanding","Misunderstanding",{"path":246,"title":247},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmock_exam_issues","Mock Exam Issues",{"path":249,"title":250},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fpodcast_issues","Podcast Issues",{"path":252,"title":253},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fquiz_issues","Quiz Issues",{"path":255,"title":256},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Frefund_request","Refund Request",{"path":258,"title":259},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_cancellation","Subscription Cancellation",{"path":261,"title":262},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_info","Subscription Info",{"path":264,"title":265},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsummary_issues","Summary Issues",{"path":267,"title":268},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Ftechnical_errors","Technical Errors",{"path":270,"title":271},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fvideo_issues","Video Issues",{"path":273,"title":274},"\u002Fpackages\u002Fcommon\u002Fdocs\u002Fearly-access-features","Declarative Early Access Features",{"path":276,"title":277},"\u002Fpackages\u002Fcommon\u002Fscripts\u002Freadme","Common Package Scripts",{"path":279,"title":280},"\u002Fpackages\u002Fdevtools\u002Ffigma-plugins\u002Freadme","Figma plugins",{"path":282,"title":77},"\u002Fpackages\u002Fpulumi-infisical\u002Freadme",{"id":284,"title":177,"body":285,"description":1227,"extension":1228,"lastReviewed":1229,"meta":1230,"navigation":713,"owner":1229,"path":176,"seo":1231,"status":1229,"stem":1232,"tags":1229,"__hash__":1233},"repo\u002Finfra\u002Fdokploy\u002FREADME.md",{"type":286,"value":287,"toc":1216},"minimark",[288,294,334,357,362,477,487,492,535,539,549,586,610,614,632,678,1048,1052,1066,1119,1134,1138,1141,1168,1174,1178,1186,1190,1212],[289,290,291],"h1",{"id":177},[292,293,177],"code",{},[295,296,297,298,305,306,309,310,317,318,321,322,325,326,329,330,333],"p",{},"Pulumi-native resource provider for the self-hosted ",[299,300,304],"a",{"href":301,"rel":302},"https:\u002F\u002Fdokploy.com",[303],"nofollow","Dokploy","\nat ",[292,307,308],{},"dokploy.studyflash.ch",". Implemented in Go via\n",[299,311,314],{"href":312,"rel":313},"https:\u002F\u002Fgithub.com\u002Fpulumi\u002Fpulumi-go-provider",[303],[292,315,316],{},"pulumi-go-provider",". Ships\na real plugin binary (",[292,319,320],{},"pulumi-resource-dokploy",") and a generated TypeScript\nSDK at ",[292,323,324],{},"sdk\u002Fnodejs\u002F",", consumed by sibling stacks under ",[292,327,328],{},"internal\u002F\u003Cservice>\u002F","\nvia ",[292,331,332],{},"workspace:*",".",[295,335,336,337,340,341,344,345,348,349,352,353,356],{},"This used to be a Pulumi Dynamic Provider in TypeScript. It was rewritten\nbecause dynamic providers serialise the JS closure into each resource's\nstate and treat any provider edit as a replace trigger — which, for a\nprovider whose ",[292,338,339],{},"delete"," calls Dokploy's destructive ",[292,342,343],{},"*.delete"," endpoints,\ncatastrophically deleted live resources every time a contributor pushed\na fix. The native implementation has none of those gaps: ",[292,346,347],{},"read"," works,\n",[292,350,351],{},"pulumi import"," and ",[292,354,355],{},"pulumi refresh"," work, and provider edits are a no-op\non existing state.",[358,359,361],"h2",{"id":360},"resources-v0","Resources (v0)",[363,364,365,378],"table",{},[366,367,368],"thead",{},[369,370,371,375],"tr",{},[372,373,374],"th",{},"Pulumi token",[372,376,377],{},"Dokploy API",[379,380,381,404,425,456],"tbody",{},[369,382,383,389],{},[384,385,386],"td",{},[292,387,388],{},"dokploy:index:Project",[384,390,391,394,395,394,398,394,401],{},[292,392,393],{},"project.create"," \u002F ",[292,396,397],{},"project.one",[292,399,400],{},"project.update",[292,402,403],{},"project.remove",[369,405,406,411],{},[384,407,408],{},[292,409,410],{},"dokploy:index:Environment",[384,412,413,394,416,394,419,394,422],{},[292,414,415],{},"environment.create",[292,417,418],{},"environment.one",[292,420,421],{},"environment.update",[292,423,424],{},"environment.remove",[369,426,427,432],{},[384,428,429],{},[292,430,431],{},"dokploy:index:Application",[384,433,434,437,438,437,441,437,444,437,447,394,450,394,453],{},[292,435,436],{},"application.create"," + ",[292,439,440],{},"saveGithubProvider",[292,442,443],{},"saveBuildType",[292,445,446],{},"saveEnvironment",[292,448,449],{},"update",[292,451,452],{},"application.one",[292,454,455],{},"application.delete",[369,457,458,463],{},[384,459,460],{},[292,461,462],{},"dokploy:index:Domain",[384,464,465,394,468,394,471,394,474],{},[292,466,467],{},"domain.create",[292,469,470],{},"domain.one",[292,472,473],{},"domain.update",[292,475,476],{},"domain.delete",[295,478,479,482,483,486],{},[292,480,481],{},"Application"," is the only multi-step resource: Dokploy splits app\nconfiguration across several ",[292,484,485],{},"save*"," mutations, so create\u002Fupdate sequence\nthe calls so the resource looks atomic to the caller.",[488,489,491],"h3",{"id":490},"out-of-scope-for-v0","Out of scope for v0",[493,494,495,519,525,528],"ul",{},[496,497,498,499,502,503,502,506,502,509,502,512,502,515,518],"li",{},"Databases (",[292,500,501],{},"Postgres",", ",[292,504,505],{},"Mariadb",[292,507,508],{},"Mongo",[292,510,511],{},"Mysql",[292,513,514],{},"Redis",[292,516,517],{},"LibSQL",")",[496,520,521,524],{},[292,522,523],{},"Compose"," (Docker Compose stacks)",[496,526,527],{},"Mounts, Redirects, Security, Ports, Registry, Schedule, Backup, SSHKey",[496,529,530,531,534],{},"Non-GitHub source providers (Gitlab\u002FBitbucket\u002FGitea\u002FCustomGit\u002FDockerImage) — the schema's ",[292,532,533],{},"source.type"," discriminator leaves room.",[358,536,538],{"id":537},"build-regenerate","Build \u002F regenerate",[295,540,541,542,502,545,548],{},"The SDK is checked in (TS sources only — ",[292,543,544],{},"bin\u002F",[292,546,547],{},"node_modules\u002F",", and the\nprovider binary are gitignored). Regenerate after any change to a Go file:",[550,551,556],"pre",{"className":552,"code":553,"language":554,"meta":555,"style":555},"language-sh shiki shiki-themes github-light github-dark","make sdk            # build binary, dump schema, regen + build TS SDK\nmake install-plugin # symlink the binary into ~\u002F.pulumi\u002Fplugins\n","sh","",[292,557,558,575],{"__ignoreMap":555},[559,560,563,567,571],"span",{"class":561,"line":562},"line",1,[559,564,566],{"class":565},"sScJk","make",[559,568,570],{"class":569},"sZZnC"," sdk",[559,572,574],{"class":573},"sJ8bj","            # build binary, dump schema, regen + build TS SDK\n",[559,576,578,580,583],{"class":561,"line":577},2,[559,579,566],{"class":565},[559,581,582],{"class":569}," install-plugin",[559,584,585],{"class":573}," # symlink the binary into ~\u002F.pulumi\u002Fplugins\n",[295,587,588,589,592,593,394,596,394,599,602,603,606,607,609],{},"The ",[292,590,591],{},"Makefile"," patches the gen-sdk output to add ",[292,594,595],{},"main",[292,597,598],{},"types",[292,600,601],{},"files","\nfields and to copy ",[292,604,605],{},"package.json"," into ",[292,608,544],{}," so module resolution works\nfrom a Pulumi runtime that requires the compiled artifacts.",[358,611,613],{"id":612},"consuming-from-a-sibling-stack","Consuming from a sibling stack",[295,615,616,617,619,620,623,624,627,628,631],{},"The SDK exposes itself under the npm name ",[292,618,177],{}," via the\ngenerated ",[292,621,622],{},"sdk\u002Fnodejs\u002Fpackage.json",". pnpm picks it up through the\n",[292,625,626],{},"infra\u002F**"," glob in ",[292,629,630],{},"pnpm-workspace.yaml",". In the consumer stack:",[550,633,637],{"className":634,"code":635,"language":636,"meta":555,"style":555},"language-json shiki shiki-themes github-light github-dark","{\n  \"dependencies\": {\n    \"studyflash-dokploy\": \"workspace:*\"\n  }\n}\n","json",[292,638,639,645,654,666,672],{"__ignoreMap":555},[559,640,641],{"class":561,"line":562},[559,642,644],{"class":643},"sVt8B","{\n",[559,646,647,651],{"class":561,"line":577},[559,648,650],{"class":649},"sj4cs","  \"dependencies\"",[559,652,653],{"class":643},": {\n",[559,655,657,660,663],{"class":561,"line":656},3,[559,658,659],{"class":649},"    \"studyflash-dokploy\"",[559,661,662],{"class":643},": ",[559,664,665],{"class":569},"\"workspace:*\"\n",[559,667,669],{"class":561,"line":668},4,[559,670,671],{"class":643},"  }\n",[559,673,675],{"class":561,"line":674},5,[559,676,677],{"class":643},"}\n",[550,679,683],{"className":680,"code":681,"language":682,"meta":555,"style":555},"language-ts shiki shiki-themes github-light github-dark","import * as dokploy from 'studyflash-dokploy';\n\nconst project = new dokploy.Project('customer-support', {\n  name: 'Customer Support',\n});\n\nconst env = new dokploy.Environment('production', {\n  projectId: project.projectId,\n  name: 'production',\n});\n\nconst app = new dokploy.Application('chatwoot', {\n  environmentId: env.environmentId,\n  name: 'chatwoot',\n  source: {\n    type: 'github',\n    owner: 'chatwoot',\n    repository: 'chatwoot',\n    branch: 'master',\n    buildPath: '\u002F',\n    githubId: 'gh_provider_id_in_dokploy',\n  },\n  build: { buildType: 'dockerfile' },\n  env: {\n    POSTGRES_URL: process.env.CHATWOOT_POSTGRES_URL!,\n  },\n});\n\nnew dokploy.Domain('chatwoot-public', {\n  applicationId: app.applicationId,\n  host: 'support.studyflash.ch',\n  https: true,\n  port: 3000,\n  certificateType: 'letsencrypt',\n});\n","ts",[292,684,685,709,715,744,755,760,765,789,795,804,809,814,837,843,852,858,869,879,889,900,911,922,928,940,946,960,965,970,975,993,999,1010,1021,1032,1043],{"__ignoreMap":555},[559,686,687,691,694,697,700,703,706],{"class":561,"line":562},[559,688,690],{"class":689},"szBVR","import",[559,692,693],{"class":649}," *",[559,695,696],{"class":689}," as",[559,698,699],{"class":643}," dokploy ",[559,701,702],{"class":689},"from",[559,704,705],{"class":569}," 'studyflash-dokploy'",[559,707,708],{"class":643},";\n",[559,710,711],{"class":561,"line":577},[559,712,714],{"emptyLinePlaceholder":713},true,"\n",[559,716,717,720,723,726,729,732,735,738,741],{"class":561,"line":656},[559,718,719],{"class":689},"const",[559,721,722],{"class":649}," project",[559,724,725],{"class":689}," =",[559,727,728],{"class":689}," new",[559,730,731],{"class":643}," dokploy.",[559,733,734],{"class":565},"Project",[559,736,737],{"class":643},"(",[559,739,740],{"class":569},"'customer-support'",[559,742,743],{"class":643},", {\n",[559,745,746,749,752],{"class":561,"line":668},[559,747,748],{"class":643},"  name: ",[559,750,751],{"class":569},"'Customer Support'",[559,753,754],{"class":643},",\n",[559,756,757],{"class":561,"line":674},[559,758,759],{"class":643},"});\n",[559,761,763],{"class":561,"line":762},6,[559,764,714],{"emptyLinePlaceholder":713},[559,766,768,770,773,775,777,779,782,784,787],{"class":561,"line":767},7,[559,769,719],{"class":689},[559,771,772],{"class":649}," env",[559,774,725],{"class":689},[559,776,728],{"class":689},[559,778,731],{"class":643},[559,780,781],{"class":565},"Environment",[559,783,737],{"class":643},[559,785,786],{"class":569},"'production'",[559,788,743],{"class":643},[559,790,792],{"class":561,"line":791},8,[559,793,794],{"class":643},"  projectId: project.projectId,\n",[559,796,798,800,802],{"class":561,"line":797},9,[559,799,748],{"class":643},[559,801,786],{"class":569},[559,803,754],{"class":643},[559,805,807],{"class":561,"line":806},10,[559,808,759],{"class":643},[559,810,812],{"class":561,"line":811},11,[559,813,714],{"emptyLinePlaceholder":713},[559,815,817,819,822,824,826,828,830,832,835],{"class":561,"line":816},12,[559,818,719],{"class":689},[559,820,821],{"class":649}," app",[559,823,725],{"class":689},[559,825,728],{"class":689},[559,827,731],{"class":643},[559,829,481],{"class":565},[559,831,737],{"class":643},[559,833,834],{"class":569},"'chatwoot'",[559,836,743],{"class":643},[559,838,840],{"class":561,"line":839},13,[559,841,842],{"class":643},"  environmentId: env.environmentId,\n",[559,844,846,848,850],{"class":561,"line":845},14,[559,847,748],{"class":643},[559,849,834],{"class":569},[559,851,754],{"class":643},[559,853,855],{"class":561,"line":854},15,[559,856,857],{"class":643},"  source: {\n",[559,859,861,864,867],{"class":561,"line":860},16,[559,862,863],{"class":643},"    type: ",[559,865,866],{"class":569},"'github'",[559,868,754],{"class":643},[559,870,872,875,877],{"class":561,"line":871},17,[559,873,874],{"class":643},"    owner: ",[559,876,834],{"class":569},[559,878,754],{"class":643},[559,880,882,885,887],{"class":561,"line":881},18,[559,883,884],{"class":643},"    repository: ",[559,886,834],{"class":569},[559,888,754],{"class":643},[559,890,892,895,898],{"class":561,"line":891},19,[559,893,894],{"class":643},"    branch: ",[559,896,897],{"class":569},"'master'",[559,899,754],{"class":643},[559,901,903,906,909],{"class":561,"line":902},20,[559,904,905],{"class":643},"    buildPath: ",[559,907,908],{"class":569},"'\u002F'",[559,910,754],{"class":643},[559,912,914,917,920],{"class":561,"line":913},21,[559,915,916],{"class":643},"    githubId: ",[559,918,919],{"class":569},"'gh_provider_id_in_dokploy'",[559,921,754],{"class":643},[559,923,925],{"class":561,"line":924},22,[559,926,927],{"class":643},"  },\n",[559,929,931,934,937],{"class":561,"line":930},23,[559,932,933],{"class":643},"  build: { buildType: ",[559,935,936],{"class":569},"'dockerfile'",[559,938,939],{"class":643}," },\n",[559,941,943],{"class":561,"line":942},24,[559,944,945],{"class":643},"  env: {\n",[559,947,949,952,955,958],{"class":561,"line":948},25,[559,950,951],{"class":643},"    POSTGRES_URL: process.env.",[559,953,954],{"class":649},"CHATWOOT_POSTGRES_URL",[559,956,957],{"class":689},"!",[559,959,754],{"class":643},[559,961,963],{"class":561,"line":962},26,[559,964,927],{"class":643},[559,966,968],{"class":561,"line":967},27,[559,969,759],{"class":643},[559,971,973],{"class":561,"line":972},28,[559,974,714],{"emptyLinePlaceholder":713},[559,976,978,981,983,986,988,991],{"class":561,"line":977},29,[559,979,980],{"class":689},"new",[559,982,731],{"class":643},[559,984,985],{"class":565},"Domain",[559,987,737],{"class":643},[559,989,990],{"class":569},"'chatwoot-public'",[559,992,743],{"class":643},[559,994,996],{"class":561,"line":995},30,[559,997,998],{"class":643},"  applicationId: app.applicationId,\n",[559,1000,1002,1005,1008],{"class":561,"line":1001},31,[559,1003,1004],{"class":643},"  host: ",[559,1006,1007],{"class":569},"'support.studyflash.ch'",[559,1009,754],{"class":643},[559,1011,1013,1016,1019],{"class":561,"line":1012},32,[559,1014,1015],{"class":643},"  https: ",[559,1017,1018],{"class":649},"true",[559,1020,754],{"class":643},[559,1022,1024,1027,1030],{"class":561,"line":1023},33,[559,1025,1026],{"class":643},"  port: ",[559,1028,1029],{"class":649},"3000",[559,1031,754],{"class":643},[559,1033,1035,1038,1041],{"class":561,"line":1034},34,[559,1036,1037],{"class":643},"  certificateType: ",[559,1039,1040],{"class":569},"'letsencrypt'",[559,1042,754],{"class":643},[559,1044,1046],{"class":561,"line":1045},35,[559,1047,759],{"class":643},[358,1049,1051],{"id":1050},"adopting-existing-live-resources","Adopting existing live resources",[295,1053,1054,1055,1057,1058,1061,1062,1065],{},"Because ",[292,1056,347],{}," works, adoption uses the standard Pulumi mechanism — pass\n",[292,1059,1060],{},"import: '\u003Cdokploy-id>'"," in the resource options on the first ",[292,1063,1064],{},"pulumi up",":",[550,1067,1069],{"className":680,"code":1068,"language":682,"meta":555,"style":555},"new dokploy.Application(\n  'support-bot',\n  {\n    \u002F* declared shape *\u002F\n  },\n  { import: '4mJhD5fLpfICFC4MYclSG' }\n);\n",[292,1070,1071,1082,1089,1094,1099,1103,1114],{"__ignoreMap":555},[559,1072,1073,1075,1077,1079],{"class":561,"line":562},[559,1074,980],{"class":689},[559,1076,731],{"class":643},[559,1078,481],{"class":565},[559,1080,1081],{"class":643},"(\n",[559,1083,1084,1087],{"class":561,"line":577},[559,1085,1086],{"class":569},"  'support-bot'",[559,1088,754],{"class":643},[559,1090,1091],{"class":561,"line":656},[559,1092,1093],{"class":643},"  {\n",[559,1095,1096],{"class":561,"line":668},[559,1097,1098],{"class":573},"    \u002F* declared shape *\u002F\n",[559,1100,1101],{"class":561,"line":674},[559,1102,927],{"class":643},[559,1104,1105,1108,1111],{"class":561,"line":762},[559,1106,1107],{"class":643},"  { import: ",[559,1109,1110],{"class":569},"'4mJhD5fLpfICFC4MYclSG'",[559,1112,1113],{"class":643}," }\n",[559,1115,1116],{"class":561,"line":767},[559,1117,1118],{"class":643},");\n",[295,1120,1121,1122,1125,1126,1129,1130,1133],{},"Pulumi calls our ",[292,1123,1124],{},"Read(ctx, id)",", populates state from live Dokploy state,\nand from then on the resource is managed normally. Once adoption is\nconfirmed (",[292,1127,1128],{},"pulumi preview"," shows zero diff) the ",[292,1131,1132],{},"import:"," line can be\nremoved.",[358,1135,1137],{"id":1136},"credentials","Credentials",[295,1139,1140],{},"The provider reads two values, in priority order:",[1142,1143,1144,1158],"ol",{},[496,1145,1146,1147,394,1150,1153,1154,1157],{},"Pulumi config: ",[292,1148,1149],{},"dokploy:apiUrl",[292,1151,1152],{},"dokploy:apiKey"," (the latter is ",[292,1155,1156],{},"secret",").",[496,1159,1160,1161,394,1164,1167],{},"Env vars: ",[292,1162,1163],{},"DOKPLOY_API_URL",[292,1165,1166],{},"DOKPLOY_API_KEY"," (used as defaults).",[295,1169,1170,1171,333],{},"Consumer stacks set the env vars via ",[292,1172,1173],{},"infisical run --path=\u002F\u003Cstack>\u002F -- pulumi \u003Caction>",[358,1175,1177],{"id":1176},"layout","Layout",[550,1179,1184],{"className":1180,"code":1182,"language":1183},[1181],"language-text","infra\u002Fdokploy\u002F\n├── main.go              # provider boot\n├── client.go            # Dokploy HTTP client\n├── resources.go         # Project \u002F Environment \u002F Application \u002F Domain\n├── go.mod \u002F go.sum\n├── Makefile             # build \u002F schema \u002F gen-sdk \u002F install-plugin\n├── README.md\n└── sdk\u002Fnodejs\u002F          # generated TS SDK (committed; bin\u002F + node_modules\u002F gitignored)\n","text",[292,1185,1182],{"__ignoreMap":555},[358,1187,1189],{"id":1188},"references","References",[493,1191,1192,1198,1205],{},[496,1193,1194,1195],{},"Pulumi-Go-Provider: ",[299,1196,312],{"href":312,"rel":1197},[303],[496,1199,1200,1201],{},"Dokploy API overview: ",[299,1202,1203],{"href":1203,"rel":1204},"https:\u002F\u002Fdocs.dokploy.com\u002Fdocs\u002Fapi",[303],[496,1206,1207,1208],{},"Dokploy server routers (source of truth for wire schemas):\n",[299,1209,1210],{"href":1210,"rel":1211},"https:\u002F\u002Fgithub.com\u002FDokploy\u002Fdokploy\u002Ftree\u002Fcanary\u002Fapps\u002Fdokploy\u002Fserver\u002Fapi\u002Frouters",[303],[1213,1214,1215],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":555,"searchDepth":577,"depth":577,"links":1217},[1218,1221,1222,1223,1224,1225,1226],{"id":360,"depth":577,"text":361,"children":1219},[1220],{"id":490,"depth":656,"text":491},{"id":537,"depth":577,"text":538},{"id":612,"depth":577,"text":613},{"id":1050,"depth":577,"text":1051},{"id":1136,"depth":577,"text":1137},{"id":1176,"depth":577,"text":1177},{"id":1188,"depth":577,"text":1189},"Pulumi-native resource provider for the self-hosted Dokploy\nat dokploy.studyflash.ch. Implemented in Go via\npulumi-go-provider. Ships\na real plugin binary (pulumi-resource-dokploy) and a generated TypeScript\nSDK at sdk\u002Fnodejs\u002F, consumed by sibling stacks under internal\u002F\u003Cservice>\u002F\nvia workspace:*.","md",null,{},{"title":177,"description":1227},"infra\u002Fdokploy\u002FREADME","ODyVEtDeCmjrE_VNE61lPz3AI026vXmz1BxsneHUIxo",1779007963933]