{"product":"edge-apps","releases":[{"date":"2026-05-02","entries":[{"areas":["developers"],"breaking":false,"content_html":"\u003cp\u003eUntil this release, \u003ccode\u003eedge-apps-scripts\u003c/code\u003e only ran under Bun. If your team already had Node.js\neverywhere, building an Edge App meant installing a second runtime first. Now the library installs\nand runs with npm on Node.js 20.6.0 or later:\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-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enpm install @screenly/edge-apps\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enpm run dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enpm run build\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003eEvery command works the same way it did under Bun: \u003ccode\u003edev\u003c/code\u003e, \u003ccode\u003ebuild\u003c/code\u003e, \u003ccode\u003ebuild:dev\u003c/code\u003e, \u003ccode\u003elint\u003c/code\u003e,\n\u003ccode\u003etype-check\u003c/code\u003e, \u003ccode\u003escreenshots\u003c/code\u003e, and \u003ccode\u003ecreate\u003c/code\u003e. The recommended scripts for your Edge App\u0026rsquo;s\n\u003ccode\u003epackage.json\u003c/code\u003e are unchanged apart from \u003ccode\u003edeploy\u003c/code\u003e, which now reads\n\u003ccode\u003enpm run build \u0026amp;\u0026amp; screenly edge-app deploy --path=dist/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eBun still works. \u003ccode\u003ebun add @screenly/edge-apps\u003c/code\u003e and \u003ccode\u003ebun run dev\u003c/code\u003e read the same \u003ccode\u003epackage.json\u003c/code\u003e\nscripts, so a Bun project can upgrade without changing anything except the CORS proxy script\ncovered in the next entry.\u003c/p\u003e\n\u003cp\u003eTo link a local copy of the library while you work on it, run \u003ccode\u003enpm install\u003c/code\u003e, \u003ccode\u003enpm run build\u003c/code\u003e, and\n\u003ccode\u003enpm link\u003c/code\u003e in the library, then \u003ccode\u003enpm link @screenly/edge-apps\u003c/code\u003e in your Edge App.\u003c/p\u003e\n","description":"The library and its edge-apps-scripts commands work with Node.js 20.6.0 or later and npm, so building an Edge App no longer requires Bun.","title":"edge-apps-scripts runs on Node.js and npm","type":"release","url":"https://www.screenly.io/releases/edge-apps/1.0.0/runs-on-node-and-npm/"},{"areas":["developers"],"breaking":true,"content_html":"\u003cp\u003eThe local CORS proxy has its own command:\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-json\" data-lang=\"json\"\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\"\u003e\u0026#34;scripts\u0026#34;\u003c/span\u003e: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#6ab825;font-weight:bold\"\u003e\u0026#34;cors-proxy-server\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#ed9d13\"\u003e\u0026#34;edge-apps-scripts cors-proxy\u0026#34;\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}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003eIt still listens on \u003ccode\u003e0.0.0.0:8080\u003c/code\u003e by default, and \u003ccode\u003eHOST\u003c/code\u003e and \u003ccode\u003ePORT\u003c/code\u003e change that. Put the target\nURL after the proxy\u0026rsquo;s address, as before: \u003ccode\u003ehttp://localhost:8080/https://api.example.com/feed\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe proxy also follows redirects now. When an API answers a \u003ccode\u003eGET\u003c/code\u003e or \u003ccode\u003eHEAD\u003c/code\u003e request with a 301 to\n308, the proxy fetches the new location and returns that response to your app, up to 10 redirects\ndeep. After 10 it stops and returns a 508 with \u003ccode\u003eToo many redirects\u003c/code\u003e. Other methods get the redirect\nresponse itself, unchanged.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eIf this affects you:\u003c/strong\u003e the file \u003ccode\u003ecors-proxy-server.ts\u003c/code\u003e is gone from the package. If your\n\u003ccode\u003epackage.json\u003c/code\u003e runs it directly, replace that script with \u003ccode\u003eedge-apps-scripts cors-proxy\u003c/code\u003e as shown\nabove.\u003c/p\u003e\n\u003c/blockquote\u003e\n","description":"Start the local CORS proxy with edge-apps-scripts cors-proxy instead of pointing at cors-proxy-server.ts inside the library, and it follows redirects for GET and HEAD requests.","title":"The CORS proxy is an edge-apps-scripts command now","type":"improvement","url":"https://www.screenly.io/releases/edge-apps/1.0.0/cors-proxy-command/"}],"json":"https://www.screenly.io/releases/edge-apps/1.0.0/v1.json","product":"edge-apps","product_label":"Edge Apps library","url":"https://www.screenly.io/releases/edge-apps/1.0.0/","version":"1.0.0"}],"title":"Edge Apps library 1.0.0","url":"https://www.screenly.io/releases/edge-apps/1.0.0/","version":1}