<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Edge Apps library 1.0.0 | Screenly</title><description>What has shipped across Screenly, newest first.</description><link>https://www.screenly.io/releases/edge-apps/1.0.0/</link><language>en</language><atom:link href="https://www.screenly.io/releases/edge-apps/1.0.0/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sat, 02 May 2026 00:00:00 +0000</lastBuildDate><item><title>Edge Apps library 1.0.0: edge-apps-scripts runs on Node.js and npm</title><link>https://www.screenly.io/releases/edge-apps/1.0.0/runs-on-node-and-npm/</link><guid isPermaLink="true">https://www.screenly.io/releases/edge-apps/1.0.0/runs-on-node-and-npm/</guid><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><category>release</category><category>developers</category><description>&lt;p&gt;Until this release, &lt;code&gt;edge-apps-scripts&lt;/code&gt; only ran under Bun. If your team already had Node.js
everywhere, building an Edge App meant installing a second runtime first. Now the library installs
and runs with npm on Node.js 20.6.0 or later:&lt;/p&gt;
&lt;div class="code-block"&gt;
&lt;button type="button" class="code-copy" aria-label="Copy code" data-copy-code&gt;
&lt;svg data-copy viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;
&lt;rect x="9" y="9" width="11" height="11" rx="2"&gt;&lt;/rect&gt;
&lt;path d="M5 15V5a2 2 0 0 1 2-2h10"&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;svg data-check viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;
&lt;path d="M20 6 9 17l-5-5"&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/button&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install @screenly/edge-apps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Every command works the same way it did under Bun: &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;build:dev&lt;/code&gt;, &lt;code&gt;lint&lt;/code&gt;,
&lt;code&gt;type-check&lt;/code&gt;, &lt;code&gt;screenshots&lt;/code&gt;, and &lt;code&gt;create&lt;/code&gt;. The recommended scripts for your Edge App&amp;rsquo;s
&lt;code&gt;package.json&lt;/code&gt; are unchanged apart from &lt;code&gt;deploy&lt;/code&gt;, which now reads
&lt;code&gt;npm run build &amp;amp;&amp;amp; screenly edge-app deploy --path=dist/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Bun still works. &lt;code&gt;bun add @screenly/edge-apps&lt;/code&gt; and &lt;code&gt;bun run dev&lt;/code&gt; read the same &lt;code&gt;package.json&lt;/code&gt;
scripts, so a Bun project can upgrade without changing anything except the CORS proxy script
covered in the next entry.&lt;/p&gt;
&lt;p&gt;To link a local copy of the library while you work on it, run &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;npm run build&lt;/code&gt;, and
&lt;code&gt;npm link&lt;/code&gt; in the library, then &lt;code&gt;npm link @screenly/edge-apps&lt;/code&gt; in your Edge App.&lt;/p&gt;</description></item><item><title>Edge Apps library 1.0.0: The CORS proxy is an edge-apps-scripts command now</title><link>https://www.screenly.io/releases/edge-apps/1.0.0/cors-proxy-command/</link><guid isPermaLink="true">https://www.screenly.io/releases/edge-apps/1.0.0/cors-proxy-command/</guid><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><category>improvement</category><category>developers</category><description>&lt;p&gt;The local CORS proxy has its own command:&lt;/p&gt;
&lt;div class="code-block"&gt;
&lt;button type="button" class="code-copy" aria-label="Copy code" data-copy-code&gt;
&lt;svg data-copy viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;
&lt;rect x="9" y="9" width="11" height="11" rx="2"&gt;&lt;/rect&gt;
&lt;path d="M5 15V5a2 2 0 0 1 2-2h10"&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;svg data-check viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;
&lt;path d="M20 6 9 17l-5-5"&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/button&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6ab825;font-weight:bold"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6ab825;font-weight:bold"&gt;&amp;#34;cors-proxy-server&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;edge-apps-scripts cors-proxy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It still listens on &lt;code&gt;0.0.0.0:8080&lt;/code&gt; by default, and &lt;code&gt;HOST&lt;/code&gt; and &lt;code&gt;PORT&lt;/code&gt; change that. Put the target
URL after the proxy&amp;rsquo;s address, as before: &lt;code&gt;http://localhost:8080/https://api.example.com/feed&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The proxy also follows redirects now. When an API answers a &lt;code&gt;GET&lt;/code&gt; or &lt;code&gt;HEAD&lt;/code&gt; request with a 301 to
308, the proxy fetches the new location and returns that response to your app, up to 10 redirects
deep. After 10 it stops and returns a 508 with &lt;code&gt;Too many redirects&lt;/code&gt;. Other methods get the redirect
response itself, unchanged.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this affects you:&lt;/strong&gt; the file &lt;code&gt;cors-proxy-server.ts&lt;/code&gt; is gone from the package. If your
&lt;code&gt;package.json&lt;/code&gt; runs it directly, replace that script with &lt;code&gt;edge-apps-scripts cors-proxy&lt;/code&gt; as shown
above.&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>