hrbrmstr 🇺🇦 🇬🇱 🇨🇦🇧🇪 4hrbrmstr@mastodon.social
Oct 25, 2026, 1:00 PMI was curious how many Electron apps I had (it turns out: way too many) and whether any auto-updated b/c the emSign/eMudhra thing is a real weakness, especially if you're using DNS not in your control.
All it did was rly make me hate this timeline even more.
Script here — https://ray.so/UWhETDA — and in alt txt with a warning for screen readers.
(I need to tweak the /git/* blocking config a bit hence no gist link for this for now)
![Below this is source code so screen readers should stop here.
```bash
#!/usr/bin/env bash
cache="${TMPDIR:-/tmp}/electron-node-versions.tsv"
[ -f "$cache" ] || : >"$cache"
# electron version to node version mapping with spiffy memoization to a $cache
node_version() {
local ev="${1%%+*}" node raw # strip build metadata (32.2.2+wcus)
node=$(awk -F'\t' -v v="$ev" '$1 == v { print $2; exit }' "$cache")
if [ -z "$node" ]; then
raw=$(npx --yes electron-info electron "$ev" -r 2>/dev/null)
if [[ $raw =~ node:\ \'([^\']+)\' ]]; then
node=${BASH_REMATCH[1]}
printf '%s\t%s\n' "$ev" "$node" >>"$cache"
fi
fi
printf '%s' "${node:-?}"
}
# true if a < b (dotted numeric, e.g. 22.21.1)
ver_lt() {
local IFS=. i
local -a a=($1) b=($2)
for i in 0 1 2; do
((${a[i]:-0} < ${b[i]:-0})) && return 0
((${a[i]:-0} > ${b[i]:-0})) && return 1
done
return 1
}
# Node's compiled-in CA bundle: eMudhra (emSign) intermediates distrusted in
# Node 22.23.4 / 24.22.1 / 26.12.1 (CVE-2026-114406, Oct 2026 ca-cert update)
ca_bundle() {
local v=$1 major floor
case $v in '' | '?')
printf '?'
return
;;
esac
major=${v%%.*}
case $major in
22) floor=22.23.4 ;;
24) floor=24.22.1 ;;
26) floor=26.12.1 ;;
*)
if ((major <= 21)); then printf 'EOL'; else printf '?'; fi
return
;;
esac
if ver_lt "$v" "$floor"; then printf 'STALE'; else printf 'ok'; fi
}
for a in /Applications/*.app; do
p="$a/Contents/Frameworks/Electron Framework.framework/Resources/Info.plist"
[ -f "$p" ] || p="$a/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/Info.plist"
[ -f "$p" ] || continue
ev=$(defaults read "$p" CFBundleVersion 2>/dev/null)
nv=$(node_version "$ev")
printf '%s\t%s\t%s\t%s\t%s\n' "$(basename "$a" .app)" \
"$(defaults read "$a/Contents/Info.plist" CFBundleShortVersionString 2>/dev/null)" \
"$ev" \
"$nv" \
"$(ca_bundle "$nv")"
done | sort -u
```](https://files.aleph.land/cache/media_attachments/files/117/501/681/246/807/147/small/bf2fb6a08ea73b63.png)
