Release 2026.10.1: dev auf main (0,4%-Artikel + Frist-Fixes) #20

Merged
Simon merged 126 commits from dev into main 2026-10-07 20:09:50 +02:00
Owner

Release 2026.10.1

Release 2026.10.1
Simon added 126 commits 2026-10-07 20:07:52 +02:00
fix: ASCII-Umlaute im sichtbaren Text korrigieren
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 2s
Deploy on release / deploy (release) Successful in 2s
cfe228fc95
ue/ae/oe -> Umlaute in 4 Dateien (51 Stellen): datenschutz.html,
registrierung.html, news.js, app.js. E-Mail-Adressen, externe URLs
und Filennamen (z. B. buergerinitiative-ejun.de, buergerservice,
stuempfig-gutachten-*.pdf) bewusst nicht angefasst.
feat: Issues #14 & #15 - News-Überholung mit 4 Unterseiten
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
301e1887c9
- 4 neue Unterseiten (article-Layout): UVP Hayforst, Abholzungen,
  Umzingelungsgutachten, Rainer-Umzingelung
- news.js/news.json: 8 aktuelle Einträge (2026-04-20 bis 2026-08-15),
  Brief an Landrat Beck mit Stellungnahme zusammengefasst
- Issue #15: ISO-Datum (JJJJ-MM-TT) + News-Label in der News-Sektion,
  Galerie-Bilder pro Eintrag mit Lightbox
- Lightbox: Event-Delegation + data-full-image (dynamische Bilder)
- CSS: .news-label, .news-gallery, .gallery-list, .article-image
  (beseitigt Horizontal-Overflow 393px)
- Quellen-PDFs + Bildmaterial (25 Abholzungs-Fotos + Karte, Rainer,
  Reduzierung I/II) in sources/ und assets/
feat: Umzingelungsgutachten-Seite vertiefen mit Bildern und Gutachten-Text
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
56f6ca00d2
- Factsheet 1 (Optik & Umfassungswirkung) aus der Stellungnahme vom
  27.04.2026 nahezu vollständig übernommen: Ausgangslage, 120-Grad-Regel
  mit Quellenzitaten (Stümpfig S.18/27), 2,5-km-Radius-Trick, 187,9°/122°/
  198°-Beweise der drei Projektierer, Messpunkt-Wahl, Grau-Weiß-Trick,
  Fazit + Forderung unabhängiges Obergutachten
- 5 Bilder aus dem Factsheet (Vorranggebiete, 2,5-km-Analyse, Messpunkt,
  Grau-Weiß-Vergleich) als komprimierte JPGs in assets/gutachten/
  + Thumbnails
- CSS: .article-figure, .article-figure-row (Zwei-Spalten-Vergleich,
  1 Spalte <640px), figcaption
- News-Eintrag 2026-08-15: Text vertieft + 3-Bild-Galerie (Lightbox)
fix: Dokumente und Links im selben Tab öffnen (Zurück-Button)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
70fa557aae
- app.js: News-Quelle-Links ohne target=_blank (PDFs bleiben im Tab,
  Browser-Zurück funktioniert)
- index.html: 4 PDFs + Dokumenten-Archiv + 4 externe Projekt-/Behördenseiten
- uvp-hayforst.html: UVP-Verbund + Landkreis-Links
- treffen-23-06-2024.html + archiviertes Original: Originalquellen-Link
- registrierung.html: WhatsApp-Info-Gruppe
- spenden.html: PayPal-Formular + Hinweistext angepasst
UVP-Hayforst: Stellungnahme-Nachricht korrigiert (Kritikpunkte dokumentiert, Einreichung folgt nach Faktenchecks)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
0d93e72c89
Dokumente & Quellen: um Highlight-Dokumente erweitern (Umzingelungsgutachten, UVP, Abholzungen, Rainer, neue PDFs)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
3293fb9784
News-Titel: 'Stellungnahme II zur Fortschreibung Windvorranggebiete'
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
c0c20867cd
News: Windparks mit Projekt-Farbe darstellen (WP1 gelb, WP2 blau, WP3 rot) — Farbcodierung in Titel UND Text
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 6s
f3b9764573
feat: Entlastungsseite + UI-Aufgaben aus abgebrochener Queue
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
ac735aa3db
- Neue Seite entlastung-franken-neuhofen.html: vier Reduzierungsvorschlaege
  (Intelligente Verteilung, Umfassungscut, Buergerekzeptanz, Radiuserweiterung)
  + V2 mit 250 ha + Stellungnahme II, mit Karten aus dem PDF
- umzingelungsgutachten.html: "Ausgangslage" entfernt, "Blick des Anwohners +
  Grau-Weiss-Trick" nach oben, Gra/Weiss-Bilder full-width untereinander
- Fliesstext: <p> in Artikel-Karten nehmen die volle Div-Breite ein
- Logo im Header auf allen Seiten linkt zur Startseite
- Action-Buttons: ab 1200px groessere, Titel ohne stehenden Flex-Slot
text: Farbwort-Zusaetze bei Windpark-Nennungen entfernt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 6s
24d4d1b30e
Die Farbcodierung (app.js faerbet Windpark 1/2/3 automatisch ein) reicht
aus: (rot), (blau), (gelb), (rot; ...) und die Legenden-Klammern
(Windpark 1 gelb, Windpark 2 blau, Windpark 3 rot) in news.js und auf der
Entlastungsseite entfernt.
Hauptbild: basis.jpg ersetzt Umzingelungsvisu; news.json mit news.js synchronisiert
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
3f57136997
- index.html: Hauptbild in voller Qualitaet (1279x1230, assets/reduzierung/basis.jpg)
  statt assets/visualisierung-umzingelung.jpg (706x676); Alt-Text auf
  Vorrangflaechen-Karte angepasst
- news.json aus news.js neu generiert (app.js fetcht news.json primaer):
  - basis.jpg aus den News (nur Grundlage, liegt jetzt als Hauptbild)
  - Farbwort-Zusaetze in 10 Eintraegen entfernt (24d4d1b hatte nur news.js getroffen)
  - veralteter '2026-07-26 Streichungsvorschlaege'-Eintrag durch aktuellen
    '2026-08-10' Entlastung-Eintrag ersetzt
