Crawler: HTTP fetcher and content extraction
Build first-party HTML content extractor (replace fivefilters/readability.php)
URL-pattern pre-filter: skip non-HTML extensions before page row creation
Backfill command for crawler queue (catch pages missed by observer)
Rotate Livewire release_token per deploy for cache-busting
URL submission: rate-limit message UI polish
URL submission: tighten validation (max length, reject loopback/private IPs)
URL normalization on pages.url (strip tracking params, canonicalize)
Test environment hardening: APP_KEY override and Postgres test runs
page_links FK on-delete behavior decision
UrlDiscoveredListener: add tries and failed() handler