Back up, replace, verify, and roll back Sonoran Station Displays safely.
Sonoran Station Displays checks the standard Sonoran packaging endpoint at startup and every six hours in official packaged builds, then logs SSD-UPDATE-003 when a newer version is available. No customer configuration is required. Source/development builds retain the packaging token and safely skip the request. The checker is informational and does not automatically overwrite customer files.
Verify the new package contains one sonoran-stationdisplay folder.
Replace the old resource folder with the new folder.
Restore data/displays.json.
Compare the new config.lua with your backup and reapply customer changes to the new schema.
Restore intentional locale customizations.
Do not copy only protected Lua files into an older resource. The manifest, browser files, Lua protocol, and configuration schema must stay on the same version.
Do not blindly overwrite a new config.lua with an old copy. Preserve your values while also adding any new settings from the release.
Older configs may contain update-check, dependency, DUI lifecycle/resolution, or event rate-limit settings that are now managed internally. Delete those obsolete entries and merge only documented customer-facing settings. The resource ignores old copies safely, but protected implementation values always take precedence.
Customer-editable config, locale, default data, packaged docs, and README are escrow ignored. Protected runtime files should be replaced from the newly downloaded granted asset.Do not decrypt, merge, or edit escrow-protected files.
Customers should replace the shipped web/ directory from the release package. There is no Node.js install or web build step.Source repository maintainers can run:
Version 1.0.0 validates saved display entries on load and has no separate migration command. Future releases may add migration notes. Always follow the target releaseβs changelog before restoring old data.Check for:
release-candidate for validation, packaging, and QA deployment
Manual Production Release from main for semantic version synchronization and version metadata upload
The FiveM Keymaster/Tebex escrow process for the protected archive
Updater Upload from Keymaster for the encrypted stationDisplay.pack.zip
The release package is stationDisplay.zip; its one top-level resource folder remains sonoran-stationdisplay.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Sonoran Software Documentation","colors":{"primary":"#1D7DCF","light":"#3297ED","dark":"#1465AA"},"logo":{"light":"https://docs-assets.sonoransoftware.com/sha256/a8/a8af14e6458cb682c1c8d33ca8b56d25dcd5999b2589e0de14b2be9f8dbe20a5.png","dark":"https://docs-assets.sonoransoftware.com/sha256/0b/0be9cc0ac8f90ee8aa8607653b830270c319a8ebe0c9051d1d2c7a79fb5453ab.png","href":"/"},"favicon":"https://docs-assets.sonoransoftware.com/sha256/1d/1d3aaa7393e84144f39bad7742c218a4f1db8e0ceb6f330d69f2e9bc92629df4.png","navbar":{"links":[{"href":"https://support.sonoransoftware.com","label":"Support"},{"href":"https://sonoransoftware.com","label":"Website"}]},"footer":{"socials":{"discord":"https://discord.sonoransoftware.com/","x":"https://x.com/Sonoran_SW","instagram":"https://www.instagram.com/sonoransoftware","youtube":"https://www.youtube.com/channel/UC-IfsakmGGmPrG8qcV3VVsA"},"links":[{"header":"Support","items":[{"label":"Customer Support","href":"https://support.sonoransoftware.com/"}]},{"header":"Policies","items":[{"label":"Refund and Purchase Policy","href":"/policy/policy/refund-and-purchase-policy"},{"label":"Terms of Service","href":"/policy/policy/terms-of-service"},{"label":"Privacy Policy","href":"/policy/policy/privacy-policy"}]}]},"seo":{"metatags":{"canonical":"https://docs.sonoransoftware.com"},"indexing":"all"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"sonoran-software-systems","hasAudioNarration":false,"actualSubdomain":"sonoran-software-systems","customDomains":["docs.sonoransoftware.com"],"gitSource":{"type":"github","owner":"sonoran-software","repo":"sonoran-documentation","deployBranch":"master","contentDirectory":"mintlify","isPrivate":false,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6aefca88ff56dc66d2b81dbb","clientVersion":"0.0.4094","searchFilterCounts":[{"language":"default","tag":"CAD","count":256},{"language":"default","tag":"Integration Capabilities","count":247},{"language":"default","tag":"π API Integration","count":193},{"language":"default","tag":"CMS","count":166},{"language":"default","tag":"Tutorials","count":136},{"language":"default","tag":"General","count":124},{"language":"default","tag":"Radio","count":104},{"language":"default","tag":"v2 API Endpoints","count":96},{"language":"default","tag":"Store","count":78},{"language":"default","tag":"Developer API Documentation","count":65}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#content-area img{max-width:100%;height:auto}iframe{border:0}footer a{white-space:normal;text-overflow:clip}#assistant-entry,#assistant-entry-mobile,#chat-assistant-sheet,#ask-assistant-code-block-button{display:none!important}"}],"page":{"pagePath":"store/sonoran-station-displays/updating","slug":"/store/sonoran-station-displays/updating","pageMetadata":{"title":"Updating","description":"Back up, replace, verify, and roll back Sonoran Station Displays safely.","keywords":["update","backup","rollback"],"href":"/store/sonoran-station-displays/updating"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Back up, replace, verify, and roll back Sonoran Station Displays safely.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Sonoran Station Displays checks the standard Sonoran packaging endpoint at startup and every six hours in official packaged builds, then logs `,_jsx(_components.code,{children:`SSD-UPDATE-003`}),` when a newer version is available. No customer configuration is required. Source/development builds retain the packaging token and safely skip the request. The checker is informational and does not automatically overwrite customer files.`]}),`\n`,_jsx(Heading,{level:`2`,id:`before-updating`,children:`Before updating`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Read the product `,_jsx(_components.a,{href:`/store/sonoran-station-displays/changelog`,children:`Changelog`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Record the installed resource version from `,_jsx(_components.code,{children:`fxmanifest.lua`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Stop `,_jsx(_components.code,{children:`sonoran-stationdisplay`}),`.`]}),`\n`,_jsx(_components.li,{children:`Back up:`}),`\n`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`5`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`sonoran-stationdisplay/config.lua`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`sonoran-stationdisplay/server/admin_webhook_config.lua`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`sonoran-stationdisplay/locales/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`sonoran-stationdisplay/data/displays.json`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Record any custom `,_jsx(_components.code,{children:`Config.DisplayModels`}),`, ACE object names, custom permission function, and service overrides.`]}),`\n`,_jsx(_components.li,{children:`Keep a copy of the entire previous resource for rollback.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Do not share a backup containing player identifiers or private call data.`}),`\n`,_jsx(Heading,{level:`2`,id:`replace-the-resource`,children:`Replace the resource`}),`\n`,_jsx(_components.p,{children:`For a normal Tebex/CFX update:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Download the current granted asset.`}),`\n`,_jsx(_components.li,{children:`Extract it to a temporary location.`}),`\n`,_jsxs(_components.li,{children:[`Verify the new package contains one `,_jsx(_components.code,{children:`sonoran-stationdisplay`}),` folder.`]}),`\n`,_jsx(_components.li,{children:`Replace the old resource folder with the new folder.`}),`\n`,_jsxs(_components.li,{children:[`Restore `,_jsx(_components.code,{children:`data/displays.json`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Compare the new `,_jsx(_components.code,{children:`config.lua`}),` with your backup and reapply customer changes to the new schema.`]}),`\n`,_jsx(_components.li,{children:`Restore intentional locale customizations.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Do not copy only protected Lua files into an older resource. The manifest, browser files, Lua protocol, and configuration schema must stay on the same version.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Do not blindly overwrite a new `,_jsx(_components.code,{children:`config.lua`}),` with an old copy. Preserve your values while also adding any new settings from the release.`]})}),`\n`,_jsx(_components.p,{children:`Older configs may contain update-check, dependency, DUI lifecycle/resolution, or event rate-limit settings that are now managed internally. Delete those obsolete entries and merge only documented customer-facing settings. The resource ignores old copies safely, but protected implementation values always take precedence.`}),`\n`,_jsx(Heading,{level:`2`,id:`asset-escrow-considerations`,children:`Asset Escrow considerations`}),`\n`,_jsx(_components.p,{children:`Customer-editable config, locale, default data, packaged docs, and README are escrow ignored. Protected runtime files should be replaced from the newly downloaded granted asset.`}),`\n`,_jsx(_components.p,{children:`Do not decrypt, merge, or edit escrow-protected files.`}),`\n`,_jsx(Heading,{level:`2`,id:`web-files`,children:`Web files`}),`\n`,_jsxs(_components.p,{children:[`Customers should replace the shipped `,_jsx(_components.code,{children:`web/`}),` directory from the release package. There is no Node.js install or web build step.`]}),`\n`,_jsx(_components.p,{children:`Source repository maintainers can run:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`powershell`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`powershell`,children:_jsxs(_components.code,{language:`powershell`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`python scripts`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`/`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`validate.py`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`python scripts`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`/`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`package.py`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The CI equivalent requires a Lua 5.4 compiler:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`powershell`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`powershell`,children:_jsxs(_components.code,{language:`powershell`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`python scripts`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`/`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`validate.py `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`--`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`require`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`luac`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`restart-order`,children:`Restart order`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ensure sonorancad`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ensure sonoran-stationdisplay`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Restart the full server for an update when practical. This avoids leaving old DUI/browser state in connected clients.`}),`\n`,_jsx(Heading,{level:`2`,id:`verify-after-updating`,children:`Verify after updating`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Confirm the console connects to the expected SonoranCADFiveM version.`}),`\n`,_jsx(_components.li,{children:`Confirm the expected number of displays loads.`}),`\n`,_jsxs(_components.li,{children:[`Run `,_jsx(_components.code,{children:`stationdisplay_serverdiag`}),`.`]}),`\n`,_jsx(_components.li,{children:`Open in-game diagnostics.`}),`\n`,_jsx(_components.li,{children:`Visit at least one LEO, Fire/EMS, and Both display.`}),`\n`,_jsx(_components.li,{children:`Test Active Units, both call pages, all three Live Map modes, and configured Bodycams.`}),`\n`,_jsx(_components.li,{children:`Verify main rotation, synchronized manual next/previous, map pan/reset, and bodycam pagination.`}),`\n`,_jsx(_components.li,{children:`Test place, edit, move, refresh, and delete with the intended groups.`}),`\n`,_jsx(_components.li,{children:`Confirm custom models remain aligned and independent.`}),`\n`,_jsx(_components.li,{children:`Check server and client logs.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`version-migrations`,children:`Version migrations`}),`\n`,_jsx(_components.p,{children:`Version 1.0.0 validates saved display entries on load and has no separate migration command. Future releases may add migration notes. Always follow the target releaseβs changelog before restoring old data.`}),`\n`,_jsx(_components.p,{children:`Check for:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`New or renamed permission nodes`}),`\n`,_jsx(_components.li,{children:`Configuration-version changes`}),`\n`,_jsx(_components.li,{children:`New required fields`}),`\n`,_jsx(_components.li,{children:`Model registry changes`}),`\n`,_jsx(_components.li,{children:`Supported SonoranCADFiveM minimum-version changes`}),`\n`,_jsx(_components.li,{children:`Bodycam runtime bridge/mode changes`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`roll-back`,children:`Roll back`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Stop `,_jsx(_components.code,{children:`sonoran-stationdisplay`}),`.`]}),`\n`,_jsx(_components.li,{children:`Restore the complete previous resource folder.`}),`\n`,_jsx(_components.li,{children:`Restore the matching configuration and persistence backup.`}),`\n`,_jsx(_components.li,{children:`Start SonoranCADFiveM, then the display resource.`}),`\n`,_jsx(_components.li,{children:`Confirm display count and inspect errors.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Do not use persistence data written by a newer incompatible schema unless the rollback notes confirm compatibility.`}),`\n`,_jsx(Heading,{level:`2`,id:`maintainer-release-workflow`,children:`Maintainer release workflow`}),`\n`,_jsx(_components.p,{children:`The source repository uses:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`release-candidate`}),` for validation, packaging, and QA deployment`]}),`\n`,_jsxs(_components.li,{children:[`Manual `,_jsx(_components.strong,{children:`Production Release`}),` from `,_jsx(_components.code,{children:`main`}),` for semantic version synchronization and version metadata upload`]}),`\n`,_jsx(_components.li,{children:`The FiveM Keymaster/Tebex escrow process for the protected archive`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Updater Upload from Keymaster`}),` for the encrypted `,_jsx(_components.code,{children:`stationDisplay.pack.zip`})]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The release package is `,_jsx(_components.code,{children:`stationDisplay.zip`}),`; its one top-level resource folder remains `,_jsx(_components.code,{children:`sonoran-stationdisplay`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Updating","description":"Back up, replace, verify, and roll back Sonoran Station Displays safely.","keywords":["update","backup","rollback"],"href":"/store/sonoran-station-displays/updating"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before updating","slug":"before-updating","depth":2,"children":[]},{"title":"Replace the resource","slug":"replace-the-resource","depth":2,"children":[]},{"title":"Asset Escrow considerations","slug":"asset-escrow-considerations","depth":2,"children":[]},{"title":"Web files","slug":"web-files","depth":2,"children":[]},{"title":"Restart order","slug":"restart-order","depth":2,"children":[]},{"title":"Verify after updating","slug":"verify-after-updating","depth":2,"children":[]},{"title":"Version migrations","slug":"version-migrations","depth":2,"children":[]},{"title":"Roll back","slug":"roll-back","depth":2,"children":[]},{"title":"Maintainer release workflow","slug":"maintainer-release-workflow","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"sonoran-software-systems","siteName":"Sonoran Software Documentation","title":"Updating - Sonoran Software Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-20T00:46:53.192Z","originalFileLocation":"store/sonoran-station-displays/updating.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Back up, replace, verify, and roll back Sonoran Station Displays safely.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Sonoran Software Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://docs-assets.sonoransoftware.com/sha256/1d/1d3aaa7393e84144f39bad7742c218a4f1db8e0ceb6f330d69f2e9bc92629df4.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://docs-assets.sonoransoftware.com/sha256/1d/1d3aaa7393e84144f39bad7742c218a4f1db8e0ceb6f330d69f2e9bc92629df4.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://docs-assets.sonoransoftware.com/sha256/1d/1d3aaa7393e84144f39bad7742c218a4f1db8e0ceb6f330d69f2e9bc92629df4.png\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/png\" href=\"https://docs-assets.sonoransoftware.com/sha256/1d/1d3aaa7393e84144f39bad7742c218a4f1db8e0ceb6f330d69f2e9bc92629df4.png\">\u003cmeta data-mint-head property=\"og:title\" content=\"Updating - Sonoran Software Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Back up, replace, verify, and roll back Sonoran Station Displays safely.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Sonoran Software Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://sonoran-software-systems.mintlify.site/_mintlify/api/og/v2?division=%F0%9F%96%A5%EF%B8%8F+Sonoran+Station+Displays\u0026amp;title=Updating\u0026amp;description=Back+up%2C+replace%2C+verify%2C+and+roll+back+Sonoran+Station+Displays+safely.\u0026amp;theme=1726bed78342e75c7aa90f1e\u0026amp;signature=9e797dfc97d756ff928fdb24b26e45a5efd8603383874b92e1528dc633b3ddd3\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Updating - Sonoran Software Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Back up, replace, verify, and roll back Sonoran Station Displays safely.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://sonoran-software-systems.mintlify.site/_mintlify/api/og/v2?division=%F0%9F%96%A5%EF%B8%8F+Sonoran+Station+Displays\u0026amp;title=Updating\u0026amp;description=Back+up%2C+replace%2C+verify%2C+and+roll+back+Sonoran+Station+Displays+safely.\u0026amp;theme=1726bed78342e75c7aa90f1e\u0026amp;signature=9e797dfc97d756ff928fdb24b26e45a5efd8603383874b92e1528dc633b3ddd3\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/sonoran-software-systems/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Sonoran Software Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1D7DCF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/store/sonoran-station-displays/updating.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.sonoransoftware.com/#organization\",\"name\":\"Sonoran Software Documentation\",\"url\":\"https://docs.sonoransoftware.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs-assets.sonoransoftware.com/sha256/a8/a8af14e6458cb682c1c8d33ca8b56d25dcd5999b2589e0de14b2be9f8dbe20a5.png\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.sonoransoftware.com#website\",\"name\":\"Sonoran Software Documentation\",\"url\":\"https://docs.sonoransoftware.com\",\"publisher\":{\"@id\":\"https://docs.sonoransoftware.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating#webpage\",\"url\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating\",\"name\":\"Updating\",\"description\":\"Back up, replace, verify, and roll back Sonoran Station Displays safely.\",\"dateModified\":\"2026-10-20T00:46:53.192Z\",\"isPartOf\":{\"@id\":\"https://docs.sonoransoftware.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"General\",\"item\":\"https://docs.sonoransoftware.com/store/general/information\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"π₯οΈ Sonoran Station Displays\",\"item\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Updating\",\"item\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating#article\",\"headline\":\"Updating\",\"name\":\"Updating\",\"description\":\"Back up, replace, verify, and roll back Sonoran Station Displays safely.\",\"url\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating\",\"mainEntityOfPage\":{\"@id\":\"https://docs.sonoransoftware.com/store/sonoran-station-displays/updating#webpage\"},\"dateModified\":\"2026-10-20T00:46:53.192Z\",\"keywords\":\"update, backup, rollback\",\"publisher\":{\"@id\":\"https://docs.sonoransoftware.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.sonoransoftware.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Sonoran Software Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Sonoran Software Documentation","nav":{"global":null,"products":[{"product":"Overview","icon":"house","pages":[{"title":"Overview","href":""}]},{"product":"CAD","icon":"car-side","pages":[{"title":"CAD","href":"/cad"}]},{"product":"CMS","icon":"building","pages":[{"title":"CMS","href":"/cms"}]},{"product":"Radio","icon":"walkie-talkie","pages":[{"title":"Radio","href":"/radio"}]},{"product":"Bot","icon":"robot","pages":[{"title":"Bot","href":"/bot"}]},{"product":"Store","icon":"bag-shopping","groups":[{"group":"Start here","pages":[{"title":"π Home","href":"/store"}]},{"group":"General","pages":[{"title":"Information","href":"/store/general/information"},{"title":"Accessing Tebex Assets","href":"/store/general/tebex-assets"},{"title":"Gun Placement System Guide","href":"/store/general/gun-placement"},{"title":"Five Bundle","href":"/store/five-bundle"},{"group":"π§ ATM Robbery","root":{"title":"ATM Robbery","href":"/store/atm-robbery"},"pages":[{"title":"Getting Started","href":"/store/atm-robbery/getting-started"},{"title":"Advanced Documentation","href":"/store/atm-robbery/advanced-docs"}]},{"group":"π§£ Bandanas","root":{"title":"Bandanas","href":"/store/bandanas"},"pages":[{"title":"Installation","href":"/store/bandanas/installation"}]},{"group":"π¦Ί Safety Vests","root":{"title":"Safety Vests","href":"/store/safety-vests"},"pages":[{"title":"Installation","href":"/store/safety-vests/installation"}]},{"group":"π Short Slip Dress","root":{"title":"Short Slip Dress","href":"/store/short-slip-dress"},"pages":[{"title":"Installation","href":"/store/short-slip-dress/installation"}]},{"group":"π§£ Scarf","root":{"title":"Scarf","href":"/store/scarf"},"pages":[{"title":"Installation","href":"/store/scarf/installation"}]},{"group":"πΉ CCTV","root":{"title":"CCTV","href":"/store/cctv"},"pages":[{"title":"Installation","href":"/store/cctv/installation"},{"title":"Configuration","href":"/store/cctv/configuration"},{"title":"Camera Setup","href":"/store/cctv/camera-setup"},{"title":"Live View and Historic Playback","href":"/store/cctv/playback"},{"title":"Permissions","href":"/store/cctv/permissions"},{"title":"Developer API","href":"/store/cctv/developer-api"},{"title":"Troubleshooting","href":"/store/cctv/troubleshooting"}]},{"group":"π Dashcam","root":{"title":"Dashcam","href":"/store/dashcam"},"pages":[{"title":"Installation","href":"/store/dashcam/installation"},{"title":"Configuration","href":"/store/dashcam/configuration"},{"title":"Vehicle Setup","href":"/store/dashcam/vehicle-setup"},{"title":"Recording","href":"/store/dashcam/recording"},{"title":"Playback and Evidence","href":"/store/dashcam/playback"},{"title":"Permissions","href":"/store/dashcam/permissions"},{"title":"Developer API","href":"/store/dashcam/developer-api"},{"title":"Troubleshooting","href":"/store/dashcam/troubleshooting"}]},{"group":"π₯ Bodycam","root":{"title":"Bodycam","href":"/store/bodycam"},"pages":[{"title":"Installation","href":"/store/bodycam/installation"},{"title":"Configuration","href":"/store/bodycam/configuration"},{"title":"Wearer Setup","href":"/store/bodycam/wearer-setup"},{"title":"Recording","href":"/store/bodycam/recording"},{"title":"Playback and Evidence","href":"/store/bodycam/playback"},{"title":"Permissions","href":"/store/bodycam/permissions"},{"title":"Developer API","href":"/store/bodycam/developer-api"},{"title":"Troubleshooting","href":"/store/bodycam/troubleshooting"}]},{"group":"πΈ Evidence Camera","root":{"title":"Evidence Camera","href":"/store/evidence-camera"},"pages":[{"title":"Getting Started","href":"/store/evidence-camera/getting-started"},{"title":"Advanced Documentation","href":"/store/evidence-camera/advanced-docs"}]},{"group":"π Mobile Command Center","root":{"title":"Mobile Command Center","href":"/store/mcc"},"pages":[{"title":"Getting Started","href":"/store/mcc/getting-started"},{"title":"Advanced Documentation","href":"/store/mcc/advanced-docs"}]},{"group":"ποΈ Sonoran Notepad","root":{"title":"Sonoran Notepad","href":"/store/sonoran-notepad"},"pages":[{"title":"Installation","href":"/store/sonoran-notepad/installation"},{"title":"Using and Syncing Notes","href":"/store/sonoran-notepad/usage-and-sync"},{"title":"Troubleshooting","href":"/store/sonoran-notepad/troubleshooting"}]},{"group":"β‘ Power Grid","root":{"title":"Power Grid","href":"/store/power-grid"},"pages":[{"title":"Getting Started","href":"/store/power-grid/getting-started"},{"title":"Advanced Documentation","href":"/store/power-grid/advanced-documentation"}]},{"group":"πΆ Radar Detector / Jammer","root":{"title":"Radar Detector / Jammer","href":"/store/radar-detector"},"pages":[{"title":"Getting Started","href":"/store/radar-detector/getting-started"}]},{"group":"π Radar Display","root":{"title":"Radar Display","href":"/store/radar-display"},"pages":[{"title":"Getting Started","href":"/store/radar-display/getting-started"}]},{"group":"π₯οΈ Sonoran Station Displays","root":{"title":"Sonoran Station Displays","href":"/store/sonoran-station-displays"},"pages":[{"title":"Installation","description":"Install Sonoran Station Displays, SonoranCADFiveM, permissions, and a first test display.","href":"/store/sonoran-station-displays/installation"},{"title":"Updating","href":"/store/sonoran-station-displays/updating"},{"title":"Configuration","description":"Reference every customer-editable Station Displays setting, default, limit, and current implementation note.","href":"/store/sonoran-station-displays/configuration"},{"title":"Permissions","href":"/store/sonoran-station-displays/permissions"},{"title":"Display Management","href":"/store/sonoran-station-displays/display-management"},{"title":"Display Pages and Rotation","href":"/store/sonoran-station-displays/display-pages"},{"title":"Active Units","href":"/store/sonoran-station-displays/active-units"},{"title":"Calls","href":"/store/sonoran-station-displays/calls"},{"title":"Localized Live Map","href":"/store/sonoran-station-displays/live-map"},{"title":"Bodycams","href":"/store/sonoran-station-displays/bodycams"},{"title":"In-game Clock and Weather","href":"/store/sonoran-station-displays/in-game-clock"},{"title":"SonoranCADFiveM Integration","href":"/store/sonoran-station-displays/sonorancad-integration"},{"title":"Administrative Webhooks","href":"/store/sonoran-station-displays/administrative-webhooks"},{"title":"Persistence","href":"/store/sonoran-station-displays/persistence"},{"title":"Performance","href":"/store/sonoran-station-displays/performance"},{"title":"Diagnostics","href":"/store/sonoran-station-displays/diagnostics"},{"title":"Troubleshooting","href":"/store/sonoran-station-displays/troubleshooting"},{"title":"Developer API","href":"/store/sonoran-station-displays/developer-api"},{"title":"DUI Message Protocol","href":"/store/sonoran-station-displays/dui-message-protocol"},{"title":"Changelog","href":"/store/sonoran-station-displays/changelog"}]},{"group":"π£οΈ Sonoran Street Signs","root":{"title":"Sonoran Street Signs","href":"/store/street-signs"},"pages":[{"title":"Installation","href":"/store/street-signs/getting-started"},{"title":"Configuration","href":"/store/street-signs/configuration-reference"},{"title":"Permissions","href":"/store/street-signs/permissions"},{"title":"Using Signs","href":"/store/street-signs/commands-and-usage"},{"title":"Integrations and Webhooks","href":"/store/street-signs/integrations-and-webhooks"},{"title":"Troubleshooting","href":"/store/street-signs/faq-and-troubleshooting"}]},{"group":"π« Shot Spotter","root":{"title":"Shot Spotter","href":"/store/shot-spotter"},"pages":[{"title":"Getting Started","href":"/store/shot-spotter/getting-started"},{"title":"Shot Spotter - Advanced Documentation","href":"/store/shot-spotter/advanced-docs"}]},{"group":"πΉ Speed Cameras / ALPR","root":{"title":"Speed Cameras / ALPR","href":"/store/speed-camera"},"pages":[{"title":"Getting Started","href":"/store/speed-camera/getting-started"},{"title":"Advanced Documentation","href":"/store/speed-camera/advanced-docs"}]},{"group":"π Traffic Engine","root":{"title":"Traffic Engine","href":"/store/traffic-engine"},"pages":[{"title":"Getting Started","href":"/store/traffic-engine/getting-started"},{"title":"Advanced Documentation","href":"/store/traffic-engine/advanced-documentation"}]}]},{"group":"Other","pages":[{"title":"Terms and Policies","href":"/store/other/policy"}]}]},{"product":"Studio","icon":"clapperboard","pages":[{"title":"Studio","href":"/studio"}]}]},"basePath":"","title":"Updating - Sonoran Software Documentation","buildId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","deploymentId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","dynamics":[],"chunks":[]}