- news.json und news.js jetzt 1:1 identisch (27 Eintraege)
News: Stellungnahme II + Reduzierungsvorschlaege II zu einem Eintrag zusammengefasst
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
53a4d5c844
news: UVP-Hayforst-Titel 'Auslegung läuft und erste Analyse' (news.js, news.json, index.html)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
efaf105b15
news: Umzingelungsgutachten-Headline nur noch Radius-Bild (2. u. 3. Thumbnail entfernt)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
d9960b40c4
Favicon: favicon.ico ergänzt (48/32/16), Link auf allen Seiten
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
Deploy on release / deploy (release) Successful in 8s
4992849e8e
Button-Label: Hinweis auf Seiten 13-18 der Stellungnahme ergänzt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
33329278d2
Dokument-Links in Artikeln als normale Hyperlinks statt Button-Style (wie Quellen-Liste Hauptseite)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
Deploy on release / deploy (release) Successful in 12s
c09129bab7
Dev-Deploy: Versionsstring = Release-Tag, wenn dev-HEAD getaggt ist (sonst dev-SHA)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
b1e41399ee
Crawler-Schutz: robots.txt mit Disallow /dev/ (2. Schicht)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 14s
56d45929ae
Komplementaer zur nginx-Schicht (Basic Auth + X-Robots-Tag + Rate-Limit).
Nach dem Deploy liegt die Datei an /robots.txt (Prod) und /dev/robots.txt
(Dev-Preview); nginx liefert /dev/robots.txt ohne Passwort aus, damit
hoeffliche Crawler sie sehen.
robots.txt: Umlaute in Kommentaren bereinigt (Kosmetik)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
abbf2afae0
Login: gestylte Zwei-Wechsel-Auth (statt Browser-Graubox)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 13s
2c8d869b97
Chromium macht Basic-Auth reaktiv: eine user:pass@-URL schickt im 1. Hop
noch keinen Authorization-Header - erst nach einer echten 401 retryt er.
Eine einzige URL kann das nicht (Erstbesuch und CRED-Retry kommen beide
ohne Auth an). Deshalb zwei Pfade:
  GATE   /dev/uvp-hayforst.html        -> 302 /dev/login.html (gestylt)
  REPORT /dev/uvp-hayforst-report.html -> echte 401 (CRED-Retry) / ?fail=1
login.html baut beim Absenden die CRED-URL auf /dev/uvp-hayforst-report.html.
OData V4 Backend (ejun-oapi): Auth-Engine für Dev-Preview
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 11s
70b7eb7025
- .NET 8 + Microsoft.AspNetCore.OData 8.2.2, SQLite (WAL)
- EntitySets Members/Contents, Actions verify/confirm/setStatus/resetPassword
- /authz: Nginx auth_request-Endpunkt (X-Authz-Path, Basic-Auth, 200/401/403)
- Seed: simon@berleb.net (Admin) + /dev/uvp-hayforst-report.html (Members)
- systemd-Unit ejun-oapi.service (350M Cap, /var/lib/ejun-auth/members.db)
- login.html: E-Mail statt Benutzername
- .gitignore: bin/obj; deploy-dev: backend/ aus rsync (läuft aus /opt/ejun-oapi)

Live auf ejun (10.20.10.10): Nginx auth_basic -> auth_request umgestellt.
Nginx-Config-Referenz + @report401 302-Fix + deploy-Excludes
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
b41ed88ec9
- deploy/ejun-page.nginx.conf: Referenz der Live-Config (auth_request)
- @report401: 'rewrite ... break' -> 'return 302' (fail=1 steht nun
  wirklich in der Browser-URL, Fehler-Box leuchtet, Credentials raus)
- deploy-dev.yml: backend/ + deploy/ aus dem Dev-rsync
- deploy.yml:   backend/ + deploy/ aus dem Prod-rsync

Browser-E2E (Chromium headless): 8/8 gruen.
Phase 5 Registrierung: ejun.register Action, öffentlicher /odata/-Pfad, Formular auf Mitmachen
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 11s
c4da4fc426
- Backend: neue unbound Action ejun.register (Email, FirstName, LastName,
  Gemeinde, Phone) -> Unverifiziert/Active + Temp-Passwort;
  exists bei Duplikat (kein PUT-Override), invalid-email bei Format-Fehler.
- Nginx: öffentlicher /odata/-Pfad auf Loopback-Backend (127.0.0.1:8081),
  eigene Rate-Limit-Zonen: ejunodata (2r/s, lesend) + ejunreg (5r/min, register).
- registrierung.html: echtes Formular (Vorname/Nachname/E-Mail/Gemeinde/Handy
  + Consent) mit Erfolgs-/Duplikat-/Fehler-Bannern; E-Mail + WhatsApp bleiben
  als Alternativen.
- datenschutz.html: Sektion 2 passt zum Formular (Speicherung + manuelle
  Bestätigung, E-Mail als Login-ID).

Live-Smoke (lokaler Kestrel, Test-DB): 8/8 grün (created, exists,
invalid-email, Seed-Admin bleibt Admin, confirm Unverifiziert->Mitglied,
verify wrong-pw).
Phase 5 (2): register HTTP-Semantik 409/400 + Nginx nur verify/register öffentlich
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 11s
9baa6b6e18
- register: 200 created / 409 exists / 400 invalid-email (REST-sauber)
- Nginx: exakte Matches /odata/register + /odata/verify; Rest (/odata/Members,
  confirm, setStatus, resetPassword) fällt auf 404 — kein Admin-Verbum nach außen
