<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Edge Apps GitHub Actions 26.10.2 | Screenly</title><description>What has shipped across Screenly, newest first.</description><link>https://www.screenly.io/releases/edge-apps-actions/26.10.2/</link><language>en</language><atom:link href="https://www.screenly.io/releases/edge-apps-actions/26.10.2/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Mon, 26 Oct 2026 00:00:00 +0000</lastBuildDate><item><title>Edge Apps GitHub Actions 26.10.2: Checks, initialize, and update now come as reusable workflows</title><link>https://www.screenly.io/releases/edge-apps-actions/26.10.2/reusable-workflows/</link><guid isPermaLink="true">https://www.screenly.io/releases/edge-apps-actions/26.10.2/reusable-workflows/</guid><pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate><category>release</category><category>developers</category><description>&lt;p&gt;Until this release, every Edge App repo carried its own full copy of the example workflows: the
triggers, the jobs for each environment, the production tag check, and the id expressions. Now those
live in this repo as reusable workflows, and an app&amp;rsquo;s workflow file calls them:&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;Update Edge App&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&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;on&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;workflow_dispatch&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;push&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;branches&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;[main, master]&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;tags&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;[&lt;span style="color:#ed9d13"&gt;&amp;#39;v[0-9]*&amp;#39;&lt;/span&gt;]&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&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;permissions&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;contents&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;read&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&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;jobs&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;update&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;uses&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;Screenly/edge-apps-actions/.github/workflows/update.yml@v26.10.2&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;secrets&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;SCREENLY_API_TOKEN&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;${{ secrets.SCREENLY_API_TOKEN }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When a later release changes how deploys work, bumping that pin is all it takes. Copy the 3 files in
&lt;code&gt;examples/&lt;/code&gt; into your app&amp;rsquo;s &lt;code&gt;.github/workflows/&lt;/code&gt; to start.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Inputs&lt;/th&gt;
&lt;th&gt;Secrets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;checks.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bun-version&lt;/code&gt; (default &lt;code&gt;latest&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;initialize.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;environment&lt;/code&gt;, &lt;code&gt;edge_app_name&lt;/code&gt;, &lt;code&gt;edge_app_title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SCREENLY_API_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete_missing_settings&lt;/code&gt; (default &lt;code&gt;true&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SCREENLY_API_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;update.yml&lt;/code&gt; deploys to stage on a push or a manual run on the default branch, and other branches
never deploy. It deploys to production when you push a &lt;code&gt;v*&lt;/code&gt; tag whose commit is on the default
branch, through the &lt;code&gt;production&lt;/code&gt; environment and its reviewers. &lt;code&gt;checks.yml&lt;/code&gt; cancels a check still
running on a branch when a newer push to that branch arrives.&lt;/p&gt;
&lt;h2 id="setting-up-an-app"&gt;Setting up an app&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create the GitHub environments &lt;code&gt;stage&lt;/code&gt; and &lt;code&gt;production&lt;/code&gt;, and add &lt;code&gt;SCREENLY_API_TOKEN&lt;/code&gt; to each as
an environment secret. An environment secret only reaches jobs that run in that environment, so
the production token stays behind production&amp;rsquo;s reviewers.&lt;/li&gt;
&lt;li&gt;Run &amp;ldquo;Initialize Edge App&amp;rdquo; for &lt;code&gt;stage&lt;/code&gt;. Once the run has finished successfully, set the repository
variable &lt;code&gt;STAGE_EDGE_APP_ID&lt;/code&gt; to the id in its job summary. Setting it earlier lets a deploy start
while Initialize is still running.&lt;/li&gt;
&lt;li&gt;Do the same for &lt;code&gt;production&lt;/code&gt; and &lt;code&gt;PRODUCTION_EDGE_APP_ID&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;delete_missing_settings&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt; in &lt;code&gt;update.yml&lt;/code&gt;, so the manifest decides which settings exist.
The &lt;code&gt;update&lt;/code&gt; action on its own still defaults to &lt;code&gt;false&lt;/code&gt;. To keep settings that aren&amp;rsquo;t in your
manifest, pass &lt;code&gt;delete_missing_settings: false&lt;/code&gt; under &lt;code&gt;with:&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;checks&lt;/code&gt;, &lt;code&gt;initialize&lt;/code&gt;, and &lt;code&gt;update&lt;/code&gt; actions are still there to use as steps in a workflow of
your own.&lt;/p&gt;</description></item><item><title>Edge Apps GitHub Actions 26.10.2: Deploys to an environment run one at a time</title><link>https://www.screenly.io/releases/edge-apps-actions/26.10.2/deploys-run-one-at-a-time/</link><guid isPermaLink="true">https://www.screenly.io/releases/edge-apps-actions/26.10.2/deploys-run-one-at-a-time/</guid><pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate><category>improvement</category><category>developers</category><description>&lt;p&gt;Merge 3 pull requests into &lt;code&gt;main&lt;/code&gt; in a row, and the update workflow deploys the first to stage while
the second waits. When the third arrives, it takes the second&amp;rsquo;s place in line. Stage ends up on the
newest commit after 2 deploys, and a running deploy is never cancelled to get there.&lt;/p&gt;
&lt;p&gt;Production tags queue the same way, separately from stage. If an older production run is still
waiting for a reviewer, reject it so the newest one goes next.&lt;/p&gt;
&lt;p&gt;Initialize has a queue of its own, so a push can&amp;rsquo;t take the place of an Initialize run that&amp;rsquo;s
waiting.&lt;/p&gt;
&lt;p&gt;To redo a failed or cancelled production deploy, re-run that tag&amp;rsquo;s workflow run. You don&amp;rsquo;t need a
new tag. If the earlier run stopped part-way, the re-run can report success while the app stays on
its previous revision, so check the live revision in Screenly afterward. If it didn&amp;rsquo;t move, push a
new tag with a change to the app&amp;rsquo;s files.&lt;/p&gt;</description></item><item><title>Edge Apps GitHub Actions 26.10.2: The initialize action won't create the same app twice, and other fixes</title><link>https://www.screenly.io/releases/edge-apps-actions/26.10.2/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/edge-apps-actions/26.10.2/fixes-and-improvements/</guid><pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate><category>roundup</category><description>&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If &lt;code&gt;package.json&lt;/code&gt; can&amp;rsquo;t be parsed, &lt;code&gt;initialize&lt;/code&gt; and &lt;code&gt;update&lt;/code&gt; stop with an error instead of
deploying the repo root.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;initialize&lt;/code&gt; stops if an Edge App with the same name already exists in that environment, so
running it twice can&amp;rsquo;t create 2 apps. If it can&amp;rsquo;t get the list of Edge Apps to check, it stops
without creating anything.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>