Convert actions+reasons panel from 2-col to 3-col grid and add a
Top UA bars chart as the third column, reusing the existing top_ua
stats data. Also adds responsive collapse and i18n key for all 3 locales.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add selfObserve middleware that detects bot/scanner User-Agents (or
requests with no UA) hitting any endpoint except /health and /submit,
and logs them to the bots table as site_id='self', action='observed'.
Dashboard shows these with a cyan [LOCAL] badge and colours 'observed'
action in cyan to distinguish them from WordPress-reported blocks.
Geo-enrichment runs async on self-observed entries too.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- npm ci requires a package-lock.json; use npm install --omit=dev instead
- Change all port references from 3001 to 3091 (3001 is occupied)
- docker-compose.yml: ports, PORT env, healthcheck URL
- Dockerfile: EXPOSE
- .env.example: PORT default
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Self-hosted Node.js/Express + SQLite (WAL) API server and dashboard
for tracking blocked bots and user agents. Features:
- POST /api/v1/submit — batch ingest from WordPress plugin
- GET /api/v1/stats — aggregated stats with 30s cache
- GET /api/v1/stream — SSE live event feed
- GET /api/v1/health — health check endpoint
- Cyan/blue terminal-style dashboard with live feed, bar charts, 24h activity
- Docker Compose setup on port 3001 with persistent SQLite volume
- Bearer token auth with constant-time comparison
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>