Skip to main content

Rust-powered Python SDK for async WhatsApp automation with typed bindings and event-driven APIs

Project description

Tryx

Tryx is a Rust-powered Python SDK for building WhatsApp automations with an async-first developer experience, typed APIs, and high runtime efficiency.

It combines:

  • Rust for protocol, transport, and runtime-heavy work
  • PyO3 for Python bindings
  • Tokio for async orchestration
  • Protobuf interop via generated WhatsApp Python types

Why Tryx

  • Low-latency runtime path for event processing
  • Python-friendly API surface for application logic
  • Structured event model with explicit classes
  • Optional blocking mode for script-style execution
  • Typed package distribution with .pyi and py.typed

Key Features

  • Async bot lifecycle: await bot.run()
  • Blocking lifecycle for simple scripts: bot.run_blocking()
  • Event registration decorator: @bot.on(EventType)
  • Messaging API (text, media upload, media download)
  • Dedicated contact namespace: client.contact.*
  • Dedicated chat-actions namespace: client.chat_actions.*
  • Dedicated community namespace: client.community.*
  • Dedicated newsletter namespace: client.newsletter.*
  • Dedicated groups namespace: client.groups.*
  • Dedicated status namespace: client.status.*
  • Dedicated chatstate namespace: client.chatstate.*
  • Dedicated blocking namespace: client.blocking.*
  • Dedicated polls namespace: client.polls.*
  • Dedicated presence namespace: client.presence.*
  • Dedicated helper namespace: tryx.helpers.*
  • Rich event payload classes with lazy conversion where possible

Architecture Overview

