{"product":"edge-apps","releases":[{"date":"2026-06-19","entries":[{"areas":["developers"],"breaking":false,"content_html":"\u003cp\u003eAn Edge App that fails on a screen in another building usually fails quietly. Nobody is standing in\nfront of it with the developer tools open. With \u003ccode\u003esetupSentry()\u003c/code\u003e and \u003ccode\u003ereportError()\u003c/code\u003e, those errors\nland in your own Sentry project instead, with enough context to tell which screen sent them.\u003c/p\u003e\n\u003cp\u003eAdd a \u003ccode\u003esentry_dsn\u003c/code\u003e setting to \u003ccode\u003escreenly.yml\u003c/code\u003e, set it to your project\u0026rsquo;s DSN in Screenly, and call\n\u003ccode\u003esetupSentry()\u003c/code\u003e once when the app starts:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cbutton type=\"button\" class=\"code-copy\" aria-label=\"Copy code\" data-copy-code\u003e\n    \u003csvg data-copy viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n      \u003crect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"\u003e\u003c/rect\u003e\n      \u003cpath d=\"M5 15V5a2 2 0 0 1 2-2h10\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n    \u003csvg data-check viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n      \u003cpath d=\"M20 6 9 17l-5-5\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n  \u003c/button\u003e\n  \u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003esettings\u003c/span\u003e:\u003cspan style=\"color:#666\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#666\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003esentry_dsn\u003c/span\u003e:\u003cspan style=\"color:#666\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#666\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003etype\u003c/span\u003e:\u003cspan style=\"color:#666\"\u003e \u003c/span\u003esecret\u003cspan style=\"color:#666\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#666\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003etitle\u003c/span\u003e:\u003cspan style=\"color:#666\"\u003e \u003c/span\u003eSentry Client Key\u003cspan style=\"color:#666\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#666\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003eoptional\u003c/span\u003e:\u003cspan style=\"color:#666\"\u003e \u003c/span\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003etrue\u003c/span\u003e\u003cspan style=\"color:#666\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#666\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003eis_global\u003c/span\u003e:\u003cspan style=\"color:#666\"\u003e \u003c/span\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003etrue\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cbutton type=\"button\" class=\"code-copy\" aria-label=\"Copy code\" data-copy-code\u003e\n    \u003csvg data-copy viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n      \u003crect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"\u003e\u003c/rect\u003e\n      \u003cpath d=\"M5 15V5a2 2 0 0 1 2-2h10\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n    \u003csvg data-check viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n      \u003cpath d=\"M20 6 9 17l-5-5\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n  \u003c/button\u003e\n  \u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003eimport\u003c/span\u003e { setupSentry, reportError } \u003cspan style=\"color:#6ab825;font-weight:bold\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#ed9d13\"\u003e\u0026#39;@screenly/edge-apps\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esetupSentry(\u003cspan style=\"color:#ed9d13\"\u003e\u0026#39;menu-board\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003etry\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#6ab825;font-weight:bold\"\u003eawait\u003c/span\u003e refreshPrices()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e} \u003cspan style=\"color:#6ab825;font-weight:bold\"\u003ecatch\u003c/span\u003e (error) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  reportError(error, { source: \u003cspan style=\"color:#ed9d13\"\u003e\u0026#39;price-feed\u0026#39;\u003c/span\u003e })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003eEvery event is tagged with \u003ccode\u003eedge_app\u003c/code\u003e (the name you pass) and the screen\u0026rsquo;s \u003ccode\u003ehostname\u003c/code\u003e, which is\nalso set as the Sentry user, so one screen\u0026rsquo;s errors group together. The optional second argument\nto \u003ccode\u003esetupSentry()\u003c/code\u003e attaches contexts of your own, such as the URL a report was embedded from. The\nsecond argument to \u003ccode\u003ereportError()\u003c/code\u003e goes in as extra data on that event.\u003c/p\u003e\n\u003cp\u003eBefore an event leaves the screen, the value of any setting whose key contains \u003ccode\u003etoken\u003c/code\u003e, \u003ccode\u003esecret\u003c/code\u003e,\n\u003ccode\u003epassword\u003c/code\u003e, or \u003ccode\u003ecredential\u003c/code\u003e is replaced with \u003ccode\u003e[REDACTED]\u003c/code\u003e wherever it appears in the event. If an\nevent can\u0026rsquo;t be checked that way, it isn\u0026rsquo;t sent. The same filter is exported as\n\u003ccode\u003escrubSensitiveData()\u003c/code\u003e if you initialize Sentry yourself and want it as your \u003ccode\u003ebeforeSend\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLeave \u003ccode\u003esentry_dsn\u003c/code\u003e empty and \u003ccode\u003esetupSentry()\u003c/code\u003e does nothing, so the same build runs with or without\nerror reporting. It reports errors only, with no performance tracing.\u003c/p\u003e\n","description":"setupSentry and reportError send an Edge App's errors to your own Sentry project, tagged with the app and the screen they came from, with secret setting values redacted.","title":"Edge Apps can send their errors to your own Sentry project","type":"release","url":"https://www.screenly.io/releases/edge-apps/1.1.0/sentry-error-reporting/"}],"json":"https://www.screenly.io/releases/edge-apps/1.1.0/v1.json","product":"edge-apps","product_label":"Edge Apps library","url":"https://www.screenly.io/releases/edge-apps/1.1.0/","version":"1.1.0"}],"title":"Edge Apps library 1.1.0","url":"https://www.screenly.io/releases/edge-apps/1.1.0/","version":1}