Skip to content

v0.9.0 β€” πŸ“Š City Pulse: AI Situational Summary

Choose a tag to compare

@jctots jctots released this 22 Jun 17:31

πŸ“Š 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 /pulse command β€” 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_ADDR env var β€” 127.0.0.1 for production behind Caddy, 0.0.0.0 for self-hosters
  • _allow_manual_poll safe 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