[{"data":1,"prerenderedAt":3310},["ShallowReactive",2],{"navigation_docs":3,"-docs-products-apps-concept-":984},[4,8,44,50,86,583,625,918],{"title":5,"path":6,"stem":7},"Home","\u002Fdocs","docs\u002Findex",{"title":9,"path":10,"stem":11,"children":12},"API usage","\u002Fdocs\u002Fapi-usage","docs\u002Fapi-usage\u002Findex",[13,14,20,26,32,38],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17,"children":18},"Errors","\u002Fdocs\u002Fapi-usage\u002Ferrors","docs\u002Fapi-usage\u002Ferrors\u002Findex",[19],{"title":15,"path":16,"stem":17},{"title":21,"path":22,"stem":23,"children":24},"Retries & idempotency","\u002Fdocs\u002Fapi-usage\u002Fidempotency","docs\u002Fapi-usage\u002Fidempotency\u002Findex",[25],{"title":21,"path":22,"stem":23},{"title":27,"path":28,"stem":29,"children":30},"Pagination & filtering","\u002Fdocs\u002Fapi-usage\u002Fpagination","docs\u002Fapi-usage\u002Fpagination\u002Findex",[31],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35,"children":36},"Rate limits","\u002Fdocs\u002Fapi-usage\u002Frate-limits","docs\u002Fapi-usage\u002Frate-limits\u002Findex",[37],{"title":33,"path":34,"stem":35},{"title":39,"path":40,"stem":41,"children":42},"Versioning & stability","\u002Fdocs\u002Fapi-usage\u002Fversioning","docs\u002Fapi-usage\u002Fversioning\u002Findex",[43],{"title":39,"path":40,"stem":41},{"title":45,"path":46,"stem":47,"children":48},"What's new","\u002Fdocs\u002Fchangelog","docs\u002Fchangelog\u002Findex",[49],{"title":45,"path":46,"stem":47},{"title":51,"path":52,"stem":53,"children":54},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started\u002Findex",[55,56,62,68,74,80],{"title":51,"path":52,"stem":53},{"title":57,"path":58,"stem":59,"children":60},"Architecture Overview","\u002Fdocs\u002Fgetting-started\u002Farchitecture","docs\u002Fgetting-started\u002Farchitecture\u002Findex",[61],{"title":57,"path":58,"stem":59},{"title":63,"path":64,"stem":65,"children":66},"Glossary","\u002Fdocs\u002Fgetting-started\u002Fglossary","docs\u002Fgetting-started\u002Fglossary\u002Findex",[67],{"title":63,"path":64,"stem":65},{"title":69,"path":70,"stem":71,"children":72},"Platform Overview","\u002Fdocs\u002Fgetting-started\u002Fplatform-overview","docs\u002Fgetting-started\u002Fplatform-overview\u002Findex",[73],{"title":69,"path":70,"stem":71},{"title":75,"path":76,"stem":77,"children":78},"Prerequisites","\u002Fdocs\u002Fgetting-started\u002Fprerequisites","docs\u002Fgetting-started\u002Fprerequisites\u002Findex",[79],{"title":75,"path":76,"stem":77},{"title":81,"path":82,"stem":83,"children":84},"Your First App in 15 Minutes","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002Fgetting-started\u002Fquick-start\u002Findex",[85],{"title":81,"path":82,"stem":83},{"title":87,"path":88,"stem":89,"children":90},"Products","\u002Fdocs\u002Fproducts","docs\u002Fproducts\u002Findex",[91,92,98,170,200,218,254,320,517,565],{"title":87,"path":88,"stem":89},{"title":93,"path":94,"stem":95,"children":96},"AI Studio","\u002Fdocs\u002Fproducts\u002Fai","docs\u002Fproducts\u002Fai\u002Findex",[97],{"title":93,"path":94,"stem":95},{"title":99,"path":100,"stem":101,"children":102},"App Studio","\u002Fdocs\u002Fproducts\u002Fapps","docs\u002Fproducts\u002Fapps\u002Findex",[103,104,110,116,122,128,134,140,146,152,158,164],{"title":99,"path":100,"stem":101},{"title":105,"path":106,"stem":107,"children":108},"App Model","\u002Fdocs\u002Fproducts\u002Fapps\u002Fapp-model","docs\u002Fproducts\u002Fapps\u002Fapp-model\u002Findex",[109],{"title":105,"path":106,"stem":107},{"title":111,"path":112,"stem":113,"children":114},"Auto-generated data APIs","\u002Fdocs\u002Fproducts\u002Fapps\u002Fauto-generated-data-apis","docs\u002Fproducts\u002Fapps\u002Fauto-generated-data-apis\u002Findex",[115],{"title":111,"path":112,"stem":113},{"title":117,"path":118,"stem":119,"children":120},"Billing & Events","\u002Fdocs\u002Fproducts\u002Fapps\u002Fbilling-events","docs\u002Fproducts\u002Fapps\u002Fbilling-events\u002Findex",[121],{"title":117,"path":118,"stem":119},{"title":123,"path":124,"stem":125,"children":126},"Cockpit Integration","\u002Fdocs\u002Fproducts\u002Fapps\u002Fcockpit-integration","docs\u002Fproducts\u002Fapps\u002Fcockpit-integration\u002Findex",[127],{"title":123,"path":124,"stem":125},{"title":129,"path":130,"stem":131,"children":132},"App Model Concept","\u002Fdocs\u002Fproducts\u002Fapps\u002Fconcept","docs\u002Fproducts\u002Fapps\u002Fconcept\u002Findex",[133],{"title":129,"path":130,"stem":131},{"title":135,"path":136,"stem":137,"children":138},"App Lifecycle","\u002Fdocs\u002Fproducts\u002Fapps\u002Flifecycle","docs\u002Fproducts\u002Fapps\u002Flifecycle\u002Findex",[139],{"title":135,"path":136,"stem":137},{"title":141,"path":142,"stem":143,"children":144},"Manifest Reference","\u002Fdocs\u002Fproducts\u002Fapps\u002Fmanifest-reference","docs\u002Fproducts\u002Fapps\u002Fmanifest-reference\u002Findex",[145],{"title":141,"path":142,"stem":143},{"title":147,"path":148,"stem":149,"children":150},"Market Concept","\u002Fdocs\u002Fproducts\u002Fapps\u002Fmarket-concept","docs\u002Fproducts\u002Fapps\u002Fmarket-concept\u002Findex",[151],{"title":147,"path":148,"stem":149},{"title":153,"path":154,"stem":155,"children":156},"Policies","\u002Fdocs\u002Fproducts\u002Fapps\u002Fpolicies","docs\u002Fproducts\u002Fapps\u002Fpolicies\u002Findex",[157],{"title":153,"path":154,"stem":155},{"title":159,"path":160,"stem":161,"children":162},"Schema migrations","\u002Fdocs\u002Fproducts\u002Fapps\u002Fschema-migrator","docs\u002Fproducts\u002Fapps\u002Fschema-migrator\u002Findex",[163],{"title":159,"path":160,"stem":161},{"title":165,"path":166,"stem":167,"children":168},"Schema Reference","\u002Fdocs\u002Fproducts\u002Fapps\u002Fschema-reference","docs\u002Fproducts\u002Fapps\u002Fschema-reference\u002Findex",[169],{"title":165,"path":166,"stem":167},{"title":171,"path":172,"stem":173,"children":174},"Authentication","\u002Fdocs\u002Fproducts\u002Fauth","docs\u002Fproducts\u002Fauth\u002Findex",[175,176,182,188,194],{"title":171,"path":172,"stem":173},{"title":177,"path":178,"stem":179,"children":180},"API keys","\u002Fdocs\u002Fproducts\u002Fauth\u002Fapi-keys","docs\u002Fproducts\u002Fauth\u002Fapi-keys\u002Findex",[181],{"title":177,"path":178,"stem":179},{"title":183,"path":184,"stem":185,"children":186},"Multi-factor authentication","\u002Fdocs\u002Fproducts\u002Fauth\u002Fmfa","docs\u002Fproducts\u002Fauth\u002Fmfa\u002Findex",[187],{"title":183,"path":184,"stem":185},{"title":189,"path":190,"stem":191,"children":192},"Social sign-in","\u002Fdocs\u002Fproducts\u002Fauth\u002Foauth2","docs\u002Fproducts\u002Fauth\u002Foauth2\u002Findex",[193],{"title":189,"path":190,"stem":191},{"title":195,"path":196,"stem":197,"children":198},"Sessions","\u002Fdocs\u002Fproducts\u002Fauth\u002Fsessions","docs\u002Fproducts\u002Fauth\u002Fsessions\u002Findex",[199],{"title":195,"path":196,"stem":197},{"title":201,"path":202,"stem":203,"children":204},"Events","\u002Fdocs\u002Fproducts\u002Fevents","docs\u002Fproducts\u002Fevents\u002Findex",[205,206,212],{"title":201,"path":202,"stem":203},{"title":207,"path":208,"stem":209,"children":210},"Consuming events","\u002Fdocs\u002Fproducts\u002Fevents\u002Fconsuming-events","docs\u002Fproducts\u002Fevents\u002Fconsuming-events\u002Findex",[211],{"title":207,"path":208,"stem":209},{"title":213,"path":214,"stem":215,"children":216},"Event types","\u002Fdocs\u002Fproducts\u002Fevents\u002Fevent-types","docs\u002Fproducts\u002Fevents\u002Fevent-types\u002Findex",[217],{"title":213,"path":214,"stem":215},{"title":219,"path":220,"stem":221,"children":222},"Integration Studio","\u002Fdocs\u002Fproducts\u002Fintegration-studio","docs\u002Fproducts\u002Fintegration-studio\u002Findex",[223,224,230,236,242,248],{"title":219,"path":220,"stem":221},{"title":225,"path":226,"stem":227,"children":228},"Expression Syntax","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fexpression-syntax","docs\u002Fproducts\u002Fintegration-studio\u002Fexpression-syntax\u002Findex",[229],{"title":225,"path":226,"stem":227},{"title":231,"path":232,"stem":233,"children":234},"Node Types","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fnode-types","docs\u002Fproducts\u002Fintegration-studio\u002Fnode-types\u002Findex",[235],{"title":231,"path":232,"stem":233},{"title":237,"path":238,"stem":239,"children":240},"Dual-engine architecture","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Foverview","docs\u002Fproducts\u002Fintegration-studio\u002Foverview\u002Findex",[241],{"title":237,"path":238,"stem":239},{"title":243,"path":244,"stem":245,"children":246},"Triggers","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Ftriggers","docs\u002Fproducts\u002Fintegration-studio\u002Ftriggers\u002Findex",[247],{"title":243,"path":244,"stem":245},{"title":249,"path":250,"stem":251,"children":252},"Workflow Builder","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fworkflow-builder","docs\u002Fproducts\u002Fintegration-studio\u002Fworkflow-builder\u002Findex",[253],{"title":249,"path":250,"stem":251},{"title":255,"path":256,"stem":257,"children":258},"Network","\u002Fdocs\u002Fproducts\u002Fnetwork","docs\u002Fproducts\u002Fnetwork\u002Findex",[259,260,266,272,278,284,290,296,302,308,314],{"title":255,"path":256,"stem":257},{"title":261,"path":262,"stem":263,"children":264},"Caching","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcaching","docs\u002Fproducts\u002Fnetwork\u002Fcaching\u002Findex",[265],{"title":261,"path":262,"stem":263},{"title":267,"path":268,"stem":269,"children":270},"Content delivery (CDN)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcdn","docs\u002Fproducts\u002Fnetwork\u002Fcdn\u002Findex",[271],{"title":267,"path":268,"stem":269},{"title":273,"path":274,"stem":275,"children":276},"Compression","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcompression","docs\u002Fproducts\u002Fnetwork\u002Fcompression\u002Findex",[277],{"title":273,"path":274,"stem":275},{"title":279,"path":280,"stem":281,"children":282},"DDoS mitigation","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fddos","docs\u002Fproducts\u002Fnetwork\u002Fddos\u002Findex",[283],{"title":279,"path":280,"stem":281},{"title":285,"path":286,"stem":287,"children":288},"revenexx DNS service","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fdns","docs\u002Fproducts\u002Fnetwork\u002Fdns\u002Findex",[289],{"title":285,"path":286,"stem":287},{"title":291,"path":292,"stem":293,"children":294},"Edges","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fedges","docs\u002Fproducts\u002Fnetwork\u002Fedges\u002Findex",[295],{"title":291,"path":292,"stem":293},{"title":297,"path":298,"stem":299,"children":300},"Endpoints","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fendpoints","docs\u002Fproducts\u002Fnetwork\u002Fendpoints\u002Findex",[301],{"title":297,"path":298,"stem":299},{"title":303,"path":304,"stem":305,"children":306},"Regions","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fregions","docs\u002Fproducts\u002Fnetwork\u002Fregions\u002Findex",[307],{"title":303,"path":304,"stem":305},{"title":309,"path":310,"stem":311,"children":312},"Transport Layer Security (TLS)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Ftls","docs\u002Fproducts\u002Fnetwork\u002Ftls\u002Findex",[313],{"title":309,"path":310,"stem":311},{"title":315,"path":316,"stem":317,"children":318},"Web application firewall (WAF)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fwaf","docs\u002Fproducts\u002Fnetwork\u002Fwaf\u002Findex",[319],{"title":315,"path":316,"stem":317},{"title":321,"path":322,"stem":323,"children":324},"Experience Studio","\u002Fdocs\u002Fproducts\u002Fsites","docs\u002Fproducts\u002Fsites\u002Findex",[325,326,332,337,343,349,355,361,367,373,379,385,391,397,403,409,487,505,511],{"title":321,"path":322,"stem":323},{"title":327,"path":328,"stem":329,"children":330},"Storefront Architecture","\u002Fdocs\u002Fproducts\u002Fsites\u002Farchitecture","docs\u002Fproducts\u002Fsites\u002Farchitecture\u002Findex",[331],{"title":327,"path":328,"stem":329},{"title":171,"path":333,"stem":334,"children":335},"\u002Fdocs\u002Fproducts\u002Fsites\u002Fauthentication","docs\u002Fproducts\u002Fsites\u002Fauthentication\u002Findex",[336],{"title":171,"path":333,"stem":334},{"title":338,"path":339,"stem":340,"children":341},"Blökkli Blocks","\u002Fdocs\u002Fproducts\u002Fsites\u002Fblokki-blocks","docs\u002Fproducts\u002Fsites\u002Fblokki-blocks\u002Findex",[342],{"title":338,"path":339,"stem":340},{"title":344,"path":345,"stem":346,"children":347},"Checkout","\u002Fdocs\u002Fproducts\u002Fsites\u002Fcheckout","docs\u002Fproducts\u002Fsites\u002Fcheckout\u002Findex",[348],{"title":344,"path":345,"stem":346},{"title":350,"path":351,"stem":352,"children":353},"Deploy from CLI","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-from-cli","docs\u002Fproducts\u002Fsites\u002Fdeploy-from-cli\u002Findex",[354],{"title":350,"path":351,"stem":352},{"title":356,"path":357,"stem":358,"children":359},"Deploy from Git","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-from-git","docs\u002Fproducts\u002Fsites\u002Fdeploy-from-git\u002Findex",[360],{"title":356,"path":357,"stem":358},{"title":362,"path":363,"stem":364,"children":365},"Deploy manually","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-manually","docs\u002Fproducts\u002Fsites\u002Fdeploy-manually\u002Findex",[366],{"title":362,"path":363,"stem":364},{"title":368,"path":369,"stem":370,"children":371},"Deployments","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeployments","docs\u002Fproducts\u002Fsites\u002Fdeployments\u002Findex",[372],{"title":368,"path":369,"stem":370},{"title":374,"path":375,"stem":376,"children":377},"Develop revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdevelop","docs\u002Fproducts\u002Fsites\u002Fdevelop\u002Findex",[378],{"title":374,"path":375,"stem":376},{"title":380,"path":381,"stem":382,"children":383},"Domains","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdomains","docs\u002Fproducts\u002Fsites\u002Fdomains\u002Findex",[384],{"title":380,"path":381,"stem":382},{"title":386,"path":387,"stem":388,"children":389},"Frameworks","\u002Fdocs\u002Fproducts\u002Fsites\u002Fframeworks","docs\u002Fproducts\u002Fsites\u002Fframeworks\u002Findex",[390],{"title":386,"path":387,"stem":388},{"title":392,"path":393,"stem":394,"children":395},"Instant rollbacks","\u002Fdocs\u002Fproducts\u002Fsites\u002Finstant-rollbacks","docs\u002Fproducts\u002Fsites\u002Finstant-rollbacks\u002Findex",[396],{"title":392,"path":393,"stem":394},{"title":398,"path":399,"stem":400,"children":401},"Logs","\u002Fdocs\u002Fproducts\u002Fsites\u002Flogs","docs\u002Fproducts\u002Fsites\u002Flogs\u002Findex",[402],{"title":398,"path":399,"stem":400},{"title":404,"path":405,"stem":406,"children":407},"Previews","\u002Fdocs\u002Fproducts\u002Fsites\u002Fpreviews","docs\u002Fproducts\u002Fsites\u002Fpreviews\u002Findex",[408],{"title":404,"path":405,"stem":406},{"title":410,"path":411,"stem":412,"children":413},"Start with Sites","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Findex",[414,415,421,427,433,439,445,451,457,463,469,475,481],{"title":410,"path":411,"stem":412},{"title":416,"path":417,"stem":418,"children":419},"Deploy an Angular app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fangular","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fangular\u002Findex",[420],{"title":416,"path":417,"stem":418},{"title":422,"path":423,"stem":424,"children":425},"Deploy a Astro app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fastro","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fastro\u002Findex",[426],{"title":422,"path":423,"stem":424},{"title":428,"path":429,"stem":430,"children":431},"Deploy a Flutter Web app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fflutter","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fflutter\u002Findex",[432],{"title":428,"path":429,"stem":430},{"title":434,"path":435,"stem":436,"children":437},"Deploy a Next.js app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnextjs","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnextjs\u002Findex",[438],{"title":434,"path":435,"stem":436},{"title":440,"path":441,"stem":442,"children":443},"Deploy a Nuxt app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnuxt","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnuxt\u002Findex",[444],{"title":440,"path":441,"stem":442},{"title":446,"path":447,"stem":448,"children":449},"Deploy a React Native app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact-native","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact-native\u002Findex",[450],{"title":446,"path":447,"stem":448},{"title":452,"path":453,"stem":454,"children":455},"Deploy a React app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact\u002Findex",[456],{"title":452,"path":453,"stem":454},{"title":458,"path":459,"stem":460,"children":461},"Deploy a Remix app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fremix","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fremix\u002Findex",[462],{"title":458,"path":459,"stem":460},{"title":464,"path":465,"stem":466,"children":467},"Deploy a SvelteKit app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fsveltekit","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fsveltekit\u002Findex",[468],{"title":464,"path":465,"stem":466},{"title":470,"path":471,"stem":472,"children":473},"Deploy a TanStack Start app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Ftanstack-start","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Ftanstack-start\u002Findex",[474],{"title":470,"path":471,"stem":472},{"title":476,"path":477,"stem":478,"children":479},"Deploy a Vanilla JS app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvanilla","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvanilla\u002Findex",[480],{"title":476,"path":477,"stem":478},{"title":482,"path":483,"stem":484,"children":485},"Deploy a Vue.js app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvue","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvue\u002Findex",[486],{"title":482,"path":483,"stem":484},{"title":488,"path":489,"stem":490,"children":491},"Rendering","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering","docs\u002Fproducts\u002Fsites\u002Frendering\u002Findex",[492,493,499],{"title":488,"path":489,"stem":490},{"title":494,"path":495,"stem":496,"children":497},"Server Side Rendering","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering\u002Fssr","docs\u002Fproducts\u002Fsites\u002Frendering\u002Fssr\u002Findex",[498],{"title":494,"path":495,"stem":496},{"title":500,"path":501,"stem":502,"children":503},"Static","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering\u002Fstatic","docs\u002Fproducts\u002Fsites\u002Frendering\u002Fstatic\u002Findex",[504],{"title":500,"path":501,"stem":502},{"title":506,"path":507,"stem":508,"children":509},"Templates","\u002Fdocs\u002Fproducts\u002Fsites\u002Ftemplates","docs\u002Fproducts\u002Fsites\u002Ftemplates\u002Findex",[510],{"title":506,"path":507,"stem":508},{"title":512,"path":513,"stem":514,"children":515},"Theming","\u002Fdocs\u002Fproducts\u002Fsites\u002Ftheming","docs\u002Fproducts\u002Fsites\u002Ftheming\u002Findex",[516],{"title":512,"path":513,"stem":514},{"title":518,"path":519,"stem":520,"children":521},"Storage","\u002Fdocs\u002Fproducts\u002Fstorage","docs\u002Fproducts\u002Fstorage\u002Findex",[522,523,529,535,541,547,553,559],{"title":518,"path":519,"stem":520},{"title":524,"path":525,"stem":526,"children":527},"Folders","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fbuckets","docs\u002Fproducts\u002Fstorage\u002Fbuckets\u002Findex",[528],{"title":524,"path":525,"stem":526},{"title":530,"path":531,"stem":532,"children":533},"Signed URLs and access","\u002Fdocs\u002Fproducts\u002Fstorage\u002Ffile-tokens","docs\u002Fproducts\u002Fstorage\u002Ffile-tokens\u002Findex",[534],{"title":530,"path":531,"stem":532},{"title":536,"path":537,"stem":538,"children":539},"Serve and transform images","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fimages","docs\u002Fproducts\u002Fstorage\u002Fimages\u002Findex",[540],{"title":536,"path":537,"stem":538},{"title":542,"path":543,"stem":544,"children":545},"3D assets","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fmodel-viewer","docs\u002Fproducts\u002Fstorage\u002Fmodel-viewer\u002Findex",[546],{"title":542,"path":543,"stem":544},{"title":548,"path":549,"stem":550,"children":551},"Access control and visibility","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fpermissions","docs\u002Fproducts\u002Fstorage\u002Fpermissions\u002Findex",[552],{"title":548,"path":549,"stem":550},{"title":554,"path":555,"stem":556,"children":557},"Quick start","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fquick-start","docs\u002Fproducts\u002Fstorage\u002Fquick-start\u002Findex",[558],{"title":554,"path":555,"stem":556},{"title":560,"path":561,"stem":562,"children":563},"Upload and manage files","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fupload-download","docs\u002Fproducts\u002Fstorage\u002Fupload-download\u002Findex",[564],{"title":560,"path":561,"stem":562},{"title":566,"path":567,"stem":568,"children":569},"Webhooks","\u002Fdocs\u002Fproducts\u002Fwebhooks","docs\u002Fproducts\u002Fwebhooks\u002Findex",[570,571,577],{"title":566,"path":567,"stem":568},{"title":572,"path":573,"stem":574,"children":575},"Delivery","\u002Fdocs\u002Fproducts\u002Fwebhooks\u002Fdelivery","docs\u002Fproducts\u002Fwebhooks\u002Fdelivery\u002Findex",[576],{"title":572,"path":573,"stem":574},{"title":578,"path":579,"stem":580,"children":581},"Security","\u002Fdocs\u002Fproducts\u002Fwebhooks\u002Fsecurity","docs\u002Fproducts\u002Fwebhooks\u002Fsecurity\u002Findex",[582],{"title":578,"path":579,"stem":580},{"title":584,"path":585,"stem":586,"children":587},"SDKs","\u002Fdocs\u002Fsdks","docs\u002Fsdks\u002Findex",[588,589,595,601,607,613,619],{"title":584,"path":585,"stem":586},{"title":590,"path":591,"stem":592,"children":593},"App SDK","\u002Fdocs\u002Fsdks\u002Fapp-sdk","docs\u002Fsdks\u002Fapp-sdk\u002Findex",[594],{"title":590,"path":591,"stem":592},{"title":596,"path":597,"stem":598,"children":599},"CLI","\u002Fdocs\u002Fsdks\u002Fcli","docs\u002Fsdks\u002Fcli\u002Findex",[600],{"title":596,"path":597,"stem":598},{"title":602,"path":603,"stem":604,"children":605},"Integration Node SDK","\u002Fdocs\u002Fsdks\u002Fintegration-nodes","docs\u002Fsdks\u002Fintegration-nodes\u002Findex",[606],{"title":602,"path":603,"stem":604},{"title":608,"path":609,"stem":610,"children":611},"Node SDK","\u002Fdocs\u002Fsdks\u002Fnode","docs\u002Fsdks\u002Fnode\u002Findex",[612],{"title":608,"path":609,"stem":610},{"title":614,"path":615,"stem":616,"children":617},"PHP SDK","\u002Fdocs\u002Fsdks\u002Fphp","docs\u002Fsdks\u002Fphp\u002Findex",[618],{"title":614,"path":615,"stem":616},{"title":620,"path":621,"stem":622,"children":623},"Web \u002F JavaScript SDK","\u002Fdocs\u002Fsdks\u002Fweb","docs\u002Fsdks\u002Fweb\u002Findex",[624],{"title":620,"path":621,"stem":622},{"title":626,"path":627,"stem":628,"children":629},"Tooling","\u002Fdocs\u002Ftooling","docs\u002Ftooling\u002Findex",[630,631,637,864],{"title":626,"path":627,"stem":628},{"title":632,"path":633,"stem":634,"children":635},"Command Center","\u002Fdocs\u002Ftooling\u002Fcommand-center","docs\u002Ftooling\u002Fcommand-center\u002Findex",[636],{"title":632,"path":633,"stem":634},{"title":638,"path":639,"stem":640,"children":641},"Command line","\u002Fdocs\u002Ftooling\u002Fcommand-line","docs\u002Ftooling\u002Fcommand-line\u002Findex",[642,643,649,654,660,666,672,678,684,828,834,840,846,852,858],{"title":638,"path":639,"stem":640},{"title":644,"path":645,"stem":646,"children":647},"Aliases","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Faliases","docs\u002Ftooling\u002Fcommand-line\u002Faliases\u002Findex",[648],{"title":644,"path":645,"stem":646},{"title":171,"path":650,"stem":651,"children":652},"\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fauthentication","docs\u002Ftooling\u002Fcommand-line\u002Fauthentication\u002Findex",[653],{"title":171,"path":650,"stem":651},{"title":655,"path":656,"stem":657,"children":658},"Commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fcommands","docs\u002Ftooling\u002Fcommand-line\u002Fcommands\u002Findex",[659],{"title":655,"path":656,"stem":657},{"title":661,"path":662,"stem":663,"children":664},"Installation","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Finstallation","docs\u002Ftooling\u002Fcommand-line\u002Finstallation\u002Findex",[665],{"title":661,"path":662,"stem":663},{"title":667,"path":668,"stem":669,"children":670},"Interactive use","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Finteractive","docs\u002Ftooling\u002Fcommand-line\u002Finteractive\u002Findex",[671],{"title":667,"path":668,"stem":669},{"title":673,"path":674,"stem":675,"children":676},"Non-interactive use","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fnon-interactive","docs\u002Ftooling\u002Fcommand-line\u002Fnon-interactive\u002Findex",[677],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681,"children":682},"Project configuration","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fproject-configuration","docs\u002Ftooling\u002Fcommand-line\u002Fproject-configuration\u002Findex",[683],{"title":679,"path":680,"stem":681},{"title":685,"path":686,"stem":687,"children":688},"Command reference","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Findex",[689,690,696,702,708,714,720,726,732,738,744,750,756,762,768,774,780,786,792,798,804,810,816,822],{"title":685,"path":686,"stem":687},{"title":691,"path":692,"stem":693,"children":694},"About commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fabout","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fabout\u002Findex",[695],{"title":691,"path":692,"stem":693},{"title":697,"path":698,"stem":699,"children":700},"Apps commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fapps","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fapps\u002Findex",[701],{"title":697,"path":698,"stem":699},{"title":703,"path":704,"stem":705,"children":706},"Carts commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcarts","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcarts\u002Findex",[707],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711,"children":712},"Channels commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fchannels","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fchannels\u002Findex",[713],{"title":709,"path":710,"stem":711},{"title":715,"path":716,"stem":717,"children":718},"Create commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcreate","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcreate\u002Findex",[719],{"title":715,"path":716,"stem":717},{"title":721,"path":722,"stem":723,"children":724},"Customers commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcustomers","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcustomers\u002Findex",[725],{"title":721,"path":722,"stem":723},{"title":727,"path":728,"stem":729,"children":730},"Deploy commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fdeploy","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fdeploy\u002Findex",[731],{"title":727,"path":728,"stem":729},{"title":733,"path":734,"stem":735,"children":736},"Forms commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fforms","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fforms\u002Findex",[737],{"title":733,"path":734,"stem":735},{"title":739,"path":740,"stem":741,"children":742},"Inventories commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Finventories","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Finventories\u002Findex",[743],{"title":739,"path":740,"stem":741},{"title":745,"path":746,"stem":747,"children":748},"Markets commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fmarkets","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fmarkets\u002Findex",[749],{"title":745,"path":746,"stem":747},{"title":751,"path":752,"stem":753,"children":754},"Order lists commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forderlists","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forderlists\u002Findex",[755],{"title":751,"path":752,"stem":753},{"title":757,"path":758,"stem":759,"children":760},"Orders commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forders","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forders\u002Findex",[761],{"title":757,"path":758,"stem":759},{"title":763,"path":764,"stem":765,"children":766},"Pages commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpages","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpages\u002Findex",[767],{"title":763,"path":764,"stem":765},{"title":769,"path":770,"stem":771,"children":772},"Payments commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpayments","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpayments\u002Findex",[773],{"title":769,"path":770,"stem":771},{"title":775,"path":776,"stem":777,"children":778},"Prices commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fprices","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fprices\u002Findex",[779],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783,"children":784},"Products commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fproducts","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fproducts\u002Findex",[785],{"title":781,"path":782,"stem":783},{"title":787,"path":788,"stem":789,"children":790},"Search commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsearch","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsearch\u002Findex",[791],{"title":787,"path":788,"stem":789},{"title":793,"path":794,"stem":795,"children":796},"Settings commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsettings","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsettings\u002Findex",[797],{"title":793,"path":794,"stem":795},{"title":799,"path":800,"stem":801,"children":802},"Shipping commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fshipping","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fshipping\u002Findex",[803],{"title":799,"path":800,"stem":801},{"title":805,"path":806,"stem":807,"children":808},"Sites commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsites","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsites\u002Findex",[809],{"title":805,"path":806,"stem":807},{"title":811,"path":812,"stem":813,"children":814},"Skills commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fskills","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fskills\u002Findex",[815],{"title":811,"path":812,"stem":813},{"title":817,"path":818,"stem":819,"children":820},"Storage commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fstorage","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fstorage\u002Findex",[821],{"title":817,"path":818,"stem":819},{"title":823,"path":824,"stem":825,"children":826},"Tokens commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Ftokens","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Ftokens\u002Findex",[827],{"title":823,"path":824,"stem":825},{"title":829,"path":830,"stem":831,"children":832},"Interactive shell (REPL)","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Frepl","docs\u002Ftooling\u002Fcommand-line\u002Frepl\u002Findex",[833],{"title":829,"path":830,"stem":831},{"title":835,"path":836,"stem":837,"children":838},"Scaffolding","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fscaffolding","docs\u002Ftooling\u002Fcommand-line\u002Fscaffolding\u002Findex",[839],{"title":835,"path":836,"stem":837},{"title":841,"path":842,"stem":843,"children":844},"Scripting & output","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fscripting","docs\u002Ftooling\u002Fcommand-line\u002Fscripting\u002Findex",[845],{"title":841,"path":842,"stem":843},{"title":847,"path":848,"stem":849,"children":850},"Skills","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fskills","docs\u002Ftooling\u002Fcommand-line\u002Fskills\u002Findex",[851],{"title":847,"path":848,"stem":849},{"title":853,"path":854,"stem":855,"children":856},"Full-screen app (TUI)","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Ftui","docs\u002Ftooling\u002Fcommand-line\u002Ftui\u002Findex",[857],{"title":853,"path":854,"stem":855},{"title":859,"path":860,"stem":861,"children":862},"Type generation","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Ftype-generation","docs\u002Ftooling\u002Fcommand-line\u002Ftype-generation\u002Findex",[863],{"title":859,"path":860,"stem":861},{"title":865,"path":866,"stem":867,"children":868},"Model Context Protocol","\u002Fdocs\u002Ftooling\u002Fmcp","docs\u002Ftooling\u002Fmcp\u002Findex",[869,870,876,882,888,894,900,906,912],{"title":865,"path":866,"stem":867},{"title":871,"path":872,"stem":873,"children":874},"revenexx docs MCP in Google Antigravity","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fantigravity","docs\u002Ftooling\u002Fmcp\u002Fantigravity\u002Findex",[875],{"title":871,"path":872,"stem":873},{"title":877,"path":878,"stem":879,"children":880},"revenexx docs MCP in Claude Code","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fclaude-code","docs\u002Ftooling\u002Fmcp\u002Fclaude-code\u002Findex",[881],{"title":877,"path":878,"stem":879},{"title":883,"path":884,"stem":885,"children":886},"revenexx docs MCP in Claude Desktop","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fclaude-desktop","docs\u002Ftooling\u002Fmcp\u002Fclaude-desktop\u002Findex",[887],{"title":883,"path":884,"stem":885},{"title":889,"path":890,"stem":891,"children":892},"revenexx docs MCP in Cursor","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fcursor","docs\u002Ftooling\u002Fmcp\u002Fcursor\u002Findex",[893],{"title":889,"path":890,"stem":891},{"title":895,"path":896,"stem":897,"children":898},"revenexx docs MCP in OpenCode","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fopencode","docs\u002Ftooling\u002Fmcp\u002Fopencode\u002Findex",[899],{"title":895,"path":896,"stem":897},{"title":901,"path":902,"stem":903,"children":904},"revenexx docs MCP in VS Code","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fvscode","docs\u002Ftooling\u002Fmcp\u002Fvscode\u002Findex",[905],{"title":901,"path":902,"stem":903},{"title":907,"path":908,"stem":909,"children":910},"revenexx docs MCP in Windsurf","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fwindsurf","docs\u002Ftooling\u002Fmcp\u002Fwindsurf\u002Findex",[911],{"title":907,"path":908,"stem":909},{"title":913,"path":914,"stem":915,"children":916},"revenexx docs MCP in Zenflow","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fzenflow","docs\u002Ftooling\u002Fmcp\u002Fzenflow\u002Findex",[917],{"title":913,"path":914,"stem":915},{"title":919,"path":920,"stem":921,"children":922},"Tutorials","\u002Fdocs\u002Ftutorials","docs\u002Ftutorials\u002Findex",[923,924,948,954],{"title":919,"path":920,"stem":921},{"title":925,"path":926,"stem":927,"children":928},"Build a revenexx App","\u002Fdocs\u002Ftutorials\u002Fapps","docs\u002Ftutorials\u002Fapps\u002Findex",[929,930,936,942],{"title":925,"path":926,"stem":927},{"title":931,"path":932,"stem":933,"children":934},"Add a data model","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fadd-a-data-model","docs\u002Ftutorials\u002Fapps\u002Fadd-a-data-model\u002Findex",[935],{"title":931,"path":932,"stem":933},{"title":937,"path":938,"stem":939,"children":940},"Build your first app","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fbuild-your-first-app","docs\u002Ftutorials\u002Fapps\u002Fbuild-your-first-app\u002Findex",[941],{"title":937,"path":938,"stem":939},{"title":943,"path":944,"stem":945,"children":946},"Deploy with the CLI","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fdeploy-with-the-cli","docs\u002Ftutorials\u002Fapps\u002Fdeploy-with-the-cli\u002Findex",[947],{"title":943,"path":944,"stem":945},{"title":949,"path":950,"stem":951,"children":952},"Examples","\u002Fdocs\u002Ftutorials\u002Fexamples","docs\u002Ftutorials\u002Fexamples\u002Findex",[953],{"title":949,"path":950,"stem":951},{"title":955,"path":956,"stem":957,"children":958},"Build a storefront Theme","\u002Fdocs\u002Ftutorials\u002Fthemes","docs\u002Ftutorials\u002Fthemes\u002Findex",[959,960,966,972,978],{"title":955,"path":956,"stem":957},{"title":961,"path":962,"stem":963,"children":964},"Build your first Theme","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fbuild-your-first-theme","docs\u002Ftutorials\u002Fthemes\u002Fbuild-your-first-theme\u002Findex",[965],{"title":961,"path":962,"stem":963},{"title":967,"path":968,"stem":969,"children":970},"Customize blocks","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fcustomize-blocks","docs\u002Ftutorials\u002Fthemes\u002Fcustomize-blocks\u002Findex",[971],{"title":967,"path":968,"stem":969},{"title":973,"path":974,"stem":975,"children":976},"Deploy your storefront","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fdeploy-your-storefront","docs\u002Ftutorials\u002Fthemes\u002Fdeploy-your-storefront\u002Findex",[977],{"title":973,"path":974,"stem":975},{"title":979,"path":980,"stem":981,"children":982},"Theme tokens and styling","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Ftheme-tokens-and-styling","docs\u002Ftutorials\u002Fthemes\u002Ftheme-tokens-and-styling\u002Findex",[983],{"title":979,"path":980,"stem":981},{"id":985,"title":129,"body":986,"description":3302,"extension":3303,"landing":3304,"links":3304,"meta":3305,"navigation":2988,"path":130,"seo":3307,"sitemap":3308,"stem":131,"__hash__":3309},"docs\u002Fdocs\u002Fproducts\u002Fapps\u002Fconcept\u002Findex.md",{"type":987,"value":988,"toc":3282},"minimark",[989,998,1001,1008,1013,1024,1028,1035,1067,1071,1074,1079,1635,1649,1653,2178,2191,2195,2373,2382,2386,2546,2552,2556,2705,2708,2712,2715,2719,2722,2773,2785,2789,2796,2871,2878,2882,2885,3065,3068,3072,3075,3143,3147,3150,3185,3191,3195,3198,3236,3239,3243,3278],[990,991,992,993,997],"p",{},"This page is for ",[994,995,996],"strong",{},"backend developers"," about to write their first revenexx App. It explains how the declarative model works, why it's set up this way, and walks through a small but complete app (an order-tracking app) so the rest of the App Marketplace documentation has a concrete reference.",[990,999,1000],{},"If you've ever built a multi-tenant SaaS service from scratch, you know what the platform is doing for you here: provisioning tables, adding tenant-isolation columns, scoping data to the tenant, generating REST endpoints, registering routes, wiring auth. In a typical hand-rolled service that's a substantial amount of code — most of it the same across services. In revenexx that work happens because of declarations in your app's JSON files, and you write only the part that's genuinely unique to your domain.",[990,1002,1003,1004,1007],{},"Every revenexx App is a self-contained unit that runs on the platform runtime. An app is defined by ",[994,1005,1006],{},"up to five declarative JSON files"," — no API boilerplate, no tenant logic, no infrastructure wiring. The platform reads these files and provisions everything.",[1009,1010,1012],"h2",{"id":1011},"the-five-files","The Five Files",[1014,1015,1020],"pre",{"className":1016,"code":1018,"language":1019},[1017],"language-text","my-app\u002F\n├── manifest.json     ← identity, dependencies, permissions, policies, events\n├── schema.json       ← database table definitions (slim, Git = history)\n├── cockpit.json      ← Cockpit UI extension points (navigation, views, widgets)\n├── settings.json     ← per-tenant and per-market configuration declarations\n└── billing.json      ← marketplace billing model (free, paid, included)\n","text",[1021,1022,1018],"code",{"__ignoreMap":1023},"",[1009,1025,1027],{"id":1026},"why-declarative","Why declarative?",[990,1029,1030,1031,1034],{},"It helps to understand what this model is reacting against. On a typical platform, standing up a single app means writing — and then maintaining — a familiar stack of boilerplate: REST endpoints for every table, schema migrations with their own version tracking, a ",[1021,1032,1033],{},"tenant_id"," filter on every query that you must never once forget, permission checks scattered through the request handlers, and a separate dance to register the app in a marketplace and wire up billing. None of that is the app's actual job, all of it is error-prone and slow, and most of it looks nearly identical from one app to the next.",[990,1036,1037,1038,1042,1043,1046,1047,1050,1051,1054,1055,1058,1059,1062,1063,1066],{},"The declarative model inverts that. Instead of ",[1039,1040,1041],"em",{},"writing"," the plumbing, you ",[1039,1044,1045],{},"declare"," what you need and the platform builds it. Each of the five files hands one concern to the platform: ",[1021,1048,1049],{},"manifest.json"," states what you depend on, what data you touch, and what capabilities you need; ",[1021,1052,1053],{},"schema.json"," defines your data model, and the platform applies the migrations and scopes every row to the tenant; ",[1021,1056,1057],{},"cockpit.json"," declares your UI extension points, which Cockpit renders; ",[1021,1060,1061],{},"settings.json"," describes your tenant- and market-scoped configuration, for which Cockpit auto-generates a form; and ",[1021,1064,1065],{},"billing.json"," declares your pricing, which the customer console turns into marketplace billing. Everything downstream of those declarations — API endpoints, authentication, tenant isolation, UI composition — happens for you.",[1009,1068,1070],{"id":1069},"how-it-works-an-order-app-example","How it works: an order app example",[990,1072,1073],{},"The fastest way to see the model is to watch one small app come together file by file. The app below tracks orders; it's deliberately minimal, but every file it touches is one you'll write in real apps. For each file, look at what you declare and then at what the platform does with it — that gap is the whole point of the declarative model.",[1075,1076,1078],"h3",{"id":1077},"_1-declare-the-app-manifestjson","1. Declare the app (manifest.json)",[1014,1080,1084],{"className":1081,"code":1082,"language":1083,"meta":1023,"style":1023},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"orders\",\n  \"vendor\": \"revenexx\",\n  \"version\": \"1.0.0\",\n  \"title\": \"Orders\",\n  \"dependencies\": {\n    \"customers\": \"^1.0\",\n    \"pricing\": \"^1.0\"\n  },\n  \"permissions\": [\n    { \"entity\": \"orders\", \"access\": [\"read\", \"create\", \"update\"] },\n    { \"entity\": \"order_items\", \"access\": [\"read\", \"create\"] }\n  ],\n  \"policies\": [\n    { \"name\": \"outbound-access\", \"attrs\": { \"host\": \"{{tenant_domain}}\", \"path\": \"\u002Fapi\u002Ferp\u002F*\" } },\n    { \"name\": \"event-publish\", \"attrs\": { \"events\": [\"order.created\", \"order.status_changed\"] } }\n  ],\n  \"events\": {\n    \"emits\": [\"order.created\", \"order.status_changed\"],\n    \"listens\": [\"inventory.stock_changed\", \"app.installed\"]\n  }\n}\n","json",[1021,1085,1086,1095,1123,1144,1165,1186,1201,1224,1243,1249,1264,1331,1382,1388,1402,1476,1541,1546,1559,1590,1623,1629],{"__ignoreMap":1023},[1087,1088,1091],"span",{"class":1089,"line":1090},"line",1,[1087,1092,1094],{"class":1093},"sMK4o","{\n",[1087,1096,1098,1101,1105,1108,1111,1114,1118,1120],{"class":1089,"line":1097},2,[1087,1099,1100],{"class":1093},"  \"",[1087,1102,1104],{"class":1103},"spNyl","name",[1087,1106,1107],{"class":1093},"\"",[1087,1109,1110],{"class":1093},":",[1087,1112,1113],{"class":1093}," \"",[1087,1115,1117],{"class":1116},"sfazB","orders",[1087,1119,1107],{"class":1093},[1087,1121,1122],{"class":1093},",\n",[1087,1124,1126,1128,1131,1133,1135,1137,1140,1142],{"class":1089,"line":1125},3,[1087,1127,1100],{"class":1093},[1087,1129,1130],{"class":1103},"vendor",[1087,1132,1107],{"class":1093},[1087,1134,1110],{"class":1093},[1087,1136,1113],{"class":1093},[1087,1138,1139],{"class":1116},"revenexx",[1087,1141,1107],{"class":1093},[1087,1143,1122],{"class":1093},[1087,1145,1147,1149,1152,1154,1156,1158,1161,1163],{"class":1089,"line":1146},4,[1087,1148,1100],{"class":1093},[1087,1150,1151],{"class":1103},"version",[1087,1153,1107],{"class":1093},[1087,1155,1110],{"class":1093},[1087,1157,1113],{"class":1093},[1087,1159,1160],{"class":1116},"1.0.0",[1087,1162,1107],{"class":1093},[1087,1164,1122],{"class":1093},[1087,1166,1168,1170,1173,1175,1177,1179,1182,1184],{"class":1089,"line":1167},5,[1087,1169,1100],{"class":1093},[1087,1171,1172],{"class":1103},"title",[1087,1174,1107],{"class":1093},[1087,1176,1110],{"class":1093},[1087,1178,1113],{"class":1093},[1087,1180,1181],{"class":1116},"Orders",[1087,1183,1107],{"class":1093},[1087,1185,1122],{"class":1093},[1087,1187,1189,1191,1194,1196,1198],{"class":1089,"line":1188},6,[1087,1190,1100],{"class":1093},[1087,1192,1193],{"class":1103},"dependencies",[1087,1195,1107],{"class":1093},[1087,1197,1110],{"class":1093},[1087,1199,1200],{"class":1093}," {\n",[1087,1202,1204,1207,1211,1213,1215,1217,1220,1222],{"class":1089,"line":1203},7,[1087,1205,1206],{"class":1093},"    \"",[1087,1208,1210],{"class":1209},"sBMFI","customers",[1087,1212,1107],{"class":1093},[1087,1214,1110],{"class":1093},[1087,1216,1113],{"class":1093},[1087,1218,1219],{"class":1116},"^1.0",[1087,1221,1107],{"class":1093},[1087,1223,1122],{"class":1093},[1087,1225,1227,1229,1232,1234,1236,1238,1240],{"class":1089,"line":1226},8,[1087,1228,1206],{"class":1093},[1087,1230,1231],{"class":1209},"pricing",[1087,1233,1107],{"class":1093},[1087,1235,1110],{"class":1093},[1087,1237,1113],{"class":1093},[1087,1239,1219],{"class":1116},[1087,1241,1242],{"class":1093},"\"\n",[1087,1244,1246],{"class":1089,"line":1245},9,[1087,1247,1248],{"class":1093},"  },\n",[1087,1250,1252,1254,1257,1259,1261],{"class":1089,"line":1251},10,[1087,1253,1100],{"class":1093},[1087,1255,1256],{"class":1103},"permissions",[1087,1258,1107],{"class":1093},[1087,1260,1110],{"class":1093},[1087,1262,1263],{"class":1093}," [\n",[1087,1265,1267,1270,1272,1275,1277,1279,1281,1283,1285,1288,1290,1293,1295,1297,1300,1302,1305,1307,1309,1311,1314,1316,1318,1320,1323,1325,1328],{"class":1089,"line":1266},11,[1087,1268,1269],{"class":1093},"    {",[1087,1271,1113],{"class":1093},[1087,1273,1274],{"class":1209},"entity",[1087,1276,1107],{"class":1093},[1087,1278,1110],{"class":1093},[1087,1280,1113],{"class":1093},[1087,1282,1117],{"class":1116},[1087,1284,1107],{"class":1093},[1087,1286,1287],{"class":1093},",",[1087,1289,1113],{"class":1093},[1087,1291,1292],{"class":1209},"access",[1087,1294,1107],{"class":1093},[1087,1296,1110],{"class":1093},[1087,1298,1299],{"class":1093}," [",[1087,1301,1107],{"class":1093},[1087,1303,1304],{"class":1116},"read",[1087,1306,1107],{"class":1093},[1087,1308,1287],{"class":1093},[1087,1310,1113],{"class":1093},[1087,1312,1313],{"class":1116},"create",[1087,1315,1107],{"class":1093},[1087,1317,1287],{"class":1093},[1087,1319,1113],{"class":1093},[1087,1321,1322],{"class":1116},"update",[1087,1324,1107],{"class":1093},[1087,1326,1327],{"class":1093},"]",[1087,1329,1330],{"class":1093}," },\n",[1087,1332,1334,1336,1338,1340,1342,1344,1346,1349,1351,1353,1355,1357,1359,1361,1363,1365,1367,1369,1371,1373,1375,1377,1379],{"class":1089,"line":1333},12,[1087,1335,1269],{"class":1093},[1087,1337,1113],{"class":1093},[1087,1339,1274],{"class":1209},[1087,1341,1107],{"class":1093},[1087,1343,1110],{"class":1093},[1087,1345,1113],{"class":1093},[1087,1347,1348],{"class":1116},"order_items",[1087,1350,1107],{"class":1093},[1087,1352,1287],{"class":1093},[1087,1354,1113],{"class":1093},[1087,1356,1292],{"class":1209},[1087,1358,1107],{"class":1093},[1087,1360,1110],{"class":1093},[1087,1362,1299],{"class":1093},[1087,1364,1107],{"class":1093},[1087,1366,1304],{"class":1116},[1087,1368,1107],{"class":1093},[1087,1370,1287],{"class":1093},[1087,1372,1113],{"class":1093},[1087,1374,1313],{"class":1116},[1087,1376,1107],{"class":1093},[1087,1378,1327],{"class":1093},[1087,1380,1381],{"class":1093}," }\n",[1087,1383,1385],{"class":1089,"line":1384},13,[1087,1386,1387],{"class":1093},"  ],\n",[1087,1389,1391,1393,1396,1398,1400],{"class":1089,"line":1390},14,[1087,1392,1100],{"class":1093},[1087,1394,1395],{"class":1103},"policies",[1087,1397,1107],{"class":1093},[1087,1399,1110],{"class":1093},[1087,1401,1263],{"class":1093},[1087,1403,1405,1407,1409,1411,1413,1415,1417,1420,1422,1424,1426,1429,1431,1433,1436,1438,1442,1444,1446,1448,1451,1453,1455,1457,1460,1462,1464,1466,1469,1471,1474],{"class":1089,"line":1404},15,[1087,1406,1269],{"class":1093},[1087,1408,1113],{"class":1093},[1087,1410,1104],{"class":1209},[1087,1412,1107],{"class":1093},[1087,1414,1110],{"class":1093},[1087,1416,1113],{"class":1093},[1087,1418,1419],{"class":1116},"outbound-access",[1087,1421,1107],{"class":1093},[1087,1423,1287],{"class":1093},[1087,1425,1113],{"class":1093},[1087,1427,1428],{"class":1209},"attrs",[1087,1430,1107],{"class":1093},[1087,1432,1110],{"class":1093},[1087,1434,1435],{"class":1093}," {",[1087,1437,1113],{"class":1093},[1087,1439,1441],{"class":1440},"sbssI","host",[1087,1443,1107],{"class":1093},[1087,1445,1110],{"class":1093},[1087,1447,1113],{"class":1093},[1087,1449,1450],{"class":1116},"{{tenant_domain}}",[1087,1452,1107],{"class":1093},[1087,1454,1287],{"class":1093},[1087,1456,1113],{"class":1093},[1087,1458,1459],{"class":1440},"path",[1087,1461,1107],{"class":1093},[1087,1463,1110],{"class":1093},[1087,1465,1113],{"class":1093},[1087,1467,1468],{"class":1116},"\u002Fapi\u002Ferp\u002F*",[1087,1470,1107],{"class":1093},[1087,1472,1473],{"class":1093}," }",[1087,1475,1330],{"class":1093},[1087,1477,1479,1481,1483,1485,1487,1489,1491,1494,1496,1498,1500,1502,1504,1506,1508,1510,1513,1515,1517,1519,1521,1524,1526,1528,1530,1533,1535,1537,1539],{"class":1089,"line":1478},16,[1087,1480,1269],{"class":1093},[1087,1482,1113],{"class":1093},[1087,1484,1104],{"class":1209},[1087,1486,1107],{"class":1093},[1087,1488,1110],{"class":1093},[1087,1490,1113],{"class":1093},[1087,1492,1493],{"class":1116},"event-publish",[1087,1495,1107],{"class":1093},[1087,1497,1287],{"class":1093},[1087,1499,1113],{"class":1093},[1087,1501,1428],{"class":1209},[1087,1503,1107],{"class":1093},[1087,1505,1110],{"class":1093},[1087,1507,1435],{"class":1093},[1087,1509,1113],{"class":1093},[1087,1511,1512],{"class":1440},"events",[1087,1514,1107],{"class":1093},[1087,1516,1110],{"class":1093},[1087,1518,1299],{"class":1093},[1087,1520,1107],{"class":1093},[1087,1522,1523],{"class":1116},"order.created",[1087,1525,1107],{"class":1093},[1087,1527,1287],{"class":1093},[1087,1529,1113],{"class":1093},[1087,1531,1532],{"class":1116},"order.status_changed",[1087,1534,1107],{"class":1093},[1087,1536,1327],{"class":1093},[1087,1538,1473],{"class":1093},[1087,1540,1381],{"class":1093},[1087,1542,1544],{"class":1089,"line":1543},17,[1087,1545,1387],{"class":1093},[1087,1547,1549,1551,1553,1555,1557],{"class":1089,"line":1548},18,[1087,1550,1100],{"class":1093},[1087,1552,1512],{"class":1103},[1087,1554,1107],{"class":1093},[1087,1556,1110],{"class":1093},[1087,1558,1200],{"class":1093},[1087,1560,1562,1564,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587],{"class":1089,"line":1561},19,[1087,1563,1206],{"class":1093},[1087,1565,1566],{"class":1209},"emits",[1087,1568,1107],{"class":1093},[1087,1570,1110],{"class":1093},[1087,1572,1299],{"class":1093},[1087,1574,1107],{"class":1093},[1087,1576,1523],{"class":1116},[1087,1578,1107],{"class":1093},[1087,1580,1287],{"class":1093},[1087,1582,1113],{"class":1093},[1087,1584,1532],{"class":1116},[1087,1586,1107],{"class":1093},[1087,1588,1589],{"class":1093},"],\n",[1087,1591,1593,1595,1598,1600,1602,1604,1606,1609,1611,1613,1615,1618,1620],{"class":1089,"line":1592},20,[1087,1594,1206],{"class":1093},[1087,1596,1597],{"class":1209},"listens",[1087,1599,1107],{"class":1093},[1087,1601,1110],{"class":1093},[1087,1603,1299],{"class":1093},[1087,1605,1107],{"class":1093},[1087,1607,1608],{"class":1116},"inventory.stock_changed",[1087,1610,1107],{"class":1093},[1087,1612,1287],{"class":1093},[1087,1614,1113],{"class":1093},[1087,1616,1617],{"class":1116},"app.installed",[1087,1619,1107],{"class":1093},[1087,1621,1622],{"class":1093},"]\n",[1087,1624,1626],{"class":1089,"line":1625},21,[1087,1627,1628],{"class":1093},"  }\n",[1087,1630,1632],{"class":1089,"line":1631},22,[1087,1633,1634],{"class":1093},"}\n",[990,1636,1637,1638,1640,1641,1643,1644,1640,1646,1648],{},"From this one file the platform does a surprising amount. It checks that the ",[1021,1639,1210],{}," and ",[1021,1642,1231],{}," apps exist and auto-installs them as dependencies, so your app can rely on them being present. It grants your app read\u002Fcreate\u002Fupdate access to the ",[1021,1645,1117],{},[1021,1647,1348],{}," entities — and to nothing else. It confines your outbound HTTP calls to your tenant's ERP domain, so the app physically cannot reach arbitrary hosts. It registers your events on the platform event bus. And at install time it turns these declarations into a plain-language security summary the customer reviews before saying yes.",[1075,1650,1652],{"id":1651},"_2-define-the-data-schemajson","2. Define the data (schema.json)",[1014,1654,1656],{"className":1081,"code":1655,"language":1083,"meta":1023,"style":1023},"{\n  \"tables\": {\n    \"orders\": {\n      \"columns\": {\n        \"id\": { \"type\": \"uuid\", \"primary\": true },\n        \"customer_id\": { \"type\": \"uuid\", \"references\": \"customers.id\" },\n        \"status\": { \"type\": \"string\", \"enum\": [\"draft\", \"confirmed\", \"shipped\", \"delivered\"] },\n        \"total_amount\": { \"type\": \"decimal\" },\n        \"created_at\": { \"type\": \"timestamp\", \"default\": \"now()\" }\n      }\n    },\n    \"order_items\": {\n      \"columns\": {\n        \"id\": { \"type\": \"uuid\", \"primary\": true },\n        \"order_id\": { \"type\": \"uuid\", \"references\": \"orders.id\" },\n        \"product_id\": { \"type\": \"uuid\" },\n        \"quantity\": { \"type\": \"integer\" },\n        \"unit_price\": { \"type\": \"decimal\" }\n      }\n    }\n  }\n}\n",[1021,1657,1658,1662,1675,1687,1701,1749,1796,1875,1905,1953,1958,1963,1975,1987,2027,2073,2102,2132,2161,2165,2170,2174],{"__ignoreMap":1023},[1087,1659,1660],{"class":1089,"line":1090},[1087,1661,1094],{"class":1093},[1087,1663,1664,1666,1669,1671,1673],{"class":1089,"line":1097},[1087,1665,1100],{"class":1093},[1087,1667,1668],{"class":1103},"tables",[1087,1670,1107],{"class":1093},[1087,1672,1110],{"class":1093},[1087,1674,1200],{"class":1093},[1087,1676,1677,1679,1681,1683,1685],{"class":1089,"line":1125},[1087,1678,1206],{"class":1093},[1087,1680,1117],{"class":1209},[1087,1682,1107],{"class":1093},[1087,1684,1110],{"class":1093},[1087,1686,1200],{"class":1093},[1087,1688,1689,1692,1695,1697,1699],{"class":1089,"line":1146},[1087,1690,1691],{"class":1093},"      \"",[1087,1693,1694],{"class":1440},"columns",[1087,1696,1107],{"class":1093},[1087,1698,1110],{"class":1093},[1087,1700,1200],{"class":1093},[1087,1702,1703,1706,1710,1712,1714,1716,1718,1722,1724,1726,1728,1731,1733,1735,1737,1740,1742,1744,1747],{"class":1089,"line":1167},[1087,1704,1705],{"class":1093},"        \"",[1087,1707,1709],{"class":1708},"swJcz","id",[1087,1711,1107],{"class":1093},[1087,1713,1110],{"class":1093},[1087,1715,1435],{"class":1093},[1087,1717,1113],{"class":1093},[1087,1719,1721],{"class":1720},"su27w","type",[1087,1723,1107],{"class":1093},[1087,1725,1110],{"class":1093},[1087,1727,1113],{"class":1093},[1087,1729,1730],{"class":1116},"uuid",[1087,1732,1107],{"class":1093},[1087,1734,1287],{"class":1093},[1087,1736,1113],{"class":1093},[1087,1738,1739],{"class":1720},"primary",[1087,1741,1107],{"class":1093},[1087,1743,1110],{"class":1093},[1087,1745,1746],{"class":1093}," true",[1087,1748,1330],{"class":1093},[1087,1750,1751,1753,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780,1783,1785,1787,1789,1792,1794],{"class":1089,"line":1188},[1087,1752,1705],{"class":1093},[1087,1754,1755],{"class":1708},"customer_id",[1087,1757,1107],{"class":1093},[1087,1759,1110],{"class":1093},[1087,1761,1435],{"class":1093},[1087,1763,1113],{"class":1093},[1087,1765,1721],{"class":1720},[1087,1767,1107],{"class":1093},[1087,1769,1110],{"class":1093},[1087,1771,1113],{"class":1093},[1087,1773,1730],{"class":1116},[1087,1775,1107],{"class":1093},[1087,1777,1287],{"class":1093},[1087,1779,1113],{"class":1093},[1087,1781,1782],{"class":1720},"references",[1087,1784,1107],{"class":1093},[1087,1786,1110],{"class":1093},[1087,1788,1113],{"class":1093},[1087,1790,1791],{"class":1116},"customers.id",[1087,1793,1107],{"class":1093},[1087,1795,1330],{"class":1093},[1087,1797,1798,1800,1803,1805,1807,1809,1811,1813,1815,1817,1819,1822,1824,1826,1828,1831,1833,1835,1837,1839,1842,1844,1846,1848,1851,1853,1855,1857,1860,1862,1864,1866,1869,1871,1873],{"class":1089,"line":1203},[1087,1799,1705],{"class":1093},[1087,1801,1802],{"class":1708},"status",[1087,1804,1107],{"class":1093},[1087,1806,1110],{"class":1093},[1087,1808,1435],{"class":1093},[1087,1810,1113],{"class":1093},[1087,1812,1721],{"class":1720},[1087,1814,1107],{"class":1093},[1087,1816,1110],{"class":1093},[1087,1818,1113],{"class":1093},[1087,1820,1821],{"class":1116},"string",[1087,1823,1107],{"class":1093},[1087,1825,1287],{"class":1093},[1087,1827,1113],{"class":1093},[1087,1829,1830],{"class":1720},"enum",[1087,1832,1107],{"class":1093},[1087,1834,1110],{"class":1093},[1087,1836,1299],{"class":1093},[1087,1838,1107],{"class":1093},[1087,1840,1841],{"class":1116},"draft",[1087,1843,1107],{"class":1093},[1087,1845,1287],{"class":1093},[1087,1847,1113],{"class":1093},[1087,1849,1850],{"class":1116},"confirmed",[1087,1852,1107],{"class":1093},[1087,1854,1287],{"class":1093},[1087,1856,1113],{"class":1093},[1087,1858,1859],{"class":1116},"shipped",[1087,1861,1107],{"class":1093},[1087,1863,1287],{"class":1093},[1087,1865,1113],{"class":1093},[1087,1867,1868],{"class":1116},"delivered",[1087,1870,1107],{"class":1093},[1087,1872,1327],{"class":1093},[1087,1874,1330],{"class":1093},[1087,1876,1877,1879,1882,1884,1886,1888,1890,1892,1894,1896,1898,1901,1903],{"class":1089,"line":1226},[1087,1878,1705],{"class":1093},[1087,1880,1881],{"class":1708},"total_amount",[1087,1883,1107],{"class":1093},[1087,1885,1110],{"class":1093},[1087,1887,1435],{"class":1093},[1087,1889,1113],{"class":1093},[1087,1891,1721],{"class":1720},[1087,1893,1107],{"class":1093},[1087,1895,1110],{"class":1093},[1087,1897,1113],{"class":1093},[1087,1899,1900],{"class":1116},"decimal",[1087,1902,1107],{"class":1093},[1087,1904,1330],{"class":1093},[1087,1906,1907,1909,1912,1914,1916,1918,1920,1922,1924,1926,1928,1931,1933,1935,1937,1940,1942,1944,1946,1949,1951],{"class":1089,"line":1245},[1087,1908,1705],{"class":1093},[1087,1910,1911],{"class":1708},"created_at",[1087,1913,1107],{"class":1093},[1087,1915,1110],{"class":1093},[1087,1917,1435],{"class":1093},[1087,1919,1113],{"class":1093},[1087,1921,1721],{"class":1720},[1087,1923,1107],{"class":1093},[1087,1925,1110],{"class":1093},[1087,1927,1113],{"class":1093},[1087,1929,1930],{"class":1116},"timestamp",[1087,1932,1107],{"class":1093},[1087,1934,1287],{"class":1093},[1087,1936,1113],{"class":1093},[1087,1938,1939],{"class":1720},"default",[1087,1941,1107],{"class":1093},[1087,1943,1110],{"class":1093},[1087,1945,1113],{"class":1093},[1087,1947,1948],{"class":1116},"now()",[1087,1950,1107],{"class":1093},[1087,1952,1381],{"class":1093},[1087,1954,1955],{"class":1089,"line":1251},[1087,1956,1957],{"class":1093},"      }\n",[1087,1959,1960],{"class":1089,"line":1266},[1087,1961,1962],{"class":1093},"    },\n",[1087,1964,1965,1967,1969,1971,1973],{"class":1089,"line":1333},[1087,1966,1206],{"class":1093},[1087,1968,1348],{"class":1209},[1087,1970,1107],{"class":1093},[1087,1972,1110],{"class":1093},[1087,1974,1200],{"class":1093},[1087,1976,1977,1979,1981,1983,1985],{"class":1089,"line":1384},[1087,1978,1691],{"class":1093},[1087,1980,1694],{"class":1440},[1087,1982,1107],{"class":1093},[1087,1984,1110],{"class":1093},[1087,1986,1200],{"class":1093},[1087,1988,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025],{"class":1089,"line":1390},[1087,1990,1705],{"class":1093},[1087,1992,1709],{"class":1708},[1087,1994,1107],{"class":1093},[1087,1996,1110],{"class":1093},[1087,1998,1435],{"class":1093},[1087,2000,1113],{"class":1093},[1087,2002,1721],{"class":1720},[1087,2004,1107],{"class":1093},[1087,2006,1110],{"class":1093},[1087,2008,1113],{"class":1093},[1087,2010,1730],{"class":1116},[1087,2012,1107],{"class":1093},[1087,2014,1287],{"class":1093},[1087,2016,1113],{"class":1093},[1087,2018,1739],{"class":1720},[1087,2020,1107],{"class":1093},[1087,2022,1110],{"class":1093},[1087,2024,1746],{"class":1093},[1087,2026,1330],{"class":1093},[1087,2028,2029,2031,2034,2036,2038,2040,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066,2069,2071],{"class":1089,"line":1404},[1087,2030,1705],{"class":1093},[1087,2032,2033],{"class":1708},"order_id",[1087,2035,1107],{"class":1093},[1087,2037,1110],{"class":1093},[1087,2039,1435],{"class":1093},[1087,2041,1113],{"class":1093},[1087,2043,1721],{"class":1720},[1087,2045,1107],{"class":1093},[1087,2047,1110],{"class":1093},[1087,2049,1113],{"class":1093},[1087,2051,1730],{"class":1116},[1087,2053,1107],{"class":1093},[1087,2055,1287],{"class":1093},[1087,2057,1113],{"class":1093},[1087,2059,1782],{"class":1720},[1087,2061,1107],{"class":1093},[1087,2063,1110],{"class":1093},[1087,2065,1113],{"class":1093},[1087,2067,2068],{"class":1116},"orders.id",[1087,2070,1107],{"class":1093},[1087,2072,1330],{"class":1093},[1087,2074,2075,2077,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100],{"class":1089,"line":1478},[1087,2076,1705],{"class":1093},[1087,2078,2079],{"class":1708},"product_id",[1087,2081,1107],{"class":1093},[1087,2083,1110],{"class":1093},[1087,2085,1435],{"class":1093},[1087,2087,1113],{"class":1093},[1087,2089,1721],{"class":1720},[1087,2091,1107],{"class":1093},[1087,2093,1110],{"class":1093},[1087,2095,1113],{"class":1093},[1087,2097,1730],{"class":1116},[1087,2099,1107],{"class":1093},[1087,2101,1330],{"class":1093},[1087,2103,2104,2106,2109,2111,2113,2115,2117,2119,2121,2123,2125,2128,2130],{"class":1089,"line":1543},[1087,2105,1705],{"class":1093},[1087,2107,2108],{"class":1708},"quantity",[1087,2110,1107],{"class":1093},[1087,2112,1110],{"class":1093},[1087,2114,1435],{"class":1093},[1087,2116,1113],{"class":1093},[1087,2118,1721],{"class":1720},[1087,2120,1107],{"class":1093},[1087,2122,1110],{"class":1093},[1087,2124,1113],{"class":1093},[1087,2126,2127],{"class":1116},"integer",[1087,2129,1107],{"class":1093},[1087,2131,1330],{"class":1093},[1087,2133,2134,2136,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159],{"class":1089,"line":1548},[1087,2135,1705],{"class":1093},[1087,2137,2138],{"class":1708},"unit_price",[1087,2140,1107],{"class":1093},[1087,2142,1110],{"class":1093},[1087,2144,1435],{"class":1093},[1087,2146,1113],{"class":1093},[1087,2148,1721],{"class":1720},[1087,2150,1107],{"class":1093},[1087,2152,1110],{"class":1093},[1087,2154,1113],{"class":1093},[1087,2156,1900],{"class":1116},[1087,2158,1107],{"class":1093},[1087,2160,1381],{"class":1093},[1087,2162,2163],{"class":1089,"line":1561},[1087,2164,1957],{"class":1093},[1087,2166,2167],{"class":1089,"line":1592},[1087,2168,2169],{"class":1093},"    }\n",[1087,2171,2172],{"class":1089,"line":1625},[1087,2173,1628],{"class":1093},[1087,2175,2176],{"class":1089,"line":1631},[1087,2177,1634],{"class":1093},[990,2179,2180,2181,2184,2185,2187,2188,2190],{},"Notice what's ",[1039,2182,2183],{},"not"," in that schema: there's no ",[1021,2186,1033],{}," column, no migration script, no API definition. The platform supplies all of it. It adds a ",[1021,2189,1033],{}," column to every table automatically — you never write it and can't accidentally mangle it — applies the migration, generates REST and GraphQL APIs from the tables, and scopes each tenant so it sees only its own rows. You described the shape of your data; everything that makes that data safe and reachable is the platform's job.",[1075,2192,2194],{"id":2193},"_3-extend-cockpit-cockpitjson","3. Extend Cockpit (cockpit.json)",[1014,2196,2198],{"className":1081,"code":2197,"language":1083,"meta":1023,"style":1023},"{\n  \"navigation\": [\n    {\n      \"label\": \"Orders\",\n      \"icon\": \"shopping-cart\",\n      \"target\": \"\u002Forders\"\n    }\n  ],\n  \"views\": [\n    {\n      \"route\": \"\u002Forders\",\n      \"label\": \"Orders List\",\n      \"component\": \"OrdersList\"\n    }\n  ]\n}\n",[1021,2199,2200,2204,2217,2222,2241,2261,2279,2283,2287,2300,2304,2323,2342,2360,2364,2369],{"__ignoreMap":1023},[1087,2201,2202],{"class":1089,"line":1090},[1087,2203,1094],{"class":1093},[1087,2205,2206,2208,2211,2213,2215],{"class":1089,"line":1097},[1087,2207,1100],{"class":1093},[1087,2209,2210],{"class":1103},"navigation",[1087,2212,1107],{"class":1093},[1087,2214,1110],{"class":1093},[1087,2216,1263],{"class":1093},[1087,2218,2219],{"class":1089,"line":1125},[1087,2220,2221],{"class":1093},"    {\n",[1087,2223,2224,2226,2229,2231,2233,2235,2237,2239],{"class":1089,"line":1146},[1087,2225,1691],{"class":1093},[1087,2227,2228],{"class":1209},"label",[1087,2230,1107],{"class":1093},[1087,2232,1110],{"class":1093},[1087,2234,1113],{"class":1093},[1087,2236,1181],{"class":1116},[1087,2238,1107],{"class":1093},[1087,2240,1122],{"class":1093},[1087,2242,2243,2245,2248,2250,2252,2254,2257,2259],{"class":1089,"line":1167},[1087,2244,1691],{"class":1093},[1087,2246,2247],{"class":1209},"icon",[1087,2249,1107],{"class":1093},[1087,2251,1110],{"class":1093},[1087,2253,1113],{"class":1093},[1087,2255,2256],{"class":1116},"shopping-cart",[1087,2258,1107],{"class":1093},[1087,2260,1122],{"class":1093},[1087,2262,2263,2265,2268,2270,2272,2274,2277],{"class":1089,"line":1188},[1087,2264,1691],{"class":1093},[1087,2266,2267],{"class":1209},"target",[1087,2269,1107],{"class":1093},[1087,2271,1110],{"class":1093},[1087,2273,1113],{"class":1093},[1087,2275,2276],{"class":1116},"\u002Forders",[1087,2278,1242],{"class":1093},[1087,2280,2281],{"class":1089,"line":1203},[1087,2282,2169],{"class":1093},[1087,2284,2285],{"class":1089,"line":1226},[1087,2286,1387],{"class":1093},[1087,2288,2289,2291,2294,2296,2298],{"class":1089,"line":1245},[1087,2290,1100],{"class":1093},[1087,2292,2293],{"class":1103},"views",[1087,2295,1107],{"class":1093},[1087,2297,1110],{"class":1093},[1087,2299,1263],{"class":1093},[1087,2301,2302],{"class":1089,"line":1251},[1087,2303,2221],{"class":1093},[1087,2305,2306,2308,2311,2313,2315,2317,2319,2321],{"class":1089,"line":1266},[1087,2307,1691],{"class":1093},[1087,2309,2310],{"class":1209},"route",[1087,2312,1107],{"class":1093},[1087,2314,1110],{"class":1093},[1087,2316,1113],{"class":1093},[1087,2318,2276],{"class":1116},[1087,2320,1107],{"class":1093},[1087,2322,1122],{"class":1093},[1087,2324,2325,2327,2329,2331,2333,2335,2338,2340],{"class":1089,"line":1333},[1087,2326,1691],{"class":1093},[1087,2328,2228],{"class":1209},[1087,2330,1107],{"class":1093},[1087,2332,1110],{"class":1093},[1087,2334,1113],{"class":1093},[1087,2336,2337],{"class":1116},"Orders List",[1087,2339,1107],{"class":1093},[1087,2341,1122],{"class":1093},[1087,2343,2344,2346,2349,2351,2353,2355,2358],{"class":1089,"line":1384},[1087,2345,1691],{"class":1093},[1087,2347,2348],{"class":1209},"component",[1087,2350,1107],{"class":1093},[1087,2352,1110],{"class":1093},[1087,2354,1113],{"class":1093},[1087,2356,2357],{"class":1116},"OrdersList",[1087,2359,1242],{"class":1093},[1087,2361,2362],{"class":1089,"line":1390},[1087,2363,2169],{"class":1093},[1087,2365,2366],{"class":1089,"line":1404},[1087,2367,2368],{"class":1093},"  ]\n",[1087,2370,2371],{"class":1089,"line":1478},[1087,2372,1634],{"class":1093},[990,2374,2375,2376,2378,2379,2381],{},"With that, Cockpit adds an \"Orders\" entry to its sidebar, routes ",[1021,2377,2276],{}," to your ",[1021,2380,2357],{}," component, and — because Cockpit owns the shell — handles authentication and hands your component the tenant context it needs. You ship the Vue component; the JSON just tells Cockpit where it belongs.",[1075,2383,2385],{"id":2384},"_4-declare-settings-settingsjson","4. Declare settings (settings.json)",[1014,2387,2389],{"className":1081,"code":2388,"language":1083,"meta":1023,"style":1023},"{\n  \"settings\": {\n    \"default_payment_terms\": {\n      \"title\": \"Default Payment Terms\",\n      \"type\": \"enum\",\n      \"enum_values\": [\"net-14\", \"net-30\", \"net-60\"],\n      \"default\": \"net-30\",\n      \"scope\": \"market\"\n    }\n  }\n}\n",[1021,2390,2391,2395,2408,2421,2440,2458,2498,2516,2534,2538,2542],{"__ignoreMap":1023},[1087,2392,2393],{"class":1089,"line":1090},[1087,2394,1094],{"class":1093},[1087,2396,2397,2399,2402,2404,2406],{"class":1089,"line":1097},[1087,2398,1100],{"class":1093},[1087,2400,2401],{"class":1103},"settings",[1087,2403,1107],{"class":1093},[1087,2405,1110],{"class":1093},[1087,2407,1200],{"class":1093},[1087,2409,2410,2412,2415,2417,2419],{"class":1089,"line":1125},[1087,2411,1206],{"class":1093},[1087,2413,2414],{"class":1209},"default_payment_terms",[1087,2416,1107],{"class":1093},[1087,2418,1110],{"class":1093},[1087,2420,1200],{"class":1093},[1087,2422,2423,2425,2427,2429,2431,2433,2436,2438],{"class":1089,"line":1146},[1087,2424,1691],{"class":1093},[1087,2426,1172],{"class":1440},[1087,2428,1107],{"class":1093},[1087,2430,1110],{"class":1093},[1087,2432,1113],{"class":1093},[1087,2434,2435],{"class":1116},"Default Payment Terms",[1087,2437,1107],{"class":1093},[1087,2439,1122],{"class":1093},[1087,2441,2442,2444,2446,2448,2450,2452,2454,2456],{"class":1089,"line":1167},[1087,2443,1691],{"class":1093},[1087,2445,1721],{"class":1440},[1087,2447,1107],{"class":1093},[1087,2449,1110],{"class":1093},[1087,2451,1113],{"class":1093},[1087,2453,1830],{"class":1116},[1087,2455,1107],{"class":1093},[1087,2457,1122],{"class":1093},[1087,2459,2460,2462,2465,2467,2469,2471,2473,2476,2478,2480,2482,2485,2487,2489,2491,2494,2496],{"class":1089,"line":1188},[1087,2461,1691],{"class":1093},[1087,2463,2464],{"class":1440},"enum_values",[1087,2466,1107],{"class":1093},[1087,2468,1110],{"class":1093},[1087,2470,1299],{"class":1093},[1087,2472,1107],{"class":1093},[1087,2474,2475],{"class":1116},"net-14",[1087,2477,1107],{"class":1093},[1087,2479,1287],{"class":1093},[1087,2481,1113],{"class":1093},[1087,2483,2484],{"class":1116},"net-30",[1087,2486,1107],{"class":1093},[1087,2488,1287],{"class":1093},[1087,2490,1113],{"class":1093},[1087,2492,2493],{"class":1116},"net-60",[1087,2495,1107],{"class":1093},[1087,2497,1589],{"class":1093},[1087,2499,2500,2502,2504,2506,2508,2510,2512,2514],{"class":1089,"line":1203},[1087,2501,1691],{"class":1093},[1087,2503,1939],{"class":1440},[1087,2505,1107],{"class":1093},[1087,2507,1110],{"class":1093},[1087,2509,1113],{"class":1093},[1087,2511,2484],{"class":1116},[1087,2513,1107],{"class":1093},[1087,2515,1122],{"class":1093},[1087,2517,2518,2520,2523,2525,2527,2529,2532],{"class":1089,"line":1226},[1087,2519,1691],{"class":1093},[1087,2521,2522],{"class":1440},"scope",[1087,2524,1107],{"class":1093},[1087,2526,1110],{"class":1093},[1087,2528,1113],{"class":1093},[1087,2530,2531],{"class":1116},"market",[1087,2533,1242],{"class":1093},[1087,2535,2536],{"class":1089,"line":1245},[1087,2537,2169],{"class":1093},[1087,2539,2540],{"class":1089,"line":1251},[1087,2541,1628],{"class":1093},[1087,2543,2544],{"class":1089,"line":1266},[1087,2545,1634],{"class":1093},[990,2547,2548,2549,2551],{},"The platform renders a settings form for this in Cockpit automatically, stores each value at the scope you declared — here ",[1021,2550,2531],{},", so the choice can differ per market — and lets your app read the resolved value back through an API. You never build a settings screen or a place to persist its values.",[1075,2553,2555],{"id":2554},"_5-define-pricing-billingjson","5. Define pricing (billing.json)",[1014,2557,2559],{"className":1081,"code":2558,"language":1083,"meta":1023,"style":1023},"{\n  \"type\": \"paid\",\n  \"plans\": [\n    {\n      \"id\": \"orders-starter\",\n      \"name\": \"Starter\",\n      \"price\": { \"monthly\": 49 },\n      \"limits\": { \"orders_per_month\": 500 }\n    }\n  ]\n}\n",[1021,2560,2561,2565,2584,2597,2601,2620,2639,2666,2693,2697,2701],{"__ignoreMap":1023},[1087,2562,2563],{"class":1089,"line":1090},[1087,2564,1094],{"class":1093},[1087,2566,2567,2569,2571,2573,2575,2577,2580,2582],{"class":1089,"line":1097},[1087,2568,1100],{"class":1093},[1087,2570,1721],{"class":1103},[1087,2572,1107],{"class":1093},[1087,2574,1110],{"class":1093},[1087,2576,1113],{"class":1093},[1087,2578,2579],{"class":1116},"paid",[1087,2581,1107],{"class":1093},[1087,2583,1122],{"class":1093},[1087,2585,2586,2588,2591,2593,2595],{"class":1089,"line":1125},[1087,2587,1100],{"class":1093},[1087,2589,2590],{"class":1103},"plans",[1087,2592,1107],{"class":1093},[1087,2594,1110],{"class":1093},[1087,2596,1263],{"class":1093},[1087,2598,2599],{"class":1089,"line":1146},[1087,2600,2221],{"class":1093},[1087,2602,2603,2605,2607,2609,2611,2613,2616,2618],{"class":1089,"line":1167},[1087,2604,1691],{"class":1093},[1087,2606,1709],{"class":1209},[1087,2608,1107],{"class":1093},[1087,2610,1110],{"class":1093},[1087,2612,1113],{"class":1093},[1087,2614,2615],{"class":1116},"orders-starter",[1087,2617,1107],{"class":1093},[1087,2619,1122],{"class":1093},[1087,2621,2622,2624,2626,2628,2630,2632,2635,2637],{"class":1089,"line":1188},[1087,2623,1691],{"class":1093},[1087,2625,1104],{"class":1209},[1087,2627,1107],{"class":1093},[1087,2629,1110],{"class":1093},[1087,2631,1113],{"class":1093},[1087,2633,2634],{"class":1116},"Starter",[1087,2636,1107],{"class":1093},[1087,2638,1122],{"class":1093},[1087,2640,2641,2643,2646,2648,2650,2652,2654,2657,2659,2661,2664],{"class":1089,"line":1203},[1087,2642,1691],{"class":1093},[1087,2644,2645],{"class":1209},"price",[1087,2647,1107],{"class":1093},[1087,2649,1110],{"class":1093},[1087,2651,1435],{"class":1093},[1087,2653,1113],{"class":1093},[1087,2655,2656],{"class":1440},"monthly",[1087,2658,1107],{"class":1093},[1087,2660,1110],{"class":1093},[1087,2662,2663],{"class":1440}," 49",[1087,2665,1330],{"class":1093},[1087,2667,2668,2670,2673,2675,2677,2679,2681,2684,2686,2688,2691],{"class":1089,"line":1226},[1087,2669,1691],{"class":1093},[1087,2671,2672],{"class":1209},"limits",[1087,2674,1107],{"class":1093},[1087,2676,1110],{"class":1093},[1087,2678,1435],{"class":1093},[1087,2680,1113],{"class":1093},[1087,2682,2683],{"class":1440},"orders_per_month",[1087,2685,1107],{"class":1093},[1087,2687,1110],{"class":1093},[1087,2689,2690],{"class":1440}," 500",[1087,2692,1381],{"class":1093},[1087,2694,2695],{"class":1089,"line":1245},[1087,2696,2169],{"class":1093},[1087,2698,2699],{"class":1089,"line":1251},[1087,2700,2368],{"class":1093},[1087,2702,2703],{"class":1089,"line":1266},[1087,2704,1634],{"class":1093},[990,2706,2707],{},"That makes the app a paid listing in the App Marketplace, with billing wired up to handle the subscription, and gives the platform the numbers it needs to enforce the plan's limits — like the 500-orders-per-month ceiling declared here. The pricing model is a declaration; the billing machinery behind it is not yours to build.",[1009,2709,2711],{"id":2710},"core-concepts","Core concepts",[990,2713,2714],{},"The order app touched several ideas in passing that are worth pinning down on their own, because they recur in every app you'll write.",[1075,2716,2718],{"id":2717},"dependencies-vs-peer-dependencies","Dependencies vs. peer dependencies",[990,2720,2721],{},"Apps can depend on other apps, and there are two flavours of that relationship. The difference is entirely about who decides to install the dependency — the platform, or the customer.",[2723,2724,2725,2741],"table",{},[2726,2727,2728],"thead",{},[2729,2730,2731,2735,2738],"tr",{},[2732,2733,2734],"th",{},"Type",[2732,2736,2737],{},"Installed How",[2732,2739,2740],{},"Use Case",[2742,2743,2744,2760],"tbody",{},[2729,2745,2746,2751,2754],{},[2747,2748,2749],"td",{},[994,2750,1193],{},[2747,2752,2753],{},"Automatically when your app is activated",[2747,2755,2756,2757,2759],{},"Required apps (e.g., ",[1021,2758,1210],{}," for Orders)",[2729,2761,2762,2767,2770],{},[2747,2763,2764],{},[994,2765,2766],{},"peerDependencies",[2747,2768,2769],{},"Customer installs manually after seeing a prompt",[2747,2771,2772],{},"Paid dependencies or optional features",[990,2774,2775,2776,1640,2778,2780,2781,2784],{},"So when a customer installs Orders, Console silently auto-installs ",[1021,2777,1210],{},[1021,2779,1231],{}," because they're hard dependencies, but for a peer dependency it asks first — ",[1039,2782,2783],{},"\"This app requires Markets. Do you want to install it?\""," You use a plain dependency for things your app genuinely can't run without, and a peer dependency when the dependency costs money or is genuinely optional, so the choice (and the cost) stays with the customer.",[1075,2786,2788],{"id":2787},"policies-the-allowlist-model","Policies: the allowlist model",[990,2790,2791,2792,2795],{},"The security stance is worth stating bluntly: an app starts with ",[994,2793,2794],{},"zero access to everything",". It can't call out to the network, publish or receive events, or touch file storage until it asks. Each capability is granted by a policy you declare, and nothing is implicit.",[2723,2797,2798,2811],{},[2726,2799,2800],{},[2729,2801,2802,2805,2808],{},[2732,2803,2804],{},"Policy",[2732,2806,2807],{},"Grants",[2732,2809,2810],{},"Example",[2742,2812,2813,2825,2839,2854],{},[2729,2814,2815,2819,2822],{},[2747,2816,2817],{},[1021,2818,1419],{},[2747,2820,2821],{},"HTTP calls to external hosts",[2747,2823,2824],{},"Connect to ERP system",[2729,2826,2827,2831,2834],{},[2747,2828,2829],{},[1021,2830,1493],{},[2747,2832,2833],{},"Publishing events",[2747,2835,2836,2837],{},"Emit ",[1021,2838,1523],{},[2729,2840,2841,2846,2849],{},[2747,2842,2843],{},[1021,2844,2845],{},"event-subscribe",[2747,2847,2848],{},"Subscribing to events",[2747,2850,2851,2852],{},"Listen to ",[1021,2853,1608],{},[2729,2855,2856,2865,2868],{},[2747,2857,2858,2861,2862],{},[1021,2859,2860],{},"storage-read"," \u002F ",[1021,2863,2864],{},"storage-write",[2747,2866,2867],{},"File bucket access",[2747,2869,2870],{},"Store order PDF attachments",[990,2872,2873,2874,2877],{},"Because every capability is declared up front, the platform can turn the whole list into something a non-technical customer can actually evaluate at install time — ",[1039,2875,2876],{},"\"This app will connect to your ERP system and publish order events.\""," The allowlist isn't just a runtime guardrail; it's also the source of that consent screen.",[1075,2879,2881],{"id":2880},"events-loose-coupling","Events: loose coupling",[990,2883,2884],{},"Apps communicate by publishing and subscribing to events rather than by calling each other directly:",[1014,2886,2890],{"className":2887,"code":2888,"language":2889,"meta":1023,"style":1023},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F When an order is created, the Orders app publishes:\nawait platform.events.publish('order.created', {\n  order_id: '123',\n  customer_id: '456',\n  total: 1500.00\n})\n\n\u002F\u002F The Inventory app subscribes and updates stock:\nplatform.events.on('order.created', async (event) => {\n  await inventory.update(event.order_id)\n})\n","javascript",[1021,2891,2892,2898,2933,2950,2966,2976,2984,2990,2995,3037,3059],{"__ignoreMap":1023},[1087,2893,2894],{"class":1089,"line":1090},[1087,2895,2897],{"class":2896},"sHwdD","\u002F\u002F When an order is created, the Orders app publishes:\n",[1087,2899,2900,2904,2908,2911,2913,2915,2919,2922,2925,2927,2929,2931],{"class":1089,"line":1097},[1087,2901,2903],{"class":2902},"s7zQu","await",[1087,2905,2907],{"class":2906},"sTEyZ"," platform",[1087,2909,2910],{"class":1093},".",[1087,2912,1512],{"class":2906},[1087,2914,2910],{"class":1093},[1087,2916,2918],{"class":2917},"s2Zo4","publish",[1087,2920,2921],{"class":2906},"(",[1087,2923,2924],{"class":1093},"'",[1087,2926,1523],{"class":1116},[1087,2928,2924],{"class":1093},[1087,2930,1287],{"class":1093},[1087,2932,1200],{"class":1093},[1087,2934,2935,2938,2940,2943,2946,2948],{"class":1089,"line":1125},[1087,2936,2937],{"class":1708},"  order_id",[1087,2939,1110],{"class":1093},[1087,2941,2942],{"class":1093}," '",[1087,2944,2945],{"class":1116},"123",[1087,2947,2924],{"class":1093},[1087,2949,1122],{"class":1093},[1087,2951,2952,2955,2957,2959,2962,2964],{"class":1089,"line":1146},[1087,2953,2954],{"class":1708},"  customer_id",[1087,2956,1110],{"class":1093},[1087,2958,2942],{"class":1093},[1087,2960,2961],{"class":1116},"456",[1087,2963,2924],{"class":1093},[1087,2965,1122],{"class":1093},[1087,2967,2968,2971,2973],{"class":1089,"line":1167},[1087,2969,2970],{"class":1708},"  total",[1087,2972,1110],{"class":1093},[1087,2974,2975],{"class":1440}," 1500.00\n",[1087,2977,2978,2981],{"class":1089,"line":1188},[1087,2979,2980],{"class":1093},"}",[1087,2982,2983],{"class":2906},")\n",[1087,2985,2986],{"class":1089,"line":1203},[1087,2987,2989],{"emptyLinePlaceholder":2988},true,"\n",[1087,2991,2992],{"class":1089,"line":1226},[1087,2993,2994],{"class":2896},"\u002F\u002F The Inventory app subscribes and updates stock:\n",[1087,2996,2997,3000,3002,3004,3006,3009,3011,3013,3015,3017,3019,3022,3025,3029,3032,3035],{"class":1089,"line":1245},[1087,2998,2999],{"class":2906},"platform",[1087,3001,2910],{"class":1093},[1087,3003,1512],{"class":2906},[1087,3005,2910],{"class":1093},[1087,3007,3008],{"class":2917},"on",[1087,3010,2921],{"class":2906},[1087,3012,2924],{"class":1093},[1087,3014,1523],{"class":1116},[1087,3016,2924],{"class":1093},[1087,3018,1287],{"class":1093},[1087,3020,3021],{"class":1103}," async",[1087,3023,3024],{"class":1093}," (",[1087,3026,3028],{"class":3027},"sHdIc","event",[1087,3030,3031],{"class":1093},")",[1087,3033,3034],{"class":1103}," =>",[1087,3036,1200],{"class":1093},[1087,3038,3039,3042,3045,3047,3049,3051,3053,3055,3057],{"class":1089,"line":1251},[1087,3040,3041],{"class":2902},"  await",[1087,3043,3044],{"class":2906}," inventory",[1087,3046,2910],{"class":1093},[1087,3048,1322],{"class":2917},[1087,3050,2921],{"class":1708},[1087,3052,3028],{"class":2906},[1087,3054,2910],{"class":1093},[1087,3056,2033],{"class":2906},[1087,3058,2983],{"class":1708},[1087,3060,3061,3063],{"class":1089,"line":1266},[1087,3062,2980],{"class":1093},[1087,3064,2983],{"class":2906},[990,3066,3067],{},"This ensures loose coupling — apps don't need to know each other's URLs or internals.",[1075,3069,3071],{"id":3070},"lifecycle-events","Lifecycle Events",[990,3073,3074],{},"The platform emits events for app lifecycle:",[2723,3076,3077,3090],{},[2726,3078,3079],{},[2729,3080,3081,3084,3087],{},[2732,3082,3083],{},"Event",[2732,3085,3086],{},"When",[2732,3088,3089],{},"Apps Use For",[2742,3091,3092,3104,3117,3130],{},[2729,3093,3094,3098,3101],{},[2747,3095,3096],{},[1021,3097,1617],{},[2747,3099,3100],{},"App activated for a Tenant",[2747,3102,3103],{},"Initialize data, set defaults",[2729,3105,3106,3111,3114],{},[2747,3107,3108],{},[1021,3109,3110],{},"app.uninstalled",[2747,3112,3113],{},"App deactivated for a Tenant",[2747,3115,3116],{},"Clean up resources",[2729,3118,3119,3124,3127],{},[2747,3120,3121],{},[1021,3122,3123],{},"app.upgraded",[2747,3125,3126],{},"New version deployed",[2747,3128,3129],{},"Run data migrations",[2729,3131,3132,3137,3140],{},[2747,3133,3134],{},[1021,3135,3136],{},"tenant.provisioned",[2747,3138,3139],{},"New Tenant created",[2747,3141,3142],{},"Initial setup if app is included",[1075,3144,3146],{"id":3145},"automatic-multi-tenancy","Automatic multi-tenancy",[990,3148,3149],{},"Your data is automatically scoped to your tenant. Every query an app makes returns only the current tenant's rows:",[1014,3151,3155],{"className":3152,"code":3153,"language":3154,"meta":1023,"style":1023},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Developer writes:\nSELECT * FROM orders\n\n-- Returns only the current tenant's orders, automatically scoped.\n","sql",[1021,3156,3157,3162,3176,3180],{"__ignoreMap":1023},[1087,3158,3159],{"class":1089,"line":1090},[1087,3160,3161],{"class":2896},"-- Developer writes:\n",[1087,3163,3164,3167,3170,3173],{"class":1089,"line":1097},[1087,3165,3166],{"class":1440},"SELECT",[1087,3168,3169],{"class":1093}," *",[1087,3171,3172],{"class":1440}," FROM",[1087,3174,3175],{"class":2906}," orders\n",[1087,3177,3178],{"class":1089,"line":1125},[1087,3179,2989],{"emptyLinePlaceholder":2988},[1087,3181,3182],{"class":1089,"line":1146},[1087,3183,3184],{"class":2896},"-- Returns only the current tenant's orders, automatically scoped.\n",[990,3186,3187,3190],{},[994,3188,3189],{},"No manual tenant filtering needed."," The scoping is enforced by the platform, not by your app code — so there's no application-level mistake that can bypass it.",[1009,3192,3194],{"id":3193},"the-developer-experience","The Developer Experience",[990,3196,3197],{},"If you've built multi-tenant SaaS services before, here's what you'd typically write by hand that the declarative model handles for you:",[3199,3200,3201,3207,3210,3216,3222,3228,3231],"ul",{},[3202,3203,3204,3205,3031],"li",{},"REST endpoints for CRUD operations on your tables (generated automatically from your ",[1021,3206,1053],{},[3202,3208,3209],{},"Tenant filtering on every query (your data is scoped to the tenant automatically)",[3202,3211,3212,3213,3215],{},"Migration scripts with up\u002Fdown operations (replaced by git history of ",[1021,3214,1053],{}," — the platform computes the diff)",[3202,3217,3218,3219,3221],{},"Permission checks for which roles can call which endpoints (declared in ",[1021,3220,1049],{}," permissions, enforced by the platform)",[3202,3223,3224,3225,3227],{},"Cockpit UI route registration (declared in ",[1021,3226,1057],{},", woven in at runtime)",[3202,3229,3230],{},"Marketplace registration and version tracking (handled by the App Registry when you publish)",[3202,3232,3233,3234,3031],{},"Billing integration for paid apps (declared in ",[1021,3235,1065],{},[990,3237,3238],{},"The cumulative amount of plumbing varies by project, but it's typically the largest chunk of work in a new commerce service. With revenexx, the JSON declarations are a few dozen lines per app and your code stays focused on the business logic that makes the app unique.",[1009,3240,3242],{"id":3241},"next-steps","Next Steps",[3199,3244,3245,3254,3262,3270],{},[3202,3246,3247,3253],{},[994,3248,3249],{},[3250,3251,141],"a",{"href":3252},"\u002Fdocs\u002Fproducts\u002Fapps\u002Fmanifest-reference\u002F"," — Full manifest.json spec and all fields",[3202,3255,3256,3261],{},[994,3257,3258],{},[3250,3259,165],{"href":3260},"\u002Fdocs\u002Fproducts\u002Fapps\u002Fschema-reference\u002F"," — Database schema definitions",[3202,3263,3264,3269],{},[994,3265,3266],{},[3250,3267,123],{"href":3268},"\u002Fdocs\u002Fproducts\u002Fapps\u002Fcockpit-integration\u002F"," — UI extension points",[3202,3271,3272,3277],{},[994,3273,3274],{},[3250,3275,3276],{"href":82},"Quick Start"," — Deploy your first app",[3279,3280,3281],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .su27w, html code.shiki .su27w{--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53}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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":1023,"searchDepth":1097,"depth":1097,"links":3283},[3284,3285,3286,3293,3300,3301],{"id":1011,"depth":1097,"text":1012},{"id":1026,"depth":1097,"text":1027},{"id":1069,"depth":1097,"text":1070,"children":3287},[3288,3289,3290,3291,3292],{"id":1077,"depth":1125,"text":1078},{"id":1651,"depth":1125,"text":1652},{"id":2193,"depth":1125,"text":2194},{"id":2384,"depth":1125,"text":2385},{"id":2554,"depth":1125,"text":2555},{"id":2710,"depth":1097,"text":2711,"children":3294},[3295,3296,3297,3298,3299],{"id":2717,"depth":1125,"text":2718},{"id":2787,"depth":1125,"text":2788},{"id":2880,"depth":1125,"text":2881},{"id":3070,"depth":1125,"text":3071},{"id":3145,"depth":1125,"text":3146},{"id":3193,"depth":1097,"text":3194},{"id":3241,"depth":1097,"text":3242},"Understand how revenexx Apps work and the declarative app model","md",null,{"status":3306},"published",{"title":129,"description":3302},{"loc":130},"Tnb2hphqGKFEG5LJLfsLAx1YyRLQOXuSWh5__SwZIbY",1785229259272]