Repository navigation
Releases
v0.13.1
v0.13.1 (2026-11-04)
Bug Fixes
-
chore: add require-current-main pre-push hook
-
fix: check every branch update before push
-
fix: resolve origin main unambiguously
-
fix: protect main and preserve pre-push hooks
Chores
Bumps certifi from 2026.7.22 to 2026.10.18.
updated-dependencies:
- dependency-name: certifi dependency-version: 2026.10.18
dependency-type: indirect ...
Signed-off-by: dependabot[bot] support@github.com
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Continuous Integration
-
chore: ignore local and generated files
-
ci: split firefox-reader release workflow into release and publish
-
ci: serialize release workflow publishing
Detailed Changes: v0.13.0...v0.13.1
v0.13.0
v0.13.0 (2026-10-24)
Chores
- Require approval for Firefox Reader Dokploy deployment (
afbf493)
Features
-
docs: specify persistent browser pool
-
refactor: extract reusable browser page reader
-
feat: reuse Camoufox browsers in bounded pool
-
fix: keep browser pool shutdown off the event loop
-
feat: serve endpoints through persistent browser pool
-
fix: keep page-close errors from masking request outcomes
Guard page.close() in read_with_browser's finally so a cleanup failure logs instead of replacing a successful result or the navigation error the pool retries on. Set .env.example BROWSER_POOL_SIZE=1 for the declared 1 GiB Compose profile (runtime default stays 3) with RSS guidance, fix the README browser-lifetime wording (recycle after 200 jobs or an operational error), and record the ruling in the plan's Task 3 step.
Detailed Changes: v0.12.10...v0.13.0
v0.12.10
v0.12.10 (2026-10-14)
Bug Fixes
- Deploy Firefox Reader through Dokploy (
0134de7)
Detailed Changes: v0.12.9...v0.12.10
v0.12.9
v0.12.8
v0.12.8 (2026-09-24)
Bug Fixes
- Normalise socks5h scheme to socks5 for Playwright proxy (
1130b59)
TOR_PROXY defaults to 'socks5h://127.0.0.1:9050', but socks5h is not a Playwright proxy scheme. Firefox's Juggler driver (toJugglerProxyOptions) matches only socks4:/socks5:/http:/https: and silently falls back to an HTTP proxy for unknown schemes — so Firefox sent HTTP CONNECT to the Tor SOCKS port, and Tor logged 'Socks version 67 not recognized' (67 = ASCII 'C' from 'CONNECT') on every request.
Normalise socks5h -> socks5 in _build_camoufox_kwargs. The remote-DNS semantics of the 'h' suffix are preserved via the existing network.proxy.socks_remote_dns Firefox pref.
The failure never reached Sentry by design: it surfaced inside the browser as about:neterror/timeout, which the operational-exceptions filter retries silently instead of capturing.
Detailed Changes: v0.12.7...v0.12.8
v0.12.7
v0.12.7 (2026-09-23)
Bug Fixes
- Replace Selenium/geckodriver with Camoufox (
9c0f443)
geckodriver session creation hung at TLS handshake through the Tor SOCKS5 proxy: ReadTimeoutError at 120s, then the SIGTERM shutdown timed out after 60s and left ConnectionResetError in the logs (Bugsink FIREFOX_READER_WEB_SERVICE-1, -2, -3 — 90 events). Selenium's geckodriver transport has no way to bound new-session time through a SOCKS proxy.
Camoufox (Playwright-based Firefox) launches through the same SOCKS5 Tor proxy with a 30s navigation ceiling, per-attempt retries, and a context manager that guarantees browser teardown. geckodriver and the hand-built Firefox are removed from the Dockerfile; tests rewritten (32 passing).
Detailed Changes: v0.12.6...v0.12.7
v0.12.6
v0.12.6 (2026-08-25)
Bug Fixes
- Retry webdriver.Firefox() constructor failures as operational (
5ac9753)
The constructor sat outside the try/except _OPERATIONAL_EXCEPTIONS block, so a transient WebDriverException during session creation (e.g. 'Failed to decode response from marionette' — geckodriver/Firefox startup race) escaped the retry loop, hit the caller as a 500, and was captured to Sentry as a bug. Moved the constructor + set_page_load_timeout inside the try block and guarded finally:browser.quit() for the constructor-raises path. Same operational class as a page-load timeout — retry on a fresh browser, no Sentry.
Bugsink FIREFOX_READER_WEB_SERVICE-8.
Detailed Changes: v0.12.5...v0.12.6
v0.12.5
v0.12.5 (2026-08-24)
Bug Fixes
- Treat WebDriverException from target navigation as operational (
01ff512)
When the Tor node is unreachable, Firefox loads about:neterror and Selenium raises WebDriverException from the target browser.get(url) (not just the warm-up). That escaped _OPERATIONAL_EXCEPTIONS, hit Sentry as a bug, and aborted on the first attempt without retrying — even though it is the same operational class as TimeoutException (transient network failure, worth a fresh browser).
Added WebDriverException to _OPERATIONAL_EXCEPTIONS so target-navigation failures retry up to MAX_ATTEMPTS and do not spam Sentry. Test S10 added (test_target_webdriver_exception_retries_no_sentry) — RED→GREEN, 30/30 pass.
Detailed Changes: v0.12.4...v0.12.5
v0.12.4
v0.12.4 (2026-08-24)
Bug Fixes
- Catch WebDriverException in warm-up navigation to survive unreachable IPs (
fbb0195)
Warm-up browser.get(http:///) raised WebDriverException (Firefox about:neterror?e=connectionFailure) when the resolved IP was unreachable through Tor. The warm-up except clause only caught OSError, so the WebDriverException escaped to the outer except Exception, hit Sentry, and aborted the request — even though the target URL loads through Tor regardless of warm-up outcome.
Broadened the warm-up except to (OSError, WebDriverException) and added test S9 (test_warmup_navigation_failure_skips_warmup_no_sentry) — RED→GREEN.
Bugsink FIREFOX_READER_WEB_SERVICE-6.
Detailed Changes: v0.12.3...v0.12.4
v0.12.3
v0.12.3 (2026-08-23)
Bug Fixes
- Make warm-up DNS lookup best-effort to survive host DNS failures (
b3ce079)
socket.gethostbyname('ifconfig.me') runs on the host (outside Tor) and can fail with gaierror when the container DNS is wedged. The gaierror escaped _OPERATIONAL_EXCEPTIONS (Selenium-only), hit Sentry, and aborted the request without retry. The warm-up is a workaround, not load-bearing — the target URL loads through Tor regardless.
Wrap the warm-up DNS lookup + warm-up browser.get in try/except OSError (covers gaierror); on failure, log and proceed to the target URL.
Bugsink FIREFOX_READER_WEB_SERVICE-5
Detailed Changes: v0.12.2...v0.12.3