v0.9.0 β π City Pulse: AI Situational Summary
π City Pulse
Frankfurt Radar now generates an hourly AI-powered situational summary using Gemini 2.5 Flash with extended thinking. Instead of scanning individual alert cards, users get a concise synthesis of what's happening, what's changing, and what to do about it.
β¨ Highlights
- Hourly pulse β AI synthesis of all active alerts, displayed as a floating overlay on the map
- Daily digest β 24 hourly pulses compressed into a one-paragraph summary at 23:00, providing multi-day trend context
- Telegram delivery β subscribers choose when to receive the pulse (08:00, 12:00, or 18:00)
- 5 trend categories β Weather βοΈ Β· Transport π Β· Roadworks π§ Β· Incidents π¨ Β· Events π
- 3 trend directions β β worsening Β· β improving Β· β stable
- Smart prioritization β new alerts emphasized, old low-severity alerts deprioritized
- Proactive recommendations β suggests alternative routes during disruptions, events during good weather
- Editable prompts β YAML frontmatter + template in
prompts/, seeded to data volume - Admin
/pulsecommand β trigger generation manually via Telegram - One pulse per hour β dedup prevents history pollution from repeated manual triggers
π Security Audit Remediation (#264β#268)
- Gitleaks allowlist for false positives (+ config format fix)
- SECURITY.md β security.html sync
- Caddyfile subdomain security headers
BIND_ADDRenv var β127.0.0.1for production behind Caddy,0.0.0.0for self-hosters_allow_manual_pollsafe default
π Bug Fixes
- Deep link auto-opens cleared section for removed alerts
- SOURCE_URL fallbacks for baustellen/sports/strike + synced officialUrl in popups
- Radar frames re-fetched on each open (stale "now" marker fix)
π Documentation
- README: City Pulse feature section + updated architecture diagram
- Architecture, user guide, self-hosting docs updated
- PRIVACY.md + privacy.html: Gemini API data processing disclosure
π Deploy
# Add to .env
BIND_ADDR=127.0.0.1
# Add to data/config.yaml
pulse:
enabled: true
# Deploy
rm -rf data/prompts
docker compose pull && docker compose up -d