# TODO ## Done - Fixed remote system statistics after the rTorrent service split so CPU/RAM are read from the rTorrent host again. - Fixed split system service dependencies for `default_download_path` and `list_torrents`, restoring disk/system status calls. - Fixed split rTorrent package exports so private compatibility helpers, remote caches and post-check state remain visible after refactor. - Restored remote directory browsing in the split rTorrent system service. - Split the largest backend files into smaller route modules while keeping existing API behavior. - Split rTorrent service logic into a package with focused modules and compatibility exports. - Updated OpenAPI coverage for backend routes, including Planner and Poller endpoints. - Split Planner and Adaptive Poller into separate Tools tabs. - Added Download Planner settings: - master enable switch, - night-only downloads as a separate option, - quiet hours, - weekday and weekend speed limits, - CPU protection, - disk protection, - auto-resume for planner-paused torrents. - Added speed presets and Mbit/s sliders while keeping exact B/s fields for rTorrent values. - Moved disk protection configuration out of Preferences and into Planner. - Kept worker-side disk-start protection wired to Planner disk settings. - Added footer Planner shortcut visible only when Planner is enabled. - Added Adaptive Poller settings: - active interval, - idle interval, - error interval, - system stats interval, - slow stats interval, - heartbeat interval. - Reduced unnecessary heartbeat emissions. - Added tick duration tracking for the poller. - Cleaned stale backup files from the package. - Normalized Planner and Poller UX to match Smart Queue style. - Cleaned Planner/Poller CSS and removed redundant UI wrappers. - Kept the WebSocket live refresh responsive by moving slow poller tasks (torrent stats, Smart Queue, automations and Planner enforce) into a guarded background task. - Added a regression smoke check for fixed-mode poller metrics while a slow background task is running. - Set Adaptive Poller startup defaults to the requested fast-live profile: active/torrent loop 0.5s, idle 3s, errors 2s, system stats 1s, queue 5s, heartbeat 5s, slow threshold 10000ms and slowdown multiplier 1. - Added poller runtime diagnostics for real tick gap, effective interval and configured minimum interval so 0.5s polling can be verified from the UI. ## Planned ### Phase 1 - Stabilization and maintainability - Split `static/app.js` into smaller frontend modules: - `api.js`, - `state.js`, - `torrents.js`, - `modals.js`, - `smartQueue.js`, - `planner.js`, - `poller.js`, - `rss.js`, - `charts.js`. - Add request validation for API endpoints instead of repeated manual `request.json` parsing. - Add typed application exceptions: - `RtorrentError`, - `RtorrentTimeout`, - `ProfileAccessError`, - `ValidationError`, - `UnsafePathError`, - `BackgroundJobError`. - Reduce broad `except Exception` blocks and map expected errors to clear API responses. - Add structured logging with request ID, profile ID and operation timing. - Add endpoint timing metrics for API calls and rTorrent operations. - Add a deeper healthcheck endpoint covering: - database readability/writability, - active profile state, - rTorrent connection, - background queue state, - poller state. ### Phase 2 - Tests and safety - Add unit tests for torrent parsing. - Add unit tests for Smart Queue decisions. - Add unit tests for Planner schedule windows. - Add unit tests for quiet hours. - Add unit tests for Planner speed limit selection. - Add unit tests for disk protection and CPU protection. - Add unit tests for RSS rule matching. - Add unit tests for ratio rules. - Add unit tests for profile validation. - Add auth and permission tests. - Add path safety tests for move, remove and ZIP download operations. - Add mocked rTorrent integration tests for Planner pause/resume and speed limit application. - Add mocked poller tests for adaptive cadence without requiring a live rTorrent instance. - Add visual regression checks for Tools tabs on narrow screens. - Add CI checks for Python compile, JS syntax, linting and tests. ### Phase 3 - Planner improvements - [x] Add named Planner profiles: - night mode, - weekend mode, - low power mode, - unlimited mode. - [x] Keep Planner settings per active rTorrent profile. - [x] Add Planner preview with the currently matched rule and next scheduled change. - [x] Add Planner action history: - paused torrents, - resumed torrents, - speed limit changes, - CPU protection triggers, - disk protection triggers. - [x] Add dry-run mode for Planner actions. - [x] Add optional network/load protection rules. - [x] Add configurable grace period before auto-resume. - [x] Add manual override timeout, including `disable Planner for 1 hour`. - [x] Add clearer status badges in the footer and Tools panel. Implementation notes: - Frontend settings live in the Planner tab and are stored through `/api/download-planner`. - Preview/history are exposed through `/api/download-planner/preview`. - Manual override is exposed through `/api/download-planner/override`. - Dry-run mode records intended actions without calling rTorrent mutations. ### Phase 4 - Adaptive poller improvements - [x] Make polling intervals configurable per rTorrent profile. - [x] Add automatic slowdown when rTorrent responses are slow. - [x] Add automatic recovery after repeated rTorrent errors. - [x] Split polling loop configuration by data type: - torrent list, - system stats, - tracker stats, - disk stats, - queue/job stats. - [x] Emit WebSocket torrent updates only when data changed, with heartbeat fallback. - [x] Add per-tick metrics: - duration, - emitted payload size, - rTorrent call count, - skipped emissions, - current adaptive mode. - [x] Add a Poller diagnostics panel. - [x] Add safe fallback mode if adaptive polling is misconfigured. Implementation notes: - Frontend settings live in the Poller tab and are stored through `/api/poller/settings`. - Runtime metrics are included in heartbeat/system stats payloads and shown in Poller diagnostics. - Fallback mode clamps unsafe intervals during normalization. ### Phase 5 - UX and dashboard - [x] Add a torrent health dashboard with sections for: - torrents without seeders, - stopped torrents that should be active, - tracker errors, - duplicate torrents, - slowest torrents, - dead torrents, - largest torrents, - torrents below target ratio. - [x] Add Smart Views: - Needs attention, - Large and slow, - Seeding too long, - New from RSS, - No label, - Private trackers. - [x] Add global search across: - torrent name, - hash, - label, - tracker, - path, - ratio group, - error status. - [x] Add a persistent notification center for: - rTorrent errors, - RSS errors, - automation errors, - disk warnings, - Smart Queue decisions, - Planner actions, - port status. - [x] Add a Diagnostics page for profile, rTorrent, poller, database and worker state. Implementation notes: - Health and Smart Views are calculated client-side from the live torrent snapshot. - `Seeding too long` uses rTorrent completion timestamp when available and falls back safely when older rTorrent builds do not expose it. - Global search uses torrent name, hash, label, tracker domain, path, ratio group and warning/error text. - App Status now stays application-focused: process, workers, database and cleanup counters. - Diagnostics owns profile, rTorrent connection, poller, planner, database and worker snapshots to avoid duplicated status cards. ### Phase 6 - RSS and automation - Add RSS feed preview before saving a rule. - Add RSS rule testing against the latest feed entries. - Add RSS dry-run mode. - Add duplicate detection by info-hash where possible. - Add RSS rule priorities. - Add RSS history explaining why an item was accepted or rejected. - Add cleanup rules: - remove completed torrents after target ratio, - move completed data to a destination path, - remove dead torrents after a configurable time, - remove torrents with missing data, - stop seeding after a configured upload amount. - Add import/export for automation rules. ### Phase 7 - File and torrent operations - Improve the Files view with extension filters. - Add bulk priority actions by file type, for example `.mkv`, `.srt`, `.nfo`. - Add folder-level priority actions by path pattern. - Add safer selected-file download handling for large selections. - Add missing-file detection. - Add duplicate torrent detection and merge/cleanup suggestions. ### Phase 8 - Profiles and rTorrent diagnostics - Add SCGI connection test before saving a profile. - Add profile diagnostics: - rTorrent version, - base paths, - write permissions, - free disk space, - response time. - Add import/export for profiles. - Show profile status in the profile picker: - online, - offline, - slow, - error. - Add per-profile API and polling limits. ### Phase 9 - Security and API - Require changing default admin credentials on first login when auth is enabled. - Add login rate limiting. - Add optional TOTP/2FA. - Add stronger CSRF protection for state-changing requests. - Set secure session flags when running behind HTTPS. - Add API tokens: - read-only token, - full-access token, - profile-limited token, - token revocation, - token usage log. - Generate or validate OpenAPI schemas from backend request/response models. - Add generated JS API client from OpenAPI. ### Phase 10 - Database, backup and release quality - Add explicit database migrations with version numbers. - Add `PRAGMA busy_timeout` configuration. - Add periodic `VACUUM` or WAL checkpoint maintenance. - Add indexes for history and frequently filtered data. - Add retention limits for RSS history, automation history and Planner history. - Add backup checksums. - Add backup restore validation. - Keep release archives free from `.bak`, cache and local debug files. ## Phase 5 implementation status - [x] Torrent health dashboard in Tools. - [x] Smart Views filters, including completion-time based `Seeding too long`. - [x] Global search expanded to hash, label, tracker, path, ratio group and error/status. - [x] Persistent local notification center. - [x] Diagnostics tool panel for profile, rTorrent, poller, database and workers.