<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Screenly CLI release notes | Screenly</title><description>The command line interface. What has shipped, newest first.</description><link>https://www.screenly.io/releases/cli/</link><language>en</language><atom:link href="https://www.screenly.io/releases/cli/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Thu, 03 Sep 2026 00:00:00 +0000</lastBuildDate><item><title>Screenly CLI 26.9.0: Your CI decides which Edge App a deploy goes to, not screenly.yml</title><link>https://www.screenly.io/releases/cli/26.9.0/edge-app-id-from-the-environment/</link><guid isPermaLink="true">https://www.screenly.io/releases/cli/26.9.0/edge-app-id-from-the-environment/</guid><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><category>improvement</category><category>developers</category><description>&lt;p&gt;Every Edge App in your Screenly account has an ID, and it&amp;rsquo;s how the CLI knows which app to publish
to when you run &lt;code&gt;screenly edge-app deploy&lt;/code&gt;. Until now that ID lived in the &lt;code&gt;id&lt;/code&gt; field of
&lt;code&gt;screenly.yml&lt;/code&gt;, next to your code. The CLI now looks for it in the &lt;code&gt;EDGE_APP_ID&lt;/code&gt; environment
variable first, so whatever runs the deploy decides where it goes: a secret in your GitHub Actions
workflow, or a variable in your own shell.&lt;/p&gt;
&lt;p&gt;That matters as soon as more than one person or more than one account deploys the same code. An ID
in &lt;code&gt;screenly.yml&lt;/code&gt; belongs to one account but gets committed to a repository other people clone, so
teams end up deploying over each other&amp;rsquo;s app or editing the file back and forth. With the ID in the
environment, the manifest is the same for everybody, and the
&lt;a href="https://www.screenly.io/releases/edge-apps-actions/26.9.0/edge-app-id-input/"&gt;GitHub Actions take it as an input&lt;/a&gt; for the
same reason.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;id&lt;/code&gt; field in &lt;code&gt;screenly.yml&lt;/code&gt; still works when &lt;code&gt;EDGE_APP_ID&lt;/code&gt; isn&amp;rsquo;t set, but the CLI prints a
deprecation warning each time it falls back to it, and it will go away.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;screenly edge-app create&lt;/code&gt; respects the variable too, including &lt;code&gt;--in-place&lt;/code&gt;. With &lt;code&gt;EDGE_APP_ID&lt;/code&gt;
set, create checks that the app exists and targets it rather than making a new one, and writes
nothing into &lt;code&gt;screenly.yml&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you script &lt;code&gt;create&lt;/code&gt; with a name:&lt;/strong&gt; the name no longer decides which app you get while
&lt;code&gt;EDGE_APP_ID&lt;/code&gt; is set. The deploy that follows republishes over the app the variable names, so a
new name gives you a new revision of the existing app rather than a new app. Unset the variable
where you actually want a new one.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Screenly CLI 26.8.0: Edge App settings appear in the order you declared them</title><link>https://www.screenly.io/releases/cli/26.8.0/edge-app-settings-order/</link><guid isPermaLink="true">https://www.screenly.io/releases/cli/26.8.0/edge-app-settings-order/</guid><pubDate>Fri, 28 Aug 2026 00:00:00 +0000</pubDate><category>improvement</category><category>developers</category><description>&lt;p&gt;The settings you write in &lt;code&gt;screenly.yml&lt;/code&gt; now appear to whoever installs your app in the order you
wrote them. &lt;code&gt;screenly edge-app deploy&lt;/code&gt; works out each setting&amp;rsquo;s position from where it sits in the
manifest and sends that along.&lt;/p&gt;
&lt;p&gt;This matters because a settings form is a form. An address above a postcode, a start time above an
end time, credentials grouped together: you already put them in a sensible order when you wrote
them, and until now that order was not carried anywhere.&lt;/p&gt;
&lt;p&gt;Set &lt;code&gt;display_order&lt;/code&gt; on a setting to override the position it would get. An order you write by hand
is never overwritten, and &lt;code&gt;deploy&lt;/code&gt; sends the computed order without rewriting your manifest, so
nothing appears in your working tree after a deploy.&lt;/p&gt;
&lt;p&gt;Secrets are left out of the automatic ordering unless you give them a descriptor of their own,
which keeps the password field behaving the way it does today.&lt;/p&gt;</description></item><item><title>Screenly CLI 26.8.0: The CLI version numbers moved to CalVer</title><link>https://www.screenly.io/releases/cli/26.8.0/calver-version-numbers/</link><guid isPermaLink="true">https://www.screenly.io/releases/cli/26.8.0/calver-version-numbers/</guid><pubDate>Fri, 28 Aug 2026 00:00:00 +0000</pubDate><category>improvement</category><category>developers</category><description>&lt;p&gt;CLI releases are numbered by year and month now, so this one is 26.8.0 rather than the 1.2.3 it
would otherwise have been. That is the same scheme Screenly and ScreenlyOS use, which makes it
possible to tell at a glance whether the CLI you are running is from the same era as the platform
it is talking to.&lt;/p&gt;
&lt;p&gt;Nothing about the CLI&amp;rsquo;s behavior changes with the numbering, and a version you have already pinned
keeps resolving to exactly what it did before.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you pin a version in CI:&lt;/strong&gt; a range like &lt;code&gt;1.x&lt;/code&gt; or &lt;code&gt;^1.2&lt;/code&gt; will never match a release again.
Point it at &lt;code&gt;26.8.0&lt;/code&gt; or later, or at the latest release, depending on how tightly you want to
pin. The GitHub Action&amp;rsquo;s default was updated at the same time.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Screenly CLI 1.2.2: Claude can publish an HTML page to your screens</title><link>https://www.screenly.io/releases/cli/1.2.2/publish-an-artifact-as-an-edge-app/</link><guid isPermaLink="true">https://www.screenly.io/releases/cli/1.2.2/publish-an-artifact-as-an-edge-app/</guid><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><category>release</category><category>developers</category><description>&lt;p&gt;Ask Claude for a page and you can now put it on a screen without leaving the conversation. The
CLI&amp;rsquo;s MCP server takes the HTML, wraps it as an Edge App, publishes it and installs an instance, so
what comes back is a thing on your screens rather than a file you then have to do something with.&lt;/p&gt;
&lt;p&gt;Asking again updates the same app. The CLI remembers which app it published under which name, so a
revised page becomes a new revision rather than a second app cluttering up your list. That memory
is kept per API host and token, so a work account and a test account do not see each other&amp;rsquo;s apps.&lt;/p&gt;
&lt;h2 id="installing-it-in-claude-desktop"&gt;Installing it in Claude Desktop&lt;/h2&gt;
&lt;p&gt;Claude Desktop takes the CLI as a Desktop Extension, which is a download and a dialog rather than
hand-edited JSON:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;code&gt;screenly-cli-&amp;lt;your-platform&amp;gt;.mcpb&lt;/code&gt; from the latest release&lt;/li&gt;
&lt;li&gt;Open the file, and Claude Desktop shows an installation dialog&lt;/li&gt;
&lt;li&gt;Your API token goes into your operating system&amp;rsquo;s keychain, not into a config file in plain text&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The pages Claude builds are wrapped for the player as they are published, so a page that was
written for a browser tab behaves on a screen: it signals when it is ready to be shown, and it
picks up the theme it is given.&lt;/p&gt;</description></item><item><title>Screenly CLI 1.2.1: The Edge Apps guide covers integrations, and other improvements</title><link>https://www.screenly.io/releases/cli/1.2.1/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/cli/1.2.1/fixes-and-improvements/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate><category>roundup</category><description>&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://github.com/Screenly/cli/blob/master/docs/EdgeApps.md#integrations" target="_blank" rel="noopener noreferrer nofollow"&gt;Edge Apps guide&lt;/a&gt;
now covers integrations. When someone connects a service such as a calendar or a Grafana
dashboard in Screenly, your Edge App gets ready-to-use credentials for it with
&lt;code&gt;getCredentials()&lt;/code&gt;, and Screenly keeps them fresh. The services themselves are listed in
&lt;a href="https://www.screenly.io/docs/integrations/for-apps/data-integrations/"&gt;data integrations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Security and maintenance updates to the CLI&amp;rsquo;s dependencies, including the library behind its MCP
server.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Screenly CLI 1.2.0: One output flag for every command, with CSV alongside JSON</title><link>https://www.screenly.io/releases/cli/1.2.0/output-formats/</link><guid isPermaLink="true">https://www.screenly.io/releases/cli/1.2.0/output-formats/</guid><pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate><category>release</category><category>developers</category><description>&lt;p&gt;Every list and get command takes the same output flag now:&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;screenly --output json asset list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;screenly --output csv screen list &amp;gt; screens.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;screenly screen list &lt;span style="color:#999;font-style:italic"&gt;# table, as before&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--output&lt;/code&gt; (or &lt;code&gt;-o&lt;/code&gt;) sits on the root command, so it works the same way everywhere rather than
being a flag each subcommand had to declare for itself. That is what makes CSV possible without
adding it fourteen more times.&lt;/p&gt;
&lt;p&gt;CSV is the addition worth knowing about. A screen inventory that goes to somebody in facilities, or
a monthly export into a spreadsheet, no longer needs a JSON parser in the middle of it.&lt;/p&gt;
&lt;p&gt;The old &lt;code&gt;--json&lt;/code&gt; flag still works and prints a deprecation warning. It goes to standard error, so a
script redirecting output to a file gets clean data in the file and the warning on the terminal.&lt;/p&gt;</description></item></channel></rss>