diff --git a/.sisyphus/boulder.json b/.sisyphus/boulder.json
new file mode 100644
index 0000000..0ef0d30
--- /dev/null
+++ b/.sisyphus/boulder.json
@@ -0,0 +1,9 @@
+{
+ "active_plan": "/opt/Ohm_streaming/.sisyphus/plans/watchlist-visual-redesign.md",
+ "started_at": "2026-02-26T14:52:06.065Z",
+ "session_ids": [
+ "ses_36604025effe0D8w29Z4LdkaPr"
+ ],
+ "plan_name": "watchlist-visual-redesign",
+ "agent": "atlas"
+}
\ No newline at end of file
diff --git a/.sisyphus/drafts/anime-sama-player-fallback.md b/.sisyphus/drafts/anime-sama-player-fallback.md
new file mode 100644
index 0000000..4600db5
--- /dev/null
+++ b/.sisyphus/drafts/anime-sama-player-fallback.md
@@ -0,0 +1,36 @@
+# Draft: Anime-Sama Player Fallback System
+
+## Requirements
+- **Mode**: Automatique - essayer tous les players jusqu'à en trouver un qui fonctionne
+- **Success Criterion**: Test téléchargement (télécharger un petit chunk pour vérifier)
+- **Workflow**: Si le player détecté échoue, essayer VidMoly, SendVid, Sibnet, etc. automatiquement
+
+## Technical Decisions
+
+### Player Priority Order (for Anime-Sama fallback)
+1. VidMoly - most reliable
+2. SendVid - second most reliable
+3. Sibnet - third
+4. Lpayer - last (requires Playwright, slower)
+
+### Success Detection
+- Download first 10KB of the video
+- If successful (200 OK, valid data), consider player working
+- Cache which player works for future episodes
+
+### Implementation Approach
+1. Add `get_download_link_with_fallback()` method in `AnimeSamaDownloader`
+2. Test each player by downloading first 10KB
+3. Use first player that returns valid data
+4. Cache working player per anime URL/series
+
+## Scope
+- INCLUDE: Anime-Sama downloader with automatic player fallback
+- INCLUDE: Video URL validation via chunk download test
+- INCLUDE: Player caching for performance
+- EXCLUDE: Frontend UI changes (backend only)
+- EXCLUDE: Other anime sites (Anime-Sama only for now)
+
+## Files to Modify
+- `app/downloaders/anime_sites/animesama.py` - Add fallback logic
+- `app/downloaders/base.py` - May need base helper method
diff --git a/.sisyphus/evidence/01_watchlist_page.png b/.sisyphus/evidence/01_watchlist_page.png
new file mode 100644
index 0000000..210f214
Binary files /dev/null and b/.sisyphus/evidence/01_watchlist_page.png differ
diff --git a/.sisyphus/evidence/01_web_page.png b/.sisyphus/evidence/01_web_page.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/01_web_page.png differ
diff --git a/.sisyphus/evidence/02_auth_state.png b/.sisyphus/evidence/02_auth_state.png
new file mode 100644
index 0000000..e0829f6
Binary files /dev/null and b/.sisyphus/evidence/02_auth_state.png differ
diff --git a/.sisyphus/evidence/02_tab_highlighted.png b/.sisyphus/evidence/02_tab_highlighted.png
new file mode 100644
index 0000000..210f214
Binary files /dev/null and b/.sisyphus/evidence/02_tab_highlighted.png differ
diff --git a/.sisyphus/evidence/03_header_nav.png b/.sisyphus/evidence/03_header_nav.png
new file mode 100644
index 0000000..210f214
Binary files /dev/null and b/.sisyphus/evidence/03_header_nav.png differ
diff --git a/.sisyphus/evidence/03_watchlist_not_found.png b/.sisyphus/evidence/03_watchlist_not_found.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/03_watchlist_not_found.png differ
diff --git a/.sisyphus/evidence/04_scheduler_panel.png b/.sisyphus/evidence/04_scheduler_panel.png
new file mode 100644
index 0000000..210f214
Binary files /dev/null and b/.sisyphus/evidence/04_scheduler_panel.png differ
diff --git a/.sisyphus/evidence/04_tab_highlighted.png b/.sisyphus/evidence/04_tab_highlighted.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/04_tab_highlighted.png differ
diff --git a/.sisyphus/evidence/05_filter_tabs.png b/.sisyphus/evidence/05_filter_tabs.png
new file mode 100644
index 0000000..210f214
Binary files /dev/null and b/.sisyphus/evidence/05_filter_tabs.png differ
diff --git a/.sisyphus/evidence/05_filters_clicked.png b/.sisyphus/evidence/05_filters_clicked.png
new file mode 100644
index 0000000..d7cded9
Binary files /dev/null and b/.sisyphus/evidence/05_filters_clicked.png differ
diff --git a/.sisyphus/evidence/05_header_nav.png b/.sisyphus/evidence/05_header_nav.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/05_header_nav.png differ
diff --git a/.sisyphus/evidence/06_scheduler_panel.png b/.sisyphus/evidence/06_scheduler_panel.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/06_scheduler_panel.png differ
diff --git a/.sisyphus/evidence/06_settings_closed.png b/.sisyphus/evidence/06_settings_closed.png
new file mode 100644
index 0000000..d7cded9
Binary files /dev/null and b/.sisyphus/evidence/06_settings_closed.png differ
diff --git a/.sisyphus/evidence/06_settings_not_found.png b/.sisyphus/evidence/06_settings_not_found.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/06_settings_not_found.png differ
diff --git a/.sisyphus/evidence/06_settings_open.png b/.sisyphus/evidence/06_settings_open.png
new file mode 100644
index 0000000..8a19354
Binary files /dev/null and b/.sisyphus/evidence/06_settings_open.png differ
diff --git a/.sisyphus/evidence/07_filter_tabs.png b/.sisyphus/evidence/07_filter_tabs.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/07_filter_tabs.png differ
diff --git a/.sisyphus/evidence/07_filters_clicked.png b/.sisyphus/evidence/07_filters_clicked.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/07_filters_clicked.png differ
diff --git a/.sisyphus/evidence/07_refresh_check.png b/.sisyphus/evidence/07_refresh_check.png
new file mode 100644
index 0000000..d7cded9
Binary files /dev/null and b/.sisyphus/evidence/07_refresh_check.png differ
diff --git a/.sisyphus/evidence/08_back_to_watchlist.png b/.sisyphus/evidence/08_back_to_watchlist.png
new file mode 100644
index 0000000..d7cc33a
Binary files /dev/null and b/.sisyphus/evidence/08_back_to_watchlist.png differ
diff --git a/.sisyphus/evidence/08_home_tab.png b/.sisyphus/evidence/08_home_tab.png
new file mode 100644
index 0000000..5831c74
Binary files /dev/null and b/.sisyphus/evidence/08_home_tab.png differ
diff --git a/.sisyphus/evidence/08_settings_not_found.png b/.sisyphus/evidence/08_settings_not_found.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/08_settings_not_found.png differ
diff --git a/.sisyphus/evidence/09_refresh_check.png b/.sisyphus/evidence/09_refresh_check.png
new file mode 100644
index 0000000..2b4c649
Binary files /dev/null and b/.sisyphus/evidence/09_refresh_check.png differ
diff --git a/.sisyphus/evidence/09_web_hash_watchlist.png b/.sisyphus/evidence/09_web_hash_watchlist.png
new file mode 100644
index 0000000..d7cc33a
Binary files /dev/null and b/.sisyphus/evidence/09_web_hash_watchlist.png differ
diff --git a/.sisyphus/evidence/11_watchlist_direct.png b/.sisyphus/evidence/11_watchlist_direct.png
new file mode 100644
index 0000000..210f214
Binary files /dev/null and b/.sisyphus/evidence/11_watchlist_direct.png differ
diff --git a/.sisyphus/evidence/task-1-flag-init.txt b/.sisyphus/evidence/task-1-flag-init.txt
new file mode 100644
index 0000000..559da7d
--- /dev/null
+++ b/.sisyphus/evidence/task-1-flag-init.txt
@@ -0,0 +1 @@
+364: window.watchlistTabLoaded = false;
diff --git a/.sisyphus/evidence/task-1-timeout-url.txt b/.sisyphus/evidence/task-1-timeout-url.txt
new file mode 100644
index 0000000..b8a22aa
--- /dev/null
+++ b/.sisyphus/evidence/task-1-timeout-url.txt
@@ -0,0 +1,16 @@
+# Evidence: Task 1 - Timeout URL Test
+
+## Scenario: Invalid video URL times out
+
+**Tool**: Python3
+**Preconditions**: URL that times out (httpbin.org/delay/20)
+**Steps**:
+1. python3 -c "from app.downloaders.anime_sites.animesama import AnimeSamaDownloader; d = AnimeSamaDownloader(); result = d._test_video_url('https://httpbin.org/delay/20'); print(f'Result: {result}')"
+
+**Expected Result**: Returns False (timeout)
+
+**Actual Result**:
+Video URL validation FAILED: Timeout for https://httpbin.org/delay/20...
+Result for timeout URL: False
+
+**Status**: PASS
diff --git a/.sisyphus/evidence/task-1-valid-url.txt b/.sisyphus/evidence/task-1-valid-url.txt
new file mode 100644
index 0000000..108974b
--- /dev/null
+++ b/.sisyphus/evidence/task-1-valid-url.txt
@@ -0,0 +1,15 @@
+# Evidence: Task 1 - Valid URL Test
+
+## Scenario: Valid video URL returns 200 OK
+
+**Tool**: Python3
+**Preconditions**: URL that returns HTTP 200
+**Steps**:
+1. python3 -c "from app.downloaders.anime_sites.animesama import AnimeSamaDownloader; d = AnimeSamaDownloader(); result = d._test_video_url('https://www.google.com/'); print(f'Result: {result}')"
+
+**Expected Result**: Returns True
+
+**Actual Result**:
+Result for google.com: True
+
+**Status**: PASS
diff --git a/.sisyphus/evidence/task-2-all-fail.txt b/.sisyphus/evidence/task-2-all-fail.txt
new file mode 100644
index 0000000..ab976cf
--- /dev/null
+++ b/.sisyphus/evidence/task-2-all-fail.txt
@@ -0,0 +1,16 @@
+# Evidence: Task 2 - All Players Fail
+
+## Scenario: All players fail
+
+**Tool**: Python3
+**Preconditions**: Mock all extractions to fail
+**Steps**:
+1. Mock all _extract_from_* methods to raise Exception
+2. Call get_download_link_with_fallback()
+
+**Expected Result**: Raises exception "All video players failed"
+
+**Actual Result**:
+Exception raised: All players failed. Last error: Player failed
+
+**Status**: PASS
diff --git a/.sisyphus/evidence/task-2-css-conflicts.txt b/.sisyphus/evidence/task-2-css-conflicts.txt
new file mode 100644
index 0000000..8b877b6
--- /dev/null
+++ b/.sisyphus/evidence/task-2-css-conflicts.txt
@@ -0,0 +1,42 @@
+# CSS Class Conflicts Check Results
+
+## Check 4: filter-tab class in style.css
+No matches found for "filter-tab" in static/css/style.css
+
+However, filter-tab IS defined in watchlist.html inline styles:
+/opt/Ohm_streaming/templates/watchlist.html
+ 123: .filter-tabs {
+ 130: .filter-tab {
+ 140: .filter-tab:hover {
+ 144: .filter-tab.active {
+ 257:
+ 258:
+ 259:
+ 260:
+ 261:
+ 363: document.querySelectorAll('.filter-tab').forEach(tab => {
+
+## Check 5: .tab class in style.css
+Found 2 matches in static/css/style.css
+ 151: .tab {
+ 733: .tab {
+
+## Tab Class Usage Across Templates:
+- login.html: auth-tabs, auth-tab
+- watchlist.html: .tab (navigation), .filter-tabs, .filter-tab
+- components/header.html: .tab (navigation tabs)
+
+## Potential CSS Conflict Analysis:
+1. filter-tab: Defined inline in watchlist.html, NOT in style.css
+ - Risk: LOW (isolated to watchlist page)
+
+2. .tab: Defined in style.css at lines 151 and 733
+ - Used in multiple templates for navigation tabs
+ - .filter-tab is DIFFERENT from .tab
+ - Risk: LOW (.tab and .filter-tab are distinct classes)
+
+## Conclusion:
+NO CSS CLASS CONFLICTS DETECTED
+- filter-tab is isolated to watchlist.html (inline CSS)
+- .tab class in style.css is for main navigation tabs
+- .filter-tab is a separate, distinct class for watchlist filtering
diff --git a/.sisyphus/evidence/task-2-dom-conflicts.txt b/.sisyphus/evidence/task-2-dom-conflicts.txt
new file mode 100644
index 0000000..dd43cd0
--- /dev/null
+++ b/.sisyphus/evidence/task-2-dom-conflicts.txt
@@ -0,0 +1,32 @@
+# DOM ID Conflicts Check Results
+
+## Check 1: watchlistContainer & schedulerStatus
+Found 2 matches in 1 file(s):
+/opt/Ohm_streaming/templates/watchlist.html
+ 233: