Skip to content

Releases

v0.13.1

Choose a tag to compare

@github-actions github-actions released this 04 Nov 07:37

v0.13.1 (2026-11-04)

Bug Fixes

  • Protect main and preserve pre-push hooks (#16, c3f1ce6)
  • 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

  • Enforce LF line endings (#11, fbfe157)

  • deps: Bump certifi from 2026.7.22 to 2026.10.18 (#13, 0aa2d5a)

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

  • Serialize release workflow publishing (#12, 3ba33a0)
  • 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

Choose a tag to compare

@github-actions github-actions released this 24 Oct 21:53

v0.13.0 (2026-10-24)

Chores

  • Require approval for Firefox Reader Dokploy deployment (afbf493)

Features

  • Reuse Camoufox browsers in bounded pool (#10, f2328d7)
  • 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

Choose a tag to compare

@github-actions github-actions released this 14 Oct 12:14

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

Choose a tag to compare

@github-actions github-actions released this 13 Oct 11:34

v0.12.9 (2026-10-13)

Bug Fixes

  • Cap concurrent browser launches (#9, 4926a2d)

Detailed Changes: v0.12.8...v0.12.9

v0.12.8

Choose a tag to compare

@github-actions github-actions released this 24 Sep 11:05

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

Choose a tag to compare

@github-actions github-actions released this 23 Sep 09:39

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

Choose a tag to compare

@github-actions github-actions released this 25 Aug 13:59

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

Choose a tag to compare

@github-actions github-actions released this 24 Aug 08:55

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

Choose a tag to compare

@github-actions github-actions released this 24 Aug 08:45

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

Choose a tag to compare

@github-actions github-actions released this 23 Aug 15:02

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