[{"data":1,"prerenderedAt":2122},["ShallowReactive",2],{"case-study-aurum-aurora-technical-report-en":3},{"id":4,"title":5,"body":6,"description":2092,"extension":2093,"featured":2094,"interactive":2094,"meta":2095,"navigation":175,"path":2096,"seo":2097,"stem":2098,"subtitle":2099,"tags":2100,"technologies":2106,"__hash__":2121},"caseStudiesEn\u002Fcase-studies\u002Fen\u002Faurum-aurora-technical-report.md","Aurum 2.0 & Aurora — technical report",{"type":7,"value":8,"toc":2076},"minimark",[9,14,18,21,25,28,47,50,54,57,72,75,79,82,85,89,92,95,99,102,105,109,117,564,567,571,574,1043,1050,1054,1061,1169,1184,1191,1201,1485,1488,1492,1495,1828,1839,1843,1846,1895,1898,2059,2062,2066,2069,2072],[10,11,13],"h2",{"id":12},"platform-objective","Platform objective",[15,16,17],"p",{},"Aurum 2.0 separates bespoke customer experience from repeatable operational work. Websites remain independent Vue and Nuxt applications while content, permissions, domain data, publishing, and delivery use shared contracts.",[15,19,20],{},"The platform is not tied to one industry. Business capabilities ship as versioned plugins, allowing new domains to evolve without expanding the core.",[10,22,24],{"id":23},"a-small-core-and-product-plugins","A small core and product plugins",[15,26,27],{},"The Aurum core owns the concerns that require shared trust:",[29,30,31,35,38,41,44],"ul",{},[32,33,34],"li",{},"identity, sessions, and roles;",[32,36,37],{},"the plugin catalog and versions;",[32,39,40],{},"audit and observability;",[32,42,43],{},"contract validation;",[32,45,46],{},"controlled activation.",[15,48,49],{},"A plugin contributes a complete product capability: backend endpoints, administration UI, configuration, permissions, and private data storage. Aurora Editor, Contact Messages, and domain-specific modules are peers in the same runtime.",[10,51,53],{"id":52},"isolation-and-ai-assisted-code","Isolation and AI-assisted code",[15,55,56],{},"Code generated or modified with AI receives no additional trust. Every plugin crosses the same explicit contract boundary:",[58,59,60,63,66,69],"ol",{},[32,61,62],{},"Its manifest declares SDK compatibility, configuration, endpoints, and permissions.",[32,64,65],{},"Access is granted per capability according to least privilege.",[32,67,68],{},"Data and migrations remain private to the plugin.",[32,70,71],{},"A candidate is verified before activation and active traffic.",[15,73,74],{},"The model does not assume generated code is flawless. It contains the possible consequences of a mistake and prevents accidental coupling between modules.",[10,76,78],{"id":77},"aurora-editor","Aurora Editor",[15,80,81],{},"Aurora turns the final website into the editing surface. Developers mark editable elements with stable keys, fallback values, and editorial context. Layout, responsiveness, and rendering remain owned by the client application.",[15,83,84],{},"The embedded website receives no administration token and performs no direct persistence. It sends editing intent to the trusted parent through a versioned message protocol with origin control, nonce-based handshakes, schema validation, correlation identifiers, and revisioned state updates.",[10,86,88],{"id":87},"drafts-publishing-and-history","Drafts, publishing, and history",[15,90,91],{},"Aurora owns drafts, autosave, revisions, conflicts, and published state. Writes contain an expected revision and idempotency key, so concurrent work cannot be silently overwritten.",[15,93,94],{},"Publishing creates an immutable release for a specific revision. A rollback becomes a new release based on an earlier snapshot, preserving a linear and auditable history.",[10,96,98],{"id":97},"safe-activation","Safe activation",[15,100,101],{},"A new plugin version is prepared away from active traffic. Aurum validates its manifest, configuration, backend routes, and interface metadata. Only a complete candidate replaces the previous version atomically.",[15,103,104],{},"If activation fails, the last healthy version remains active. The Kubernetes operator and GitOps connect the image version, configuration, and expected cluster state in one auditable process.",[10,106,108],{"id":107},"backend-plugin-manifest","Backend plugin manifest",[15,110,111,112,116],{},"A plugin is a TypeScript module exporting a manifest defined through ",[113,114,115],"code",{},"@aurum\u002Fbackend-plugin-sdk",". The contract contains the plugin version, SDK compatibility range, permission catalog, configuration schema, and endpoints:",[118,119,124],"pre",{"className":120,"code":121,"language":122,"meta":123,"style":123},"language-ts shiki shiki-themes github-light github-dark","import {\n  definePlugin,\n  type PluginManifest,\n} from \"@aurum\u002Fbackend-plugin-sdk\";\n\nconst READ = \"contact-messages.read\";\nconst WRITE = \"contact-messages.write\";\n\nexport const manifest: PluginManifest = definePlugin({\n  id: \"contact-message\",\n  name: \"Contact\",\n  version: \"1.0.0\",\n  sdkVersion: \"^1.0.0\",\n  permissions: [READ, WRITE],\n  configurationSchema: {\n    type: \"object\",\n    required: [\n      \"retentionDays\",\n      \"publicRateLimit\",\n      \"allowedOrigins\",\n    ],\n    additionalProperties: false,\n    properties: {\n      retentionDays: { type: \"integer\" },\n      publicRateLimit: { type: \"integer\" },\n      allowedOrigins: { type: \"array\" },\n    },\n  },\n  backend: {\n    endpoints: [{\n      method: \"GET\",\n      path: \"\u002Fapi\u002Fcontact-messages\",\n      requireAuth: true,\n      requirePermission: [READ],\n      handler: async (request) =>\n        request.platform.storage.find(\n          \"contactMessages\",\n          {},\n          { sort: { createdAt: -1 } },\n        ),\n    }],\n  },\n});\n","ts","",[113,125,126,139,145,154,170,177,195,210,215,242,254,265,276,287,305,311,322,328,336,344,352,358,369,375,387,397,408,414,420,426,432,443,454,465,475,500,512,520,526,541,547,553,558],{"__ignoreMap":123},[127,128,131,135],"span",{"class":129,"line":130},"line",1,[127,132,134],{"class":133},"szBVR","import",[127,136,138],{"class":137},"sVt8B"," {\n",[127,140,142],{"class":129,"line":141},2,[127,143,144],{"class":137},"  definePlugin,\n",[127,146,148,151],{"class":129,"line":147},3,[127,149,150],{"class":133},"  type",[127,152,153],{"class":137}," PluginManifest,\n",[127,155,157,160,163,167],{"class":129,"line":156},4,[127,158,159],{"class":137},"} ",[127,161,162],{"class":133},"from",[127,164,166],{"class":165},"sZZnC"," \"@aurum\u002Fbackend-plugin-sdk\"",[127,168,169],{"class":137},";\n",[127,171,173],{"class":129,"line":172},5,[127,174,176],{"emptyLinePlaceholder":175},true,"\n",[127,178,180,183,187,190,193],{"class":129,"line":179},6,[127,181,182],{"class":133},"const",[127,184,186],{"class":185},"sj4cs"," READ",[127,188,189],{"class":133}," =",[127,191,192],{"class":165}," \"contact-messages.read\"",[127,194,169],{"class":137},[127,196,198,200,203,205,208],{"class":129,"line":197},7,[127,199,182],{"class":133},[127,201,202],{"class":185}," WRITE",[127,204,189],{"class":133},[127,206,207],{"class":165}," \"contact-messages.write\"",[127,209,169],{"class":137},[127,211,213],{"class":129,"line":212},8,[127,214,176],{"emptyLinePlaceholder":175},[127,216,218,221,224,227,230,234,236,239],{"class":129,"line":217},9,[127,219,220],{"class":133},"export",[127,222,223],{"class":133}," const",[127,225,226],{"class":185}," manifest",[127,228,229],{"class":133},":",[127,231,233],{"class":232},"sScJk"," PluginManifest",[127,235,189],{"class":133},[127,237,238],{"class":232}," definePlugin",[127,240,241],{"class":137},"({\n",[127,243,245,248,251],{"class":129,"line":244},10,[127,246,247],{"class":137},"  id: ",[127,249,250],{"class":165},"\"contact-message\"",[127,252,253],{"class":137},",\n",[127,255,257,260,263],{"class":129,"line":256},11,[127,258,259],{"class":137},"  name: ",[127,261,262],{"class":165},"\"Contact\"",[127,264,253],{"class":137},[127,266,268,271,274],{"class":129,"line":267},12,[127,269,270],{"class":137},"  version: ",[127,272,273],{"class":165},"\"1.0.0\"",[127,275,253],{"class":137},[127,277,279,282,285],{"class":129,"line":278},13,[127,280,281],{"class":137},"  sdkVersion: ",[127,283,284],{"class":165},"\"^1.0.0\"",[127,286,253],{"class":137},[127,288,290,293,296,299,302],{"class":129,"line":289},14,[127,291,292],{"class":137},"  permissions: [",[127,294,295],{"class":185},"READ",[127,297,298],{"class":137},", ",[127,300,301],{"class":185},"WRITE",[127,303,304],{"class":137},"],\n",[127,306,308],{"class":129,"line":307},15,[127,309,310],{"class":137},"  configurationSchema: {\n",[127,312,314,317,320],{"class":129,"line":313},16,[127,315,316],{"class":137},"    type: ",[127,318,319],{"class":165},"\"object\"",[127,321,253],{"class":137},[127,323,325],{"class":129,"line":324},17,[127,326,327],{"class":137},"    required: [\n",[127,329,331,334],{"class":129,"line":330},18,[127,332,333],{"class":165},"      \"retentionDays\"",[127,335,253],{"class":137},[127,337,339,342],{"class":129,"line":338},19,[127,340,341],{"class":165},"      \"publicRateLimit\"",[127,343,253],{"class":137},[127,345,347,350],{"class":129,"line":346},20,[127,348,349],{"class":165},"      \"allowedOrigins\"",[127,351,253],{"class":137},[127,353,355],{"class":129,"line":354},21,[127,356,357],{"class":137},"    ],\n",[127,359,361,364,367],{"class":129,"line":360},22,[127,362,363],{"class":137},"    additionalProperties: ",[127,365,366],{"class":185},"false",[127,368,253],{"class":137},[127,370,372],{"class":129,"line":371},23,[127,373,374],{"class":137},"    properties: {\n",[127,376,378,381,384],{"class":129,"line":377},24,[127,379,380],{"class":137},"      retentionDays: { type: ",[127,382,383],{"class":165},"\"integer\"",[127,385,386],{"class":137}," },\n",[127,388,390,393,395],{"class":129,"line":389},25,[127,391,392],{"class":137},"      publicRateLimit: { type: ",[127,394,383],{"class":165},[127,396,386],{"class":137},[127,398,400,403,406],{"class":129,"line":399},26,[127,401,402],{"class":137},"      allowedOrigins: { type: ",[127,404,405],{"class":165},"\"array\"",[127,407,386],{"class":137},[127,409,411],{"class":129,"line":410},27,[127,412,413],{"class":137},"    },\n",[127,415,417],{"class":129,"line":416},28,[127,418,419],{"class":137},"  },\n",[127,421,423],{"class":129,"line":422},29,[127,424,425],{"class":137},"  backend: {\n",[127,427,429],{"class":129,"line":428},30,[127,430,431],{"class":137},"    endpoints: [{\n",[127,433,435,438,441],{"class":129,"line":434},31,[127,436,437],{"class":137},"      method: ",[127,439,440],{"class":165},"\"GET\"",[127,442,253],{"class":137},[127,444,446,449,452],{"class":129,"line":445},32,[127,447,448],{"class":137},"      path: ",[127,450,451],{"class":165},"\"\u002Fapi\u002Fcontact-messages\"",[127,453,253],{"class":137},[127,455,457,460,463],{"class":129,"line":456},33,[127,458,459],{"class":137},"      requireAuth: ",[127,461,462],{"class":185},"true",[127,464,253],{"class":137},[127,466,468,471,473],{"class":129,"line":467},34,[127,469,470],{"class":137},"      requirePermission: [",[127,472,295],{"class":185},[127,474,304],{"class":137},[127,476,478,481,484,487,490,494,497],{"class":129,"line":477},35,[127,479,480],{"class":232},"      handler",[127,482,483],{"class":137},": ",[127,485,486],{"class":133},"async",[127,488,489],{"class":137}," (",[127,491,493],{"class":492},"s4XuR","request",[127,495,496],{"class":137},") ",[127,498,499],{"class":133},"=>\n",[127,501,503,506,509],{"class":129,"line":502},36,[127,504,505],{"class":137},"        request.platform.storage.",[127,507,508],{"class":232},"find",[127,510,511],{"class":137},"(\n",[127,513,515,518],{"class":129,"line":514},37,[127,516,517],{"class":165},"          \"contactMessages\"",[127,519,253],{"class":137},[127,521,523],{"class":129,"line":522},38,[127,524,525],{"class":137},"          {},\n",[127,527,529,532,535,538],{"class":129,"line":528},39,[127,530,531],{"class":137},"          { sort: { createdAt: ",[127,533,534],{"class":133},"-",[127,536,537],{"class":185},"1",[127,539,540],{"class":137}," } },\n",[127,542,544],{"class":129,"line":543},40,[127,545,546],{"class":137},"        ),\n",[127,548,550],{"class":129,"line":549},41,[127,551,552],{"class":137},"    }],\n",[127,554,556],{"class":129,"line":555},42,[127,557,419],{"class":137},[127,559,561],{"class":129,"line":560},43,[127,562,563],{"class":137},"});\n",[15,565,566],{},"The registry rejects incompatible SDK ranges, duplicate permissions, invalid endpoint contracts, and plugin-owned runtime fields.",[10,568,570],{"id":569},"capability-api-instead-of-raw-infrastructure","Capability API instead of raw infrastructure",[15,572,573],{},"Handlers receive narrow runtime-owned capabilities rather than unrestricted Fastify or MongoDB objects:",[118,575,577],{"className":120,"code":576,"language":122,"meta":123,"style":123},"export interface PlatformCapabilities {\n  readonly pluginId: string;\n  readonly requestId: string;\n  readonly configuration:\n    Readonly\u003CRecord\u003Cstring, unknown>>;\n\n  readonly audit: {\n    write(\n      event: string,\n      details?: Record\u003Cstring, unknown>,\n    ): Promise\u003Cvoid>;\n  };\n\n  readonly storage: {\n    find\u003CT>(\n      collection: string,\n      filter?: Record\u003Cstring, unknown>,\n    ): Promise\u003CT[]>;\n    insertOne\u003CT>(\n      collection: string,\n      document: T,\n    ): Promise\u003Cvoid>;\n    ensureIndex(\n      collection: string,\n      keys: Record\u003Cstring, 1 | -1>,\n      options?: {\n        unique?: boolean;\n        expireAfterSeconds?: number;\n      },\n    ): Promise\u003Cvoid>;\n  };\n\n  readonly rateLimit: {\n    consume(\n      subject: string,\n      policy: {\n        limit: number;\n        windowMilliseconds: number;\n      },\n    ): Promise\u003Cboolean>;\n  };\n}\n",[113,578,579,591,606,619,629,653,657,668,675,686,708,726,731,735,746,759,770,789,804,815,825,837,851,858,868,895,904,916,928,933,947,951,955,966,973,984,993,1004,1015,1019,1034,1038],{"__ignoreMap":123},[127,580,581,583,586,589],{"class":129,"line":130},[127,582,220],{"class":133},[127,584,585],{"class":133}," interface",[127,587,588],{"class":232}," PlatformCapabilities",[127,590,138],{"class":137},[127,592,593,596,599,601,604],{"class":129,"line":141},[127,594,595],{"class":133},"  readonly",[127,597,598],{"class":492}," pluginId",[127,600,229],{"class":133},[127,602,603],{"class":185}," string",[127,605,169],{"class":137},[127,607,608,610,613,615,617],{"class":129,"line":147},[127,609,595],{"class":133},[127,611,612],{"class":492}," requestId",[127,614,229],{"class":133},[127,616,603],{"class":185},[127,618,169],{"class":137},[127,620,621,623,626],{"class":129,"line":156},[127,622,595],{"class":133},[127,624,625],{"class":492}," configuration",[127,627,628],{"class":133},":\n",[127,630,631,634,637,640,642,645,647,650],{"class":129,"line":172},[127,632,633],{"class":232},"    Readonly",[127,635,636],{"class":137},"\u003C",[127,638,639],{"class":232},"Record",[127,641,636],{"class":137},[127,643,644],{"class":185},"string",[127,646,298],{"class":137},[127,648,649],{"class":185},"unknown",[127,651,652],{"class":137},">>;\n",[127,654,655],{"class":129,"line":179},[127,656,176],{"emptyLinePlaceholder":175},[127,658,659,661,664,666],{"class":129,"line":197},[127,660,595],{"class":133},[127,662,663],{"class":492}," audit",[127,665,229],{"class":133},[127,667,138],{"class":137},[127,669,670,673],{"class":129,"line":212},[127,671,672],{"class":232},"    write",[127,674,511],{"class":137},[127,676,677,680,682,684],{"class":129,"line":217},[127,678,679],{"class":492},"      event",[127,681,229],{"class":133},[127,683,603],{"class":185},[127,685,253],{"class":137},[127,687,688,691,694,697,699,701,703,705],{"class":129,"line":244},[127,689,690],{"class":492},"      details",[127,692,693],{"class":133},"?:",[127,695,696],{"class":232}," Record",[127,698,636],{"class":137},[127,700,644],{"class":185},[127,702,298],{"class":137},[127,704,649],{"class":185},[127,706,707],{"class":137},">,\n",[127,709,710,713,715,718,720,723],{"class":129,"line":256},[127,711,712],{"class":137},"    )",[127,714,229],{"class":133},[127,716,717],{"class":232}," Promise",[127,719,636],{"class":137},[127,721,722],{"class":185},"void",[127,724,725],{"class":137},">;\n",[127,727,728],{"class":129,"line":267},[127,729,730],{"class":137},"  };\n",[127,732,733],{"class":129,"line":278},[127,734,176],{"emptyLinePlaceholder":175},[127,736,737,739,742,744],{"class":129,"line":289},[127,738,595],{"class":133},[127,740,741],{"class":492}," storage",[127,743,229],{"class":133},[127,745,138],{"class":137},[127,747,748,751,753,756],{"class":129,"line":307},[127,749,750],{"class":232},"    find",[127,752,636],{"class":137},[127,754,755],{"class":232},"T",[127,757,758],{"class":137},">(\n",[127,760,761,764,766,768],{"class":129,"line":313},[127,762,763],{"class":492},"      collection",[127,765,229],{"class":133},[127,767,603],{"class":185},[127,769,253],{"class":137},[127,771,772,775,777,779,781,783,785,787],{"class":129,"line":324},[127,773,774],{"class":492},"      filter",[127,776,693],{"class":133},[127,778,696],{"class":232},[127,780,636],{"class":137},[127,782,644],{"class":185},[127,784,298],{"class":137},[127,786,649],{"class":185},[127,788,707],{"class":137},[127,790,791,793,795,797,799,801],{"class":129,"line":330},[127,792,712],{"class":137},[127,794,229],{"class":133},[127,796,717],{"class":232},[127,798,636],{"class":137},[127,800,755],{"class":232},[127,802,803],{"class":137},"[]>;\n",[127,805,806,809,811,813],{"class":129,"line":338},[127,807,808],{"class":232},"    insertOne",[127,810,636],{"class":137},[127,812,755],{"class":232},[127,814,758],{"class":137},[127,816,817,819,821,823],{"class":129,"line":346},[127,818,763],{"class":492},[127,820,229],{"class":133},[127,822,603],{"class":185},[127,824,253],{"class":137},[127,826,827,830,832,835],{"class":129,"line":354},[127,828,829],{"class":492},"      document",[127,831,229],{"class":133},[127,833,834],{"class":232}," T",[127,836,253],{"class":137},[127,838,839,841,843,845,847,849],{"class":129,"line":360},[127,840,712],{"class":137},[127,842,229],{"class":133},[127,844,717],{"class":232},[127,846,636],{"class":137},[127,848,722],{"class":185},[127,850,725],{"class":137},[127,852,853,856],{"class":129,"line":371},[127,854,855],{"class":232},"    ensureIndex",[127,857,511],{"class":137},[127,859,860,862,864,866],{"class":129,"line":377},[127,861,763],{"class":492},[127,863,229],{"class":133},[127,865,603],{"class":185},[127,867,253],{"class":137},[127,869,870,873,875,877,879,881,883,885,888,891,893],{"class":129,"line":389},[127,871,872],{"class":492},"      keys",[127,874,229],{"class":133},[127,876,696],{"class":232},[127,878,636],{"class":137},[127,880,644],{"class":185},[127,882,298],{"class":137},[127,884,537],{"class":185},[127,886,887],{"class":133}," |",[127,889,890],{"class":137}," -",[127,892,537],{"class":185},[127,894,707],{"class":137},[127,896,897,900,902],{"class":129,"line":399},[127,898,899],{"class":492},"      options",[127,901,693],{"class":133},[127,903,138],{"class":137},[127,905,906,909,911,914],{"class":129,"line":410},[127,907,908],{"class":492},"        unique",[127,910,693],{"class":133},[127,912,913],{"class":185}," boolean",[127,915,169],{"class":137},[127,917,918,921,923,926],{"class":129,"line":416},[127,919,920],{"class":492},"        expireAfterSeconds",[127,922,693],{"class":133},[127,924,925],{"class":185}," number",[127,927,169],{"class":137},[127,929,930],{"class":129,"line":422},[127,931,932],{"class":137},"      },\n",[127,934,935,937,939,941,943,945],{"class":129,"line":428},[127,936,712],{"class":137},[127,938,229],{"class":133},[127,940,717],{"class":232},[127,942,636],{"class":137},[127,944,722],{"class":185},[127,946,725],{"class":137},[127,948,949],{"class":129,"line":434},[127,950,730],{"class":137},[127,952,953],{"class":129,"line":445},[127,954,176],{"emptyLinePlaceholder":175},[127,956,957,959,962,964],{"class":129,"line":456},[127,958,595],{"class":133},[127,960,961],{"class":492}," rateLimit",[127,963,229],{"class":133},[127,965,138],{"class":137},[127,967,968,971],{"class":129,"line":467},[127,969,970],{"class":232},"    consume",[127,972,511],{"class":137},[127,974,975,978,980,982],{"class":129,"line":477},[127,976,977],{"class":492},"      subject",[127,979,229],{"class":133},[127,981,603],{"class":185},[127,983,253],{"class":137},[127,985,986,989,991],{"class":129,"line":502},[127,987,988],{"class":492},"      policy",[127,990,229],{"class":133},[127,992,138],{"class":137},[127,994,995,998,1000,1002],{"class":129,"line":514},[127,996,997],{"class":492},"        limit",[127,999,229],{"class":133},[127,1001,925],{"class":185},[127,1003,169],{"class":137},[127,1005,1006,1009,1011,1013],{"class":129,"line":522},[127,1007,1008],{"class":492},"        windowMilliseconds",[127,1010,229],{"class":133},[127,1012,925],{"class":185},[127,1014,169],{"class":137},[127,1016,1017],{"class":129,"line":528},[127,1018,932],{"class":137},[127,1020,1021,1023,1025,1027,1029,1032],{"class":129,"line":543},[127,1022,712],{"class":137},[127,1024,229],{"class":133},[127,1026,717],{"class":232},[127,1028,636],{"class":137},[127,1030,1031],{"class":185},"boolean",[127,1033,725],{"class":137},[127,1035,1036],{"class":129,"line":549},[127,1037,730],{"class":137},[127,1039,1040],{"class":129,"line":555},[127,1041,1042],{"class":137},"}\n",[15,1044,1045,1046,1049],{},"Storage collections are automatically namespaced by plugin identity. ",[113,1047,1048],{},"storage.find(\"messages\")"," cannot read the same logical collection owned by another extension.",[10,1051,1053],{"id":1052},"endpoint-permissions-and-scope","Endpoint permissions and scope",[15,1055,1056,1057,1060],{},"An endpoint can require all declared capabilities or any one of them. ",[113,1058,1059],{},"scopeParam"," connects a route parameter to a scoped user grant:",[118,1062,1064],{"className":120,"code":1063,"language":122,"meta":123,"style":123},"{\n  method: \"PATCH\",\n  path: \"\u002Fapi\u002Fprojects\u002F:projectId\u002Fcontent\u002F:id\",\n  requireAuth: true,\n  requirePermission: [\n    \"content.read\",\n    \"content.write\",\n  ],\n  permissionMode: \"all\",\n  scopeParam: \"projectId\",\n  handler: updateContent,\n}\n",[113,1065,1066,1071,1083,1095,1106,1114,1121,1128,1133,1145,1157,1165],{"__ignoreMap":123},[127,1067,1068],{"class":129,"line":130},[127,1069,1070],{"class":137},"{\n",[127,1072,1073,1076,1078,1081],{"class":129,"line":141},[127,1074,1075],{"class":232},"  method",[127,1077,483],{"class":137},[127,1079,1080],{"class":165},"\"PATCH\"",[127,1082,253],{"class":137},[127,1084,1085,1088,1090,1093],{"class":129,"line":147},[127,1086,1087],{"class":232},"  path",[127,1089,483],{"class":137},[127,1091,1092],{"class":165},"\"\u002Fapi\u002Fprojects\u002F:projectId\u002Fcontent\u002F:id\"",[127,1094,253],{"class":137},[127,1096,1097,1100,1102,1104],{"class":129,"line":156},[127,1098,1099],{"class":232},"  requireAuth",[127,1101,483],{"class":137},[127,1103,462],{"class":185},[127,1105,253],{"class":137},[127,1107,1108,1111],{"class":129,"line":172},[127,1109,1110],{"class":232},"  requirePermission",[127,1112,1113],{"class":137},": [\n",[127,1115,1116,1119],{"class":129,"line":179},[127,1117,1118],{"class":165},"    \"content.read\"",[127,1120,253],{"class":137},[127,1122,1123,1126],{"class":129,"line":197},[127,1124,1125],{"class":165},"    \"content.write\"",[127,1127,253],{"class":137},[127,1129,1130],{"class":129,"line":212},[127,1131,1132],{"class":137},"  ],\n",[127,1134,1135,1138,1140,1143],{"class":129,"line":217},[127,1136,1137],{"class":232},"  permissionMode",[127,1139,483],{"class":137},[127,1141,1142],{"class":165},"\"all\"",[127,1144,253],{"class":137},[127,1146,1147,1150,1152,1155],{"class":129,"line":244},[127,1148,1149],{"class":232},"  scopeParam",[127,1151,483],{"class":137},[127,1153,1154],{"class":165},"\"projectId\"",[127,1156,253],{"class":137},[127,1158,1159,1162],{"class":129,"line":256},[127,1160,1161],{"class":232},"  handler",[127,1163,1164],{"class":137},": updateContent,\n",[127,1166,1167],{"class":129,"line":267},[127,1168,1042],{"class":137},[15,1170,1171,1172,1175,1176,1179,1180,1183],{},"A ",[113,1173,1174],{},"content.write"," grant scoped to ",[113,1177,1178],{},"gardenia"," does not authorize writes to ",[113,1181,1182],{},"park-43",". The gateway evaluates the grant before invoking plugin code.",[10,1185,1187,1188],{"id":1186},"declarative-plugin-setyaml","Declarative ",[113,1189,1190],{},"plugin-set.yaml",[15,1192,1193,1194,1197,1198,229],{},"The operator watches ",[113,1195,1196],{},"AurumPluginSet"," resources in ",[113,1199,1200],{},"aurum.dev\u002Fv1alpha1",[118,1202,1206],{"className":1203,"code":1204,"language":1205,"meta":123,"style":123},"language-yaml shiki shiki-themes github-light github-dark","apiVersion: aurum.dev\u002Fv1alpha1\nkind: AurumPluginSet\nmetadata:\n  name: portfolio-platform\n  namespace: gardenia\nspec:\n  applicationRef:\n    targets:\n      - deployment: backend\n        container: backend\n        pluginMountPath: \u002Fapp\u002Fplugins\n      - deployment: frontend\n        container: nginx\n        pluginMountPath: \u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\u002Fplugins\n\n  plugins:\n    - id: contact-message\n      image: europe-west1-docker.pkg.dev\u002Fplatform\u002Faurum\u002Fcontact-message\n      version: 1.0.0\n      digest: sha256:2f36f2c7e5b7c18d81d73ca5e5a7e3b1d9b08a358af7f9b0b1f44f617db45a12\n      configuration:\n        retentionDays: 365\n        publicRateLimit: 5\n        publicRateLimitWindowSeconds: 60\n        allowedOrigins:\n          - https:\u002F\u002Fgardenia.example\n\n    - id: real-estate\n      image: europe-west1-docker.pkg.dev\u002Fplatform\u002Faurum\u002Freal-estate\n      version: 1.0.0\n      tag: 1.0.0\n","yaml",[113,1207,1208,1219,1229,1236,1246,1256,1263,1270,1277,1290,1299,1309,1320,1329,1338,1342,1349,1362,1372,1382,1392,1399,1409,1419,1429,1436,1444,1448,1459,1468,1476],{"__ignoreMap":123},[127,1209,1210,1214,1216],{"class":129,"line":130},[127,1211,1213],{"class":1212},"s9eBZ","apiVersion",[127,1215,483],{"class":137},[127,1217,1218],{"class":165},"aurum.dev\u002Fv1alpha1\n",[127,1220,1221,1224,1226],{"class":129,"line":141},[127,1222,1223],{"class":1212},"kind",[127,1225,483],{"class":137},[127,1227,1228],{"class":165},"AurumPluginSet\n",[127,1230,1231,1234],{"class":129,"line":147},[127,1232,1233],{"class":1212},"metadata",[127,1235,628],{"class":137},[127,1237,1238,1241,1243],{"class":129,"line":156},[127,1239,1240],{"class":1212},"  name",[127,1242,483],{"class":137},[127,1244,1245],{"class":165},"portfolio-platform\n",[127,1247,1248,1251,1253],{"class":129,"line":172},[127,1249,1250],{"class":1212},"  namespace",[127,1252,483],{"class":137},[127,1254,1255],{"class":165},"gardenia\n",[127,1257,1258,1261],{"class":129,"line":179},[127,1259,1260],{"class":1212},"spec",[127,1262,628],{"class":137},[127,1264,1265,1268],{"class":129,"line":197},[127,1266,1267],{"class":1212},"  applicationRef",[127,1269,628],{"class":137},[127,1271,1272,1275],{"class":129,"line":212},[127,1273,1274],{"class":1212},"    targets",[127,1276,628],{"class":137},[127,1278,1279,1282,1285,1287],{"class":129,"line":217},[127,1280,1281],{"class":137},"      - ",[127,1283,1284],{"class":1212},"deployment",[127,1286,483],{"class":137},[127,1288,1289],{"class":165},"backend\n",[127,1291,1292,1295,1297],{"class":129,"line":244},[127,1293,1294],{"class":1212},"        container",[127,1296,483],{"class":137},[127,1298,1289],{"class":165},[127,1300,1301,1304,1306],{"class":129,"line":256},[127,1302,1303],{"class":1212},"        pluginMountPath",[127,1305,483],{"class":137},[127,1307,1308],{"class":165},"\u002Fapp\u002Fplugins\n",[127,1310,1311,1313,1315,1317],{"class":129,"line":267},[127,1312,1281],{"class":137},[127,1314,1284],{"class":1212},[127,1316,483],{"class":137},[127,1318,1319],{"class":165},"frontend\n",[127,1321,1322,1324,1326],{"class":129,"line":278},[127,1323,1294],{"class":1212},[127,1325,483],{"class":137},[127,1327,1328],{"class":165},"nginx\n",[127,1330,1331,1333,1335],{"class":129,"line":289},[127,1332,1303],{"class":1212},[127,1334,483],{"class":137},[127,1336,1337],{"class":165},"\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\u002Fplugins\n",[127,1339,1340],{"class":129,"line":307},[127,1341,176],{"emptyLinePlaceholder":175},[127,1343,1344,1347],{"class":129,"line":313},[127,1345,1346],{"class":1212},"  plugins",[127,1348,628],{"class":137},[127,1350,1351,1354,1357,1359],{"class":129,"line":324},[127,1352,1353],{"class":137},"    - ",[127,1355,1356],{"class":1212},"id",[127,1358,483],{"class":137},[127,1360,1361],{"class":165},"contact-message\n",[127,1363,1364,1367,1369],{"class":129,"line":330},[127,1365,1366],{"class":1212},"      image",[127,1368,483],{"class":137},[127,1370,1371],{"class":165},"europe-west1-docker.pkg.dev\u002Fplatform\u002Faurum\u002Fcontact-message\n",[127,1373,1374,1377,1379],{"class":129,"line":338},[127,1375,1376],{"class":1212},"      version",[127,1378,483],{"class":137},[127,1380,1381],{"class":185},"1.0.0\n",[127,1383,1384,1387,1389],{"class":129,"line":346},[127,1385,1386],{"class":1212},"      digest",[127,1388,483],{"class":137},[127,1390,1391],{"class":165},"sha256:2f36f2c7e5b7c18d81d73ca5e5a7e3b1d9b08a358af7f9b0b1f44f617db45a12\n",[127,1393,1394,1397],{"class":129,"line":354},[127,1395,1396],{"class":1212},"      configuration",[127,1398,628],{"class":137},[127,1400,1401,1404,1406],{"class":129,"line":360},[127,1402,1403],{"class":1212},"        retentionDays",[127,1405,483],{"class":137},[127,1407,1408],{"class":185},"365\n",[127,1410,1411,1414,1416],{"class":129,"line":371},[127,1412,1413],{"class":1212},"        publicRateLimit",[127,1415,483],{"class":137},[127,1417,1418],{"class":185},"5\n",[127,1420,1421,1424,1426],{"class":129,"line":377},[127,1422,1423],{"class":1212},"        publicRateLimitWindowSeconds",[127,1425,483],{"class":137},[127,1427,1428],{"class":185},"60\n",[127,1430,1431,1434],{"class":129,"line":389},[127,1432,1433],{"class":1212},"        allowedOrigins",[127,1435,628],{"class":137},[127,1437,1438,1441],{"class":129,"line":399},[127,1439,1440],{"class":137},"          - ",[127,1442,1443],{"class":165},"https:\u002F\u002Fgardenia.example\n",[127,1445,1446],{"class":129,"line":410},[127,1447,176],{"emptyLinePlaceholder":175},[127,1449,1450,1452,1454,1456],{"class":129,"line":416},[127,1451,1353],{"class":137},[127,1453,1356],{"class":1212},[127,1455,483],{"class":137},[127,1457,1458],{"class":165},"real-estate\n",[127,1460,1461,1463,1465],{"class":129,"line":422},[127,1462,1366],{"class":1212},[127,1464,483],{"class":137},[127,1466,1467],{"class":165},"europe-west1-docker.pkg.dev\u002Fplatform\u002Faurum\u002Freal-estate\n",[127,1469,1470,1472,1474],{"class":129,"line":428},[127,1471,1376],{"class":1212},[127,1473,483],{"class":137},[127,1475,1381],{"class":185},[127,1477,1478,1481,1483],{"class":129,"line":434},[127,1479,1480],{"class":1212},"      tag",[127,1482,483],{"class":137},[127,1484,1381],{"class":185},[15,1486,1487],{},"Each plugin must use exactly one valid digest or tag. Production deployments can pin immutable digests. Duplicate IDs, invalid names, and relative mount paths fail validation before any Deployment is changed.",[10,1489,1491],{"id":1490},"deployment-reconciliation","Deployment reconciliation",[15,1493,1494],{},"For every target, the operator creates a size-limited shared volume, mounts it read-only in the application container, generates controlled init containers, and adds a SHA-256 hash to the PodTemplate:",[118,1496,1498],{"className":120,"code":1497,"language":122,"meta":123,"style":123},"const pluginMount = {\n  name: \"aurum-plugins\",\n  mountPath: target.pluginMountPath,\n  readOnly: true,\n};\n\ntemplate.spec.volumes = [{\n  name: \"aurum-plugins\",\n  emptyDir: { sizeLimit: \"256Mi\" },\n}];\n\ntemplate.spec.initContainers = set.spec.plugins.map(\n  (plugin) => ({\n    name: `aurum-plugin-${plugin.id}`,\n    image: plugin.digest\n      ? `${plugin.image}@${plugin.digest}`\n      : `${plugin.image}:${plugin.tag}`,\n    env: [\n      { name: \"PLUGIN_ID\", value: plugin.id },\n      { name: \"PLUGIN_VERSION\", value: plugin.version },\n      {\n        name: \"PLUGIN_CONFIGURATION\",\n        value: JSON.stringify(plugin.configuration ?? {}),\n      },\n    ],\n    volumeMounts: [{\n      name: \"aurum-plugins\",\n      mountPath: \"\u002Fplugins\",\n    }],\n  }),\n);\n\ntemplate.metadata.annotations[\n  \"aurum.dev\u002Fplugin-hash\"\n] = sha256({ target, plugins: set.spec.plugins });\n",[113,1499,1500,1511,1520,1525,1534,1539,1543,1554,1562,1572,1577,1581,1596,1612,1632,1637,1665,1692,1697,1708,1718,1723,1733,1755,1759,1763,1768,1777,1787,1791,1796,1801,1805,1810,1815],{"__ignoreMap":123},[127,1501,1502,1504,1507,1509],{"class":129,"line":130},[127,1503,182],{"class":133},[127,1505,1506],{"class":185}," pluginMount",[127,1508,189],{"class":133},[127,1510,138],{"class":137},[127,1512,1513,1515,1518],{"class":129,"line":141},[127,1514,259],{"class":137},[127,1516,1517],{"class":165},"\"aurum-plugins\"",[127,1519,253],{"class":137},[127,1521,1522],{"class":129,"line":147},[127,1523,1524],{"class":137},"  mountPath: target.pluginMountPath,\n",[127,1526,1527,1530,1532],{"class":129,"line":156},[127,1528,1529],{"class":137},"  readOnly: ",[127,1531,462],{"class":185},[127,1533,253],{"class":137},[127,1535,1536],{"class":129,"line":172},[127,1537,1538],{"class":137},"};\n",[127,1540,1541],{"class":129,"line":179},[127,1542,176],{"emptyLinePlaceholder":175},[127,1544,1545,1548,1551],{"class":129,"line":197},[127,1546,1547],{"class":137},"template.spec.volumes ",[127,1549,1550],{"class":133},"=",[127,1552,1553],{"class":137}," [{\n",[127,1555,1556,1558,1560],{"class":129,"line":212},[127,1557,259],{"class":137},[127,1559,1517],{"class":165},[127,1561,253],{"class":137},[127,1563,1564,1567,1570],{"class":129,"line":217},[127,1565,1566],{"class":137},"  emptyDir: { sizeLimit: ",[127,1568,1569],{"class":165},"\"256Mi\"",[127,1571,386],{"class":137},[127,1573,1574],{"class":129,"line":244},[127,1575,1576],{"class":137},"}];\n",[127,1578,1579],{"class":129,"line":256},[127,1580,176],{"emptyLinePlaceholder":175},[127,1582,1583,1586,1588,1591,1594],{"class":129,"line":267},[127,1584,1585],{"class":137},"template.spec.initContainers ",[127,1587,1550],{"class":133},[127,1589,1590],{"class":137}," set.spec.plugins.",[127,1592,1593],{"class":232},"map",[127,1595,511],{"class":137},[127,1597,1598,1601,1604,1606,1609],{"class":129,"line":278},[127,1599,1600],{"class":137},"  (",[127,1602,1603],{"class":492},"plugin",[127,1605,496],{"class":137},[127,1607,1608],{"class":133},"=>",[127,1610,1611],{"class":137}," ({\n",[127,1613,1614,1617,1620,1622,1625,1627,1630],{"class":129,"line":289},[127,1615,1616],{"class":137},"    name: ",[127,1618,1619],{"class":165},"`aurum-plugin-${",[127,1621,1603],{"class":137},[127,1623,1624],{"class":165},".",[127,1626,1356],{"class":137},[127,1628,1629],{"class":165},"}`",[127,1631,253],{"class":137},[127,1633,1634],{"class":129,"line":307},[127,1635,1636],{"class":137},"    image: plugin.digest\n",[127,1638,1639,1642,1645,1647,1649,1652,1655,1657,1659,1662],{"class":129,"line":313},[127,1640,1641],{"class":133},"      ?",[127,1643,1644],{"class":165}," `${",[127,1646,1603],{"class":137},[127,1648,1624],{"class":165},[127,1650,1651],{"class":137},"image",[127,1653,1654],{"class":165},"}@${",[127,1656,1603],{"class":137},[127,1658,1624],{"class":165},[127,1660,1661],{"class":137},"digest",[127,1663,1664],{"class":165},"}`\n",[127,1666,1667,1670,1672,1674,1676,1678,1681,1683,1685,1688,1690],{"class":129,"line":324},[127,1668,1669],{"class":133},"      :",[127,1671,1644],{"class":165},[127,1673,1603],{"class":137},[127,1675,1624],{"class":165},[127,1677,1651],{"class":137},[127,1679,1680],{"class":165},"}:${",[127,1682,1603],{"class":137},[127,1684,1624],{"class":165},[127,1686,1687],{"class":137},"tag",[127,1689,1629],{"class":165},[127,1691,253],{"class":137},[127,1693,1694],{"class":129,"line":330},[127,1695,1696],{"class":137},"    env: [\n",[127,1698,1699,1702,1705],{"class":129,"line":338},[127,1700,1701],{"class":137},"      { name: ",[127,1703,1704],{"class":165},"\"PLUGIN_ID\"",[127,1706,1707],{"class":137},", value: plugin.id },\n",[127,1709,1710,1712,1715],{"class":129,"line":346},[127,1711,1701],{"class":137},[127,1713,1714],{"class":165},"\"PLUGIN_VERSION\"",[127,1716,1717],{"class":137},", value: plugin.version },\n",[127,1719,1720],{"class":129,"line":354},[127,1721,1722],{"class":137},"      {\n",[127,1724,1725,1728,1731],{"class":129,"line":360},[127,1726,1727],{"class":137},"        name: ",[127,1729,1730],{"class":165},"\"PLUGIN_CONFIGURATION\"",[127,1732,253],{"class":137},[127,1734,1735,1738,1741,1743,1746,1749,1752],{"class":129,"line":371},[127,1736,1737],{"class":137},"        value: ",[127,1739,1740],{"class":185},"JSON",[127,1742,1624],{"class":137},[127,1744,1745],{"class":232},"stringify",[127,1747,1748],{"class":137},"(plugin.configuration ",[127,1750,1751],{"class":133},"??",[127,1753,1754],{"class":137}," {}),\n",[127,1756,1757],{"class":129,"line":377},[127,1758,932],{"class":137},[127,1760,1761],{"class":129,"line":389},[127,1762,357],{"class":137},[127,1764,1765],{"class":129,"line":399},[127,1766,1767],{"class":137},"    volumeMounts: [{\n",[127,1769,1770,1773,1775],{"class":129,"line":410},[127,1771,1772],{"class":137},"      name: ",[127,1774,1517],{"class":165},[127,1776,253],{"class":137},[127,1778,1779,1782,1785],{"class":129,"line":416},[127,1780,1781],{"class":137},"      mountPath: ",[127,1783,1784],{"class":165},"\"\u002Fplugins\"",[127,1786,253],{"class":137},[127,1788,1789],{"class":129,"line":422},[127,1790,552],{"class":137},[127,1792,1793],{"class":129,"line":428},[127,1794,1795],{"class":137},"  }),\n",[127,1797,1798],{"class":129,"line":434},[127,1799,1800],{"class":137},");\n",[127,1802,1803],{"class":129,"line":445},[127,1804,176],{"emptyLinePlaceholder":175},[127,1806,1807],{"class":129,"line":456},[127,1808,1809],{"class":137},"template.metadata.annotations[\n",[127,1811,1812],{"class":129,"line":467},[127,1813,1814],{"class":165},"  \"aurum.dev\u002Fplugin-hash\"\n",[127,1816,1817,1820,1822,1825],{"class":129,"line":477},[127,1818,1819],{"class":137},"] ",[127,1821,1550],{"class":133},[127,1823,1824],{"class":232}," sha256",[127,1826,1827],{"class":137},"({ target, plugins: set.spec.plugins });\n",[15,1829,1830,1831,1834,1835,1838],{},"A hash change triggers a Kubernetes rollout. The custom resource reaches ",[113,1832,1833],{},"Ready"," after reconciliation; validation or mutation errors produce an ",[113,1836,1837],{},"Error"," phase with a diagnostic message.",[10,1840,1842],{"id":1841},"declaring-aurora-content-in-nuxt","Declaring Aurora content in Nuxt",[15,1844,1845],{},"Aurora does not scrape arbitrary DOM content. Editable points are explicit in website code:",[118,1847,1851],{"className":1848,"code":1849,"language":1850,"meta":123,"style":123},"language-vue shiki shiki-themes github-light github-dark","\u003CEditableText\n  translation-key=\"website.hero.title\"\n  fallback=\"A home built around breathing room\"\n  context=\"Primary headline of the hero section.\"\n\u002F>\n","vue",[113,1852,1853,1860,1870,1880,1890],{"__ignoreMap":123},[127,1854,1855,1857],{"class":129,"line":130},[127,1856,636],{"class":137},[127,1858,1859],{"class":1212},"EditableText\n",[127,1861,1862,1865,1867],{"class":129,"line":141},[127,1863,1864],{"class":232},"  translation-key",[127,1866,1550],{"class":137},[127,1868,1869],{"class":165},"\"website.hero.title\"\n",[127,1871,1872,1875,1877],{"class":129,"line":147},[127,1873,1874],{"class":232},"  fallback",[127,1876,1550],{"class":137},[127,1878,1879],{"class":165},"\"A home built around breathing room\"\n",[127,1881,1882,1885,1887],{"class":129,"line":156},[127,1883,1884],{"class":232},"  context",[127,1886,1550],{"class":137},[127,1888,1889],{"class":165},"\"Primary headline of the hero section.\"\n",[127,1891,1892],{"class":129,"line":172},[127,1893,1894],{"class":137},"\u002F>\n",[15,1896,1897],{},"The Nuxt integration supplies the publication scope and trusted parent origin:",[118,1899,1901],{"className":120,"code":1900,"language":122,"meta":123,"style":123},"export default defineNuxtPlugin(() => {\n  const config = useRuntimeConfig();\n  const state = useState(\n    \"aurora-published-state\",\n    () => ({\n      mode: \"view\",\n      activeLocale:\n        config.public.auroraDefaultLocale,\n      translations: {},\n    }),\n  );\n\n  installAurora({\n    state,\n    applicationId:\n      config.public.auroraApplicationId,\n    parentOrigin: new URL(\n      config.public.auroraParentOrigin,\n    ).origin,\n  });\n});\n",[113,1902,1903,1920,1936,1950,1957,1966,1976,1981,1986,1991,1996,2001,2005,2012,2017,2022,2027,2040,2045,2050,2055],{"__ignoreMap":123},[127,1904,1905,1907,1910,1913,1916,1918],{"class":129,"line":130},[127,1906,220],{"class":133},[127,1908,1909],{"class":133}," default",[127,1911,1912],{"class":232}," defineNuxtPlugin",[127,1914,1915],{"class":137},"(() ",[127,1917,1608],{"class":133},[127,1919,138],{"class":137},[127,1921,1922,1925,1928,1930,1933],{"class":129,"line":141},[127,1923,1924],{"class":133},"  const",[127,1926,1927],{"class":185}," config",[127,1929,189],{"class":133},[127,1931,1932],{"class":232}," useRuntimeConfig",[127,1934,1935],{"class":137},"();\n",[127,1937,1938,1940,1943,1945,1948],{"class":129,"line":147},[127,1939,1924],{"class":133},[127,1941,1942],{"class":185}," state",[127,1944,189],{"class":133},[127,1946,1947],{"class":232}," useState",[127,1949,511],{"class":137},[127,1951,1952,1955],{"class":129,"line":156},[127,1953,1954],{"class":165},"    \"aurora-published-state\"",[127,1956,253],{"class":137},[127,1958,1959,1962,1964],{"class":129,"line":172},[127,1960,1961],{"class":137},"    () ",[127,1963,1608],{"class":133},[127,1965,1611],{"class":137},[127,1967,1968,1971,1974],{"class":129,"line":179},[127,1969,1970],{"class":137},"      mode: ",[127,1972,1973],{"class":165},"\"view\"",[127,1975,253],{"class":137},[127,1977,1978],{"class":129,"line":197},[127,1979,1980],{"class":137},"      activeLocale:\n",[127,1982,1983],{"class":129,"line":212},[127,1984,1985],{"class":137},"        config.public.auroraDefaultLocale,\n",[127,1987,1988],{"class":129,"line":217},[127,1989,1990],{"class":137},"      translations: {},\n",[127,1992,1993],{"class":129,"line":244},[127,1994,1995],{"class":137},"    }),\n",[127,1997,1998],{"class":129,"line":256},[127,1999,2000],{"class":137},"  );\n",[127,2002,2003],{"class":129,"line":267},[127,2004,176],{"emptyLinePlaceholder":175},[127,2006,2007,2010],{"class":129,"line":278},[127,2008,2009],{"class":232},"  installAurora",[127,2011,241],{"class":137},[127,2013,2014],{"class":129,"line":289},[127,2015,2016],{"class":137},"    state,\n",[127,2018,2019],{"class":129,"line":307},[127,2020,2021],{"class":137},"    applicationId:\n",[127,2023,2024],{"class":129,"line":313},[127,2025,2026],{"class":137},"      config.public.auroraApplicationId,\n",[127,2028,2029,2032,2035,2038],{"class":129,"line":324},[127,2030,2031],{"class":137},"    parentOrigin: ",[127,2033,2034],{"class":133},"new",[127,2036,2037],{"class":232}," URL",[127,2039,511],{"class":137},[127,2041,2042],{"class":129,"line":330},[127,2043,2044],{"class":137},"      config.public.auroraParentOrigin,\n",[127,2046,2047],{"class":129,"line":338},[127,2048,2049],{"class":137},"    ).origin,\n",[127,2051,2052],{"class":129,"line":346},[127,2053,2054],{"class":137},"  });\n",[127,2056,2057],{"class":129,"line":354},[127,2058,563],{"class":137},[15,2060,2061],{},"The public Nuxt application fetches only the published snapshot for a tenant\u002Fapplication\u002Fenvironment\u002Flocale scope.",[10,2063,2065],{"id":2064},"result","Result",[15,2067,2068],{},"The architecture allows the platform to grow in two independent directions: frontend teams retain full freedom over customer-facing design, while operational capabilities are reused as isolated products.",[15,2070,2071],{},"Aurum standardizes trust, contracts, and delivery. Plugins define the domain. Aurora lets editors work directly in the final experience.",[2073,2074,2075],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":123,"searchDepth":141,"depth":141,"links":2077},[2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2089,2090,2091],{"id":12,"depth":141,"text":13},{"id":23,"depth":141,"text":24},{"id":52,"depth":141,"text":53},{"id":77,"depth":141,"text":78},{"id":87,"depth":141,"text":88},{"id":97,"depth":141,"text":98},{"id":107,"depth":141,"text":108},{"id":569,"depth":141,"text":570},{"id":1052,"depth":141,"text":1053},{"id":1186,"depth":141,"text":2088},"Declarative plugin-set.yaml",{"id":1490,"depth":141,"text":1491},{"id":1841,"depth":141,"text":1842},{"id":2064,"depth":141,"text":2065},"A technical account of the Aurum 2.0 architecture, plugin runtime, Aurora Editor, security boundaries, and delivery model.","md",false,{},"\u002Fcase-studies\u002Fen\u002Faurum-aurora-technical-report",{"title":5,"description":2092},"case-studies\u002Fen\u002Faurum-aurora-technical-report","Architecture of a modular platform, isolated plugins, and a visual editor",[2101,2102,2103,2104,2105],"Platform Engineering","Runtime Plugins","Visual Editor","Security","Kubernetes",[2107,2110,2113,2116,2119],{"name":2108,"icon":2109},"Vue.js","logos:vue",{"name":2111,"icon":2112},"Nuxt","logos:nuxt-icon",{"name":2114,"icon":2115},"TypeScript","logos:typescript-icon",{"name":2117,"icon":2118},"MongoDB","logos:mongodb-icon",{"name":2105,"icon":2120},"logos:kubernetes","6FdRevB0qo0vhbXLLrdq25ffYjgackURXfoEKrpSafw",1787647489715]