یہاں Px کے 5 ورژن درج ہیں، 7 اپریل، 2025 سے لے کر موجودہ 0.13.0 تک۔ ہر ورژن پبلشر کی اپنی انسٹالر فائلوں سے منسلک ہے۔
2 برسوں میں 5 ورژن · سال میں تقریباً 3.2
| ورژن | تاریخ | سائز | فائلیں |
|---|---|---|---|
| 0.13.0تازہ ترین | 26 اکتوبر، 2026 | — | 64 بٹ ZIP ریلیز نوٹسImprovements
- Px now requires pymcurl 8.23.0.2 or newer, which provides the keepalive,
low-speed timeout, and auth-retry APIs used by Px.
- PAC dnsResolve() (and so isResolvable()/isInNet()) and IP-based
--noproxy matching use a cached, bounded DNS resolver: successful and
failed lookups are cached, concurrent lookups of one name are shared, and
slow resolvers no longer stall unrelated requests (#273).
- px --test now reports every connectivity check as passed or failed and
completes all checks before returning a failure status (#274).
- Release binaries and Docker images bundle the newest CPython 3.13 patch
available to the build tools (uv's python-build-standalone,
actions/setup-python, python.org's Windows embed zips, and the
python:3.13-alpine image), and log the bundled version (#275).
- Installation docs now cover uninstalling Px for winget, pip and standalone
binary installs, including removing the Windows auto-start entry first.
New features
- Switched to libuv-based event loops: winloop on Windows, uvloop on
Linux/macOS. These replace Python's default asyncio event loop with libuv,
providing significantly improved throughput for CONNECT tunnels and fixing
px randomly becoming unresponsive on Windows after network disruptions
(CPython bug #93821). Falls back to the default event loop gracefully if
the libuv library is not available (#268).
- New --event-loop=auto|asyncio option (PX_EVENT_LOOP, event_loop in
px.ini) to run on Python's default asyncio event loop instead of
winloop/uvloop.
- New --authretry=<seconds> option (PX_AUTHRETRY, authretry in
px.ini) takes a float number of seconds (fractions allowed) and lets Px
probe an upstream proxy again after it has been blocked for repeated 407s.
For example, --authretry=300 retries every 5 minutes. Once blocked, one
request is let through per interval and all other requests are refused until
that probe succeeds. A successful response unblocks the proxy immediately;
another 407 re-blocks it. Default 0 keeps blocked proxies blocked until
Kerberos ticket renewal or restart. Thanks to #276 (enkunkun) for identifying
the problem.
Bug fixes
- The macOS binary no longer links Homebrew's OpenSSL by absolute path, which
made SSL and pyspnego fail to load on Macs without that exact Homebrew
version. It is now built with a self-contained python-build-standalone
CPython. The release build scans every bundled Mach-O file and rejects
/opt/homebrew or /usr/local references before publishing.
- Fixed macOS Nuitka binaries omitting pyspnego's NTLM dependencies, which
prevented authenticated proxy use. Missing dependency messages now show the
original import error, and binary builds smoke-check those imports before
artifact tests run.
- px --quit now flushes its successful shutdown response before exiting, so
Nuitka and Windows embedded binaries reliably stop instead of leaving their
proxy port bound.
- PAC DNS helpers no longer hold up all PAC evaluation during slow name
resolution. Failed or timed-out dnsResolve() requests now return null,
so isResolvable() and isInNet() correctly reject unresolved hosts;
myIpAddress() no longer depends on hostname DNS (#273).
- IP-based --noproxy checks now use the bounded DNS resolver and reuse its
cached results instead of performing a new unbounded DNS lookup per request
(#273).
- --idle now also applies to plain-HTTP transfers: a response that sends no
data for that long is aborted.
- Listen backlog raised from 128 to 2048, avoiding ~1 second SYN-retransmit
stalls at 200+ concurrent connections.
- TCP_NODELAY is now set on accepted client connections on the plain asyncio
loop, removing ~40 ms per round trip on CONNECT tunnels.
- Fixed --kerberos crashing Px at startup with OSError: [Errno 9] Bad file descriptor on hosts where kinit is not installed; Px now logs
Kerberos: kinit not found and keeps running.
Internal
- macOS test jobs (the CI test and benchmark jobs and test-binary) now run on
uv-managed CPython instead of setup-python's. On the macOS |
| 0.12.0 | 21 جولائی، 2026 | — | 64 بٹ ZIP ریلیز نوٹسNew features
- PAC file encoding is now auto-detected using an extended browser-compatible
algorithm: HTTP Content-Type charset (for URL-loaded PACs), then BOM check,
then UTF-8, then Windows code page cascade (cp1252, cp1251), then Latin-1
fallback. This handles enterprise environments where IIS or other Windows
servers serve PAC files in cp1252 or cp1251 without proper charset headers.
The --pac_encoding option remains available as an explicit override if
auto-detection does not work. PAC decode and load failures are now always
printed instead of being hidden behind --debug (#269).
Bug fixes
- Fixed --workers > 1 crashing on Windows with OSError: [WinError 87] due
to IOCP socket registration conflict. Each worker now creates its own
independent listening sockets instead of sharing from the parent process
(#267).
- Enabled --workers on macOS — previously disabled because the old socket
sharing approach was incompatible. The new per-worker socket model uses
SO_REUSEPORT on Linux and macOS and SO_REUSEADDR on Windows.
- Fixed px randomly becoming unresponsive after running for days when using
--debug mode. os.fsync() in the debug log write path could block the
asyncio event loop indefinitely on slow or locked filesystems (antivirus,
network drives). Replaced with file.flush() which pushes data to the OS
page cache without blocking (#268).
Improvements
- Px now automatically raises the open file descriptor soft limit
(RLIMIT_NOFILE) at startup on Linux and macOS. macOS launchd defaults to
256 and Linux defaults to 1024, both too low for a proxy handling concurrent
CONNECT tunnels. The limit is raised to min(hard_limit, 65536) with a
step-down fallback for macOS where kern.maxfilesperproc may reject high
values (#272). |
| 0.11.0 | 3 اپریل، 2026 | — | 64 بٹ ZIP ریلیز نوٹسNew features
- Added Kerberos ticket management (--kerberos) for Linux and macOS — Px
acquires and renews Kerberos tickets automatically using kinit with the
configured --username and password from PX_PASSWORD or keyring. No keytab
file is created. Addresses #252 and #258.
Bug fixes
- Fixed auth failure recovery when a Kerberos ticket becomes available after Px
startup — clearing MCURL.failed allows previously-blocked proxies to be
retried (#258).
- Fixed --verbose output not appearing in non-TTY environments (e.g. Docker
with workers=1) due to Python block-buffering stdout.
Docker
- Added BUILDER build arg and local builder stage to Dockerfile to support
both CI (pre-built wheel) and local (source tree) builds.
- The full Docker image now requires --cap-add IPC_LOCK — gnome-keyring 48+
(Alpine 3.23+) links libcap-ng which aborts without the IPC_LOCK capability.
Improvements
- Replaced synchronous http.server + threading with asyncio + h11.
CONNECT tunnels now use zero-thread bidirectional relays: TunnelRelay
(FD watchers via add_reader/add_writer) on Linux, and
_async_tunnel_relay (asyncio StreamReader/StreamWriter for the
client side, IOCP-backed sock_recv/sock_sendall for the upstream
libcurl socket) on Windows. Thread count stays bounded at the thread
pool size regardless of active tunnel count.
- Changed --workers default from 2 to 1 — the async event loop handles
concurrency without multiple processes.
- Reduced per-request overhead: double-checked locking in reload_proxy(),
cached get_curl_features() and noproxy_hosts, shallow copy for proxy
server lists, tuples for hot-path membership checks.
- Optimized --verbose logging: skipped file I/O overhead and
process/thread name lookup when --workers=1. Log output is more
compact (timestamp + call tree + message) while retaining diagnostic value.
- Added Winget package support — Px can now be installed on Windows via
winget install genotrance.px. Manifests are submitted automatically on
release via vedantmgoyal9/winget-releaser. Addresses #115, PR #264.
- Documented WinSW service account and environment variable options for
running Px as a Windows service with SSPI or explicit credentials (#259).
Internal
- Added h11 runtime dependency, psutil dev dependency.
- Wired --threads to asyncio default executor pool size.
- Dynamic xdist worker count (-n auto) — auto-scales to hardware via a
platform-aware pytest_xdist_auto_num_workers hook in conftest.py.
- Switched test fixtures and helpers from --debug (file logging) to
--verbose (stdout logging), reducing test suite runtime by ~58%.
- Added concurrency benchmark tests (make benchmark) covering HTTP
throughput, CONNECT tunnel throughput, thread pool saturation, active data
exchange, thread count bounds, and memory bounds. Benchmarks now test up to
1 000–1 024 concurrent connections with sliding success thresholds for
barrier-synchronised active tunnel tests.
- Added large data transfer reliability tests (make test-large-data) with
SHA-256 integrity verification for concurrent multi-MB GET/POST over HTTP
and HTTPS. CI jobs run these on both Linux and Windows. |
| 0.10.3 | 11 مارچ، 2026 | — | 64 بٹ ZIP ریلیز نوٹسBug fixes
- Fixed #248 — check install cmd if modified.
- Fixed #255 — handle Python v3.13 runtime context on startup.
- Fixed set_client_auth() mutating the global AUTH_SUPPORTED list when
called with ANY or ANYSAFE — now copies the list.
- Fixed cfg_int_init()/cfg_float_init() passing invalid string values to
callbacks when config values fail to parse — now falls back to default.
- Fixed send_html() in handler inserting a tuple instead of a string into
the error page explain field.
- Fixed file_url_to_local_path() returning None for non-Windows file URLs.
- Fixed --hostonly and --quit failing in emulated/virtualized environments
(QEMU, Docker on ARM) by adding a fallback when psutil.net_if_stats() is
unavailable (psutil#2693).
Improvements
- Replaced quickjs dependency with quickjs-ng.
- Dropped Python 3.8 and 3.9 support; minimum is now Python 3.10.
- Added Python 3.14 classifier.
- Restructured README.md with basic install/config/usage info and full
github.com links (for PyPI/Docker Hub display).
- Made docs/configuration.md a complete user-facing reference with all CLI
flags, environment variables, INI keys, defaults, and auth types.
- Split detailed documentation into user-facing (docs/installation.md,
docs/usage.md, docs/configuration.md) and developer (docs/architecture.md,
docs/build.md, docs/testing.md) sections.
Internal
- Modernised project tooling: ruff, mypy, pre-commit, Makefile, docs/ folder.
- CI workflow (ci.yml) now triggers on devel push and PRs only (not
master). Test matrix expanded to 9 jobs: Ubuntu on Python 3.10–3.14, macOS
on 3.10 and 3.14, Windows on 3.10 and 3.14.
- Build workflow (build.yml) now triggers on master push and
workflow_dispatch only. Docker build and push steps merged into the
release job (separate docker job removed).
- Added Dependabot configuration for monthly pip and GitHub Actions updates.
- tools.py: all sys.exit() calls changed to sys.exit(1) for proper error
propagation. Docker function updated to accept --push flag and
--wheels-dir option for CI usage.
- build.sh: added build_local function for end-to-end local build and test
using Docker containers (musl or glibc). Added auditwheel to pip install in
build_binary for both musl and glibc. Added error checking (|| return 1)
to build_local steps.
- Added test-musl and test-glibc Makefile targets for local container
testing.
- Updated GitHub Actions to Node 24: actions/setup-python v6,
astral-sh/setup-uv v7, Docker actions v4.
- Fixed build workflow: Linux musl Nuitka builds now use Alpine containers
(both x86_64 and aarch64) since musllinux containers lack Python dev headers
needed by Nuitka. Linux glibc builds use Python 3.13 from the manylinux
container (/opt/python/cp313-cp313/). All Linux container builds install
uv via curl consistently.
- Fixed test-binary workflow: release archives from the binary job are now
extracted before testing. The PXBIN environment variable is now properly
exported to tox so the binary tox environment actually tests the compiled
Nuitka/embedded binary.
- Resolved ruff violations in px/ package — reduced suppressed rules to
minimal intentional set.
- Ported HISTORY.txt to docs/changelog.md and removed the original file.
- Expanded docs/architecture.md with State singleton, request handling, spnego
monkey-patching, PAC evaluation, proxy reload, and error handling details.
- Expanded pytest suite: added test_debug.py, test_wproxy.py, test_pac.py,
test_network.py; expanded test_config.py with unit tests for utility
functions and defaults. Deleted legacy test.py.
- Updated tox configuration to run all test files.
- Added ./mcurllib as local wheel index to Makefile install for testing with
unreleased mcurl versions.
- Cleaned up tools.py: removed obsolete functions (get_curl, pyinstaller,
scoop, and all GitHub API release management). Remaining targets are
--wheel, --nuitka, --embed, --deps, --depspkg, and --docker.
- Removed old build.sh and build.ps1 monolithic build scripts — replaced
by GitHub Action |
| 0.10.2 | 7 اپریل، 2025 | — | 64 بٹ ZIP ریلیز نوٹس- Fixed #246 - resolved crash caused by PAC hostname resolution
- Added gui script pxw.exe to run Px in the background on Windows, addressing
#203, #213 and #235 by providing correct path for px.ini and logs.
- Enhanced px --install to write --config=path into the registry to support
non-standard locations for px.ini
- Fixed #217 - updated px --install to write pxw into the registry to run
Px in the background on Windows startup
- Added support to read and write px.ini from the user config directory
- Fixed #218 - improved config load order to cwd, user config or script path
if file already exists. If --save, the file should be writable, otherwise use
the user config directory. |