diff --git a/README.md b/README.md
index b04a5d48..f2eece92 100644
--- a/README.md
+++ b/README.md
@@ -132,11 +132,7 @@ For general Canton and Daml questions, use the
### Standalone installs
-Release asset downloads only (Homebrew formula tarballs and direct GitHub
-Release downloads). DPM installs via `dpm install` are counted separately
-below. Charts refresh daily via
-[`release-stats.yml`](.github/workflows/release-stats.yml). Exact numbers:
-[release-downloads.md](https://github.com/bitdynamics-ab/canton-devkit/blob/release-stats-data/docs/assets/release-downloads.md).
+Homebrew install, installer script, and GitHub Release direct download:

@@ -144,10 +140,7 @@ below. Charts refresh daily via
### DPM package downloads
-GHCR package pulls for `canton-devkit` (the `dpm install` path). Tracked
-separately from standalone release downloads. Charts refresh daily via
-[`package-stats.yml`](.github/workflows/package-stats.yml). Exact numbers:
-[package-downloads.md](https://github.com/bitdynamics-ab/canton-devkit/blob/release-stats-data/docs/assets/package-downloads.md).
+The `dpm install` path:

diff --git a/scripts/package-stats.sh b/scripts/package-stats.sh
index 6e2b3073..05bf85c4 100755
--- a/scripts/package-stats.sh
+++ b/scripts/package-stats.sh
@@ -98,13 +98,15 @@ render_line_chart() {
local out="$1" title="$2" xlabel="$3" data="$4"
local W=760 H=380
- local ml=56 mr=180 mt=48 mb=64
+ # Narrow right margin: single-series chart has no legend.
+ local ml=56 mr=24 mt=48 mb=64
local pw ph
pw=$(( W - ml - mr ))
ph=$(( H - mt - mb ))
- local n maxv step
+ local n maxv step nseries
n="$(printf '%s' "${data}" | jq '.labels | length')"
+ nseries="$(printf '%s' "${data}" | jq '.series | length')"
maxv="$(printf '%s' "${data}" | jq '[.series[].values[]] | max // 0')"
maxv="$(nice_max "${maxv}")"
step=$(awk -v n="$n" 'BEGIN{ if (n <= 12) print 1; else print int((n + 11) / 12) }')
@@ -146,8 +148,8 @@ render_line_chart() {
printf '%s\n' \
$(( ml + pw/2 )) $(( H - 12 )) "$(svg_escape "${xlabel}")"
- local si=0 sname scolor
- while IFS= read -r sname; do
+ local si=0 scolor
+ while [ "$si" -lt "$nseries" ]; do
scolor="$(printf '%s' "${data}" | jq -r --argjson i "$si" '.series[$i].color')"
local pts=""
local vi=0 v px py
@@ -167,14 +169,8 @@ render_line_chart() {
printf '\n' "${p%,*}" "${p#*,}" "${scolor}"
done
- local ly=$(( mt + si*22 ))
- printf '\n' \
- $(( ml + pw + 16 )) "$ly" "${scolor}"
- printf '%s\n' \
- $(( ml + pw + 36 )) $(( ly + 12 )) "$(svg_escape "${sname}")"
-
si=$(( si + 1 ))
- done < <(printf '%s' "${data}" | jq -r '.series[].name')
+ done
printf '\n'
} > "${out}"
diff --git a/scripts/package-stats_test.sh b/scripts/package-stats_test.sh
index bdbf1a8a..c0c9491b 100755
--- a/scripts/package-stats_test.sh
+++ b/scripts/package-stats_test.sh
@@ -91,6 +91,14 @@ assert_eq "first seeded row" \
assert_file_contains "md total" "${md}" "**Total downloads:** 100"
assert_file_contains "md day" "${md}" "| 2026-10-20 | 20 |"
assert_file_contains "svg title" "${svg}" "Daily DPM package downloads"
+if grep -Fq 'width="14" height="14"' "${svg}"; then
+ echo "FAIL: svg still contains a legend swatch" >&2
+ exit 1
+fi
+if grep -Fq '>Downloads' "${svg}"; then
+ echo "FAIL: svg still contains a Downloads legend label" >&2
+ exit 1
+fi
# Idempotent same-day re-run must not duplicate rows.
OUT_DIR="${out}" \