Add waitBeforeCaptureMs parameter to URLItem and renderSSR to allow waiting
before capturing page content (useful for animations/dynamic content).
Refactor bakeComputedStyles from per-element computed style baking to a
simplified approach that collects all CSS into a single inline style tag.
This reduces complexity while maintaining compatibility.
- Format arrays and objects on multiple lines for clarity
- Add trailing commas to arrays and objects
- Format function parameters across multiple lines when needed
- Format string concatenation and template literals consistently
- Format try-catch blocks with proper spacing
- Add debug section for banned IPs with refresh button
- Implement fetchBannedIPs() function to display banned IPs in table
- Add adminUnban() function for unbanning IPs from UI
- Show IP, ban time, reason, banned by, and unban action in table
- Add banned_ips database table with IP, timestamp, reason, and banned_by fields
- Implement IP ban checking in deviceTrack to block banned connections
- Add admin API endpoints: /api/admin/ban/:ip, /api/admin/unban/:ip, /api/admin/disconnect/:ip, /api/admin/refresh/:ip
- Add GET /api/banned endpoint to retrieve banned IPs list
- Return 403 error page for banned IP connections
Implement automatic cache warming when users first connect to views.
Pre-renders all URLs in a view to eliminate initial load latency.
Also adds periodic warmup for active devices and removes cache TTL
refresh on cache hits to preserve original expiration timing.
- Replace localStorage.clear() with CDP Storage.clearDataForOrigin to avoid SecurityError on about:blank (opaque origin)
- Add idleTimeout to Bun.serve config to prevent 10s timeout during queued renders
- Add timeout fallback for networkidle0 in renderSSR and renderScreenshotFrame to handle sites that never reach idle state
- Add recursive CSS @import resolver with font service filtering
- Preserve media attribute when inlining CSS
- Implement browser pool with 2 browsers × 8 pages each
- Add page pool with acquire/release lifecycle and page reset between uses
- Add render cache with TTL-based expiry and pre-warming before rotation boundaries
- Add in-memory view cache to avoid repeated DB reads
- Add per-IP rate limiting (2s cooldown)
- Add concurrent render limit (16 max)
- Refactor database functions with `db` prefix for clarity
- Add CONFIG object for all tunable parameters
- Add In