CI Report:
https://ci-tests.linuxserver.io/linuxserver/sealskin/0.3.0-ls56/index.html
LinuxServer Changes:
Full Changelog: 0.1.39-ls55...0.3.0-ls56
Remote Changes:
SealSkin 0.3.0
The client is now served by your SealSkin server. The browser extension and
the mobile app are thin shells; the launcher, options, file manager, upload
page and collaboration room ship with the server image. A new container env
var, a launcher tweak or an options page change no longer needs a store
submission.
Highlights
- Served UI. The server hosts the web UI under
/ui/with content-hashed
assets, so browsers pick up changes without a forced reload. - Thin shells. The store packages contain only the connection page, a
frame host and the privileged pieces: context menus, download interception
and the E2EE session for the extension; native file open and Custom Tabs for
mobile. Your private key never leaves the shell. - Redesigned interface. Dark only. Deep slate surfaces, the violet end of
the logo gradient as the single accent, gradient primary buttons, drawn
checkboxes and tile-style status cards. The launcher draws a blurred backdrop
from the selected app's icon, cards rise in and tilt on hover, views flip in,
and modals blur the page behind them. All motion respects
prefers-reduced-motion. - Installed apps follow their store.
installed_apps.ymlstores a
reference to the store entry plus your overrides, so store updates apply on
restart and apps can be edited in place. Existing files migrate on first
start. - YAML files reload on edit. Hand edits to installed apps, stores,
templates, users and groups are picked up without a restart. Writes are
atomic. - Template settings are server data. The env var definitions for the
template editor live inserver/app/template_schema.yml. - One version.
VERSIONat the repo root drives the server, the served UI
manifest, both extension manifests, the mobile package and the Android
version code.
Server
- One launch spec builder is shared by launches and collaboration, and all
Docker access goes through the provider. - Sessions persist at launch; invalid YAML records are skipped instead of
clearing the list. PATCH /api/admin/apps/installed/{id}for partial updates.- Encrypted routes honour
X-Idempotency-Key, so a request retried after a
network blip runs once. - The status call reports the proxy certificate expiry and the dashboard warns
before it runs out. /internal/*is denied on the public Caddy listener; template and store
names are validated; uploads are scoped per user; share passwords use salted
scrypt.python-josereplaced byPyJWT, dependencies pinned, Pydantic v2 API.- Small pytest suite, ruff configuration, and a CI workflow that lints, tests
and builds the client.
Client
- Single esbuild pipeline in
client/producing the served UI, the extension
package and the mobile web dir. Font Awesome is vendored; no CDN. - Translations are one JSON file per language loaded on demand.
- The shell retries API calls that fail at the network level and reports
connection failures with the endpoint and likely cause instead of a bare
"Failed to fetch". - After login the connect page opens the options dashboard.
Upgrading
- Install the new extension and app builds once. After that, UI changes arrive
with server updates. - Mobile WebViews need a valid TLS certificate to load the served UI.