diff --git a/AGENTS.md b/AGENTS.md
index ba66e20..3656c01 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -74,6 +74,16 @@ uv run quarto render
- **Testing:** add or update tests for non-trivial logic.
- **Paradigm:** prefer functional programming patterns over object-oriented programming.
+### Dashboard changes
+
+- When editing files under `dashboards/`, check whether the change affects published dashboard data,
+ interpretation, navigation, metadata, or presentation.
+- Record relevant dashboard changes in `dashboards/_data/hei-changelog.json`, including the commit
+ SHA once available; keep `tests/test_common.py::test_latest_hei_changelog_date` aligned when the
+ latest changelog date changes.
+- Purely internal refactors that do not affect rendered dashboards or published data may be omitted,
+ but note that decision in the PR or final summary.
+
Common commands:
```bash
diff --git a/dashboards/_common.py b/dashboards/_common.py
index 83b1763..a9fab1e 100644
--- a/dashboards/_common.py
+++ b/dashboards/_common.py
@@ -24,7 +24,7 @@
"Univ. Inst.": "University institutes",
"UAS": "Universities of applied sciences (UAS)",
"UAS Inst.": "UAS institutes",
- "UTE": "Teacher education institutions",
+ "UTE": "Universities of Teacher Education (UTE)",
}
INSTITUTION_TYPE_ROWS: list[tuple[str, str]] = [
@@ -32,7 +32,7 @@
("Univ. Inst.", "University institutes"),
("UAS", "Universities of applied sciences"),
("UAS Inst.", "UAS institutes"),
- ("UTE", "Teacher education institutions"),
+ ("UTE", "Universities of Teacher Education"),
]
# -- Formatting helpers --------------------------------------------------------
@@ -129,10 +129,7 @@ def make_link(url: str, label: str) -> str:
def institution_type_table_html() -> str:
"""Return the shared institution type reference table as HTML."""
rows = "".join(
- (
- f"
| {abbreviation} | "
- f"{description} |
"
- )
+ (f"| {abbreviation} | {description} |
")
for abbreviation, description in INSTITUTION_TYPE_ROWS
)
return (
@@ -229,7 +226,10 @@ def ensure_csv_xlsx_export(
source_path = Path(csv_path)
output_path = Path(xlsx_path)
- if output_path.exists() and output_path.stat().st_mtime >= source_path.stat().st_mtime:
+ if (
+ output_path.exists()
+ and output_path.stat().st_mtime >= source_path.stat().st_mtime
+ ):
return output_path
dataframe = pd.read_csv(source_path, dtype=str).fillna("")
diff --git a/dashboards/_data/hei-changelog.json b/dashboards/_data/hei-changelog.json
index 8694783..2bcf607 100644
--- a/dashboards/_data/hei-changelog.json
+++ b/dashboards/_data/hei-changelog.json
@@ -205,5 +205,70 @@
"message": "fix: fix #17 and #15"
}
]
+ },
+ {
+ "date": "2026-05-04",
+ "scope": "Dashboards",
+ "title": "Shared dashboard helpers, site usage dashboard, and FHNW name correction",
+ "summary": "Dashboard maintenance centralised repeated markup, added the Matomo-backed site usage dashboard, and corrected the English and German FHNW display names in the shared HEI data.",
+ "row_count_before": 55,
+ "row_count_after": 55,
+ "changes": [
+ "Updated `FHNW` from `University of Applied Sciences Northwestern Switzerland` to `University of Applied Sciences and Arts Northwestern Switzerland` and changed `name_de` to `Fachhochschule Nordwestschweiz FHNW`.",
+ "Added the site usage dashboard and checked-in Matomo usage snapshot used for historic usage reporting.",
+ "Extracted shared dashboard table, download, and institution-type markup helpers used by the NAIF, Swiss HEI Open Data, and TOBI dashboards."
+ ],
+ "corrections": [
+ "The HEI row count stayed unchanged; only one institution display name and shared dashboard presentation code changed."
+ ],
+ "commits": [
+ {
+ "sha": "4fbcf38af71ecb28118c4fe852fe6632278058c1",
+ "message": "Declutter, ORD & Matomo Stats (#21)"
+ }
+ ]
+ },
+ {
+ "date": "2026-05-19",
+ "scope": "Dashboards",
+ "title": "Dashboard index order and descriptions curated",
+ "summary": "The dashboards landing page was changed from date-based discovery to an explicit curated order, and dashboard listing descriptions were refreshed.",
+ "row_count_before": 55,
+ "row_count_after": 55,
+ "changes": [
+ "Set explicit dashboard listing order: Swiss HEI Open Data, DORA and CoARA, TOBI, and Site usage.",
+ "Refined dashboard descriptions for the index, NAIF, Swiss HEI Open Data, TOBI, and Site usage pages.",
+ "Added `listing-order` metadata to the individual dashboard pages."
+ ],
+ "corrections": [
+ "This was a dashboard navigation and metadata change only; the shared HEI data rows stayed unchanged."
+ ],
+ "commits": [
+ {
+ "sha": "3c47a00cf348e5261664ed874e27b01ae3d90c2c",
+ "message": "Dashboard index order (#27)"
+ }
+ ]
+ },
+ {
+ "date": "2026-05-20",
+ "scope": "HEI + NAIF",
+ "title": "Teacher education type label aligned with official terminology",
+ "summary": "The dashboard display labels for the `UTE` institution type were updated to use the official Swiss higher education category name.",
+ "row_count_before": 55,
+ "row_count_after": 55,
+ "changes": [
+ "Changed the displayed `UTE` institution type label from teacher education institutions to `Universities of Teacher Education`.",
+ "Kept the underlying `UTE` code and the published HEI rows unchanged."
+ ],
+ "corrections": [
+ "This is a terminology correction only; it does not change institution coverage, identifiers, or status flags."
+ ],
+ "commits": [
+ {
+ "sha": "54757b73cd52daea8be27164a6d752c9c0e81d3c",
+ "message": "fix: align teacher education terminology"
+ }
+ ]
}
]
diff --git a/dashboards/tobi/index.qmd b/dashboards/tobi/index.qmd
index 4785c33..9a99a6b 100644
--- a/dashboards/tobi/index.qmd
+++ b/dashboards/tobi/index.qmd
@@ -91,7 +91,7 @@ TOBI_SOURCES = [
RETRIEVAL_COLUMNS = [retrieval_column for _, _, _, retrieval_column, _ in TOBI_SOURCES]
-TYPE_LABELS = {**_BASE_TYPE_LABELS, "UTE": "Teacher education institutions (UTE)"}
+TYPE_LABELS = {**_BASE_TYPE_LABELS, "UTE": "Universities of Teacher Education (UTE)"}
def pct_float(value: int, denominator: int) -> float:
diff --git a/posts/2026-02-27-naif-at-research-on-research/index.qmd b/posts/2026-02-27-naif-at-research-on-research/index.qmd
index 67dc82c..0f99306 100644
--- a/posts/2026-02-27-naif-at-research-on-research/index.qmd
+++ b/posts/2026-02-27-naif-at-research-on-research/index.qmd
@@ -134,7 +134,7 @@ legend_html = make_legend_html(
[
("Universities", "#F97B22"),
("Universities of Applied Sciences", "#FEE8B0"),
- ("Teacher Education", "#9CA777"),
+ ("Universities of Teacher Education", "#9CA777"),
("University Institutes", "#7C9070"),
]
)
@@ -192,7 +192,7 @@ legend_html = make_legend_html(
[
("Universities", "#F97B22"),
("Universities of Applied Sciences", "#FEE8B0"),
- ("Teacher Education", "#9CA777"),
+ ("Universities of Teacher Education", "#9CA777"),
],
note="* CoARA Member",
)
diff --git a/tests/test_common.py b/tests/test_common.py
index 9b434ec..0cc083b 100644
--- a/tests/test_common.py
+++ b/tests/test_common.py
@@ -190,7 +190,7 @@ def test_load_hei_changelog_not_empty() -> None:
def test_latest_hei_changelog_date() -> None:
- assert latest_hei_changelog_date() == "22 April 2026"
+ assert latest_hei_changelog_date() == "20 May 2026"
# ---------------------------------------------------------------------------
@@ -227,7 +227,9 @@ def test_ensure_csv_xlsx_export_refreshes_stale_workbook(tmp_path: Path) -> None
csv_path = tmp_path / "source.csv"
xlsx_path = tmp_path / "source.xlsx"
pd.DataFrame({"name": ["Original"]}).to_csv(csv_path, index=False)
- write_dataframe_xlsx(pd.DataFrame({"name": ["Stale"]}), xlsx_path, sheet_name="Sheet")
+ write_dataframe_xlsx(
+ pd.DataFrame({"name": ["Stale"]}), xlsx_path, sheet_name="Sheet"
+ )
pd.DataFrame({"name": ["Fresh"]}).to_csv(csv_path, index=False)
stale_time = csv_path.stat().st_mtime - 10