- In-memory TTL cache (server/src/cache.ts) with a get/set/clear surface
that a Redis backend can replace later for multi-replica setups.
- Cache the expensive opportunities ranking (5 min), item detail/search
(1 h), and per-item market prices (10 min). All keyed by request; each
read endpoint takes a refresh/force bypass.
- Invalidate precisely on writes: price upserts, overrides, profile
activate/update, economy config, and game-data reparse (full clear).
- AODP anti-spam: a price download now skips items priced within a
configurable cooldown (default 15 min, Settings page) unless "force"
is checked; the job reports how many fresh items it skipped.
- No client-side caching (per request); the browser still calls the API,
but repeats are served from the server cache without recompute/AODP.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>