diff --git a/backend/app/config.py b/backend/app/config.py
index 84a160b..1ed8951 100644
--- a/backend/app/config.py
+++ b/backend/app/config.py
@@ -88,10 +88,11 @@ class Settings(BaseSettings):
log_level: str = "DEBUG"
- # FK scraper — legal/ToS review completed (2026-06). Default is False (conservative).
- # Set APP_SCRAPER_ENABLED=true in the environment or backend/.env to enable.
+ # FK scraper — legal/ToS review completed (2026-06); cleared for use.
+ # Default is True. Set APP_SCRAPER_ENABLED=false to disable (e.g. an
+ # environment without Playwright chromium installed).
# Playwright chromium binaries must be installed: `playwright install chromium`.
- scraper_enabled: bool = False
+ scraper_enabled: bool = True
scraper_headless: bool = True
scraper_session_ttl_seconds: int = 180 # auto-cancel awaiting_scan/authenticating sessions
# Set to None to disable debug artifact saving. Files may contain personal data.
diff --git a/backend/tests/unit/test_fetch_data_router.py b/backend/tests/unit/test_fetch_data_router.py
index ab48e60..f09bb92 100644
--- a/backend/tests/unit/test_fetch_data_router.py
+++ b/backend/tests/unit/test_fetch_data_router.py
@@ -8,23 +8,21 @@ primary onboarding action. Follows the `test_calendar_router.py` /
graph, not just the service, so status codes and wire-shape regressions are
caught.
-`settings.scraper_enabled` defaults to `False` in `app/config.py` (the
-checked-in, CI-facing configuration -- no `APP_SCRAPER_ENABLED` is set in
-CI). On at least one contributor's machine, an untracked, gitignored
-`backend/.env` sets `APP_SCRAPER_ENABLED=true` for manual scraper testing
-(see `AGENTS.md`'s `npm run login` note) -- so `settings.scraper_enabled` at
-*import time* is genuinely ambient and must not be asserted on directly (it
-was `True` when this suite was drafted, on the machine that drafted it,
-despite the shipped default being `False`).
+`settings.scraper_enabled` defaults to `True` in `app/config.py` (the FK
+legal/ToS review completed 2026-06; see the field's docstring) but a
+contributor's untracked, gitignored `backend/.env` can still override it
+either way -- so `settings.scraper_enabled` at *import time* is genuinely
+ambient and must not be asserted on directly.
The scraper-session tests below therefore use `monkeypatch` to pin
`app.routers.fetch_data.settings.scraper_enabled` to a known value for the
duration of each test, rather than asserting on (or branching on) whatever a
contributor's local `.env` happens to set. This is deliberately more robust
than reading the live value once and assuming it holds — the disabled path
-is what both the shipped default and CI exercise; the enabled path is
-exercised here only far enough to prove the guard flips (`start_session` is
-faked out, never a real Playwright session -- see the module docstring in
+is exercised here to prove the guard still works for an environment that
+opts back out (e.g. one without Playwright chromium installed); the enabled
+path is exercised only far enough to prove the guard flips (`start_session`
+is faked out, never a real Playwright session -- see the module docstring in
`app/scrapers/fk_scraper.py`; actually driving it here would launch a real,
non-headless browser as a fire-and-forget background task, which is unsafe
to do from a router test).
@@ -181,9 +179,10 @@ class TestGetLatestAndHistory:
class TestScraperEndpointsDisabled:
- """`settings.scraper_enabled = False` is the shipped default and what CI
- exercises (see the module docstring for why this is pinned via
- `monkeypatch` rather than asserted on ambiently).
+ """Covers the disabled path (an environment that opts out via
+ `APP_SCRAPER_ENABLED=false`, e.g. one without Playwright chromium
+ installed) — see the module docstring for why this is pinned via
+ `monkeypatch` rather than asserted on ambiently.
"""
async def test_start_returns_501_when_scraper_disabled(
diff --git a/frontend/package.json b/frontend/package.json
index b59554b..936c3e8 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -18,7 +18,7 @@
"e2e": "playwright test",
"e2e:ui": "playwright test --ui",
"login": "concurrently -k -n backend,web \"npm:login:backend\" \"npm:login:web\"",
- "login:backend": "cd ../backend && APP_SCRAPER_ENABLED=true APP_SCRAPER_HEADLESS=true uv run uvicorn app.main:app --reload --port 8000",
+ "login:backend": "cd ../backend && APP_SCRAPER_HEADLESS=true uv run uvicorn app.main:app --reload --port 8000",
"login:web": "vite --open /dev/fetch"
},
"dependencies": {
diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx
index 6f98098..f375172 100644
--- a/frontend/src/App.test.tsx
+++ b/frontend/src/App.test.tsx
@@ -30,10 +30,6 @@ vi.mock('@/pages/Settings', () => ({
Settings: () =>