- Live-E2E 7/7 grün auf 10.20.10.10 (register/duplikat/invalid/verify/404x2/gate)
Phase 2: Admin-Panel /admin/ (Mitglieder + Seiten)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 12s
02b04343d8
Frontend (Vanilla-HTML/JS, EjUn-Design):
- admin/members.html: Statistik, Filter (Suche/Rolle/Status),
  anlegen (ejun.create, Rolle wählbar + TempPassword), bearbeiten
  (PUT Voll-Entity, Passwort bleibt), bestätigen (confirm),
  Passwort-Reset (resetPassword, Einmal-Passwort mit Copy-Button),
  Soft-Delete/Reaktivieren (setStatus), Hard-Delete (DELETE)
- admin/contents.html: Seiten-Flags Public/Members (Visibility),
  anlegen/bearbeiten/toggle/löschen
- admin/admin.js: gemeinsamer OData-Client (API-Basis aus URL abgeleitet:
  /dev/adminapi/ in Dev, /adminapi/ in Prod)
- login.html: ?fail=2 (angemeldet, aber kein Admin), Admin-Kontext
  (Titel/Kicker), ?next= blieb

Backend (OData-Vokabular, keine neuen Auth-Konzepte):
- ejun.create: wie register, aber Role wählbar + TempPassword zurück
  (200 created / 409 exists / 400 invalid-email)
- PUT Members: ConfirmedAt jetzt auch kopiert (Edit-Roundtrip)
- AuthzController: /admin/ (Prod) neben /dev/admin/ als Admin-Pfad —
  ohne wäre Prod-Admin per Content-Lookup öffentlich geworden

Nginx:
- Gate:  /dev/admin/  -> 302 /dev/login.html?next=/dev/admin/members.html
         /admin/      -> 302 /login.html?next=/admin/members.html
