Skip to content

chore(deps): upgrade LiveView to 1.2, gettext to 1.0, LiveDashboard and dns_cluster - #84

Merged
darwin67 merged 6 commits into
chore/dependency-upgradesfrom
chore/elixir-major-upgrades
Oct 11, 2026
Merged

darwin67 merged 6 commits into
chore/dependency-upgradesfrom
chore/elixir-major-upgrades

Conversation

@darwin67

Copy link
Copy Markdown
Member

This is stacked on #82. It covers the Elixir upgrades that need a mix.exs constraint change.

Commit Change Notes
dns_cluster 0.2 → 0.3.1 Adds SRV queries and fixes {basename, query} lookups. Textbin passes a plain query or :ignore.
gettext 0.26 → 1.0 No breaking changes. The app already uses the Gettext.Backend style.
phoenix_live_view 1.1.33 → 1.2.12 Security: 1.2.7 fixes CVE-2026-58228 (GHSA-5cgh-g58j-m9cq), a scheme validation bypass in Phoenix.LiveView.Utils. The 1.1 changelog lists no backport. 1.1.33 already had the CVE-2026-64941 redirect fix.
style: HEEx reformat The 1.2 HTML formatter keeps an empty element's closing tag inline. Two templates change, so mix format --check-formatted stays green.
phoenix_live_dashboard 0.8.7 → 0.9.1 Dev-only, mounted at /dev/dashboard.
build: lumis ~> 0.3 → ~> 0.7.0 Holds lumis back. See below.

lumis is held at 0.7, not upgraded

From 0.9, lumis no longer bundles parsers. Each language is a separate lumis_wasm_* Hex package that wasmtime compiles at runtime. A language without its package renders as plain text and only logs a warning. I tried 0.10.3: every sample (Elixir, JS, Python, Rust, JSON, SQL, YAML) came back uncoloured, with no error. Lines also become <span> instead of <div>, and the line-number CSS and two tests depend on the <div>.

The old ~> 0.3 would have let mix deps.update --all make that jump silently, so this PR tightens it to ~> 0.7.0. Doing the upgrade properly means choosing:

  • which parser packages to ship (the Syntax field is free text, and 0.7 bundles ~110 languages);
  • a writable LUMIS_DATA_DIR for the compiled-module cache in the read-only container;
  • which parsers to warm at boot.

That belongs in its own PR.

Verification

  • mix precommit passes (582 tests). The suite also passes with S3 storage against SeaweedFS.
  • mix deps.unlock --check-unused is clean, and mix deps.get reports no packages with advisories.
  • LiveView 1.2's JS client in Chromium against the dev server, with no console or page errors:
    • log in;
    • create a paste through the phx-change/phx-submit form, with push_navigate to its page;
    • navigate live back to the list, then search;
    • delete, then restore from the Deleted tab;
    • load the settings and orgs pages;
    • drop and reconnect the socket.
  • LiveDashboard's home, OS data, metrics, processes and Ecto stats pages load and connect with no client errors.
  • The suite raises no new LiveView test warnings, including 1.2's new missing-form-id check. Every form has an id.

🤖 Generated with Claude Code

https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6


Generated by Claude Code

dns_cluster discovers the other nodes of a clustered deployment from
DNS_CLUSTER_QUERY. 0.3 adds SRV queries, and 0.3.1 fixes the hostname
lookup for {basename, query} tuples. Textbin passes a plain query
string, or :ignore when the variable is unset, and both behave as
before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6
gettext 1.0 has no breaking changes from 0.26. Textbin already uses
the Gettext.Backend and `use Gettext, backend:` style that 0.26
introduced. 1.0 adds compile-time sigil concatenation,
Gettext.put_locale!/2 and a longer extraction timeout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6
1.2.7 fixes CVE-2026-58228 (GHSA-5cgh-g58j-m9cq), a scheme validation
bypass in Phoenix.LiveView.Utils. The 1.1 line lists no backport of it.
1.1.33 already had the open-redirect fix for CVE-2026-64941.

1.2 also adds colocated CSS, JSON-encodable JS commands, per-module
opt-outs for debug annotations, and configurable test DOM checks. A
form with phx-change but no id now emits a warning by default. The
suite emits none of these warnings, because every Textbin form already
has an id.

