# dossiers-ngi — cascade landing + hourly branch-status SoT for the blank cascade landing on **dossiers.ngi.hacktivism.ch** (path roots only; no dossiers.2 / dossiers.3 ownership here). | Path | Role | |------|------| | `sites/dossiers.ngi.hacktivism.ch/` | Landing HTML (EN, ASCII ladder) | | `scripts/dossiers-ngi/branch-status-hourly.py` | Read tips from tdpd checkout → `branch-status.json` | | `configs/systemd/user/dossiers-ngi-branch-status.{timer,service}` | Hourly oneshot on koopa | ## Env | Var | Default | Meaning | |-----|---------|---------| | `TDPD_ROOT` | `$HOME/git/src/ngi/tech-dossier-project-data` | tech-dossier-project-data checkout for tip SHAs | | `OUT` | `sites/dossiers.ngi.hacktivism.ch/branch-status.json` under kal | write path for JSON (live www on koopa) | | `ADMIN_LOG` | (script derives from `__file__`) | koopa-admin-log root | On koopa the clone often lives at `%h/src/koopa/koopa-admin-log`; set `TDPD_ROOT` and `OUT` in `~/.config/dossiers-ngi/branch-status.env` when the tdpd path or live www path differs from the laptop defaults. ## Manual run ```bash python3 scripts/dossiers-ngi/branch-status-hourly.py # → sites/dossiers.ngi.hacktivism.ch/branch-status.json ``` ## Deploy landing (Freigabe) ```text hernani@koopa:/var/www/monitoring-sites/dossiers.ngi.hacktivism.ch/ ``` rsync from `sites/dossiers.ngi.hacktivism.ch/` — Freigabe this session required. Hourly JSON can sit next to the HTML once the timer is installed on koopa (Freigabe for host mutation). ## Ownership Hourly builder belongs in **kal** (this tree). Do **not** put `scripts/branch-status-hourly.py` back into tdpd. ## Sticky cascade bar Stock Caddy `templates` renders `{% include "_cascade/bar.html" . %}` on each HTML page. The include path has no leading slash. The dot passes the request, so `.Req.URL.Path` marks the active link with `class="is-active"` and `aria-current="page"`. Delimiters are `{%` `%}`, so a later `{{ }}` in real dossier HTML stays literal. The bar lists cascade `/` plus the five branch paths. Seeded tips match `branch-status.json`. `/_cascade/bar.js` refreshes `[data-tip]` from that JSON (`cache: no-store`). CSS is `/_cascade/bar.css` (`position: sticky`). Enable templates before rsync. A page without the include does not grow the bar. `{%` without the templates directive is shown as raw text. Templates apply is **host-local on koopa** (`~/bin/apply-dossiers-ngi-templates.sh`), not tracked in this repo. It edits `~/koopa-caddy/Caddyfile` only (this host; keeps `header Alt-Svc "clear"` and any `basic_auth`; leaves `.2` / `.3` untouched). Then reload with the usual home→`/etc` helper: ```bash bash ~/bin/apply-dossiers-ngi-templates.sh sudo ~/bin/caddy-apply ``` The stanza body for hand-check / re-seed lives in `scripts/dossiers-ngi/caddy-dossiers-ngi.snippet`. `scripts/caddy/caddy-apply.sh --snippet` leaves an existing block unchanged. Leave `scripts/caddy/apply-goa-wdGet-full-replace.sh` and `scripts/caddy/apply-dossiers-ngi-basicauth.sh` unused. No response-body replace plugin. After validate and reload succeed, rsync from the laptop (Freigabe): ```bash rsync -avz --delete --exclude .DS_Store \ "$HOME/git/admin-logs/local/koopa-admin-log/sites/dossiers.ngi.hacktivism.ch/" \ hernani@koopa:/var/www/monitoring-sites/dossiers.ngi.hacktivism.ch/ ``` `--delete` removes `_cascade/` on the server when the source tree is an older copy. The bar does not finish the dossier site. This section does not install the hourly timer.