Tryx is split into two layers:

  1. Core (Rust)
  • Transport, protocol state, and event stream integration
  • WhatsApp runtime from submodule stack in libs/whatsapp-rust
  • PyO3 bindings in src/
  1. Interface (Python)
  • Dynamic re-export modules in python/tryx/*.py
  • Type stubs in python/tryx/*.pyi
  • Generated protobuf package in python/tryx/waproto

Native Binding Advantages (Rust + PyO3)

Tryx uses native Rust bindings instead of a pure-Python protocol implementation. This gives concrete benefits for this specific project:

  • Lower CPU overhead on hot paths such as event parsing and media/protobuf conversion.
  • Better memory behavior because heavy objects stay in Rust and are exposed to Python only when needed.
  • Async safety and runtime control from Tokio while keeping Python application code simple.
  • Ability to cache expensive Python type lookups once (PyOnceLock) and reuse them across events.
  • Cleaner separation: Rust handles protocol/runtime mechanics, Python handles business logic and integrations.

In practical terms, this means Python callbacks remain expressive while most protocol-heavy work stays fast and predictable.

Centralized PyOnceLock Cache

Event protobuf type caches are centralized in src/events/proto_cache.rs.

Why this helps:

  • All static PyOnceLock declarations are in one file.
  • All cache lookup helpers are in one place.
  • Easier maintenance and code search when adding/removing protobuf-backed fields.
  • Lower risk of duplicated cache logic in multiple event files.

The event layer now consumes cache helpers from this module, keeping event structs focused on payload mapping instead of cache plumbing.

Concurrency and Overhead Model

Tryx currently uses watch::Receiver<Option<Arc<Client>>> to expose the active client across binding objects.

Why this is a good default for PyO3 async bindings:

  • watch::Receiver is read-optimized and cheap to clone.
  • Stored value is Arc<Client>, so clone cost is minimal (atomic refcount).
  • Works naturally with Tokio async context.
  • Avoids explicit lock management in Python-exposed methods.

Compared to RwLock<Option<Arc<Client>>>:

  • RwLock adds lock acquisition on every read path.
  • It can increase contention under frequent method calls.
  • In mixed Python/Rust workloads, lock handoff can be noisier than watch read snapshots.

Recommendation:

  • Keep watch::Receiver<Option<Arc<Client>>> for low overhead and async safety.
  • Use RwLock only if you need mutable shared state beyond swapping client snapshots.

Contact Client Design

Tryx now exposes contact APIs through a dedicated ContactClient pyclass:

  • client.contact.get_info(...)
  • client.contact.get_user_info(...)
  • client.contact.get_profile_picture(...)
  • client.contact.is_on_whatsapp(...)

This keeps TryxClient focused on messaging/media and keeps contacts grouped by responsibility with no extra heavy synchronization cost.

Project Structure

  • src/lib.rs: PyO3 module bootstrap and submodule registration
  • src/clients/tryx.rs: main Tryx runtime wrapper
  • src/clients/tryx_client.rs: messaging/media client methods
  • src/clients/contacts.rs: contact-specific client methods
  • src/events/: dispatcher and event payload classes
  • src/types.rs: core Python-exposed value types (JID, MessageInfo, ...)
  • python/tryx/: Python package surface and stubs
  • python/tryx/waproto/: generated protobuf Python files
  • libs/whatsapp-rust/: embedded rust stack dependencies

Documentation Site (MkDocs Material)

A full documentation site is provided with MkDocs Material.

Install docs dependencies:

uv sync --group docs

Run local docs server:

uv run mkdocs serve

Build docs in strict mode:

uv run mkdocs build --strict

Installation

Prerequisites

  • Python 3.8+
  • Rust stable toolchain
  • uv

Development install (editable)

uv sync --group dev
uv run maturin develop

Build wheel

uv run maturin build --release

Wheels are produced under target/wheels or project-specific wheel output depending on command options.

Quick Start

import asyncio
from tryx.backend import SqliteBackend
from tryx.client import Tryx, TryxClient
from tryx.events import EvMessage
from tryx.waproto.whatsapp_pb2 import Message

backend = SqliteBackend("whatsapp.db")
bot = Tryx(backend)

@bot.on(EvMessage)
async def on_message(client: TryxClient, event: EvMessage) -> None:
    text = event.data.get_text() or "<non-text>"
    chat = event.data.message_info.source.chat
    await client.send_message(chat, Message(conversation=f"Echo: {text}"))

async def main() -> None:
    await bot.run()

if __name__ == "__main__":
    asyncio.run(main())

Command Bot Example (examples)

Contoh siap pakai tersedia di examples/command_bot.py.

Fitur contoh:

  • command router berbasis EvMessage
  • quoted reply pada semua balasan command
  • download profile picture pengirim, lalu kirim kembali ke chat
  • ambil pushname dari metadata pesan
  • ambil bio/about dari contact API
  • log update pushname dan bio realtime (EvPushNameUpdate, EvUserAboutUpdate)

Command yang tersedia:

  • ping -> pong
  • pp -> kirim ulang profile picture pengirim
  • pushname -> tampilkan pushname pengirim
  • bio -> tampilkan bio/about pengirim
  • help / menu -> tampilkan daftar command

Run:

uv run python examples/command_bot.py

Opsional env:

  • TRYX_DB_PATH (default whatsapp.db)

Python API Reference (High Level)

Backend

  • SqliteBackend(path: str)

Bot controller

  • Tryx(backend)
  • Tryx.on(event_type)
  • await Tryx.run()
  • Tryx.run_blocking()
  • Tryx.get_client() -> TryxClient

Runtime client

  • TryxClient.contact -> ContactClient
  • TryxClient.chat_actions -> ChatActionsClient
  • TryxClient.community -> CommunityClient
  • TryxClient.newsletter -> NewsletterClient
  • TryxClient.groups -> GroupsClient
  • TryxClient.status -> StatusClient
  • TryxClient.chatstate -> ChatstateClient
  • TryxClient.blocking -> BlockingClient
  • TryxClient.polls -> PollsClient
  • TryxClient.presence -> PresenceClient
  • TryxClient.privacy -> PrivacyClient
  • TryxClient.profile -> ProfileClient
  • TryxClient.send_message(...)
  • TryxClient.send_text(...)
  • TryxClient.send_photo(...)
  • TryxClient.send_document(...)
  • TryxClient.send_audio(...)
  • TryxClient.send_video(...)
  • TryxClient.send_gif(...)
  • TryxClient.send_sticker(...)
  • TryxClient.request_media_reupload(...)
  • TryxClient.download_media(...)
  • TryxClient.upload(...)
  • TryxClient.upload_file(...)

Return value penting:

  • send_message/send_text/send_photo/send_document/send_audio/send_video/send_gif/send_sticker mengembalikan SendResult.
  • request_media_reupload mengembalikan MediaReuploadResult.

Contact namespace

  • ContactClient.get_info(phones)
  • ContactClient.get_user_info(jid)
  • ContactClient.get_profile_picture(jid, preview)
  • ContactClient.is_on_whatsapp(jids)

Chat actions namespace

  • ChatActionsClient.archive_chat(jid, message_range=None)
  • ChatActionsClient.unarchive_chat(jid, message_range=None)
  • ChatActionsClient.pin_chat(jid)
  • ChatActionsClient.unpin_chat(jid)
  • ChatActionsClient.mute_chat(jid)
  • ChatActionsClient.mute_chat_until(jid, mute_end_timestamp_ms)
  • ChatActionsClient.unmute_chat(jid)
  • ChatActionsClient.star_message(chat_jid, participant_jid, message_id, from_me)
  • ChatActionsClient.unstar_message(chat_jid, participant_jid, message_id, from_me)
  • ChatActionsClient.mark_chat_as_read(jid, read, message_range=None)
  • ChatActionsClient.delete_chat(jid, delete_media, message_range=None)
  • ChatActionsClient.delete_message_for_me(chat_jid, participant_jid, message_id, from_me, delete_media, message_timestamp=None)
  • ChatActionsClient.build_message_key(...)
  • ChatActionsClient.build_message_range(...)

Community namespace

  • CommunityClient.create(options)
  • CommunityClient.deactivate(community_jid)
  • CommunityClient.link_subgroups(community_jid, subgroup_jids)
  • CommunityClient.unlink_subgroups(community_jid, subgroup_jids, remove_orphan_members)
  • CommunityClient.get_subgroups(community_jid)
  • CommunityClient.get_subgroup_participant_counts(community_jid)
  • CommunityClient.query_linked_group(community_jid, subgroup_jid)
  • CommunityClient.join_subgroup(community_jid, subgroup_jid)
  • CommunityClient.get_linked_groups_participants(community_jid)

Newsletter namespace

  • NewsletterClient.list_subscribed()
  • NewsletterClient.get_metadata(jid)
  • NewsletterClient.get_metadata_by_invite(invite_code)
  • NewsletterClient.create(name, description=None)
  • NewsletterClient.join(jid)
  • NewsletterClient.leave(jid)
  • NewsletterClient.update(jid, name=None, description=None)
  • NewsletterClient.subscribe_live_updates(jid)
  • NewsletterClient.send_message(jid, message)
  • NewsletterClient.send_reaction(jid, server_id, reaction)
  • NewsletterClient.get_messages(jid, count, before=None)

Groups namespace

  • GroupsClient.query_info(jid)
  • GroupsClient.get_participating()
  • GroupsClient.get_metadata(jid)
  • GroupsClient.create_group(options)
  • GroupsClient.set_subject(jid, subject)
  • GroupsClient.set_description(jid, description=None, prev=None)
  • GroupsClient.leave(jid)
  • GroupsClient.add_participants(jid, participants)
  • GroupsClient.remove_participants(jid, participants)
  • GroupsClient.promote_participants(jid, participants)
  • GroupsClient.demote_participants(jid, participants)
  • GroupsClient.get_invite_link(jid, reset)
  • GroupsClient.set_locked(jid, locked)
  • GroupsClient.set_announce(jid, announce)
  • GroupsClient.set_ephemeral(jid, expiration)
  • GroupsClient.set_membership_approval(jid, mode)
  • GroupsClient.join_with_invite_code(code)
  • GroupsClient.join_with_invite_v4(group_jid, code, expiration, admin_jid)
  • GroupsClient.get_invite_info(code)
  • GroupsClient.get_membership_requests(jid)
  • GroupsClient.approve_membership_requests(jid, participants)
  • GroupsClient.reject_membership_requests(jid, participants)
  • GroupsClient.set_member_add_mode(jid, mode)

Status namespace

  • StatusClient.send_text(text, background_argb, font, recipients, options=None)
  • StatusClient.send_image(upload, thumbnail, recipients, caption=None, options=None)
  • StatusClient.send_video(upload, thumbnail, duration_seconds, recipients, caption=None, options=None)
  • StatusClient.send_raw(message, recipients, options=None)
  • StatusClient.revoke(message_id, recipients, options=None)

Chatstate namespace

  • ChatstateClient.send(to, state)
  • ChatstateClient.send_composing(to)
  • ChatstateClient.send_recording(to)
  • ChatstateClient.send_paused(to)

Blocking namespace

  • BlockingClient.block(jid)
  • BlockingClient.unblock(jid)
  • BlockingClient.get_blocklist()
  • BlockingClient.is_blocked(jid)

Polls namespace

  • PollsClient.create(to, name, options, selectable_count)
  • PollsClient.vote(chat_jid, poll_msg_id, poll_creator_jid, message_secret, option_names)
  • PollsClient.decrypt_vote(enc_payload, enc_iv, message_secret, poll_msg_id, poll_creator_jid, voter_jid)
  • PollsClient.aggregate_votes(poll_options, votes, message_secret, poll_msg_id, poll_creator_jid)

Presence namespace

  • PresenceClient.set(status)
  • PresenceClient.set_available()
  • PresenceClient.set_unavailable()
  • PresenceClient.subscribe(jid)
  • PresenceClient.unsubscribe(jid)

Profile namespace

  • ProfileClient.set_push_name(name)
  • ProfileClient.set_status_text(text)
  • ProfileClient.set_profile_picture(image_data)
  • ProfileClient.remove_profile_picture()

Privacy namespace

  • PrivacyClient.fetch_settings()
  • PrivacyClient.set_setting(category, value)
  • PrivacyClient.set_disallowed_list(category, update)
  • PrivacyClient.set_default_disappearing_mode(duration_seconds)

Helper namespace

  • NewsletterHelpers.parse_message(data)
  • NewsletterHelpers.serialize_message(message)
  • NewsletterHelpers.build_text_message(text)
  • GroupsHelpers.strip_invite_url(code)
  • GroupsHelpers.build_participant(...)
  • GroupsHelpers.build_create_options(...)
  • StatusHelpers.build_send_options(privacy=...)
  • StatusHelpers.default_privacy()
  • ChatstateHelpers.composing()
  • ChatstateHelpers.recording()
  • ChatstateHelpers.paused()
  • BlockingHelpers.same_user(a, b)
  • PollsHelpers.decrypt_vote(...)
  • PollsHelpers.aggregate_votes(...)
  • PresenceHelpers.default_status()

Related typed models:

  • CreateCommunityOptions
  • CreateCommunityResult
  • CommunitySubgroup
  • LinkSubgroupsResult
  • UnlinkSubgroupsResult
  • GroupParticipant
  • GroupMetadata
  • GroupType
  • NewsletterVerification
  • NewsletterState
  • NewsletterRole
  • NewsletterReactionCount
  • NewsletterMetadata
  • NewsletterMessage
  • MemberLinkMode
  • MemberAddMode
  • MembershipApprovalMode
  • GroupParticipantOptions
  • CreateGroupOptions
  • CreateGroupResult
  • JoinGroupResult
  • ParticipantChangeResponse
  • MembershipRequest
  • GroupInfo
  • StatusPrivacySetting
  • StatusSendOptions
  • ChatStateType
  • BlocklistEntry
  • PollOptionResult
  • PresenceStatus
  • SendResult
  • MediaReuploadResult

Typing Support

Tryx ships as a typed Python package:

  • Stub files in python/tryx/*.pyi
  • Marker file python/tryx/py.typed

Recommended type checkers:

  • Pyright
  • Mypy
  • Pylance

Events

Event classes are generated from Rust-side event payloads and exposed under tryx.events.

Common patterns:

  • event.data for structured payload
  • lazy-converted proto fields (for lower eager conversion overhead)
  • datetime and typed references where available

Error Handling

Tryx exposes binding-level exceptions in tryx.exceptions, including:

  • FailedBuildBot
  • EventDispatchError
  • UnsupportedBackend
  • UnsupportedEventType

Backward-compatible aliases are also available for older names.

Development Workflow

Rust checks

cargo check

Python package sanity

uv run python -c "import tryx; print('ok')"

Type checking example

uv run pyright
# or
uv run mypy examples/command_bot.py

Pre-commit hooks

uv run pre-commit install --hook-type pre-commit --hook-type commit-msg
uv run pre-commit run --all-files

Performance Notes

  • Avoid creating Python objects before .await points in Rust async methods.
  • Construct Python values inside Python::attach(...) after async IO completes.
  • Return owned Py<T> from futures when required by Send bounds.
  • Keep payload conversion lazy when field access is infrequent.
  • Centralize Python type/proto caches to minimize repeated import/lookups.

Troubleshooting

Import error for native module

Symptom:

  • ModuleNotFoundError: No module named 'tryx._tryx'

Fix:

uv run maturin develop --release

Bot is not running

Symptom:

  • Python methods raise runtime error before run/start

Fix:

  • Ensure bot is started (run/run_blocking) and connected before invoking runtime client methods.

Type checker not reading stubs

Fix:

  • Ensure local install is active in your environment
  • Confirm py.typed is included in installed package
  • Restart language server

Security and Compliance

  • Keep secrets and session files outside version control
  • Use WhatsApp automation responsibly and within platform policy
  • Audit message handling callbacks before deploying production bots

Contributing

  • Contribution guideline: CONTRIBUTING.md
  • Docs page: docs/getting-started/contributing.md

License

See LICENSE for license terms.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tryx-0.2.0.tar.gz (1.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tryx-0.2.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (15.9 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

tryx-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

tryx-0.2.0-cp314-cp314-musllinux_1_2_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

tryx-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

tryx-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

tryx-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

tryx-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

tryx-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

tryx-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

tryx-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

File details

Details for the file tryx-0.2.0.tar.gz.

File metadata

  • Download URL: tryx-0.2.0.tar.gz
  • Upload date:
  • Size: 1.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0.tar.gz
Algorithm Hash digest
SHA256 c6c0952af9ecd42099d0feb3e07bfe80fc72dfa2ef07556cd1eb2473670caffd
MD5 c216b7fca69c7662052c5c36a4df7b02
BLAKE2b-256 8300983494c4487ef8f6c12c5f6437012b3a2a922c0d018cc71062eeb2121a21

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 15.9 MB
  • Tags: PyPy, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 292fa33ec32c7ee4219b9afd07002a34a8d16ccce68ce4ae2441a633756c0bb3
MD5 62791963970627ab5eaa565de090e19b
BLAKE2b-256 2bc90ed4e220c3bb4e5d42b32a3e5f06dcaf657eb76665a3c888a5c319413d2d

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.14t, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 96debd18af85249b6cd78fc9d3454bb665192c4351718e52fcd184e805bf4b59
MD5 f7aa9b355d70606d406e3a2a4362beea
BLAKE2b-256 59ff2af5cdcbc2bb9fd3d268af0104d9ca12cf2504357824cfa7f9a19ae186e2

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp314-cp314-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 15.9 MB
  • Tags: CPython 3.14, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bbd9cab093dec2c957b9ecdc3cd825af9a8b262dabf4a5c7d4af0cc55fcff47e
MD5 2d0bbb4cc7cf88a45a3b7c66042a78f9
BLAKE2b-256 4dbec1bdae677ff94e4ff1eed56a8da0b6676ee2685578e424ce3b6de491bd6c

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.13t, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 140f24fee971c44f2e46c3505bc8c989b8c104b224d4e4d008dec08a5f4b3282
MD5 efa257239e224337382dd0dd78114acd
BLAKE2b-256 3770094215336bef572fbc156e314a6e456a4eac2f3088f061424a789ee421f9

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.13, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 18b32cdb734fcb2fa01b7be921e595a1fa980d8740ec01e5819c5c53ef7b71c4
MD5 eb1e991fc52cbbe64cf0cd0bdaadb98e
BLAKE2b-256 a361df8df1e8ec2eae7df7c50c3fff71524ab2c3dcccb6aa60de6af5d5f011a1

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.12, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 39ab6bcfa12844f95e32339d4cca458f95d083d4ad96a79ebbd1c65e73ef1082
MD5 1899b8797524fd5f18e8cf25ec17d336
BLAKE2b-256 dd104448b42d4762f0fa52ac1a6a08fdcd3698adb4524aeab60c1059909e61b0

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.11, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b8ae41817d5e98f5ec03be09037abade744d6a1e6dd34c355d23831f4324170a
MD5 54efdb5216b194cd849784c3c2f3b86e
BLAKE2b-256 43adbf1ab2c7005b275287d6243b19ee4b0b05411edf8be6042fbfebc33612b1

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.10, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 121f481845f1a43c68db438e222ef8ef9a2fe7f767ead903ebdd25b196b52295
MD5 ff6387dabfcffc95a4f87fcce1ba8794
BLAKE2b-256 fc3d0d254299776488f9ff5cf244323049453fcd190caf60bd3c95745d564b03

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.9, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b3ea40e7e6670b25a344e465f9728eb53930bf2439cfc5f289467274c268a6c8
MD5 91b3e1a500c4b490ebefbf619eacbe60
BLAKE2b-256 40601849dc2a56a2e690894b4059d66164d1d9d12a28c1f76a120e0ece6d3a45

See more details on using hashes here.

File details

Details for the file tryx-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: tryx-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.8, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tryx-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 724617d036723a67aba9f9e9e64250c97955958d5e7fd25f68fb9f904923a376
MD5 dd245dac3b18c7223aea917804a64887
BLAKE2b-256 63a89fa12503741455ed8a3e5efa3a25054b416f87e8ee916bf44708e4ca9fd8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page