[{"data":1,"prerenderedAt":907},["ShallowReactive",2],{"navigation":3,"\u002Fecosystem\u002Fagent-recipe":105,"\u002Fecosystem\u002Fagent-recipe-surround":902},[4,44,79,92],{"title":5,"path":6,"stem":7,"children":8,"icon":43},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11,15,19,23,27,31,35,39],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Quick Start: Service Provider","\u002Fgetting-started\u002Fquickstart-sp","1.getting-started\u002F2.quickstart-sp",{"title":16,"path":17,"stem":18},"Quick Start: Identity Provider","\u002Fgetting-started\u002Fquickstart-idp","1.getting-started\u002F3.quickstart-idp",{"title":20,"path":21,"stem":22},"Quick Start: Agent","\u002Fgetting-started\u002Fquickstart-agent","1.getting-started\u002F4.quickstart-agent",{"title":24,"path":25,"stem":26},"Quick Start","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F5.installation",{"title":28,"path":29,"stem":30},"How It Works","\u002Fgetting-started\u002Fhow-it-works","1.getting-started\u002F6.how-it-works",{"title":32,"path":33,"stem":34},"For Service Providers","\u002Fgetting-started\u002Ffor-service-providers","1.getting-started\u002F7.for-service-providers",{"title":36,"path":37,"stem":38},"CLI (apes & ape-shell)","\u002Fgetting-started\u002Fcli","1.getting-started\u002F8.cli",{"title":40,"path":41,"stem":42},"Free-IdP Hosting Guide","\u002Fgetting-started\u002Ffree-idp-hosting","1.getting-started\u002F9.free-idp-hosting",false,{"title":45,"path":46,"stem":47,"children":48,"icon":43},"Ecosystem","\u002Fecosystem","2.ecosystem\u002F1.index",[49,51,55,59,63,67,71,75],{"title":50,"path":46,"stem":47},"Overview",{"title":52,"path":53,"stem":54},"OpenApe Auth","\u002Fecosystem\u002Fauth","2.ecosystem\u002F2.auth",{"title":56,"path":57,"stem":58},"OpenApe Grants","\u002Fecosystem\u002Fgrants","2.ecosystem\u002F3.grants",{"title":60,"path":61,"stem":62},"nuxt-auth-sp","\u002Fecosystem\u002Fnuxt-auth-sp","2.ecosystem\u002F4.nuxt-auth-sp",{"title":64,"path":65,"stem":66},"escapes","\u002Fecosystem\u002Fescapes","2.ecosystem\u002F5.escapes",{"title":68,"path":69,"stem":70},"nuxt-auth-idp","\u002Fecosystem\u002Fnuxt-auth-idp","2.ecosystem\u002F6.nuxt-auth-idp",{"title":72,"path":73,"stem":74},"Multi-Tenant IdP","\u002Fecosystem\u002Fmulti-tenant-idp","2.ecosystem\u002F7.multi-tenant-idp",{"title":76,"path":77,"stem":78},"Agent Recipe","\u002Fecosystem\u002Fagent-recipe","2.ecosystem\u002F8.agent-recipe",{"title":80,"icon":43,"path":81,"stem":82,"children":83,"page":43},"Security","\u002Fsecurity","3.security",[84,88],{"title":85,"path":86,"stem":87},"Compliance","\u002Fsecurity\u002Fcompliance","3.security\u002F1.compliance",{"title":89,"path":90,"stem":91},"Threat Model","\u002Fsecurity\u002Fthreat-model","3.security\u002F2.threat-model",{"title":93,"icon":43,"path":94,"stem":95,"children":96,"page":43},"Guides","\u002Fguides","4.guides",[97,101],{"title":98,"path":99,"stem":100},"Capabilities & Grants","\u002Fguides\u002Fcapabilities","4.guides\u002F1.capabilities",{"title":102,"path":103,"stem":104},"Delegation","\u002Fguides\u002Fdelegation","4.guides\u002F2.delegation",{"id":106,"title":76,"body":107,"description":896,"extension":897,"links":898,"meta":899,"navigation":847,"path":77,"seo":900,"stem":78,"__hash__":901},"docs\u002F2.ecosystem\u002F8.agent-recipe.md",{"type":108,"value":109,"toc":887},"minimark",[110,114,122,129,134,137,164,174,179,439,582,586,605,646,661,665,672,703,706,730,734,754,758,761,859,862,866,883],[111,112,76],"h1",{"id":113},"agent-recipe",[115,116,117,118,121],"p",{},"An ",[119,120,76],"strong",{}," turns a scheduled, capability-using agent into a\nsingle declarative artifact you can deploy in one step. Instead of\nhand-wiring a script, a password \"somewhere\", a cron entry and a system\nprompt, you point troop at a pinned repo and it provisions everything.",[115,123,124,125,128],{},"Agent Recipe is a ",[119,126,127],{},"troop feature and a repo convention"," — not a\nprotocol. There is nothing in the DDISA spec about it.",[130,131,133],"h2",{"id":132},"the-shape-of-a-recipe","The shape of a recipe",[115,135,136],{},"A recipe repo has two parts:",[138,139,140,150,158],"ul",{},[141,142,143,149],"li",{},[119,144,145],{},[146,147,148],"code",{},"ape-agent.yaml"," — the manifest (all the declarative data).",[141,151,152,157],{},[119,153,154],{},[146,155,156],{},"tools\u002F"," — the code part: the actual scripts the agent runs.",[141,159,160,163],{},[146,161,162],{},"README.md"," — for humans.",[165,166,171],"pre",{"className":167,"code":169,"language":170},[168],"language-text","my-recipe\u002F\n├── ape-agent.yaml\n├── tools\u002F\n│   └── summarize.mjs\n└── README.md\n","text",[146,172,169],{"__ignoreMap":173},"",[130,175,177],{"id":176},"ape-agentyaml",[146,178,148],{},[165,180,184],{"className":181,"code":182,"language":183,"meta":173,"style":173},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: bluesky-summary           # kebab-case; becomes the agent slug\nkind: agent                     # v1: only `agent`\nintent: |                       # the prepared system prompt\n  You summarise the Bluesky feed about {{topic}} twice a day.\n  Be concise. Use the tools in tools\u002F via your bash tool.\ncapabilities:                   # declared placeholder env names only\n  - env: BLUESKY_HANDLE\n  - env: BLUESKY_APP_PASSWORD\n    prefer: local               # optional hint: proxy | local\nparams:                         # typed, validated at deploy time\n  - name: topic\n    type: string                # string | number | boolean\n    required: true\nschedules:                      # one agent run per tick\n  - cron: \"0 8 * * *\"\n    description: morning digest for {{topic}}\n  - cron: \"0 18 * * *\"\nuser_addendum: true             # allow a free runtime behaviour layer\ntools:                          # entrypoints under tools\u002F\n  - tools\u002Fsummarize.mjs\n","yaml",[146,185,186,207,221,236,242,248,259,273,285,299,310,323,337,349,360,379,390,406,420,431],{"__ignoreMap":173},[187,188,191,195,199,203],"span",{"class":189,"line":190},"line",1,[187,192,194],{"class":193},"swJcz","name",[187,196,198],{"class":197},"sMK4o",":",[187,200,202],{"class":201},"sfazB"," bluesky-summary",[187,204,206],{"class":205},"sHwdD","           # kebab-case; becomes the agent slug\n",[187,208,210,213,215,218],{"class":189,"line":209},2,[187,211,212],{"class":193},"kind",[187,214,198],{"class":197},[187,216,217],{"class":201}," agent",[187,219,220],{"class":205},"                     # v1: only `agent`\n",[187,222,224,227,229,233],{"class":189,"line":223},3,[187,225,226],{"class":193},"intent",[187,228,198],{"class":197},[187,230,232],{"class":231},"s7zQu"," |",[187,234,235],{"class":205},"                       # the prepared system prompt\n",[187,237,239],{"class":189,"line":238},4,[187,240,241],{"class":201},"  You summarise the Bluesky feed about {{topic}} twice a day.\n",[187,243,245],{"class":189,"line":244},5,[187,246,247],{"class":201},"  Be concise. Use the tools in tools\u002F via your bash tool.\n",[187,249,251,254,256],{"class":189,"line":250},6,[187,252,253],{"class":193},"capabilities",[187,255,198],{"class":197},[187,257,258],{"class":205},"                   # declared placeholder env names only\n",[187,260,262,265,268,270],{"class":189,"line":261},7,[187,263,264],{"class":197},"  -",[187,266,267],{"class":193}," env",[187,269,198],{"class":197},[187,271,272],{"class":201}," BLUESKY_HANDLE\n",[187,274,276,278,280,282],{"class":189,"line":275},8,[187,277,264],{"class":197},[187,279,267],{"class":193},[187,281,198],{"class":197},[187,283,284],{"class":201}," BLUESKY_APP_PASSWORD\n",[187,286,288,291,293,296],{"class":189,"line":287},9,[187,289,290],{"class":193},"    prefer",[187,292,198],{"class":197},[187,294,295],{"class":201}," local",[187,297,298],{"class":205},"               # optional hint: proxy | local\n",[187,300,302,305,307],{"class":189,"line":301},10,[187,303,304],{"class":193},"params",[187,306,198],{"class":197},[187,308,309],{"class":205},"                         # typed, validated at deploy time\n",[187,311,313,315,318,320],{"class":189,"line":312},11,[187,314,264],{"class":197},[187,316,317],{"class":193}," name",[187,319,198],{"class":197},[187,321,322],{"class":201}," topic\n",[187,324,326,329,331,334],{"class":189,"line":325},12,[187,327,328],{"class":193},"    type",[187,330,198],{"class":197},[187,332,333],{"class":201}," string",[187,335,336],{"class":205},"                # string | number | boolean\n",[187,338,340,343,345],{"class":189,"line":339},13,[187,341,342],{"class":193},"    required",[187,344,198],{"class":197},[187,346,348],{"class":347},"sfNiH"," true\n",[187,350,352,355,357],{"class":189,"line":351},14,[187,353,354],{"class":193},"schedules",[187,356,198],{"class":197},[187,358,359],{"class":205},"                      # one agent run per tick\n",[187,361,363,365,368,370,373,376],{"class":189,"line":362},15,[187,364,264],{"class":197},[187,366,367],{"class":193}," cron",[187,369,198],{"class":197},[187,371,372],{"class":197}," \"",[187,374,375],{"class":201},"0 8 * * *",[187,377,378],{"class":197},"\"\n",[187,380,382,385,387],{"class":189,"line":381},16,[187,383,384],{"class":193},"    description",[187,386,198],{"class":197},[187,388,389],{"class":201}," morning digest for {{topic}}\n",[187,391,393,395,397,399,401,404],{"class":189,"line":392},17,[187,394,264],{"class":197},[187,396,367],{"class":193},[187,398,198],{"class":197},[187,400,372],{"class":197},[187,402,403],{"class":201},"0 18 * * *",[187,405,378],{"class":197},[187,407,409,412,414,417],{"class":189,"line":408},18,[187,410,411],{"class":193},"user_addendum",[187,413,198],{"class":197},[187,415,416],{"class":347}," true",[187,418,419],{"class":205},"             # allow a free runtime behaviour layer\n",[187,421,423,426,428],{"class":189,"line":422},19,[187,424,425],{"class":193},"tools",[187,427,198],{"class":197},[187,429,430],{"class":205},"                          # entrypoints under tools\u002F\n",[187,432,434,436],{"class":189,"line":433},20,[187,435,264],{"class":197},[187,437,438],{"class":201}," tools\u002Fsummarize.mjs\n",[440,441,442,455],"table",{},[443,444,445],"thead",{},[446,447,448,452],"tr",{},[449,450,451],"th",{},"Field",[449,453,454],{},"Meaning",[456,457,458,468,484,497,515,546,556,569],"tbody",{},[446,459,460,465],{},[461,462,463],"td",{},[146,464,194],{},[461,466,467],{},"kebab-case; the deployed agent's name (capped at 24 chars).",[446,469,470,474],{},[461,471,472],{},[146,473,212],{},[461,475,476,479,480,483],{},[146,477,478],{},"agent"," only in v1. ",[146,481,482],{},"script"," is a future additive extension.",[446,485,486,490],{},[461,487,488],{},[146,489,226],{},[461,491,492,493,496],{},"The prepared system prompt. ",[146,494,495],{},"{{param}}"," placeholders are interpolated at deploy.",[446,498,499,504],{},[461,500,501],{},[146,502,503],{},"capabilities[]",[461,505,506,507,510,511,514],{},"The ",[119,508,509],{},"names"," of the secrets the recipe needs — never values. ",[146,512,513],{},"prefer"," is a hint only; troop owns the lifecycle.",[446,516,517,522],{},[461,518,519],{},[146,520,521],{},"params[]",[461,523,524,525,527,528,527,531,534,535,538,539,527,541,527,543,545],{},"Typed deploy-time inputs (",[146,526,194],{},", ",[146,529,530],{},"type",[146,532,533],{},"required",", optional ",[146,536,537],{},"default","). Interpolated into ",[146,540,226],{},[146,542,354],{},[146,544,425],{},".",[446,547,548,553],{},[461,549,550],{},[146,551,552],{},"schedules[]",[461,554,555],{},"Cron list (the 5-field subset troop supports). Each tick is one agent run with the intent.",[446,557,558,562],{},[461,559,560],{},[146,561,411],{},[461,563,564,565,568],{},"If ",[146,566,567],{},"true",", the owner gets a free-text behaviour layer editable at runtime (see below).",[446,570,571,576],{},[461,572,573],{},[146,574,575],{},"tools[]",[461,577,578,579,581],{},"Entrypoints under ",[146,580,156],{}," the agent invokes.",[130,583,585],{"id":584},"sourcing-trust","Sourcing & trust",[115,587,588,589,592,593,596,597,600,601,604],{},"Deploy with a ",[119,590,591],{},"pinned ref"," — a version tag (",[146,594,595],{},"v1.0.0",") or a commit\nSHA. A floating ref (",[146,598,599],{},"@main",", a branch) is ",[119,602,603],{},"rejected before any\nfetch",". Integrity comes from the pin.",[165,606,610],{"className":607,"code":608,"language":609,"meta":173,"style":173},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","apes agent deploy github.com\u002Fopenape-ai\u002Fbluesky-summary@v0.1.0 \\\n  --param topic=\"AI agents\"\n","bash",[146,611,612,630],{"__ignoreMap":173},[187,613,614,618,620,623,626],{"class":189,"line":190},[187,615,617],{"class":616},"sBMFI","apes",[187,619,217],{"class":201},[187,621,622],{"class":201}," deploy",[187,624,625],{"class":201}," github.com\u002Fopenape-ai\u002Fbluesky-summary@v0.1.0",[187,627,629],{"class":628},"sTEyZ"," \\\n",[187,631,632,635,638,641,644],{"class":189,"line":209},[187,633,634],{"class":201},"  --param",[187,636,637],{"class":201}," topic=",[187,639,640],{"class":197},"\"",[187,642,643],{"class":201},"AI agents",[187,645,378],{"class":197},[115,647,648,649,652,653,656,657,660],{},"The curated recipe index (e.g. ",[146,650,651],{},"github.com\u002Fopenape-ai\u002Fbluesky-summary",")\nis only a ",[119,654,655],{},"discovery convenience",". It carries ",[119,658,659],{},"no special trust"," —\ncapabilities are always consented explicitly, once, regardless of where\nthe recipe comes from. A curated recipe and your own repo are\ntechnically identical.",[130,662,664],{"id":663},"capabilities-secrets-the-agent-never-sees-them-as-a-stranger","Capabilities & secrets — the agent never sees them as a stranger",[115,666,667,668,671],{},"A recipe only declares ",[119,669,670],{},"placeholder env names",". troop is the broker\nand owns the whole lifecycle:",[673,674,675,682,689,696],"ol",{},[141,676,677,678,681],{},"At deploy you supply the values (prompted, or ",[146,679,680],{},"--secret ENV=val",").",[141,683,684,685,688],{},"troop ",[119,686,687],{},"seals each value to the agent's X25519 public key the\nmoment you submit it"," and stores only the sealed blob. troop's DB,\nlogs and the control-plane WS only ever see ciphertext.",[141,690,691,692,695],{},"The blob is relayed ",[119,693,694],{},"blind"," through the nest to the agent host.",[141,697,698,699,702],{},"The agent — the ",[119,700,701],{},"only"," place plaintext exists — opens it with its\nprivate key and puts it in its own environment.",[115,704,705],{},"Revoke clears the agent's copy on the next connect. Rotate takes effect\nlive, no re-deploy.",[115,707,708,709,713,714,721,722,545],{},"This follows the published principle ",[710,711,712],"em",{},"\"the infrastructure carries the\nknowledge, the agent operates blind\""," —\n",[715,716,720],"a",{"href":717,"rel":718},"https:\u002F\u002Fwww.delta-mind.at\u002Fde\u002Fblog\u002Fwas-der-agent-nicht-weiss",[719],"nofollow","Was der Agent nicht weiß",".\nThe proxy-injection path (where the agent never even decrypts) is the\nNorth-Star; see the ",[715,723,726,729],{"href":724,"rel":725},"https:\u002F\u002Fgithub.com\u002Fopenape-ai\u002Fopenape\u002Fblob\u002Fmain\u002Fdocs\u002Fproxy-secrets.md",[719],[146,727,728],{},"proxy-secrets"," runbook",[130,731,733],{"id":732},"params-vs-user_addendum","Params vs. user_addendum",[138,735,736,743],{},[141,737,738,742],{},[119,739,740],{},[146,741,304],{}," are typed and validated at deploy time, then\ninterpolated into the intent\u002Fschedules\u002Ftools. They are fixed for the\nlife of the deploy.",[141,744,745,749,750,753],{},[119,746,747],{},[146,748,411],{}," is free text the owner can edit any time in\ntroop. It is appended to the intent on every run — ",[119,751,752],{},"no re-deploy",".\nUse it for \"focus on the negative posts\" style tweaks.",[130,755,757],{"id":756},"deploying","Deploying",[115,759,760],{},"CLI and troop UI are equivalent. The CLI:",[165,762,764],{"className":607,"code":763,"language":609,"meta":173,"style":173},"# pinned ref is mandatory\napes agent deploy github.com\u002F\u003Cowner>\u002F\u003Cname>@v1.2.0 \\\n  --param topic=\"AI agents\" \\\n  --secret BLUESKY_HANDLE=me.bsky.social \\\n  --secret BLUESKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx\n\n# omit --secret to be prompted interactively\n# add --json for non-interactive \u002F scripted use\n",[146,765,766,771,812,826,836,843,849,854],{"__ignoreMap":173},[187,767,768],{"class":189,"line":190},[187,769,770],{"class":205},"# pinned ref is mandatory\n",[187,772,773,775,777,779,782,785,788,791,794,797,799,802,805,807,810],{"class":189,"line":209},[187,774,617],{"class":616},[187,776,217],{"class":201},[187,778,622],{"class":201},[187,780,781],{"class":201}," github.com\u002F",[187,783,784],{"class":197},"\u003C",[187,786,787],{"class":201},"owne",[187,789,790],{"class":628},"r",[187,792,793],{"class":197},">",[187,795,796],{"class":201},"\u002F",[187,798,784],{"class":197},[187,800,801],{"class":201},"nam",[187,803,804],{"class":628},"e",[187,806,793],{"class":197},[187,808,809],{"class":201},"@v1.2.0",[187,811,629],{"class":628},[187,813,814,816,818,820,822,824],{"class":189,"line":223},[187,815,634],{"class":201},[187,817,637],{"class":201},[187,819,640],{"class":197},[187,821,643],{"class":201},[187,823,640],{"class":197},[187,825,629],{"class":628},[187,827,828,831,834],{"class":189,"line":238},[187,829,830],{"class":201},"  --secret",[187,832,833],{"class":201}," BLUESKY_HANDLE=me.bsky.social",[187,835,629],{"class":628},[187,837,838,840],{"class":189,"line":244},[187,839,830],{"class":201},[187,841,842],{"class":201}," BLUESKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx\n",[187,844,845],{"class":189,"line":250},[187,846,848],{"emptyLinePlaceholder":847},true,"\n",[187,850,851],{"class":189,"line":261},[187,852,853],{"class":205},"# omit --secret to be prompted interactively\n",[187,855,856],{"class":189,"line":275},[187,857,858],{"class":205},"# add --json for non-interactive \u002F scripted use\n",[115,860,861],{},"What happens: troop fetches and validates the manifest, validates your\nparams, spawns the agent, sets its system prompt to the interpolated\nintent, creates the schedules, and binds the sealed secrets. Within\nseconds the agent is running on its schedule.",[130,863,865],{"id":864},"next-steps","Next Steps",[138,867,868,873,878],{},[141,869,870,872],{},[715,871,98],{"href":99}," — the consent model",[141,874,875,877],{},[715,876,64],{"href":65}," — the privilege boundary the relay uses",[141,879,880,882],{},[715,881,20],{"href":21}," — your first agent",[884,885,886],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":173,"searchDepth":190,"depth":209,"links":888},[889,890,891,892,893,894,895],{"id":132,"depth":209,"text":133},{"id":176,"depth":209,"text":148},{"id":584,"depth":209,"text":585},{"id":663,"depth":209,"text":664},{"id":732,"depth":209,"text":733},{"id":756,"depth":209,"text":757},{"id":864,"depth":209,"text":865},"One-step deployable, scheduled, capability-using agents from a pinned repo.","md",null,{},{"title":76,"description":896},"f3DAjsL9f7QgOQU6eIjzbOhS5pEZsCz3k_POIpfH8ss",[903,905],{"title":72,"path":73,"stem":74,"description":904,"children":-1},"Serve multiple OpenApe IdP domains from a single Nuxt process.",{"title":85,"path":86,"stem":87,"description":906,"children":-1},"NIS2, NIST CSF 2.0, and regulatory compliance.",1781287647231]