- Panel: /dev/admin/* + /admin/* -> auth_request (Admin + Active)
- API:   /dev/adminapi/ + /adminapi/ -> 127.0.0.1:8081/odata/
         (geschütztes OData; öffentlich bleiben NUR register+verify)
- 401-Zwei-Wechsel wie Report: ohne Header echte 401 (Browser retryt
  mit user:pass@), mit falschem Header -> login.html?fail=1&next=...,
  403 -> fail=2. Dev/Prod getrennt (unterschiedliches Login-File).
Phase 2 Fix: Admin-Panel Fetch-Credentials
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
e0b02f8178
- admin.js: absolute API-Base (location.origin) + expliziter Authorization-Header
  (sessionStorage, Fallback location.username) + HTML-Erkennung in parse()
- login.html: user:pass in sessionStorage beim Submit
- members.html + contents.html: r.html -> 'Session abgelaufen' + Redirect zur Login-Card
- e2e-admin-browser.mjs: 19-Check UI-E2E (Playwright)

Kern-Bug: relative fetch('/dev/adminapi/...') erbt die user:pass@-Creds aus
location.href -> Fetch-Spec wirft 'Request cannot be constructed from a URL
that includes credentials'. Absolute URL + Header fixen es.

E2E: 19/19 gruen (Chromium 1234, VM 10.20.10.10)
Phase 3: Scheme-aware Login + Gate-302
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
7f3eecf4a5
- login.html: CRED-URL-Bau backreference (https?:) statt harter http://
  -> kein HTTP-Downgrade mehr hinter OPNsense-TLS
- nginx: absolute_redirect off -> 302-Targets (Gate, fail=1/2, Admin)
  liefern relative Location, Browser loest gegen echte Client-Scheme auf
- (DB-Datafix /reports/ -> /dev/uvp-hayforst-report.html: Report-Gate
  war Rubber-Stamp, jetzt 401/401/200 wie designed)
Phase 5b: Registrierung UX — Button sichtbar, E-Mail zuerst + Fokus
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 13s
85fdbc78cf
- Button unsichtbar: --accent-2 war nie definiert -> background-Declaration
  invalid -> transparenter Button, weisser Text. :root-Fallback #1c7c43
  (identisch zu login.html/members.html/contents.html).
- E-Mail-Adresse ist jetzt das ERSTE Feld + autofocus beim Seitenladen.
- Zwei Alternativ-Buttons (E-Mail, WhatsApp-Gruppe) + .register-alt-CSS
  entfernt; nur noch das Formular mit einem klaren Senden-Button.
Phase 5b: Submit-Button-Icon groesse fix (1.15rem, flex 0 0 auto)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
fb067ff5d2
Das SVG im Submit-Button hatte kein width/height -> fiel auf die
Default-Box-Size (~150px) zurueck und streckte den Button auf. Jetzt
kompaktes Icon, Button-Box zurueck im normalen Button-Raster.
Phase 4: News-Details für Mitglieder (Umzingelung + Stellungnahme II)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
7cf8b83084
UVP-Pattern auf die beiden anderen News-Detailseiten übertragen:
- GATE /dev/umzingelungsgutachten.html + /dev/entlastung-franken-neuhofen.html
  -> 302 login.html?next=/dev/<name>-report.html
- REPORT <name>-report.html: auth_request + Alias auf die echte Datei,
  401 -> @report401 (Zwei-Wechsel), 2 neue Authz-Subrequests
- DB-Contents: +2 Zeilen Visibility=Mitglied (live)
News-Teaser auf der Startseite bleiben public. Prod folgt mit Release.
E2E: PASS per EJUN_PW-Umgebungsvariable (Seed-PW ist rotierbar)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
5c9c4e13e1
Startseite: 'Windparks' -> 'Windparks in unserem Fokus'
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
9de0709bf4
Footer: Slogan-Zeile 'Für transparente Information ...' entfernt (alle Seiten)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
5a7a1aab63
ui: einheitliches Button-System (48px / 1rem) über alle Seiten
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 14s
c9d59dc148
- styles.css: .cta-button auf 48px/1rem, neue .btn-primary (Gradient)
  + .btn-ghost (Creme/Linie), Header-CTA rechtsbündig + nowrap
  (fixt die 126x70px-Drift auf rainer-umzingelung)
- forms.css (neu): gemeinsame 48px-Basis für Login + Admin, ohne
  Side-Effekte der vollen styles.css
- login.html / registrierung.html: Inline-Button-CSS auf das 48px-
  Raster umgestellt
- Artikel-Füße: einheitliche Reihenfolge Inhaltslink -> primär -> ghost
- admin: .btn 48px/1rem, .act/.exit auf 32px-Chips, Modal-Buttons 48px

Gemessen (Playwright 1280x900 + 390x844): alle CTA-Buttons jetzt
167x48 r16px, Header-CTA einheitlich bei x=1033 statt 438-1074.
Mobile-Icon-Kreise 41x41 bleiben intakt.
auth: Cookie-Session (ejun_auth) statt native 401-Graubox
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
b5cc94cc95
Root Cause: Chromium/Safari senden bei user:pass@-URLs im 1. Hop
noch keinen Authorization-Header (reaktive Basic-Auth) -> 401 +
WWW-Authenticate -> native Browser-Graubox ueber dem Report.

Fix (04.09.2026):
- login.html setzt Cookie ejun_auth = base64(user:pass), 30 Tage,
  SameSite=Lax (exakt das Basic-Format)
- Nginx: map $auth_final = Header ODER Cookie (Header gewinnt);
  alle 5 auth_request-Subrequests bekommen $auth_final
- @report401/@admin401_dev/@admin401_prod: native Box nur noch
  ohne Cookie (Direkt-Bookmark ohne Login-Historie)
- admin.js: Cookie-Fallback fuer fetch() (neue Tabs, Private Mode)

Live-Test (10.20.10.10, 11/11 gruen): Report/Admin-DOK/AdminAPI mit
Cookie 200 ohne Box; falsches Cookie 302 fail=1; Header+Cookie:
Header gewinnt.
Protokoll: wer welchen Eintrag in welcher Session abgerufen hat
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
74bbe1a79b
- session-id.js: pro Browser-Tab/Session ein zufaelliges ejun_sid
  (sessionStorage + Session-Cookie), im Head gesetzt BEVOR die erste
  auth_request feuert.
- Nginx: alle 5 auth_request-Subrequests reichen X-Ejun-Sid
  ($cookie_ejun_sid) + X-Authz-Path ($uri bei Admin) an das OData-Backend.
- Backend ejun-oapi:
  - ActivityLog-Entity (User, SessionId, Entry, Timestamp) + DbSet
    + OData-Set 'ActivityLogs' (READ-ONLY, EnableQuery).
  - Schema-Patch fuer besth. DB (CREATE TABLE IF NOT EXISTS, idempotent).
  - AuthzController schreibt bei jeder Freigabe einen Protokoll-Eintrag
    (try/catch: DB-Fehler darf Gate nie blockieren). Admin-Pfade ->
    'admin' (Panel) / 'adminapi' (API), Assets bleiben raus.
- Admin-Portal: neuer Tab 'Protokoll' (members/contents/protokoll) mit
  Stats, Suche, Eintrag-/Zeitraum-Filter, letzten 200 Zeilen (de-DE Zeit).

Verifiziert: dotnet build + publish 0 Warnungen 0 Fehler.
news: Umzelungsgutachten & UVP-Auslegung kürzen, Einträge 1/2 getauscht, Datum korrigiert (15.08.→11.08.)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
9455f2fee1
news: Datum aus News entfernen; Eintrag 1 ohne zweites 'Windpark 3'; Eintrag 3 nur ein Vorschaubild
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
d5c741a6a9
news-label rendert statt hartem 'News'-Text das Datum
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
3d8492ac2f
news-label + news-date in alter Struktur wiederherstellen
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
f667dde485
news-title als Link zur Quelle; 'Quelle'-Zeile erspart
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
07c3dcec63
news-label entfernt: nur Datum direkt vor Titel
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
e856bed76b
neuigkeiten: erste drei Einträge gekürzt (kein Scrollbalken)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 20s
310c6c1cd3
timeline: max-height/overflow auto entfernt, layout align-items stretch
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
a3ae699e1e
neuigkeiten: Windpark-3-Rot kräftiger, News-Titel-Link blau statt orange-rot
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
3e9f078cde
Report-Seiten: <head> + styles.css-Link ergänzt (Fragment hatte kein Stylesheet -> kein Design)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
4c5f5bfebc
Report-Seiten: hero-full-Header + site-footer ergänzt (kein Extraseite-Look mehr)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
be27699989
Zensiermodus (Issue #16): Report öffentlich, Doku client-seitig verriegelt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
4390d14460
- Nginx: uvp-hayforst-report + umzingelungsgutachten-report ohne auth_request
  (Beschreibung + Quellen oben fuer ALLE sichtbar); entlastung-franken-
  neuhofen-report bleibt 401-geschuetzt (hat noch kein client-Gating).
- zensiermodus.js (neu): prueft das ejun_auth-Cookie gegen /odata/verify
  und blendt .report-document ein; CTA wird 'Abmelden' (loescht Cookie).
- Report-CTA: ?next= auf die eigene Report-URL (Bugfix: Login landete
  immer auf Hayforst).
- login.html: fuer oeffentliche Reports Redirect OHNE Credentials in der
  URL (Cookie-Session reicht); CRED-URL bleibt nur fuer Admin (auth_request).
- styles.css: .report-zensiert .report-document { display:none } (kein FOUC,
  head-Skript setzt die Klasse vor dem ersten Paint).
- Kleinigkeiten: Meta-Description Umzingelungs-Report, News-Link im
  selben Tab, Report-Wrapper-Section mit aria-label.
news: Reports öffentlich mit Zensiermodus — Login vor Teilzensur entfernt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
6901c15ea0
- news.js/index/abholzungen: Links zeigen jetzt auf -report.html
  (öffentlich, Zensiermodus) statt Entry-Seite mit Login-first
- entlastung-franken-neuhofen-report.html: neu (analog UVP/Umzingelung)
- Nginx: GATE 302 -> -report.html; entlastung-report ohne auth_request;
  tote Auth-Blöcke (@authz_news_umzingelung, @authz_news_entlastung,
  @report401) entfernt
- assets: 2 Bilder aus der Zoho-Page lokal vendorisiert
news: Zoho-Page 'Unterlagen & Neuigkeiten' in nativen EjUn-Artikel konvertiert
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
7837dc9645
- Rohes Zoho-HTML (36,5 kB, Zoho-Scripts/CSS) ersetzt durch native
  EjUn-Artikelstruktur (analog 2024-06-23_treffen)
- 13 PDFs verlinkt (alle lokal in sources/ejun/), BR24-Video, 2 Bilder
- Landtagsprotokoll-Notizen (23.10.2025) als saubere Liste aufbereitet
- Defekter Zoho-PDF-Link (Schreiben an Landrat Laumer zeigte auf
  Entlastungs-PDF) korrigiert: eigenes 2025-05-11-PDF verlinkt
- Originalquelle als CTA verlinkt
ci: Dev-Deploy spiegelt Nginx-Config aus dem Repo
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
10a9384061
- Neuer Step 'Nginx-Config spiegeln': SHA-256-Abgleich zwischen
  deploy/ejun-page.nginx.conf und der Live-Config auf der VM
- Bei Abweichung: Zeitstempel-Backup der Live-Config, dann scp
- Danach bleibt der bestehende nginx -t && reload-Step (faellt den
  Workflow bei kaputter Config)
- Behebt die Prozess-Luecke: Config-Changes im Repo wirken ab sofort
  automatisch beim Dev-Deploy
News- und Dokument-Links im selben Tab öffnen
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
078d787abd
Newseinträge (app.js) und alle verbleibenden target=_blank-Links
(Report-Quellenkarten, YouTube-Link im Sammelbeitrag, Admin-Contents)
öffnen jetzt den bestehenden Tab, damit der Back-Button funktioniert.
feat: Report-Meta-Box — eine Box für Artikel-Info, Teaser = News-Text, Skelett-Blur statt hartem Verdeck
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
5d51c08c1e
- 3 Report-Seiten: report-hero + desc-card + Zensierbox durch EINE section.report-meta-box ersetzt
  (Badge, Titel, Teaser, Quellen & Unterlagen, Zugriff-Block mit Anmelden/Registrieren)
- Teaser-Texte exakt an die News-Teaser in news.js angegleicht
- zensiermodus.js neu: .report-meta-lock steuert CTA-Block, Blur-Preview auf .report-document
  (Überschriften scharf, Fließtext/Bilder unscharf) statt display:none; FOUC-Klasse report-locked
- styles.css: neue .report-meta-* Styles, Blur-Regeln, alte hero/desc-card/zensiermodus-Styles entfernt
- registrierung.html: ?next=-Parameter — nach erfolgreicher Registrierung Weiterleitung zu login.html?next=...
Zensiermodus: Blur statt Abbruch — erste 5 Zeilen scharf, ab Zeile 6 geblurred
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 13s
2484ac4301
Simon: Meta-Box oben bleibt, darunter die eine Word-Dokument-Box mit dem
ganzen Inhalt; diese Box ist ab den ersten 1,75 (→ 5) Zeilen geblurred.
- CSS: display:none (n+5) -> filter: blur(6px) grayscale(0.3) ab Element 6
- Veil-Box wandert ans Blur-Ende (vor Element 6), Text 'Nur für Mitglieder'
- Nach Login: Blur + Veil verschwinden, Doku vollständig lesbar (unchanged)
Zensiermodus: oberer Login-Block entfernt — Anmeldung nur im Blur
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 12s
b5352a29d3
Simon: 'Der obere Login kann weg, es reicht unten beim Blur.'
- report-meta-lock-Block (Anmelden/Registrieren) aus allen 3 Report-HTMLs entfernt
- zensiermodus.js: Lock-Box-Handling und Abmelden-Button entfernt (Veil-Box im Blur bleibt einzige Anmeldung)
- styles.css: tote report-meta-lock-Regeln entfernt
- e2e-blur-check.mjs: Playwright-E2E für locked/Unlock-Verhalten
e2e-blur-check: Prüft zusätzlich, dass der obere Login-Block fehlt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
5b081ccb6a
e2e-blur-check: Veil-Box belegt Slot 6 — Blur-Start-Assertion korrigiert
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
b246c5f707
reports: doppelten Dokument-Anfang entfernt (Box 1 = Box 2)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 7s
dd81c07031
Die zweite Box begann mit dem gleichen Kicker + H2-Titel +
Teaser-Paragraph wie die Meta-Box oben. Das Dokument startet
jetzt direkt mit der Kopfzeile (Badge + Datum) und dem
eigentlichen Inhalt — ohne erneute Nennung der Box-1-Punkte.
Issue #16 Phase 2: serverseitiger Content-Gate + PDF-Mitglieder-Gate
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
9b81a16d54
- Nginx: Reports (uvp-hayforst, umzingelungsgutachten, entlastung-franken-
  neuhofen) via auth_request /authz_report gehardet. Anonym 401/403 ->
  statische -preview.html (keine Volltext-Leaks); mit Login -> Voll-Dokument.
- Nginx: PDF-Links ohne Login -> 302 zur Login-Seite (?next=<PDF>), nach
  Login öffnet sich die PDF direkt (statt 404). Simon-Entscheidung 09.09.
- Prod-Root-Entry-Seiten 302 -> gehardete Dev-Reports (stale Prod-Deploy
  enthielt Volltext + PDF-Links).
- Program.cs: idempotentes Content-Seed (3 Reports + 4 PDFs, alle Members),
  1:1 zu Live-VM.
- make_previews.py + CSS: statische Previews mit generischen Blur-
  Skeleton-Balken (keine echten Dokument-Phrasen).
- tools/apply_pdf_login_gate.py: reproduzierbarer Nginx-Patch (idempotent).
E2E-Test serverseitiger Content-Gate + PDF-Mitglieder-Gate (10/10 live 09.09.2026)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
c88933513d
Anonym: 3 Reports = statische Preview (5 scharf, Veil-Box 'Nur für
Mitglieder', Skeleton, 0 Volltext-Leaks, Login-Link) + 2 PDFs -> 302
Login-Redirect mit korrektem next-Param. Login: Cookie-Session,
Volltext ohne Veil/Skeleton/Blur; PDFs 200 + Content-Type PDF.
Session-Persistenz über 2 weitere Reports verifiziert.
Reports: doppelte Badge/Datum-Zeile aus Dokument-Box entfernt; Veil-Abstand + Titel-Farbe
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 13s
d08d9086de
- report-doc-meta (Badge + Datum) in allen 3 Reports entfernt — die Meta-Box
  oben zeigt Badge + Titel bereits, das Dokument beginnt jetzt direkt mit
  Status/Verfahrensdaten (Simon, 10.09.2026)
- Previews per make_previews.py regeneriert
- .report-veil: margin-top 1.5rem -> 0.9rem (Abstand Titel/Buttons straffer)
- .report-veil-title: Farbe var(--ink) -> var(--brand) (minimal auffaelliger)
feat(einwendung): Einwendungs-Formular + KI-Generator-Backend (Issue #17)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
766193b97c
- Entity Einwendung + Status-Enum, DbContext, OData-Modell
- Actions submitEinwendung / setEinwendungStatus im Import-Controller
- Read-only-Endpoint /odata/einwaende (Admin)
- SQLite-Schema-Patch in Program.cs
- einwendung.html: öffentliches Formular (EjUn-Optik), Frist-Hinweis
- Nginx: /odata/submitEinwendung öffentlich (Zone ejunreg, 5/min)
copy(einwendung): kurze Einleitung statt Langtext
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
da79fce8b3
fix(einwendung): Frist auf 05.10.2026 korrigiert
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
d242d0a9d3
fix(einwendung): Meta-Description auf 05.10.2026, kurze Sprache
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
3992425f20
fix(einwendung): Anonymisierungs-Checkbox entfernt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
1f7b398594
copy(einwendung): Titel auf 'Stellungnahme anfordern'
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
75cb814883
ui(einwendung): Betroffenheit zuerst, Eingabefenster minimal größer
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
8ee354aeed
copy(einwendung): Betroffenheit-Hint + Beispiel-Platzhalter getrennt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
77ace2c2ef
copy(einwendung): Titel/H2 entfernt, Einleitung neu
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
38a8fa76d6
api(einwaende): Stellungnahmen-API (Issue #17) + Banner
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
20641a9cc4
- ApiController: GET/PUT /api/Einwaende, Bearer-Token (Env EJUN_API_TOKEN)
- /api/docs (oeffentliche HTML-Doku) + /api/health (Liveness)
- nginx: /api/, /api/docs, /api/health -> 127.0.0.1:8081
- systemd: EnvironmentFile /etc/ejun-oapi.env (Token)
- Frontend: Banner 'Vorlage zur Stellungnahme abholen' auf index.html
- admin/einwaende.html: Uebersicht + Status-Verwaltung
fix(einwendung): Unkenntlich: false im Formular-Payload
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
Deploy on release / deploy (release) Successful in 1m17s
fa73b5c984
Das OData-Modell deklariert Unkenntlich als Pflichtparameter.
Das Formular sendete ihn nicht → 500 (ODataException: missing
parameter 'Unkenntlich') und die Fehlermeldung im Formular.
Fix: Unkenntlich: false im JS-Payload (Formular bietet diese
Option bewusst nicht an).
feat(auth): Logout per 401-Realm-Flush + Footer-Links
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 11s
196d3ce905
- logout.js: Admin-Logout via 401 mit gleichem Realm 'EjUn Admin'
  (Browser flusht gecachte Basic-Creds, kein nativer Dialog),
  Public-Logout via Cookie-Löschung
- 20 HTML-Seiten: Logout-Link/Button im Footer
- styles.css: Footer-Logout-Styles
- nginx: /dev/logout + /logout Endpoints (401 + WWW-Authenticate)
- e2e-logout-mock.mjs: Chromium-Regressionstest für die 401-Mechanik
- e2e-logout-check.mjs: E2E-Check
feat(ui): Logout-Button ins Hero-Header (neben Zurück) + Sonja-News
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
860472cf66
- logout.js: Öffentliche Seiten mounten 'Abmelden' als Ghost-Button
  in den Hero-Header direkt neben dem Zurück-/Haupt-CTA (Startseite:
  hinter dem Button-Cluster); Admin-Topbar unverändert.
- styles.css: Hero-Styles statt Footer-Styles; 480px-Grid um 4.
  Spalte erweitert, .ejun-logout fix in Spalte 4 (kein Overlap mit
  Zurück bzw. hero-actions auf dem Smartphone).
- news.json + news.js: Letze Neuigkeit gemäß Sonja überarbeitet —
  'Öffentliche Auslegung für Einwendungen — Windpark 3 Hayforst (9×)':
  Antrag + Unterlagen inkl. UVP-Bericht bis 10.09.2026 öffentlich
  (1 GB), förmliches Verfahren nach § 10 BImSchG mit Öffentlichkeits-
  beteiligung, Einwendungen bis 12.10.2026.
- e2e-logout-check.mjs: A1-A3 auf Hero-Platzierung umgestellt.
test(e2e): B-Sektion auf reale Admin-Mechanik (Cookie-Session statt Gate-Redirect)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
Deploy on release / deploy (release) Successful in 8s
74ee9b4789
Panel-Dateien hängen NICHT am Gate-Redirect (der gilt nur für /dev/admin/
leer) — ohne Creds kommt native 401 + Basic. Playwright 1.62 hat kein
setHTTPBasicAuth; ejun_auth-Cookie setzen = Zustand nach login.html-Login
(Nginx synthetisiert den Auth-Header daraus). B3 prüft jetzt den
Flush-Endpunkt (401 + gleicher Realm 'EjUn Admin'); der volle
Browser-Cache-Flush-Test bleibt e2e-logout-mock.mjs. 6/6 PASS live.
fix(news): Einwendungsfrist 05.10.2026 konsistent (Fristenklarstellung)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
Deploy on release / deploy (release) Successful in 7s
1f3e08a7c0
Einwendungen: Einsendeschluss 05.10.2026; Bearbeitung bis 12.10.2026 (LRA).
Betroffen: news.json/news.js, uvp-hayforst.html, uvp-hayforst-report.html,
Previews neu generiert (make_previews.py). einwendung.html war bereits korrekt.
style(zen): symmetrischer Zensierbereich (je 5 Skeleton-Zeilen)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
ed14a24b78
Vor der Veil-Box 3 -> 5, nach der Veil-Box 6 -> 5 Skeleton-Zeilen,
damit ueber und unter dem Anmeldefenster gleich lang ist und das
Dokument groesser wirkt (Simon-Request 12.09.2026).
Betroffen: tools/make_previews.py + 3 neu generierte *-preview.html.
Client-seitiger Blur (zensiermodus.js) bleibt unveraendert.
style(zen): Zensur beginnt nach 4–5 Zeilen + längere Skeleton-Bereiche (6+6)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
7d3d3f3090
- Preview: 4 statt 5 Top-Level-Elemente scharf (make_previews KEEP_COUNT=4)
- Blur: nth-child(n+5) statt n+6
- zensiermodus.js: Injektion vor Element 5, Skeleton 6 vor + 6 nach Veil
- E2E (blur/gate): Schwellen 12 Zeilen / Index 5 / 4 scharf
- Previews regeneriert (12 Skeleton-Zeilen je Seite)
feat(gate): Bekanntmachungs-PDF öffentlich (Entscheidung Simon 13.09.2026)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
33732a0c1c
- Nginx: auth_request + Login-Redirect für bekanntgabe-genehmigung.pdf
  entfernt (dev + prod) — läuft jetzt über die öffentliche sources/-Auslieferung
- Stellungnahme II bleibt members-only (Gate + E2E unverändert)
- e2e-gate-check: PDF_PUBLIC (anonym 200) vs PDF_GATED (anonym 302) getrennt
- oapi Content-Seed: Bekanntmachungs-Zeilen entfernt (inert, DB-Zeilen bleiben)
- UVP-Verbund + Landkreis-Links waren bereits öffentlich (extern)
feat(report): Stellungnahme-Banner in UVP-Report-Meta-Box (wie Hauptseite)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
fb108749fa
fix(report): Stellungnahme-Banner in separate Box; News-Titel: '...Einwendungen Hayforst (Windpark 3)'
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
0be9e0f0a8
fix(stellungnahme-ii): Link 'Zur News-Uebersicht' aus Quellen-Box und Dokument-Footer entfernen
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
e8b5a2865c
fix(logout): rohen Textknoten aus Hero-Logout entfernen (ueberdeckte Rueck-Button auf Smartphone)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
Deploy on release / deploy (release) Successful in 8s
afc6b4ed92
fix(mobile): Abmelden-Button wandert auf dem Smartphone in den Footer; Hayforst-Banner in eigene Highlight-Box zwischen Box 1 und Box 2
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
Deploy on release / deploy (release) Successful in 8s
4c12169c0e
feat(news): Essenbach-Artikel — Entscheidung und Klage zum Windpark Maessenholz
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
a0d1f831de
Extra News-Seite zu den Ereignissen in Essenbach:
- Einvernehmensverweigerung (16.06.), Genehmigung per Ersetzung (24.06.)
- Anwaltliche Einschaeftung 'aueserst geringe Erfolgsaussichten'
- Klagebeschluss 9:8 am 24.07. (AFD-Stimmen erstmals massgeblich)
- Kern des Streits: Erschliessung, aufschiebende Bedingung Ziffer 14
- Genehmigungsbescheid (51 S.) + Zeitungsbericht als PDFs in sources/
- News-Eintraege in news.js + news.json (24.07.2026)
fix(news): Essenbach-Artikel auf 2-Box-Layout — Quellen in Meta-Kopf, Zitate gegen Quellen verifiziert
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
10ca20aba0
fix(news): Essenbach-Schlagzeile — "Essenbach klagt gegen die Genehmigung"
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
4427f70e99
fix(news): Essenbach-Hero-Titel auf Slogan 'Energiewende ja, Umzingelung nein'
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
Deploy on release / deploy (release) Successful in 8s
c2447dce41
fix(backend): fehlender Unkenntlich-Parameter liefert 400 statt 500
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
902832e16b
OData-Reader warf ODataException ("parameters missing") fuer das
nicht-nullable bool Unkenntlich, wenn es im Payload fehlte -> unhandled
-> 500. Fix:
- ODataModel: Unkenntlich als bool? (nullable) deklariert
- Controller: bool? Unkenntlich, Default false (= Checkbox unangehackt)
- Program.cs: defensive Middleware fängt "…are missing from the
  request payload" generisch ab -> 400 {Ok:false,Status:invalid}
  (Warning-Log statt unhandled-fail)

Verifiziert: lokal 7/7 Smoke-Tests + Live (leer/Teil-Payload -> 400,
gültig -> 200 received, Unkenntlich 0/1 korrekt persistiert).
- Banner + Notiz: offizielle Einwendungsfrist 12.10.2026 (Az. 22-1711/1)
- Hinweis: wegen Bearbeitungsfrist (05.10.2026) keine Anträge mehr
- Client: einwendung.html blendet Formular ab 08.10.2026 00:00 MESZ aus
  (Sperre-Box statt Form, kontakt-E-Mail)
- Server: nginx map $einw_locked + if/return 410 in
  /odata/submitEinwendung — hart, auch ohne JavaScript
- Dev-Deploy spiegelt Nginx-Config automatisch mit Backup + reload
fix(frist): offizielle Frist 12.10.2026 konsistent auf Hayforst-Seiten/News/Previews
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
Deploy on release / deploy (release) Successful in 9s
f21cc9105e
Banner (index) zeigt jetzt 12.10.2026; uvp-hayforst(-report/-preview)
und News-Teaser tragen die offizielle Einwendungsfrist 12.10.2026.
Die Bearbeitungsfrist 05.10.2026 bleibt nur als Hinweis in
einwendung.html (keine Anträge mehr), Formular-Sperre ab 08.10.2026.
Previews per tools/make_previews.py neu erzeugt.
fix(einwendung): Sperre-Box und 08.10-Hinweis entfernen, Fettabhebungen anpassen
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
Deploy on release / deploy (release) Successful in 8s
cc05a7c6c3
fix(einwendung): Frist-Notiz umformulieren (Antraege bis 05.10.2026 werden fristgerecht waehrgenommen)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
Deploy on release / deploy (release) Successful in 8s
3c5755ab5e
fix(einwendung): Frist-Kopfzeile (bis einschliesslich 12.10.2026, Az.) aus Notiz entfernen
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
Deploy on release / deploy (release) Successful in 8s
d328ea89d2
fix(nginx): Apex-Domain kanonisch per 301 auf www (Pfad/Query erhalten)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
3eea3e6746
buergerinitiative-ejun.de (ohne www) -> https://www.buergerinitiative-ejun.de$request_uri
Damit funktionieren alte Links ohne www (z.B. /einwendung.html) sobald die
Apex per DNS auf unseren Server zeigt (bisher Cloudflare->Zoho, dort wird der
Pfad beim 301 weggeworfen). Bis die DNS-Umstellung live ist, ist der Block inert
(kein Apex-Traffic). server_name im www-Block auf www reduziert (kein Conflict).
copy(einwendung): Einleitung + Betroffenheit-Hint auf Hayforst/Rodungen erweitert
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
Deploy on release / deploy (release) Successful in 7s
5fd2b3ef95
fix(einwendung): konkrete Fehlermeldungen + Rate-Limit auf 429
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
5c3e48b14b
- Frontend prueft Mindestlaenge 40 Zeichen fuer 'Betroffenheit' vor dem
  Absenden; Meldung nennt den aktuellen Zaehler (Backend gab 400 zurueck,
  User sah nur die generische Fehlermeldung)
- Fehlertexte statt generischem 'Ups' fuer: Pflichtfelder, zu kurzer
  Text, fehlende Einverst.
- Nginx: limit_req_status 429 im submitEinwendung-Block, damit der
  429-Zweig im Formular greift (Standard waere 503 gewesen)

Diagnose: sporadische Formfehler = (a) kurze Texte -> 400, (b)
Rate-Limit (5/min, alle User hinter OPNsense-NAT = eine IP) -> 503
feat(news): EEG-Novelle-Artikel — Kritik an der 0,4-Prozent-Entlastung
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 16s
183fbab769
- eeg-novelle-entlastung.html (News-Eintrag 2026-10-03)
- reduktionsvergleich-report.html + serverseitige Preview (Zensiermodus)
- nginx: @preview_reduktion-Block + GATE/Report-Location
- news.json aus news.js regeneriert (stale-Stand gefixt)
- B3-Unterlagen (2025-07-10, 2026-06-22) als Quellen
refactor(news): EEG-Artikel als kurzer Zeitungsartikel — EEG-Teil raus
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 11s
9847e33c7d
- EEG-Novelle-Hintergrund entfernt, Fokus auf Fakten + Kritik
- Planungsverband + Regierung/Schmaus: Flächen anderweitig vergeben
- Zeitdruck-Argument 'spät dran, jetzt abstimmen' seit Beginn aufgenommen
- Titel angepasst (ohne EEG-Novelle), news.json regeneriert
fix(news): 0,4%-Artikel — SR25 komplett gestrichen, Angst-vor-Klagen-Narrativ, Beck/Zellmeier zitiert
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
73d970d8c1
- SR25 Neuhofen Nord (182 ha) komplett durchgestrichen (B3-2), nicht unverändert
- Lokale Kürzung: 506 ha (267+57+182), kein Windrad betroffen
- Schmaus/Regierung planen aus Angst vor Klagen der Projektierer mit Überlastung
  (Seissler/Laumer: private Belange, mündlich in Fortschreibungssitzungen)
- Beck (FW) und Zellmeier (CSU) hinter den Bürgern, Zitat idowa 'Gegen die
  Umzingelung' (06.02.2026)
- EEG-Referenzen entfernt
fix(news): Header-Logo im 0,4%-Artikel mit hero-logo-Klasse begrenzen (war ohne Größe nativ riesig)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
09ae2301ca
fix(news): schließende Zitatzeichen U+201C → U+201D (korrektes deutsches „“)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
b67426d11a
feat(news): Titel -> 'Planungsverband trickst bei 0,4% Reduzierung: Überlastung bei Franken-Neuhofen bleibt bestehen'
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
6b1f5c5556
fix(article): Sektion 'Haut retten: Überlastung bleibt aus Angst vor Klagen' entfernt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 10s
fac659865a
fix(article): Sektion 3: Aiwanger (Freie Wähler) beim Namen nennen, StMWi
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
f6019f340b
fix(article): Teaser umformuliert — Trick-Formulierung fett-rot, Kriterium-Zitat
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
4d87ef3a15
fix(article): Sektion 2: SR-Tabelle Vorher/Nachher, 'bei uns' -> Franken-Neuhofen, Labels entfernt
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
4517558a09
fix(css): Report-Text nutzt volle Breite wie Headings (70ch/72ch entfernt)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
e309d80cf3
fix(article): Petitionsantwort StMWi: Aiwanger -> Staatssekretär Tobias Gotthardt (OCR-verifiziert)
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 8s
b4c8867cea
fix(article): Sektionsreihenfolge: Umzingelung (Beck/Zellmeier) -> StMWi Gotthardt -> 2.566 ha
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
295bc5e99e
fix(article): Überschrift 3. Sektion: 'Planungsverband reduziert direkt 0,35% ohne Wirkung!'
All checks were successful
Dev deploy on push to dev / deploy-dev (push) Successful in 9s
c517d72bf6
Simon merged commit 3595b94712 into main 2026-10-07 20:09:50 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Simon/ejun-page!20
No description provided.