Rate limits (Mistral web_search 429) used to get counted as hard errors, marking the bucket as queried and bumping the Errors(24h) strip — even though the right behavior is to wait and try again later. Backend: - isRateLimit() matches "rate limit" / "status 429" in the error string. - On persistent rate-limit after one 10s retry: leave last_queried_at unchanged (bucket stays eligible for next tick) and abort the remainder of this tick — Mistral's web_search budget is shared, no point hammering more buckets in the same batch. - TickSummary gains rate_limited counter; Errors stays for real failures. Frontend: - Dates: RFC3339 → 'DD.MM.YYYY' German format, range rendered as 'DD.MM.YYYY – DD.MM.YYYY'. - Queue table: cell horizontal padding, uppercase compact headers, scrollable on narrow viewports, dark-mode variants on every color (emerald/amber badges, link color, reject button), Region folds bundesland||land into a single column (Land was always 'Deutschland' for DACH anyway).
Marktvogt Backend
Go REST API + WebSocket