The JS client is bundled from deps, so it changes too. I checked it in
Chromium against the dev server: log in, create a paste through the
phx-change/phx-submit form with push_navigate to its page, navigate
live back to the list, search, delete, restore from the Deleted tab,
and drop and reconnect the socket. None of it raised a console or page
error.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6
The 1.2 HTML formatter keeps an empty element's closing tag on the
same line as its opening tag, even when the opening tag wraps the line
limit. The format check uses the formatter from deps, so these two
templates have to change with the upgrade. The rendered markup is the
same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6
LiveDashboard is mounted only in development, at /dev/dashboard. 0.9
requires LiveView 1.0+ and Elixir 1.15+, both met. It adds a nested
supervision-tree view and process labels, and 0.9.1 skips Ecto repos
it cannot resolve to an extras module. The home, OS data, metrics,
processes and Ecto stats pages all load and connect in Chromium with no
client errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6
`{:lumis, "~> 0.3"}` allows 0.10, so `mix deps.update --all` would
quietly install it. From 0.9, language parsers no longer ship with
lumis. Each one is a separate lumis_wasm_* package that wasmtime
compiles at runtime, and a language without its package renders as
plain text with only a logged warning. Pastes would lose their colours
with no error to catch it. 0.10 also renders lines as <span> instead of
<div>, which the line-number CSS depends on.

Upgrading is a deployment decision: which parser packages to ship,
where the compiled-module cache lives in a read-only container, and
which parsers to warm at boot. This constraint keeps it from happening
by accident.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6
@github-actions github-actions Bot added the chore label Oct 11, 2026
darwin67 added a commit that referenced this pull request Oct 11, 2026
This brings the asset toolchain up to date. It is independent of #82,
#83 and #84. The Hex `esbuild` and `tailwind` packages were already
current; the binary versions in `config/config.exs` and the vendored JS
were behind.

| Commit | Change | Effect |
|---|---|---|
| topbar | 3.0.0 → 3.0.1 (vendored) | The canvas gets
`role="presentation"` and is hidden with the `hidden` attribute. Checked
in Chromium: shown during `phx:page-loading`, hidden afterwards. |
| esbuild | 0.25.4 → 0.28.2 | The breaking releases don't touch this
build. The binaries now need Linux 3.2+ and macOS 12+. The bundle
differs only in esbuild's CommonJS wrapper. |
| Tailwind | 4.1.7 → 4.3.3 | Additive utilities, plus a deprecation of
`start-*`/`end-*`, which aren't used. CSS is 3.5 KB smaller. This
matches what Phoenix 1.8.15 generates. |
| daisyUI | 5.0.35 → 5.7.47 (vendored) | No breaking changes flagged.
CSS grows by 51 KB raw, **3.7 KB gzipped**, from extra `@supports`
fallbacks and state rules. |

### Visual check
I screenshotted nine pages in light and dark, at 1280 and 390 px, before
and after each CSS change, and diffed the pixels. The pages were login,
pastes, new paste, paste detail with highlighting, deleted, workspace
settings, search, user settings and orgs. Two runs with no change
differed by at most 6 pixels.

- **Tailwind:** no real change. The largest difference was 11 pixels of
anti-aliasing on a button edge.
- **daisyUI** made two small visible changes:
- `badge-sm` pills (audience, syntax, expiry) are a few pixels wider, so
they sit about 5 px further left on the list and detail pages;
  - `select` fields have about 4 px less left padding before their text.

  Nothing else moves.

None of the 36 screenshots logged a console or page error. The LiveView
flows (create, live navigation, search, delete, restore, socket
reconnect) pass on the new bundle. `mix test` passes (582 tests).

`assets/vendor/daisyui-theme.js` is not referenced by `app.css`, so it
is left as it is.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6

---
_Generated by [Claude
Code](https://claude.ai/code/session_019fnjMN7WpEjQJD2zveakV6)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
@darwin67
darwin67 added this pull request to stack #86 October 11, 2026 22:45
@darwin67
darwin67 marked this pull request as ready for review October 11, 2026 22:46
@darwin67
darwin67 merged commit a87b125 into main Oct 11, 2026
17 checks passed
@darwin67
darwin67 deleted the chore/elixir-major-upgrades branch October 11, 2026 22:46
@chaba2-bot chaba2-bot Bot mentioned this pull request Oct 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants