Skip to main content

PxSteamDL

A small C++20 library and CLI that replaces steamcmd +login anonymous +workshop_download_item 294100 <id>. It logs in to Steam anonymously and downloads RimWorld Workshop items in parallel.

Notice: This project is made for PyXiion/PxModRim.

Disclaimer: PxSteamDL is not affiliated with or endorsed by Valve. It only downloads content that Steam serves to anonymous accounts.

It talks to Steam directly:

  • a CM WebSocket session for anonymous logon, the depot key and manifest request codes;
  • the public Web API for item details and CDN servers;
  • SteamPipe CDN over HTTPS for manifests and chunks.

The protocol follows DepotDownloader / SteamKit2 (-app 294100 -pubfile <id>).

Why not an existing library

Project Language Notes
DepotDownloader / SteamKit2 C# Does this exact job (-pubfile), but needs the .NET runtime
ValvePython/steam, node-steam-user Python / JS Full clients, wrong runtime
steamdepot, steam-vent Rust Depot downloaders, not C++
SteamPP C++ Unmaintained SteamKit port with chat/logon only; no depot/CDN support, legacy TCP

None of them is a maintained C++ library, so this project implements the needed subset.

Build

Requirements: CMake ≥ 3.24 and a C++20 compiler (GCC, Clang/Apple Clang or MSVC). Linux, macOS and Windows are supported.

Everything else is fetched by CPM at configure time, pinned and hash-checked, and linked statically: curl (HTTP/1.1, WebSockets), mbedTLS 3.6, zlib, zstd, liblzma and nlohmann_json. No system libraries beyond the C/C++ runtime are used. Set CPM_SOURCE_CACHE to reuse the downloads between build directories.

TLS trusts only the Mozilla CA bundle published by curl (cacert-<date>.pem, pinned in CMakeLists.txt), which is compiled into the library; the operating system's certificate store is not consulted.

cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build

To build and run the unit tests, add -DPXSTEAMDL_BUILD_TESTS=ON and run ctest --test-dir build; see CONTRIBUTING.md, which also describes the code style.

CLI

pxsteamdl [-o DIR] [-j PARALLEL_ITEMS] [-t THREADS_PER_ITEM] [--] ITEM_ID...

pxsteamdl --version prints the version and -h/--help the usage (exit code 0); -- ends the options.

Each item goes into DIR/<ITEM_ID>/, which matches steamcmd's steamapps/workshop/content/294100/<ITEM_ID>. The exit code is 1 if any item fails. Ctrl-C stops the batch: requests in flight finish, unfinished items are reported as cancelled, and the exit code is 130. A second Ctrl-C quits immediately.

Standalone prebuilt binaries for Linux x86_64, macOS arm64, and Windows x64 are attached to GitHub Releases.

Library

#include <pxsteamdl/pxsteamdl.hpp>

pxsteamdl::Client client;  // anonymous logon; throws pxsteamdl::Error on failure
std::vector<std::uint64_t> ids{2009463077, 818773962};
pxsteamdl::Options options;
options.on_resolved = [](const pxsteamdl::ItemInfo& i) { /* title known, no bytes yet; called on this thread */ };
options.on_progress = [](const pxsteamdl::Progress& p) { /* called from worker threads */ };
for (const auto& r : client.download(ids, "mods", options))
    if (!r.ok()) std::fprintf(stderr, "%llu: %s\n", (unsigned long long)r.item_id, r.error.c_str());

download() returns one Result per entry of ids, in order. A repeated ID is downloaded once (on_resolved is called once for it) and every occurrence gets the same Result. Result::path is root/<id> for every item, failed ones included; after a failure it holds the previous copy, if there was one.

Errors. Result::error is a message for people; its wording may change. To decide what to do, use Result::error_kind (ItemInfo has it too, and Error::kind() for the exception of Client's constructor):

ErrorKind Meaning
kNone success
kCancelled stopped through Options::stop (the message is exactly cancelled; cancelled() tests for it)
kNotFound Steam does not have the item
kRejected Steam or a CDN refused: private item, access denied, HTTP 4xx
kNetwork network or service failure that survived the automatic retries; trying again later may work
kData Steam sent data that cannot be used (malformed, checksum mismatch, unsafe path)
kFilesystem a local file or directory could not be written
kOther anything else

Downloaded and unpacked bytes. Progress and Result count both: downloaded_* is what came over the network (chunks as the CDN serves them, encrypted and compressed), unpacked_* is what was decrypted, decompressed and written (the size on disk). Use the first for a transfer rate and the second for a progress bar. They cover only what had to be fetched in this run: an item that is already up to date reports zeros.

Connection settings. pxsteamdl::Client(ClientOptions{...}) takes a proxy (not set: libcurl's environment variables; empty: no proxy), a connect_timeout and a stall_timeout. A Client can be moved.

Callbacks that throw. An exception from on_progress (worker threads) fails the item it was called for (error_kind kOther) and the others go on; one from on_resolved propagates out of download() after the items under way have been stopped. In Python, exceptions from either are reported through sys.unraisablehook and the download goes on. download() throws std::invalid_argument if parallel_items or threads_per_item is 0.

To cancel, pass a std::stop_token in Options::stop. Once stop is requested, in-flight chunk requests finish, the remaining work is skipped and every unfinished item reports Result::error == "cancelled"; items that already completed stay successful and download() returns normally. As with failures, temporary files are removed and the existing files of unfinished items are not replaced.

std::stop_source stop;
options.stop = stop.get_token();
// from another thread: stop.request_stop();

pxsteamdl::Version() returns the version of the library, and PXSTEAMDL_VERSION_MAJOR, _MINOR, _PATCH and _STRING (from <pxsteamdl/version.hpp>, included by the main header) that of the headers; in Python it is pxsteamdl.__version__.

Link against the PxSteamDL::pxsteamdl CMake target, after add_subdirectory or CPMAddPackage, or against an installed copy:

cmake --install build --prefix /some/prefix
find_package(PxSteamDL 1.0 CONFIG REQUIRED)  # with -DCMAKE_PREFIX_PATH=/some/prefix
target_link_libraries(app PRIVATE PxSteamDL::pxsteamdl)

The installed library is a single static archive that already contains curl, mbedTLS, zlib, liblzma and zstd, so nothing but the system libraries is needed to link it. (Before 1.0, a new minor version may change the API, so find_package accepts only a version with the same minor number.) The install also contains the CLI (bin/pxsteamdl). Single-configuration generators only. The CLI executable is built as build/pxsteamdl.

Python

Prebuilt wheels (CPython 3.10–3.14 on Linux x86_64 (manylinux_2_28), macOS arm64 (11.0+) and Windows x64) are attached to the GitHub Releases; install one with pip install <wheel URL or file>. Alternatively, build from source (needs CMake and a C++20 compiler):

pip install git+https://github.com/PyXiion/PxSteamDL   # or, from a checkout: pip install .
import pxsteamdl

client = pxsteamdl.Client()  # anonymous logon; raises pxsteamdl.Error (a RuntimeError) on failure

def on_progress(p: pxsteamdl.Progress) -> None:  # called from worker threads
    print(f"{p.item_id} {p.title}: {p.unpacked_bytes}/{p.unpacked_total}")

def on_resolved(i: pxsteamdl.ItemInfo) -> None:  # once per item, before its bytes; same thread as download()
    print(f"queued {i.item_id}: {i.title}" if not i.error else f"{i.item_id}: {i.error}")

for r in client.download([2009463077, 818773962], "mods", on_progress=on_progress, on_resolved=on_resolved):
    print(r.item_id, r.title, r.path if r.ok else f"{r.error_kind.name}: {r.error}")

The same names exist in Python: Result.error_kind is a pxsteamdl.ErrorKind (NONE, CANCELLED, NOT_FOUND, REJECTED, NETWORK, DATA, FILESYSTEM, OTHER), Result.cancelled and Result.ok are properties, and Client(proxy=None, connect_timeout=10, stall_timeout=30) takes the connection settings (proxy="" means no proxy). pxsteamdl.Error (a RuntimeError with a kind attribute) is what Client() raises when the logon fails. Result, ItemInfo and Progress can be constructed with keyword arguments, e.g. to test code that takes them.

download releases the GIL, and one Client may be used from several threads. Overlapping downloads into the same item directory wait for each other; the wait can be cancelled. An exception raised by on_progress or on_resolved is reported like an exception in a thread (sys.unraisablehook) and does not stop the download. The package ships type stubs.

download also takes cancel=pxsteamdl.CancelToken(); calling token.cancel() from another thread stops it the same way as Options::stop in C++.

asyncio

AsyncClient runs logon and downloads in worker threads, so the event loop keeps running. AsyncClient.create() takes the arguments of Client; AsyncClient(client) wraps a Client you already have. Several downloads may run concurrently on one client. on_progress and on_resolved are called on the event loop thread. Cancelling the task (including via asyncio.wait_for timeouts) stops the download, waits until in-flight requests finish and temporary files are removed, then raises CancelledError.

import asyncio
import pxsteamdl

async def main() -> None:
    client = await pxsteamdl.AsyncClient.create()
    harmony, rest = await asyncio.gather(
        client.download([2009463077], "mods"),
        client.download([818773962], "mods", on_progress=lambda p: print(p.item_id, p.unpacked_bytes)),
    )
    try:
        await asyncio.wait_for(client.download([2016436324], "mods"), timeout=60)
    except asyncio.TimeoutError:  # TimeoutError on Python 3.11+
        print("gave up; run again to resume")

asyncio.run(main())

Examples

Complete programs that use the whole API are in examples/: download.cpp (C++; built with -DPXSTEAMDL_BUILD_EXAMPLES=ON), download.py (synchronous Python) and download_async.py (asyncio). Each takes a directory and item IDs.

Behaviour

  • Updates are incremental: a file whose size and SHA-1 already match the manifest is not downloaded again. Files and directories that are not in the manifest are deleted, as steamcmd does.
  • Files are assembled under a temporary name and renamed into place after the SHA-1 check, so an interrupted run never leaves a truncated file under its real name.
  • Each item is built in a temporary sibling directory. All files and symlinks are prepared before the old directory is moved aside and the new one installed; an installation error restores the old directory. Unchanged files are reused by hard link, or copied locally if hard links are unavailable. Changing their executable permissions uses a separate copy so a failed update does not change the previous files.
  • Downloads coordinate through DIR/.<ITEM_ID>.lock containing the owner's PID and an exclusive kernel lock (flock on Linux/macOS, LockFileEx on Windows). The lock covers planning through installation and cleanup, across clients and processes. An occupied destination is waited for, interruptibly. On Linux/macOS, normal release removes the file while still holding the lock; waiters verify the inode and reopen the path if it changed. Windows keeps the file. Process exit releases the kernel lock automatically; after a crash, a later owner can reuse a leftover file regardless of its recorded PID. Cleanup is best-effort if unlinking fails. Do not delete lock files manually while downloads are running. When upgrading from persistent-lock versions (including 0.3.0), stop all older downloads first: old clients do not revalidate inodes and cannot safely share a destination with new ones.
  • Cancellation is checked before installation. Once directory replacement starts it finishes or rolls back; there is a brief interval between the two renames when the item directory is absent. Other downloads are locked out, but readers that do not take the lock can observe that interval. This is rollback for ordinary errors, not crash recovery: a killed process or power loss during installation can leave the old copy in the temporary sibling.
  • Every chunk is checked (Adler-32 and size) after it is decrypted and decompressed.
  • Manifest paths are untrusted: absolute paths and .. components are rejected. On Windows, names Windows cannot represent faithfully (containing : or other reserved characters, device names such as CON, trailing dots or spaces) fail the item.
  • Symlinks from the manifest are recreated as symlinks. Windows allows creating them only with Developer Mode enabled or with administrator rights; otherwise an item that contains symlinks fails with an error saying so.
  • Transient failures (HTTP 429 and 5xx, network errors, Steam answering busy, timed out or rate limited) are retried up to four times with growing pauses (about 0.5 s, 1 s, 2 s); a CDN download also pauses before it tries the next host. Permanent failures (404, a rejected depot key, a corrupt chunk) are not retried, and a stop request ends a pause at once.
  • Item details are looked up in batches of 100 while earlier items download: each item is queued as soon as its batch is answered. A failed details request fails only the items of its batch.
  • A failed item is reported in Result::error and does not stop the other items in the batch. Steam's result codes are spelled out, e.g. Steam rejected the item: not found (EResult 9).

License

PxSteamDL is licensed under the GNU Lesser General Public License v3.0 or later (LGPL-3.0-or-later). See COPYING.LESSER and COPYING.

Metadata

Release files for pxsteamdl 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pxsteamdl 0.4.0
File Size Uploaded Provenance
pxsteamdl-0.4.0.tar.gz 123.0 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for pxsteamdl 0.4.0
File
pxsteamdl-0.4.0-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
pxsteamdl-0.4.0-cp312-abi3-manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.28+ x86-64 Details
pxsteamdl-0.4.0-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details
pxsteamdl-0.4.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
pxsteamdl-0.4.0-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details
pxsteamdl-0.4.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
pxsteamdl-0.4.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
pxsteamdl-0.4.0-cp310-cp310-manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64 Details
pxsteamdl-0.4.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 10.6 MB

Release files / pxsteamdl-0.4.0.tar.gz

Download URL pxsteamdl-0.4.0.tar.gz
Size 123.0 kB
Tags Source
SHA-256 checksum
How to use checksums
0fa0430ccc0479d517a5157d4372f50ccc458ef6212b1b8d3e5bcadfe7583180
BLAKE2b-256 checksum
How to use checksums
a8c96ccab10843266c16d5647dc6a3314f80efedd6dc22f993816920d84e77b9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp312-abi3-win_amd64.whl

Download URL pxsteamdl-0.4.0-cp312-abi3-win_amd64.whl
Size 1.2 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
36cf90523fe446fb1202a21f9f3ca19d77d1f6633936915eebbc723801dbbc72
BLAKE2b-256 checksum
How to use checksums
e716c131bdf64e142f42df2490f092abee11f58f4f07f4bdcc632459ac0b7be7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp312-abi3-manylinux_2_28_x86_64.whl

Download URL pxsteamdl-0.4.0-cp312-abi3-manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.12 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
631336f3ea2d7177e479c9141da05da96f328dd9e2e2c1e2ec1bd6c4d01b8b27
BLAKE2b-256 checksum
How to use checksums
73dfab4bb76b62add12c1030fb41ec23895d1f552a8b22100f8dd9a0a8ad7aa5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp312-abi3-macosx_11_0_arm64.whl

Download URL pxsteamdl-0.4.0-cp312-abi3-macosx_11_0_arm64.whl
Size 985.7 kB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b2c45ad4a5755dcf90127f4a9ad855d08fd06fb6481ed56d88ebfb6658bd254b
BLAKE2b-256 checksum
How to use checksums
447d9dc2ef725240d2368047cc0b77c8eb10a5f378a0c00657bde23623dac2c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp311-cp311-win_amd64.whl

Download URL pxsteamdl-0.4.0-cp311-cp311-win_amd64.whl
Size 1.2 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
1828ca246def658a5a6af489d95e81167e6d0c887ba9f65f04cb4410fa548532
BLAKE2b-256 checksum
How to use checksums
9846d4dc2031be92363b81b76391200c536d7c2cdace20c74bd6d3df2591db0c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL pxsteamdl-0.4.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
5b2004a591aee2b7ba040ef0a688edcc855444d52913573ae76b68e64c0d4898
BLAKE2b-256 checksum
How to use checksums
ea83418a3379010b1dba6290b8495900c5c720f2b61a6e8afad127645693d91f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL pxsteamdl-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Size 986.7 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f2618523ff5135a6d3bf324888e7a5af209287c2616cb61ed53782ce8644371d
BLAKE2b-256 checksum
How to use checksums
35713075a803bb578730cec11e88afd1483098f506beb47f5978bef8b46e49fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp310-cp310-win_amd64.whl

Download URL pxsteamdl-0.4.0-cp310-cp310-win_amd64.whl
Size 1.2 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
3d939810956346099e3e77e4e1817c86dbe0f9debddf9e33d0e0a44749087fae
BLAKE2b-256 checksum
How to use checksums
5ebf443eeabb897e8b5f39a57db1c66b1f76444d9bbb0b532d71a84bd251a8a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp310-cp310-manylinux_2_28_x86_64.whl

Download URL pxsteamdl-0.4.0-cp310-cp310-manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
01c76c11d5ca55f14028e68fa2311ee012f9ddd5a23ae1e4790eddfa072d79db
BLAKE2b-256 checksum
How to use checksums
942ce9cafeeaf5dfa1c10cf687a398f9d45c29d722ed78c3a1931f1ec91452f5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / pxsteamdl-0.4.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL pxsteamdl-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
Size 986.7 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b1cc8ec126394933f95c8b0713ed1243837e9ad1ce3c91b8dc91bbcc3e0f1885
BLAKE2b-256 checksum
How to use checksums
c820b7473e5f19fe81d75ddbdb746c8c7b319cbeda733fb41a97b5b9c900787c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Security for pxsteamdl 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 10 files in this release have been uploaded with provenance metadata.

Select from 10 files

Attestation for pxsteamdl-0.4.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.4.0 This release

10 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page