[{"data":1,"prerenderedAt":2639},["ShallowReactive",2],{"navigation_docs":3,"-docs-products-apps-lifecycle":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":135,"body":986,"description":2631,"extension":2632,"landing":2633,"links":2633,"meta":2634,"navigation":1543,"path":136,"seo":2636,"sitemap":2637,"stem":137,"__hash__":2638},"docs\u002Fdocs\u002Fproducts\u002Fapps\u002Flifecycle\u002Findex.md",{"type":987,"value":988,"toc":2604},"minimark",[989,1002,1014,1021,1026,1033,1043,1048,1051,1058,1064,1070,1074,1080,1191,1211,1214,1218,1230,1236,1247,1253,1259,1263,1267,1270,1322,1325,1353,1360,1364,1367,1393,1397,1400,1404,1407,1485,1488,1625,1629,1632,1685,1688,1748,1751,1754,1838,1841,1901,1905,1908,1964,1967,2022,2026,2030,2052,2056,2067,2140,2144,2154,2189,2204,2208,2222,2226,2229,2233,2236,2245,2251,2262,2266,2269,2565,2568,2572,2600],[990,991,992,993,997,998,1001],"p",{},"This page is for ",[994,995,996],"strong",{},"app developers"," thinking about what happens ",[994,999,1000],{},"after"," the first deploy. A successful app in production needs versioning that doesn't break customer data, an upgrade story that's safe across hundreds of tenants, and event hooks for the moments when something has changed (installed, upgraded, uninstalled).",[990,1003,1004,1005,1008,1009,1013],{},"The basic shape: each app version is deployed ",[994,1006,1007],{},"once"," to the platform's app registry and then installed by individual tenants. When you ship a new version, tenants get upgraded according to rules you set in ",[1010,1011,1012],"code",{},"manifest.json",". Schema migrations apply automatically per-tenant the next time their data is touched. Lifecycle events fire so other apps (and your own) can react.",[990,1015,1016,1017,1020],{},"The most important practical question is: ",[994,1018,1019],{},"how do I ship a change without breaking the customer who's already running the previous version in production?"," The semantic versioning rules below answer most of it; the rest comes down to designing schema changes carefully — additive changes are safe, destructive changes require coordination.",[1022,1023,1025],"h2",{"id":1024},"versioning","Versioning",[990,1027,1028,1029,1032],{},"Apps use ",[994,1030,1031],{},"Semantic Versioning"," (SemVer):",[1034,1035,1040],"pre",{"className":1036,"code":1038,"language":1039},[1037],"language-text","1.0.0\n│ │ │\n│ │ └─ Patch: Bug fixes, non-breaking changes (1.0.0 → 1.0.1)\n│ └─── Minor: New features, backward-compatible (1.0.0 → 1.1.0)\n└───── Major: Breaking changes (1.0.0 → 2.0.0)\n","text",[1010,1041,1038],{"__ignoreMap":1042},"",[1044,1045,1047],"h3",{"id":1046},"version-rules","Version Rules",[990,1049,1050],{},"Which number you bump isn't cosmetic — it tells the platform how aggressively to roll the change out, so the version is really a promise about how disruptive the change is.",[990,1052,1053,1054,1057],{},"A ",[994,1055,1056],{},"patch"," (1.0.0 → 1.0.1) is a bug fix, performance tweak, or small UI change that touches nothing a tenant depends on. There are no data migrations, and existing tenants are upgraded automatically because there's nothing to break.",[990,1059,1053,1060,1063],{},[994,1061,1062],{},"minor"," (1.0.0 → 1.1.0) adds something — a feature, a table, a setting — while staying backward-compatible with 1.0.0. Existing tenants still auto-upgrade, though they can opt out, and the change may carry a schema migration since new tables or columns are additive and safe.",[990,1065,1053,1066,1069],{},[994,1067,1068],{},"major"," (1.0.0 → 2.0.0) is where breaking changes live: removing fields, changing behaviour, adding a required dependency. Because it can break a tenant who isn't ready, the platform doesn't push it silently — tenants get an upgrade prompt, the breaking change must be documented, and you may need a manual data migration to carry existing data across.",[1044,1071,1073],{"id":1072},"dependency-versions","Dependency Versions",[990,1075,1076,1077,1079],{},"In ",[1010,1078,1012],{},", specify version constraints:",[1034,1081,1085],{"className":1082,"code":1083,"language":1084,"meta":1042,"style":1042},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"dependencies\": {\n  \"customers\": \"^1.0.0\",     \u002F\u002F ✓ 1.0.0 to \u003C2.0.0 (breaks on major)\n  \"pricing\": \"~1.2.0\",        \u002F\u002F ✓ 1.2.0 to \u003C1.3.0 (breaks on minor)\n  \"inventory\": \"1.0.0\"        \u002F\u002F ✓ Exact version only\n}\n","json",[1010,1086,1087,1109,1139,1163,1185],{"__ignoreMap":1042},[1088,1089,1092,1096,1100,1102,1106],"span",{"class":1090,"line":1091},"line",1,[1088,1093,1095],{"class":1094},"sMK4o","\"",[1088,1097,1099],{"class":1098},"sfazB","dependencies",[1088,1101,1095],{"class":1094},[1088,1103,1105],{"class":1104},"sTEyZ",": ",[1088,1107,1108],{"class":1094},"{\n",[1088,1110,1112,1115,1119,1121,1124,1127,1130,1132,1135],{"class":1090,"line":1111},2,[1088,1113,1114],{"class":1094},"  \"",[1088,1116,1118],{"class":1117},"spNyl","customers",[1088,1120,1095],{"class":1094},[1088,1122,1123],{"class":1094},":",[1088,1125,1126],{"class":1094}," \"",[1088,1128,1129],{"class":1098},"^1.0.0",[1088,1131,1095],{"class":1094},[1088,1133,1134],{"class":1094},",",[1088,1136,1138],{"class":1137},"sHwdD","     \u002F\u002F ✓ 1.0.0 to \u003C2.0.0 (breaks on major)\n",[1088,1140,1142,1144,1147,1149,1151,1153,1156,1158,1160],{"class":1090,"line":1141},3,[1088,1143,1114],{"class":1094},[1088,1145,1146],{"class":1117},"pricing",[1088,1148,1095],{"class":1094},[1088,1150,1123],{"class":1094},[1088,1152,1126],{"class":1094},[1088,1154,1155],{"class":1098},"~1.2.0",[1088,1157,1095],{"class":1094},[1088,1159,1134],{"class":1094},[1088,1161,1162],{"class":1137},"        \u002F\u002F ✓ 1.2.0 to \u003C1.3.0 (breaks on minor)\n",[1088,1164,1166,1168,1171,1173,1175,1177,1180,1182],{"class":1090,"line":1165},4,[1088,1167,1114],{"class":1094},[1088,1169,1170],{"class":1117},"inventory",[1088,1172,1095],{"class":1094},[1088,1174,1123],{"class":1094},[1088,1176,1126],{"class":1094},[1088,1178,1179],{"class":1098},"1.0.0",[1088,1181,1095],{"class":1094},[1088,1183,1184],{"class":1137},"        \u002F\u002F ✓ Exact version only\n",[1088,1186,1188],{"class":1090,"line":1187},5,[1088,1189,1190],{"class":1094},"}\n",[1192,1193,1194,1200,1206],"ul",{},[1195,1196,1197,1199],"li",{},[1010,1198,1129],{}," — Recommended. Breaks only on major version",[1195,1201,1202,1205],{},[1010,1203,1204],{},"~1.0.0"," — Breaks only on minor version (more restrictive)",[1195,1207,1208,1210],{},[1010,1209,1179],{}," — Exact version only (most restrictive)",[990,1212,1213],{},"The trade-off is between staying current and staying still. A caret range picks up your dependency's fixes and features automatically and only stops at a major version; an exact pin never changes underneath you but also never gets a fix unless you bump it by hand. Caret is the right default for almost everything.",[1022,1215,1217],{"id":1216},"app-states","App States",[990,1219,1220,1221,1225,1226,1229],{},"Every app moves through a sequence of states over its life, from a private draft to — eventually — full removal. The states differ along two axes: whether the app is ",[1222,1223,1224],"em",{},"offered"," to new tenants, and whether existing tenants can still ",[1222,1227,1228],{},"use"," it.",[990,1231,1053,1232,1235],{},[994,1233,1234],{},"Draft"," is an app still in development. It isn't listed in the Marketplace, only the developer can test it, and its version number doesn't increment yet — it's a workspace, not a release.",[990,1237,1238,1239,1242,1243,1246],{},"An ",[994,1240,1241],{},"Active"," app is the normal published state: listed in the Marketplace (if it has a ",[1010,1244,1245],{},"billing.json","), installable and usable by tenants, and eligible for upgrades or eventual deprecation.",[990,1248,1053,1249,1252],{},[994,1250,1251],{},"Deprecated"," app is on its way out but not gone. It's no longer offered to new tenants and disappears from the Marketplace, but tenants who already have it keep working — it's a grace period before the version reaches end-of-life.",[990,1254,1238,1255,1258],{},[994,1256,1257],{},"Archived"," app is fully retired. No one can install it and no new versions ship; existing tenants have it in an archived state and can only uninstall it. This is the terminal state.",[1022,1260,1262],{"id":1261},"deployment","Deployment",[1044,1264,1266],{"id":1265},"deploy-a-new-version","Deploy a New Version",[990,1268,1269],{},"Register the app from its manifest (only needed the first time, or when the manifest changes), then create and activate a deployment:",[1034,1271,1275],{"className":1272,"code":1273,"language":1274,"meta":1042,"style":1042},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","revenexx apps register --manifest manifest.json\nrevenexx apps create-deployment --function-id orders --activate true --code .\n","bash",[1010,1276,1277,1295],{"__ignoreMap":1042},[1088,1278,1279,1283,1286,1289,1292],{"class":1090,"line":1091},[1088,1280,1282],{"class":1281},"sBMFI","revenexx",[1088,1284,1285],{"class":1098}," apps",[1088,1287,1288],{"class":1098}," register",[1088,1290,1291],{"class":1098}," --manifest",[1088,1293,1294],{"class":1098}," manifest.json\n",[1088,1296,1297,1299,1301,1304,1307,1310,1313,1316,1319],{"class":1090,"line":1111},[1088,1298,1282],{"class":1281},[1088,1300,1285],{"class":1098},[1088,1302,1303],{"class":1098}," create-deployment",[1088,1305,1306],{"class":1098}," --function-id",[1088,1308,1309],{"class":1098}," orders",[1088,1311,1312],{"class":1098}," --activate",[1088,1314,1315],{"class":1094}," true",[1088,1317,1318],{"class":1098}," --code",[1088,1320,1321],{"class":1098}," .\n",[990,1323,1324],{},"The platform:",[1326,1327,1328,1338,1341,1347,1350],"ol",{},[1195,1329,1330,1331,1333,1334,1337],{},"Validates ",[1010,1332,1012],{},", ",[1010,1335,1336],{},"schema.json",", etc.",[1195,1339,1340],{},"Uploads your app code to the platform runtime",[1195,1342,1343,1344,1346],{},"Reads the version from ",[1010,1345,1012],{}," (you specify major.minor.patch)",[1195,1348,1349],{},"Registers the new version in the App Registry (Console)",[1195,1351,1352],{},"Publishes deployment event",[990,1354,1355,1356,1359],{},"Run ",[1010,1357,1358],{},"revenexx apps \u003Ccommand> --help"," for the exact flags.",[1044,1361,1363],{"id":1362},"auto-upgrade-rules","Auto-Upgrade Rules",[990,1365,1366],{},"Once a version is in the registry, how it reaches existing tenants depends on the kind of bump — the same gradient of caution as the version rules, now from the tenant's side.",[990,1368,1369,1372,1373,1376,1377,1380,1381,1384,1385,1388,1389,1392],{},[994,1370,1371],{},"Patch versions"," roll out to all tenants immediately and without any user action; the only visible trace is an ",[1010,1374,1375],{},"app.upgraded"," lifecycle event carrying the ",[1010,1378,1379],{},"from_version"," and ",[1010,1382,1383],{},"to_version",". ",[994,1386,1387],{},"Minor versions"," are offered rather than forced — existing tenants are notified and can opt in from the \"Manage Apps\" screen in Console, while any newly provisioned tenant simply starts on the latest minor. ",[994,1390,1391],{},"Major versions"," require an explicit yes: the tenant sees a \"Critical update required\" prompt, can read the breaking changes in the release notes, and is free to delay or refuse until they're ready. Nothing breaking ever happens to a tenant without their consent.",[1022,1394,1396],{"id":1395},"lifecycle-events","Lifecycle Events",[990,1398,1399],{},"The platform emits events when app lifecycle changes:",[1044,1401,1403],{"id":1402},"appinstalled","app.installed",[990,1405,1406],{},"Fired when a Tenant installs your app:",[1034,1408,1412],{"className":1409,"code":1410,"language":1411,"meta":1042,"style":1042},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  event: \"app.installed\",\n  app_name: \"orders\",\n  tenant_id: \"acme-eu\",\n  app_version: \"1.0.0\"\n}\n","javascript",[1010,1413,1414,1418,1434,1450,1466,1480],{"__ignoreMap":1042},[1088,1415,1416],{"class":1090,"line":1091},[1088,1417,1108],{"class":1094},[1088,1419,1420,1423,1425,1427,1429,1431],{"class":1090,"line":1111},[1088,1421,1422],{"class":1281},"  event",[1088,1424,1123],{"class":1094},[1088,1426,1126],{"class":1094},[1088,1428,1403],{"class":1098},[1088,1430,1095],{"class":1094},[1088,1432,1433],{"class":1094},",\n",[1088,1435,1436,1439,1441,1443,1446,1448],{"class":1090,"line":1141},[1088,1437,1438],{"class":1281},"  app_name",[1088,1440,1123],{"class":1094},[1088,1442,1126],{"class":1094},[1088,1444,1445],{"class":1098},"orders",[1088,1447,1095],{"class":1094},[1088,1449,1433],{"class":1094},[1088,1451,1452,1455,1457,1459,1462,1464],{"class":1090,"line":1165},[1088,1453,1454],{"class":1281},"  tenant_id",[1088,1456,1123],{"class":1094},[1088,1458,1126],{"class":1094},[1088,1460,1461],{"class":1098},"acme-eu",[1088,1463,1095],{"class":1094},[1088,1465,1433],{"class":1094},[1088,1467,1468,1471,1473,1475,1477],{"class":1090,"line":1187},[1088,1469,1470],{"class":1281},"  app_version",[1088,1472,1123],{"class":1094},[1088,1474,1126],{"class":1094},[1088,1476,1179],{"class":1098},[1088,1478,1479],{"class":1094},"\"\n",[1088,1481,1483],{"class":1090,"line":1482},6,[1088,1484,1190],{"class":1094},[990,1486,1487],{},"Your app can listen and initialize data:",[1034,1489,1491],{"className":1409,"code":1490,"language":1411,"meta":1042,"style":1042},"\u002F\u002F In manifest.json:\n\"events\": {\n  \"listens\": [\"app.installed\"]\n}\n\n\u002F\u002F In your function:\nplatform.events.on('app.installed', async (event) => {\n  \u002F\u002F Initialize default settings\n  \u002F\u002F Create system records\n  \u002F\u002F Log installation\n})\n",[1010,1492,1493,1498,1511,1535,1539,1545,1550,1598,1604,1610,1616],{"__ignoreMap":1042},[1088,1494,1495],{"class":1090,"line":1091},[1088,1496,1497],{"class":1137},"\u002F\u002F In manifest.json:\n",[1088,1499,1500,1502,1505,1507,1509],{"class":1090,"line":1111},[1088,1501,1095],{"class":1094},[1088,1503,1504],{"class":1098},"events",[1088,1506,1095],{"class":1094},[1088,1508,1105],{"class":1104},[1088,1510,1108],{"class":1094},[1088,1512,1513,1515,1519,1521,1523,1526,1528,1530,1532],{"class":1090,"line":1141},[1088,1514,1114],{"class":1094},[1088,1516,1518],{"class":1517},"swJcz","listens",[1088,1520,1095],{"class":1094},[1088,1522,1123],{"class":1094},[1088,1524,1525],{"class":1104}," [",[1088,1527,1095],{"class":1094},[1088,1529,1403],{"class":1098},[1088,1531,1095],{"class":1094},[1088,1533,1534],{"class":1104},"]\n",[1088,1536,1537],{"class":1090,"line":1165},[1088,1538,1190],{"class":1094},[1088,1540,1541],{"class":1090,"line":1187},[1088,1542,1544],{"emptyLinePlaceholder":1543},true,"\n",[1088,1546,1547],{"class":1090,"line":1482},[1088,1548,1549],{"class":1137},"\u002F\u002F In your function:\n",[1088,1551,1553,1556,1559,1561,1563,1567,1570,1573,1575,1577,1579,1582,1585,1589,1592,1595],{"class":1090,"line":1552},7,[1088,1554,1555],{"class":1104},"platform",[1088,1557,1558],{"class":1094},".",[1088,1560,1504],{"class":1104},[1088,1562,1558],{"class":1094},[1088,1564,1566],{"class":1565},"s2Zo4","on",[1088,1568,1569],{"class":1104},"(",[1088,1571,1572],{"class":1094},"'",[1088,1574,1403],{"class":1098},[1088,1576,1572],{"class":1094},[1088,1578,1134],{"class":1094},[1088,1580,1581],{"class":1117}," async",[1088,1583,1584],{"class":1094}," (",[1088,1586,1588],{"class":1587},"sHdIc","event",[1088,1590,1591],{"class":1094},")",[1088,1593,1594],{"class":1117}," =>",[1088,1596,1597],{"class":1094}," {\n",[1088,1599,1601],{"class":1090,"line":1600},8,[1088,1602,1603],{"class":1137},"  \u002F\u002F Initialize default settings\n",[1088,1605,1607],{"class":1090,"line":1606},9,[1088,1608,1609],{"class":1137},"  \u002F\u002F Create system records\n",[1088,1611,1613],{"class":1090,"line":1612},10,[1088,1614,1615],{"class":1137},"  \u002F\u002F Log installation\n",[1088,1617,1619,1622],{"class":1090,"line":1618},11,[1088,1620,1621],{"class":1094},"}",[1088,1623,1624],{"class":1104},")\n",[1044,1626,1628],{"id":1627},"appuninstalled","app.uninstalled",[990,1630,1631],{},"Fired when a Tenant removes your app:",[1034,1633,1635],{"className":1409,"code":1634,"language":1411,"meta":1042,"style":1042},"{\n  event: \"app.uninstalled\",\n  app_name: \"orders\",\n  tenant_id: \"acme-eu\"\n}\n",[1010,1636,1637,1641,1655,1669,1681],{"__ignoreMap":1042},[1088,1638,1639],{"class":1090,"line":1091},[1088,1640,1108],{"class":1094},[1088,1642,1643,1645,1647,1649,1651,1653],{"class":1090,"line":1111},[1088,1644,1422],{"class":1281},[1088,1646,1123],{"class":1094},[1088,1648,1126],{"class":1094},[1088,1650,1628],{"class":1098},[1088,1652,1095],{"class":1094},[1088,1654,1433],{"class":1094},[1088,1656,1657,1659,1661,1663,1665,1667],{"class":1090,"line":1141},[1088,1658,1438],{"class":1281},[1088,1660,1123],{"class":1094},[1088,1662,1126],{"class":1094},[1088,1664,1445],{"class":1098},[1088,1666,1095],{"class":1094},[1088,1668,1433],{"class":1094},[1088,1670,1671,1673,1675,1677,1679],{"class":1090,"line":1165},[1088,1672,1454],{"class":1281},[1088,1674,1123],{"class":1094},[1088,1676,1126],{"class":1094},[1088,1678,1461],{"class":1098},[1088,1680,1479],{"class":1094},[1088,1682,1683],{"class":1090,"line":1187},[1088,1684,1190],{"class":1094},[990,1686,1687],{},"Clean up:",[1034,1689,1691],{"className":1409,"code":1690,"language":1411,"meta":1042,"style":1042},"platform.events.on('app.uninstalled', async (event) => {\n  \u002F\u002F Delete app-specific data (optional)\n  \u002F\u002F Notify external systems\n  \u002F\u002F Log removal\n})\n",[1010,1692,1693,1727,1732,1737,1742],{"__ignoreMap":1042},[1088,1694,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721,1723,1725],{"class":1090,"line":1091},[1088,1696,1555],{"class":1104},[1088,1698,1558],{"class":1094},[1088,1700,1504],{"class":1104},[1088,1702,1558],{"class":1094},[1088,1704,1566],{"class":1565},[1088,1706,1569],{"class":1104},[1088,1708,1572],{"class":1094},[1088,1710,1628],{"class":1098},[1088,1712,1572],{"class":1094},[1088,1714,1134],{"class":1094},[1088,1716,1581],{"class":1117},[1088,1718,1584],{"class":1094},[1088,1720,1588],{"class":1587},[1088,1722,1591],{"class":1094},[1088,1724,1594],{"class":1117},[1088,1726,1597],{"class":1094},[1088,1728,1729],{"class":1090,"line":1111},[1088,1730,1731],{"class":1137},"  \u002F\u002F Delete app-specific data (optional)\n",[1088,1733,1734],{"class":1090,"line":1141},[1088,1735,1736],{"class":1137},"  \u002F\u002F Notify external systems\n",[1088,1738,1739],{"class":1090,"line":1165},[1088,1740,1741],{"class":1137},"  \u002F\u002F Log removal\n",[1088,1743,1744,1746],{"class":1090,"line":1187},[1088,1745,1621],{"class":1094},[1088,1747,1624],{"class":1104},[1044,1749,1375],{"id":1750},"appupgraded",[990,1752,1753],{},"Fired when your app is upgraded to a new version:",[1034,1755,1757],{"className":1409,"code":1756,"language":1411,"meta":1042,"style":1042},"{\n  event: \"app.upgraded\",\n  app_name: \"orders\",\n  tenant_id: \"acme-eu\",\n  from_version: \"1.0.0\",\n  to_version: \"1.1.0\"\n}\n",[1010,1758,1759,1763,1777,1791,1805,1820,1834],{"__ignoreMap":1042},[1088,1760,1761],{"class":1090,"line":1091},[1088,1762,1108],{"class":1094},[1088,1764,1765,1767,1769,1771,1773,1775],{"class":1090,"line":1111},[1088,1766,1422],{"class":1281},[1088,1768,1123],{"class":1094},[1088,1770,1126],{"class":1094},[1088,1772,1375],{"class":1098},[1088,1774,1095],{"class":1094},[1088,1776,1433],{"class":1094},[1088,1778,1779,1781,1783,1785,1787,1789],{"class":1090,"line":1141},[1088,1780,1438],{"class":1281},[1088,1782,1123],{"class":1094},[1088,1784,1126],{"class":1094},[1088,1786,1445],{"class":1098},[1088,1788,1095],{"class":1094},[1088,1790,1433],{"class":1094},[1088,1792,1793,1795,1797,1799,1801,1803],{"class":1090,"line":1165},[1088,1794,1454],{"class":1281},[1088,1796,1123],{"class":1094},[1088,1798,1126],{"class":1094},[1088,1800,1461],{"class":1098},[1088,1802,1095],{"class":1094},[1088,1804,1433],{"class":1094},[1088,1806,1807,1810,1812,1814,1816,1818],{"class":1090,"line":1187},[1088,1808,1809],{"class":1281},"  from_version",[1088,1811,1123],{"class":1094},[1088,1813,1126],{"class":1094},[1088,1815,1179],{"class":1098},[1088,1817,1095],{"class":1094},[1088,1819,1433],{"class":1094},[1088,1821,1822,1825,1827,1829,1832],{"class":1090,"line":1482},[1088,1823,1824],{"class":1281},"  to_version",[1088,1826,1123],{"class":1094},[1088,1828,1126],{"class":1094},[1088,1830,1831],{"class":1098},"1.1.0",[1088,1833,1479],{"class":1094},[1088,1835,1836],{"class":1090,"line":1552},[1088,1837,1190],{"class":1094},[990,1839,1840],{},"Run migrations or data transformations:",[1034,1842,1844],{"className":1409,"code":1843,"language":1411,"meta":1042,"style":1042},"platform.events.on('app.upgraded', async (event) => {\n  \u002F\u002F Run schema migrations (auto-handled by the platform)\n  \u002F\u002F Backfill new fields\n  \u002F\u002F Update configuration\n})\n",[1010,1845,1846,1880,1885,1890,1895],{"__ignoreMap":1042},[1088,1847,1848,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878],{"class":1090,"line":1091},[1088,1849,1555],{"class":1104},[1088,1851,1558],{"class":1094},[1088,1853,1504],{"class":1104},[1088,1855,1558],{"class":1094},[1088,1857,1566],{"class":1565},[1088,1859,1569],{"class":1104},[1088,1861,1572],{"class":1094},[1088,1863,1375],{"class":1098},[1088,1865,1572],{"class":1094},[1088,1867,1134],{"class":1094},[1088,1869,1581],{"class":1117},[1088,1871,1584],{"class":1094},[1088,1873,1588],{"class":1587},[1088,1875,1591],{"class":1094},[1088,1877,1594],{"class":1117},[1088,1879,1597],{"class":1094},[1088,1881,1882],{"class":1090,"line":1111},[1088,1883,1884],{"class":1137},"  \u002F\u002F Run schema migrations (auto-handled by the platform)\n",[1088,1886,1887],{"class":1090,"line":1141},[1088,1888,1889],{"class":1137},"  \u002F\u002F Backfill new fields\n",[1088,1891,1892],{"class":1090,"line":1165},[1088,1893,1894],{"class":1137},"  \u002F\u002F Update configuration\n",[1088,1896,1897,1899],{"class":1090,"line":1187},[1088,1898,1621],{"class":1094},[1088,1900,1624],{"class":1104},[1044,1902,1904],{"id":1903},"tenantprovisioned","tenant.provisioned",[990,1906,1907],{},"Fired when a new Tenant is created:",[1034,1909,1911],{"className":1409,"code":1910,"language":1411,"meta":1042,"style":1042},"{\n  event: \"tenant.provisioned\",\n  tenant_id: \"new-customer\",\n  reason: \"new_signup\"\n}\n",[1010,1912,1913,1917,1931,1946,1960],{"__ignoreMap":1042},[1088,1914,1915],{"class":1090,"line":1091},[1088,1916,1108],{"class":1094},[1088,1918,1919,1921,1923,1925,1927,1929],{"class":1090,"line":1111},[1088,1920,1422],{"class":1281},[1088,1922,1123],{"class":1094},[1088,1924,1126],{"class":1094},[1088,1926,1904],{"class":1098},[1088,1928,1095],{"class":1094},[1088,1930,1433],{"class":1094},[1088,1932,1933,1935,1937,1939,1942,1944],{"class":1090,"line":1141},[1088,1934,1454],{"class":1281},[1088,1936,1123],{"class":1094},[1088,1938,1126],{"class":1094},[1088,1940,1941],{"class":1098},"new-customer",[1088,1943,1095],{"class":1094},[1088,1945,1433],{"class":1094},[1088,1947,1948,1951,1953,1955,1958],{"class":1090,"line":1165},[1088,1949,1950],{"class":1281},"  reason",[1088,1952,1123],{"class":1094},[1088,1954,1126],{"class":1094},[1088,1956,1957],{"class":1098},"new_signup",[1088,1959,1479],{"class":1094},[1088,1961,1962],{"class":1090,"line":1187},[1088,1963,1190],{"class":1094},[990,1965,1966],{},"If your app is an Included App (bundled with the subscription), initialize it:",[1034,1968,1970],{"className":1409,"code":1969,"language":1411,"meta":1042,"style":1042},"platform.events.on('tenant.provisioned', async (event) => {\n  \u002F\u002F Initialize customer defaults\n  \u002F\u002F Set up welcome data\n})\n",[1010,1971,1972,2006,2011,2016],{"__ignoreMap":1042},[1088,1973,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004],{"class":1090,"line":1091},[1088,1975,1555],{"class":1104},[1088,1977,1558],{"class":1094},[1088,1979,1504],{"class":1104},[1088,1981,1558],{"class":1094},[1088,1983,1566],{"class":1565},[1088,1985,1569],{"class":1104},[1088,1987,1572],{"class":1094},[1088,1989,1904],{"class":1098},[1088,1991,1572],{"class":1094},[1088,1993,1134],{"class":1094},[1088,1995,1581],{"class":1117},[1088,1997,1584],{"class":1094},[1088,1999,1588],{"class":1587},[1088,2001,1591],{"class":1094},[1088,2003,1594],{"class":1117},[1088,2005,1597],{"class":1094},[1088,2007,2008],{"class":1090,"line":1111},[1088,2009,2010],{"class":1137},"  \u002F\u002F Initialize customer defaults\n",[1088,2012,2013],{"class":1090,"line":1141},[1088,2014,2015],{"class":1137},"  \u002F\u002F Set up welcome data\n",[1088,2017,2018,2020],{"class":1090,"line":1165},[1088,2019,1621],{"class":1094},[1088,2021,1624],{"class":1104},[1022,2023,2025],{"id":2024},"upgrade-workflow","Upgrade Workflow",[1044,2027,2029],{"id":2028},"_1-develop-and-test-local","1. Develop and Test (Local)",[1034,2031,2033],{"className":1272,"code":2032,"language":1274,"meta":1042,"style":1042},"# Scaffold manifest.json + index.js, edit your code...\nrevenexx apps register --manifest manifest.json\n",[1010,2034,2035,2040],{"__ignoreMap":1042},[1088,2036,2037],{"class":1090,"line":1091},[1088,2038,2039],{"class":1137},"# Scaffold manifest.json + index.js, edit your code...\n",[1088,2041,2042,2044,2046,2048,2050],{"class":1090,"line":1111},[1088,2043,1282],{"class":1281},[1088,2045,1285],{"class":1098},[1088,2047,1288],{"class":1098},[1088,2049,1291],{"class":1098},[1088,2051,1294],{"class":1098},[1044,2053,2055],{"id":2054},"_2-deploy-and-verify-on-a-test-tenant","2. Deploy and verify on a test tenant",[990,2057,2058,2059,2062,2063,2066],{},"Create a deployment but don't activate it yet, then verify it before it goes live. Run ",[1010,2060,2061],{},"revenexx login --tenant \u003Cslug>"," (or ",[1010,2064,2065],{},"revenexx tenants use \u003Cslug>",") to point at your staging tenant first:",[1034,2068,2070],{"className":1272,"code":2069,"language":1274,"meta":1042,"style":1042},"revenexx apps create-deployment --function-id orders --activate false --code .\nrevenexx apps list-deployments --function-id orders\n# Verify the deployment, then activate it:\nrevenexx apps update-deployment --function-id orders --deployment-id \u003CDEPLOYMENT_ID>\n",[1010,2071,2072,2093,2107,2112],{"__ignoreMap":1042},[1088,2073,2074,2076,2078,2080,2082,2084,2086,2089,2091],{"class":1090,"line":1091},[1088,2075,1282],{"class":1281},[1088,2077,1285],{"class":1098},[1088,2079,1303],{"class":1098},[1088,2081,1306],{"class":1098},[1088,2083,1309],{"class":1098},[1088,2085,1312],{"class":1098},[1088,2087,2088],{"class":1094}," false",[1088,2090,1318],{"class":1098},[1088,2092,1321],{"class":1098},[1088,2094,2095,2097,2099,2102,2104],{"class":1090,"line":1111},[1088,2096,1282],{"class":1281},[1088,2098,1285],{"class":1098},[1088,2100,2101],{"class":1098}," list-deployments",[1088,2103,1306],{"class":1098},[1088,2105,2106],{"class":1098}," orders\n",[1088,2108,2109],{"class":1090,"line":1141},[1088,2110,2111],{"class":1137},"# Verify the deployment, then activate it:\n",[1088,2113,2114,2116,2118,2121,2123,2125,2128,2131,2134,2137],{"class":1090,"line":1165},[1088,2115,1282],{"class":1281},[1088,2117,1285],{"class":1098},[1088,2119,2120],{"class":1098}," update-deployment",[1088,2122,1306],{"class":1098},[1088,2124,1309],{"class":1098},[1088,2126,2127],{"class":1098}," --deployment-id",[1088,2129,2130],{"class":1094}," \u003C",[1088,2132,2133],{"class":1098},"DEPLOYMENT_I",[1088,2135,2136],{"class":1104},"D",[1088,2138,2139],{"class":1094},">\n",[1044,2141,2143],{"id":2142},"_3-deploy-to-production","3. Deploy to Production",[990,2145,2146,2147,2150,2151,2153],{},"Against your production tenant, bump ",[1010,2148,2149],{},"version"," in ",[1010,2152,1012],{},", then create and activate a deployment:",[1034,2155,2157],{"className":1272,"code":2156,"language":1274,"meta":1042,"style":1042},"revenexx apps create-deployment --function-id orders --activate true --code .\n# Publishes to App Marketplace\n# Existing Tenants notified of update\n",[1010,2158,2159,2179,2184],{"__ignoreMap":1042},[1088,2160,2161,2163,2165,2167,2169,2171,2173,2175,2177],{"class":1090,"line":1091},[1088,2162,1282],{"class":1281},[1088,2164,1285],{"class":1098},[1088,2166,1303],{"class":1098},[1088,2168,1306],{"class":1098},[1088,2170,1309],{"class":1098},[1088,2172,1312],{"class":1098},[1088,2174,1315],{"class":1094},[1088,2176,1318],{"class":1098},[1088,2178,1321],{"class":1098},[1088,2180,2181],{"class":1090,"line":1111},[1088,2182,2183],{"class":1137},"# Publishes to App Marketplace\n",[1088,2185,2186],{"class":1090,"line":1141},[1088,2187,2188],{"class":1137},"# Existing Tenants notified of update\n",[990,2190,2191,2192,2195,2196,2062,2198,2201,2202,1359],{},"There's no ",[1010,2193,2194],{},"--env"," flag — scope a deploy to an environment by selecting the tenant first with ",[1010,2197,2065],{},[1010,2199,2200],{},"--tenant","). Run ",[1010,2203,1358],{},[1044,2205,2207],{"id":2206},"_4-tenants-upgrade","4. Tenants Upgrade",[990,2209,2210,2213,2214,2217,2218,2221],{},[994,2211,2212],{},"Patch",": Auto-upgrade, no action\n",[994,2215,2216],{},"Minor",": Tenant notified, can opt-in\n",[994,2219,2220],{},"Major",": Tenant prompted, must accept",[1044,2223,2225],{"id":2224},"_5-post-upgrade-verification","5. Post-Upgrade Verification",[990,2227,2228],{},"Finally, confirm the upgrade landed cleanly by opening the app in Cockpit: check that the views still render, that existing data survived the migration, that any new features are present, and that the browser console is free of errors. The migration that worked on staging almost always works in production too, but a one-minute look is cheap insurance.",[1022,2230,2232],{"id":2231},"best-practices","Best Practices",[990,2234,2235],{},"Living safely with versioning comes down to one discipline: be honest with the version number, and let everything else follow from it.",[990,2237,2238,2241,2242,2244],{},[994,2239,2240],{},"Version every release, and version it truthfully."," Increment ",[1010,2243,1012],{}," for every production deploy, and let the size of the bump match the size of the change — a breaking change is never a patch. The version is a promise to your tenants about how risky the upgrade is, and the auto-upgrade rules act on that promise; mislabel it and you'll either push a breaking change silently or nag people about a trivial fix.",[990,2246,2247,2250],{},[994,2248,2249],{},"Make change safe before you ship it."," Document breaking changes in the release notes so a tenant deciding whether to accept a major upgrade has what they need, and test schema migrations on staging before production rather than discovering a bad migration against live data. Within a major version, hold the line on backward compatibility so auto-upgrading minors and patches stay genuinely safe.",[990,2252,2253,2256,2257,1333,2259,2261],{},[994,2254,2255],{},"Use the lifecycle events."," Subscribe to ",[1010,2258,1403],{},[1010,2260,1375],{},", and the rest to handle your own initialization, cleanup, and data backfills — they're the hooks that let an upgrade carry data forward instead of leaving it stranded.",[1022,2263,2265],{"id":2264},"schema-migrations-and-versioning","Schema Migrations and Versioning",[990,2267,2268],{},"The platform handles schema changes automatically:",[1034,2270,2272],{"className":1082,"code":2271,"language":1084,"meta":1042,"style":1042},"\u002F\u002F Version 1.0.0\n\"orders\": {\n  \"columns\": {\n    \"id\": { \"type\": \"uuid\", \"primary\": true },\n    \"customer_id\": { \"type\": \"uuid\" }\n  }\n}\n\n\u002F\u002F Version 1.1.0 (added column)\n\"orders\": {\n  \"columns\": {\n    \"id\": { \"type\": \"uuid\", \"primary\": true },\n    \"customer_id\": { \"type\": \"uuid\" },\n    \"expected_delivery\": { \"type\": \"date\", \"required\": false }\n  }\n}\n\n\u002F\u002F Deploy v1.1.0 → the platform runs:\n\u002F\u002F ALTER TABLE orders ADD COLUMN expected_delivery DATE;\n",[1010,2273,2274,2279,2291,2304,2352,2382,2387,2391,2395,2400,2412,2424,2465,2494,2538,2543,2548,2553,2559],{"__ignoreMap":1042},[1088,2275,2276],{"class":1090,"line":1091},[1088,2277,2278],{"class":1137},"\u002F\u002F Version 1.0.0\n",[1088,2280,2281,2283,2285,2287,2289],{"class":1090,"line":1111},[1088,2282,1095],{"class":1094},[1088,2284,1445],{"class":1098},[1088,2286,1095],{"class":1094},[1088,2288,1105],{"class":1104},[1088,2290,1108],{"class":1094},[1088,2292,2293,2295,2298,2300,2302],{"class":1090,"line":1141},[1088,2294,1114],{"class":1094},[1088,2296,2297],{"class":1117},"columns",[1088,2299,1095],{"class":1094},[1088,2301,1123],{"class":1094},[1088,2303,1597],{"class":1094},[1088,2305,2306,2309,2312,2314,2316,2319,2321,2325,2327,2329,2331,2334,2336,2338,2340,2343,2345,2347,2349],{"class":1090,"line":1165},[1088,2307,2308],{"class":1094},"    \"",[1088,2310,2311],{"class":1281},"id",[1088,2313,1095],{"class":1094},[1088,2315,1123],{"class":1094},[1088,2317,2318],{"class":1094}," {",[1088,2320,1126],{"class":1094},[1088,2322,2324],{"class":2323},"sbssI","type",[1088,2326,1095],{"class":1094},[1088,2328,1123],{"class":1094},[1088,2330,1126],{"class":1094},[1088,2332,2333],{"class":1098},"uuid",[1088,2335,1095],{"class":1094},[1088,2337,1134],{"class":1094},[1088,2339,1126],{"class":1094},[1088,2341,2342],{"class":2323},"primary",[1088,2344,1095],{"class":1094},[1088,2346,1123],{"class":1094},[1088,2348,1315],{"class":1094},[1088,2350,2351],{"class":1094}," },\n",[1088,2353,2354,2356,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379],{"class":1090,"line":1187},[1088,2355,2308],{"class":1094},[1088,2357,2358],{"class":1281},"customer_id",[1088,2360,1095],{"class":1094},[1088,2362,1123],{"class":1094},[1088,2364,2318],{"class":1094},[1088,2366,1126],{"class":1094},[1088,2368,2324],{"class":2323},[1088,2370,1095],{"class":1094},[1088,2372,1123],{"class":1094},[1088,2374,1126],{"class":1094},[1088,2376,2333],{"class":1098},[1088,2378,1095],{"class":1094},[1088,2380,2381],{"class":1094}," }\n",[1088,2383,2384],{"class":1090,"line":1482},[1088,2385,2386],{"class":1094},"  }\n",[1088,2388,2389],{"class":1090,"line":1552},[1088,2390,1190],{"class":1094},[1088,2392,2393],{"class":1090,"line":1600},[1088,2394,1544],{"emptyLinePlaceholder":1543},[1088,2396,2397],{"class":1090,"line":1606},[1088,2398,2399],{"class":1137},"\u002F\u002F Version 1.1.0 (added column)\n",[1088,2401,2402,2404,2406,2408,2410],{"class":1090,"line":1612},[1088,2403,1095],{"class":1094},[1088,2405,1445],{"class":1098},[1088,2407,1095],{"class":1094},[1088,2409,1105],{"class":1104},[1088,2411,1108],{"class":1094},[1088,2413,2414,2416,2418,2420,2422],{"class":1090,"line":1618},[1088,2415,1114],{"class":1094},[1088,2417,2297],{"class":1117},[1088,2419,1095],{"class":1094},[1088,2421,1123],{"class":1094},[1088,2423,1597],{"class":1094},[1088,2425,2427,2429,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455,2457,2459,2461,2463],{"class":1090,"line":2426},12,[1088,2428,2308],{"class":1094},[1088,2430,2311],{"class":1281},[1088,2432,1095],{"class":1094},[1088,2434,1123],{"class":1094},[1088,2436,2318],{"class":1094},[1088,2438,1126],{"class":1094},[1088,2440,2324],{"class":2323},[1088,2442,1095],{"class":1094},[1088,2444,1123],{"class":1094},[1088,2446,1126],{"class":1094},[1088,2448,2333],{"class":1098},[1088,2450,1095],{"class":1094},[1088,2452,1134],{"class":1094},[1088,2454,1126],{"class":1094},[1088,2456,2342],{"class":2323},[1088,2458,1095],{"class":1094},[1088,2460,1123],{"class":1094},[1088,2462,1315],{"class":1094},[1088,2464,2351],{"class":1094},[1088,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492],{"class":1090,"line":2467},13,[1088,2469,2308],{"class":1094},[1088,2471,2358],{"class":1281},[1088,2473,1095],{"class":1094},[1088,2475,1123],{"class":1094},[1088,2477,2318],{"class":1094},[1088,2479,1126],{"class":1094},[1088,2481,2324],{"class":2323},[1088,2483,1095],{"class":1094},[1088,2485,1123],{"class":1094},[1088,2487,1126],{"class":1094},[1088,2489,2333],{"class":1098},[1088,2491,1095],{"class":1094},[1088,2493,2351],{"class":1094},[1088,2495,2497,2499,2502,2504,2506,2508,2510,2512,2514,2516,2518,2521,2523,2525,2527,2530,2532,2534,2536],{"class":1090,"line":2496},14,[1088,2498,2308],{"class":1094},[1088,2500,2501],{"class":1281},"expected_delivery",[1088,2503,1095],{"class":1094},[1088,2505,1123],{"class":1094},[1088,2507,2318],{"class":1094},[1088,2509,1126],{"class":1094},[1088,2511,2324],{"class":2323},[1088,2513,1095],{"class":1094},[1088,2515,1123],{"class":1094},[1088,2517,1126],{"class":1094},[1088,2519,2520],{"class":1098},"date",[1088,2522,1095],{"class":1094},[1088,2524,1134],{"class":1094},[1088,2526,1126],{"class":1094},[1088,2528,2529],{"class":2323},"required",[1088,2531,1095],{"class":1094},[1088,2533,1123],{"class":1094},[1088,2535,2088],{"class":1094},[1088,2537,2381],{"class":1094},[1088,2539,2541],{"class":1090,"line":2540},15,[1088,2542,2386],{"class":1094},[1088,2544,2546],{"class":1090,"line":2545},16,[1088,2547,1190],{"class":1094},[1088,2549,2551],{"class":1090,"line":2550},17,[1088,2552,1544],{"emptyLinePlaceholder":1543},[1088,2554,2556],{"class":1090,"line":2555},18,[1088,2557,2558],{"class":1137},"\u002F\u002F Deploy v1.1.0 → the platform runs:\n",[1088,2560,2562],{"class":1090,"line":2561},19,[1088,2563,2564],{"class":1137},"\u002F\u002F ALTER TABLE orders ADD COLUMN expected_delivery DATE;\n",[990,2566,2567],{},"No manual migration files needed — git history is your migration log.",[1022,2569,2571],{"id":2570},"next-steps","Next Steps",[1192,2573,2574,2584,2592],{},[1195,2575,2576,2583],{},[994,2577,2578],{},[2579,2580,2582],"a",{"href":2581},"\u002Fdocs\u002Fproducts\u002Fapps\u002Fconcept\u002F","Concept"," — Understand the declarative app model",[1195,2585,2586,2591],{},[994,2587,2588],{},[2579,2589,117],{"href":2590},"\u002Fdocs\u002Fproducts\u002Fapps\u002Fbilling-events\u002F"," — Marketplace billing and events",[1195,2593,2594,2599],{},[994,2595,2596],{},[2579,2597,123],{"href":2598},"\u002Fdocs\u002Fproducts\u002Fapps\u002Fcockpit-integration\u002F"," — UI extension points",[2601,2602,2603],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":1042,"searchDepth":1111,"depth":1111,"links":2605},[2606,2610,2611,2615,2621,2628,2629,2630],{"id":1024,"depth":1111,"text":1025,"children":2607},[2608,2609],{"id":1046,"depth":1141,"text":1047},{"id":1072,"depth":1141,"text":1073},{"id":1216,"depth":1111,"text":1217},{"id":1261,"depth":1111,"text":1262,"children":2612},[2613,2614],{"id":1265,"depth":1141,"text":1266},{"id":1362,"depth":1141,"text":1363},{"id":1395,"depth":1111,"text":1396,"children":2616},[2617,2618,2619,2620],{"id":1402,"depth":1141,"text":1403},{"id":1627,"depth":1141,"text":1628},{"id":1750,"depth":1141,"text":1375},{"id":1903,"depth":1141,"text":1904},{"id":2024,"depth":1111,"text":2025,"children":2622},[2623,2624,2625,2626,2627],{"id":2028,"depth":1141,"text":2029},{"id":2054,"depth":1141,"text":2055},{"id":2142,"depth":1141,"text":2143},{"id":2206,"depth":1141,"text":2207},{"id":2224,"depth":1141,"text":2225},{"id":2231,"depth":1111,"text":2232},{"id":2264,"depth":1111,"text":2265},{"id":2570,"depth":1111,"text":2571},"App versioning, deployment, and lifecycle events","md",null,{"status":2635},"published",{"title":135,"description":2631},{"loc":136},"x_2EyGsOMCFQ2-OdggvufZOckqNXAk2SgZlDf-CHdJc",1785229260860]