Skip to main content

🏷️ Fuda

A Python library for generating, parsing, and inspecting IDs.

Fuda supports 39 formats, from UUIDs and ULIDs to content identifiers like CID. Generate one ID or a batch, parse an ID from text, or read its timestamp and other fields. You can use it from Python or the command line.

Requires CPython 3.14+. Fuda includes a Rust extension and has no required third-party Python runtime dependencies.

Installation

Install in your virtual environment:

python -m pip install fuda

Wheels include the Rust extension for these platforms:

Platform Architectures
Windows x86-64, ARM64
macOS 11+ Intel, Apple Silicon
Linux with glibc 2.28+ x86-64, ARM64
Linux with musl 1.2+, including Alpine x86-64, ARM64

The same wheel works on standard CPython 3.14 and newer. Free-threaded Python and PyPy aren't supported.

To require a prebuilt wheel, use python -m pip install --only-binary=fuda fuda. Building from source, including an editable checkout, needs Rust and a native compiler for your platform.

Quick start

import fuda

ids = fuda.ULIDGenerator()
event_id = ids.generate()
batch = ids.generate_many(100)

users = fuda.TypeIDGenerator('user')
user_id = users.generate()

print(str(event_id))
print(event_id.timestamp_ms)
print(str(user_id))

assert fuda.validate('ulid', str(event_id))
assert fuda.ULID.from_str(str(event_id)) == event_id

Every generator has generate(), generate_many(count), and iter_ids(count). Keep the instance around to reuse its configuration and state.

UUID generators return uuid.UUID, CUID2 and NanoID return strings, and formats such as ULID return immutable value objects. Snowflake and Sonyflake return integers.

Supported formats

Import these classes from fuda. Use the lowercase format names with the parsing helpers and CLI.

Generators

Generator class Format name What you get
Cuid2Generator cuid2 Letter-led lowercase base36 string; 24 characters by default
UUID1Generator uuid1 Time-based UUID
UUID3Generator uuid3 Deterministic UUID from a namespace and name (MD5)
UUID4Generator uuid4 Random UUID
UUID5Generator uuid5 Deterministic UUID from a namespace and name (SHA-1)
UUID6Generator uuid6 Reordered time-based UUID
UUID7Generator uuid7 Millisecond timestamp and monotonic generation
UUID8Generator uuid8 Custom payload fields, random by default
ULIDGenerator ulid 26-character timestamped ID; monotonic generation by default
NanoIDGenerator nanoid 21 URL-safe characters by default; configurable length and alphabet
TypeIDGenerator typeid A typed prefix and an encoded UUID; UUIDv7 by default
XUIDGenerator xuid KarpelesLab XUID: grouped base32 UUID with an optional prefix
KSUIDGenerator ksuid 27-character ID with a seconds timestamp and 128 random bits
SnowflakeGenerator snowflake Configurable timestamp, node, and sequence layout in a 63-bit integer
ShortUUIDGenerator shortuuid 22-character base57 encoding of a UUID; generates UUIDv4 by default
XIDGenerator xid 20-character ID containing time, machine, process, and counter fields
ObjectIDGenerator objectid MongoDB's 12-byte ObjectID, written as 24 hex characters
TSIDGenerator tsid 64-bit timestamped ID, written as 13 base32 characters
SonyflakeGenerator sonyflake 63-bit time, sequence, and node layout; Sonyflake v2 defaults
PushIDGenerator pushid Firebase's 20-character timestamped push key
SCRU128Generator scru128 25-character base36 ID with a timestamp, counters, and random data
TimeflakeGenerator timeflake 22-character base62 ID with millisecond time and 80 random bits
NUIDGenerator nuid NATS's 22-character base62 prefix and incrementing sequence
SCRU64Generator scru64 12-character base36 ID with 256 ms ticks and an assigned node
TIDGenerator tid AT Protocol's 13-character timestamp and clock ID
UPIDGenerator upid Timestamped 128-bit ID with an embedded four-character prefix
SNOGenerator sno 80-bit ID with time, partition, metadata, sequence, and a rollback bit
HyperIDGenerator hyperid UUIDv4 prefix followed by a decimal counter
Flake128Generator flake128 Boundary Flake: timestamp, 48-bit node, and 16-bit sequence

Codecs and content identifiers

Class Format name Input
Sqids sqids A sequence of nonnegative integers, encoded with an optional blocklist
Hashids hashids A sequence of nonnegative integers, with salt and alphabet settings
Proquint proquint Bytes encoded as pronounceable groups of five letters
UUID25 uuid25 A UUID encoded as 25 base36 characters
CIDv0 cidv0 An already serialized DAG-PB block
CIDv1 cidv1 Block bytes, with a codec and hash algorithm
Multihash multihash Bytes hashed into a self-describing digest
NI, NIH ni, nih Bytes identified using named-information URI formats
SWHID swhid File contents or structured Software Heritage objects

fuda.formats() lists each format's name, description, kind, and timestamp support.

Generating IDs

For one-off calls, use functions such as fuda.uuid7() or fuda.ulid(). For custom settings, create a generator:

import fuda

ids = fuda.NanoIDGenerator(length=16, alphabet='0123456789abcdef')
one = ids.generate()
batch = ids.generate_many(100)
stream = ids.iter_ids(5)

assert len(one) == 16
assert all(char in '0123456789abcdef' for char in one)

NanoID accepts 2–256 distinct alphabet characters, including Unicode, and samples them without modulo bias.

generate_many() returns a list and accepts up to 1,000,000 IDs per call. iter_ids() produces values as you request them; omit the count for an unbounded iterator. Use iteration when you don't want the whole batch in memory.

CUID2, NanoID, UUIDv4, UUIDv8, KSUID, ShortUUID, Timeflake, and UPID use native batch generation. Other generators keep their clock and counter updates in order by calling generate() for each ID. All generators accept generate_many(count, parallel=True) to allow native work to use worker threads; clock callbacks and state updates stay ordered.

Names and fixed values

UUIDv3 and UUIDv5 derive an ID from a namespace and name:

import fuda
from uuid import NAMESPACE_DNS

names = fuda.UUID5Generator(NAMESPACE_DNS, 'example.com')
assert names.generate() == names.generate()

A UUIDv3 or UUIDv5 generator returns the same ID on every call. Use a different name to get a different ID. UUIDv8 accepts fixed payload fields a, b, and c; setting all three also produces the same ID every time.

CUID2 accepts lengths from 2 to 32 characters. Shorter IDs have less collision resistance, so choose a length for the number of IDs you expect to create.

Node-based formats

Snowflake, Sonyflake, SCRU64, and Flake128 need an assigned node_id. SNO needs an assigned partition. Keep the generator instance so its sequence state survives between calls:

import fuda

ids = fuda.SnowflakeGenerator(node_id=7)
value = ids.generate()
batch = ids.generate_many(5)

assert ids.inspect(value)['node_id'] == 7

compact = fuda.SCRU64Generator(node_id=7, node_bits=8)
partitioned = fuda.SNOGenerator(partition=7, metadata=3)

Give concurrent generators distinct assignments. Fuda doesn't coordinate node leases or persist generator state across restarts. Only reuse an assignment once its last timestamp has passed. Generators with assigned nodes or partitions refuse inherited use after fork; construct a new one with a distinct assignment in the child.

Time ordering has a few format-specific details:

  • UUIDv7 and default ULID generation are monotonic within one generator. This doesn't establish a global order across machines.
  • SCRU128 and SCRU64 tolerate up to 10 seconds of clock rollback by default; larger rollbacks raise. Counter overflow advances their logical time.
  • Snowflake, Sonyflake, and Flake128 refuse rollback and raise on sequence exhaustion. Sonyflake defaults to 256 IDs per 10 ms tick per node.
  • SNO handles a safe rollback by toggling a bit, so IDs can sort backwards. Unsafe repeated rollback and sequence exhaustion raise.
  • Timeflake doesn't guarantee order within a millisecond. UPID timestamps have 256 ms resolution. TID's custom clock returns Unix microseconds.

Parsing, validation, and inspection

import fuda

value = fuda.ULIDGenerator().generate()
text = str(value)
parsed = fuda.ULID.from_str(text)

assert fuda.parse('ulid', text) == parsed
assert fuda.ULID.from_bytes(parsed.bytes) == parsed
assert fuda.validate('ulid', text)
assert not fuda.validate('ulid', 'not-an-id')

print(int(parsed))
print(fuda.inspect('ulid', text))
print(fuda.detect(text))

parse() raises on invalid input. validate() returns a boolean for a known format; an unknown format name raises ValueError. Both take text as input. Use inspect() for a dictionary of available fields, including canonical text and timestamps where applicable. For a custom Snowflake or Sonyflake layout, use the generator's inspect() method to interpret its fields correctly.

detect() returns every matching format name. Several formats share alphabets and lengths, so it can return multiple matches. Keep the format alongside stored IDs when you need to parse them reliably.

Validation checks an ID's structure. IDs can expose timestamps or counters; use secrets.token_urlsafe() for authentication tokens and other secrets.

Encoding existing values

import fuda

sqids = fuda.Sqids(min_length=12)
encoded = sqids.encode([1, 2, 3])
assert sqids.decode(encoded) == [1, 2, 3]

hashids = fuda.Hashids(salt='example namespace', min_length=12)
encoded = hashids.encode([42, 100])
assert hashids.decode(encoded) == [42, 100]
assert hashids.decode_hex(hashids.encode_hex('0000abcd')) == '0000abcd'

spoken = fuda.Proquint.encode(bytes.fromhex('7f000001'))
assert spoken == 'lusab-babad'
assert fuda.Proquint.decode(spoken) == bytes.fromhex('7f000001')

original = fuda.UUID4Generator().generate()
assert fuda.UUID25.decode(fuda.UUID25.encode(original)) == original
assert fuda.decode_shortuuid(fuda.shortuuid(original)) == original

Sqids, Hashids, Proquint, and UUID25 also have encode_many() and decode_many(). They accept up to 1,000,000 inputs, keep the input order, and support parallel=True for native worker threads:

import fuda

codec = fuda.Hashids(salt='example namespace')
values = [[1, 2], [42], [100, 200]]
encoded = codec.encode_many(values, parallel=True)
assert codec.decode_many(encoded, parallel=True) == values

Sqids and Hashids accept integers from 0 through 2**63 - 1. Keep the same alphabet, salt, minimum length, and blocklist settings wherever you encode or decode. parse(), validate(), and inspect() use the default codec settings; use your codec instance for custom settings. Sqids also offers decode(value, canonical=True) to require the exact spelling for its settings.

These codecs are reversible and add no randomness or encryption. A Hashids salt is a configuration value, not an encryption key. Proquint requires nonempty bytes with an even length. UUID conversions preserve bits; reinterpreting a ULID or UPID as a UUID doesn't turn it into an RFC UUID version.

Identifying content

import fuda

data = b'hello'
cid = fuda.CIDv1.from_content(data)

assert cid.verify(data)
assert not cid.verify(b'something else')
assert fuda.CIDv1.from_str(cid.to_base('base58btc')) == cid

digest = fuda.Multihash.from_content(data)
name = fuda.NI.from_content(data, authority='example.com')
human_name = name.to_nih()

assert digest.verify(data)
assert human_name.same_content(name)
assert human_name.verify(data)

CIDv1 defaults to the raw codec and SHA-256, with lowercase base32 text. It also reads and writes supported base16, base36, base58btc, and base64 variants. Multihash defaults to multibase-prefixed base58btc text.

Pass already serialized block bytes for other codecs. CIDv0 expects a DAG-PB block. Fuda hashes the supplied bytes; it doesn't chunk files, build an IPFS DAG, or fetch content from the network.

CIDv1 and Multihash support identity, SHA-2, SHA-3, and BLAKE2b-256 hashes. Unknown numeric hash codes can survive parsing, but unsupported algorithms can't verify content. Empty non-identity digests are parseable but verification raises. Truncated digests have less collision resistance than full digests.

NI and NIH support registered SHA-2, SHA-3, and BLAKE2 algorithms. KangarooTwelve names can be parsed, but hashing them isn't supported. NI authority and query strings must already be percent-encoded where needed; fragments are rejected. Those locator hints don't change content identity or trigger network requests.

For Software Heritage objects:

import fuda

file_id = fuda.SWHID.from_content(b'hello\n')
directory_id = fuda.SWHID.from_directory([
    fuda.DirectoryEntry(b'hello.txt', file_id),
])
qualified = file_id.with_context(
    origin='https://example.com/repository',
    path=b'/hello.txt',
    lines=(1, 1),
)

assert file_id.verify(b'hello\n')
assert qualified.core == file_id
assert fuda.SWHID.from_str(str(qualified)) == qualified

All five core SWHID object types are supported: content, directory, revision, release, and snapshot. Structured constructors include from_directory(), from_revision(), from_release(), and from_snapshot(). Use from_object() for an already serialized object body; it adds the type and length header. Author, committer, and tagger headers are supplied as exact Git bytes.

Command line

The fuda command and python -m fuda use the same interface:

python -m fuda formats
python -m fuda generate cuid2 -n 5
python -m fuda generate typeid --prefix user --json -n 3
python -m fuda generate snowflake --node-id 7 -n 5
python -m fuda inspect ulid 01ARZ3NDEKTSV4RRFFQ69G5FAV
python -m fuda validate ulid 01ARZ3NDEKTSV4RRFFQ69G5FAV
python -m fuda encode sqids 1 2 3 --min-length 12
python -m fuda decode proquint lusab-babad
python -m fuda content cidv1 --text hello
python -m fuda content ni --text hello --authority example.com

Generation prints one ID per line; --json produces an array of strings. For content commands, --file path reads a file instead of --text. The whole file is read into memory. Validation exits with 0 for valid input and 1 for invalid input; argument and configuration errors exit with 2. Run a command with --help for its options.

Performance

Rust handles shared random batches, encoding, parsing, and codecs. Native batch operations release the GIL. Passing parallel=True allows larger batches to use a shared worker pool. Generator state lives in Python, and content hashing uses the standard library. After POSIX fork, a child with an inherited active worker pool uses serial native batches.

To benchmark your setup, install the development extra and run:

python tools/benchmark.py -p 3 -n 5 -w 1 --min-time 0.1 -o ../fuda-benchmark.json

The suite covers all 39 formats, including final string conversion. It reuses generators and uses OS randomness. Sonyflake uses a larger sequence field to avoid exhausting its default 256-ID tick; the layout is recorded in the results. Use --focus to filter benchmark names.

tools/benchmark_batches.py measures generation and codec batches. Use --parallel to enable workers or --serial-calls to compare with repeated single calls. --size sets the number of items per batch. Parallel execution can help with heavier workloads; smaller batches may be faster without it.

Development

To work on Fuda itself, install stable Rust and a native compiler first. On Windows, use Visual Studio Build Tools with the C++ workload; on macOS, use the Xcode command line tools. Linux needs a C compiler and linker. Then create and activate a virtual environment in the checkout and install the development tools:

python -m venv .venv
# Activate .venv using your shell's activation command before continuing.
python -m pip install -e '.[dev]'

python -m ruff check .
python tools/style.py --check
python -m mypy
python -m pytest
cargo fmt --check
cargo clippy --release -- -D warnings
cargo test --release

python -m build
python -m twine check --strict dist/*

tools/style.py applies the project's import ordering and spacing conventions. The test suite includes reference vectors, round trips, property tests, and checks for invalid input, clock changes, and process state.

CI builds wheels from the source distribution and tests them outside the checkout. It covers Python 3.14 and 3.15 on Linux, Windows, and macOS, including x86-64, ARM64, and Linux musl.

Metadata

Release files for fuda 0.1.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 fuda 0.1.0
File Size Uploaded
fuda-0.1.0.tar.gz 204.4 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for fuda 0.1.0
File
fuda-0.1.0-cp314-abi3-win_arm64.whl CPython 3.14 abi3 Windows ARM64 Details
fuda-0.1.0-cp314-abi3-win_amd64.whl CPython 3.14 abi3 Windows x86-64 Details
fuda-0.1.0-cp314-abi3-musllinux_1_2_x86_64.whl CPython 3.14 abi3 Linux musl 1.2+ x86-64 Details
fuda-0.1.0-cp314-abi3-musllinux_1_2_aarch64.whl CPython 3.14 abi3 Linux musl 1.2+ ARM64 Details
fuda-0.1.0-cp314-abi3-manylinux_2_28_x86_64.whl CPython 3.14 abi3 Linux glibc 2.28+ x86-64 Details
fuda-0.1.0-cp314-abi3-manylinux_2_28_aarch64.whl CPython 3.14 abi3 Linux glibc 2.28+ ARM64 Details
fuda-0.1.0-cp314-abi3-macosx_11_0_x86_64.whl CPython 3.14 abi3 macOS 11.0+ x86-64 Details
fuda-0.1.0-cp314-abi3-macosx_11_0_arm64.whl CPython 3.14 abi3 macOS 11.0+ ARM64 Details

Total release size: 4.1 MB

Release files / fuda-0.1.0.tar.gz

Download URL fuda-0.1.0.tar.gz
Size 204.4 kB
Tags Source
SHA-256 checksum
How to use checksums
03fe820ff28960d818cc5289b478500b48cf975dedb76d2e32f40b054e2b0875
BLAKE2b-256 checksum
How to use checksums
b276cca2785a762e105cda24e45b98f2385eb1452a0fee4ba7037ef19125d832
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 11, 2026.

Transparency log

Release files / fuda-0.1.0-cp314-abi3-win_arm64.whl

Download URL fuda-0.1.0-cp314-abi3-win_arm64.whl
Size 372.6 kB
Tags CPython 3.14 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
4d97a807340361ce014ec8cb10e5393afca2f10770f1a35e9ad9941e4528a0da
BLAKE2b-256 checksum
How to use checksums
a510bdc0f83147a3c08a610e57c17fdb836d9585fa705b7aaeb5cc87bdf63ad8
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 11, 2026.

Transparency log

Release files / fuda-0.1.0-cp314-abi3-win_amd64.whl

Download URL fuda-0.1.0-cp314-abi3-win_amd64.whl
Size 392.1 kB
Tags CPython 3.14 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
ef6040fe372542717df53625b68356bd4a35e1e3642a5744f35a5c97ed7d59ff
BLAKE2b-256 checksum
How to use checksums
95102c5dd313173261e33dd3dafb5bd3eaf021820bd6f54fd42df81a254516c6
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 11, 2026.

Transparency log

Release files / fuda-0.1.0-cp314-abi3-musllinux_1_2_x86_64.whl

Download URL fuda-0.1.0-cp314-abi3-musllinux_1_2_x86_64.whl
Size 606.4 kB
Tags CPython 3.14 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
ad0535f9d8ff05e9eb28a6171318efc8c42152f19e7eb72f6f6c184d1cd85413
BLAKE2b-256 checksum
How to use checksums
a16550404098eea5f9e357cb900a1d84218cb1bdc4b8db3dadc174733c6ad128
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 11, 2026.

Transparency log

Release files / fuda-0.1.0-cp314-abi3-musllinux_1_2_aarch64.whl

Download URL fuda-0.1.0-cp314-abi3-musllinux_1_2_aarch64.whl
Size 572.7 kB
Tags CPython 3.14 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
14307369037dded0a7383292b5c2cb3c1006776abc3e6fbe20559986700ae932
BLAKE2b-256 checksum
How to use checksums
d20353e53a74e8865b16c01c836b3151d1f979ae66d402ecc57b68e87df87cea
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 11, 2026.

Transparency log

Release files / fuda-0.1.0-cp314-abi3-manylinux_2_28_x86_64.whl

Download URL fuda-0.1.0-cp314-abi3-manylinux_2_28_x86_64.whl
Size 525.3 kB
Tags CPython 3.14 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
bd4d24750d1dd4301e2579d32755b13dadef5d42ff14fbf94b15b64ae2f8fb54
BLAKE2b-256 checksum
How to use checksums
44214ed1f16279c48afb022671f96a65eb134f917c3141eead27fc002e1148cd
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 11, 2026.

Transparency log

Release files / fuda-0.1.0-cp314-abi3-manylinux_2_28_aarch64.whl

Download URL fuda-0.1.0-cp314-abi3-manylinux_2_28_aarch64.whl
Size 506.4 kB
Tags CPython 3.14 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
771b0a40004bc3978cb43a43cf0f39a27dae09ec167dae91ec23e9040d5aa3e5
BLAKE2b-256 checksum
How to use checksums
15818ce2236d47c486d78d8ae9b84cb597e5931d08fd6701334feae80af40304
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 11, 2026.

Transparency log

Release files / fuda-0.1.0-cp314-abi3-macosx_11_0_x86_64.whl

Download URL fuda-0.1.0-cp314-abi3-macosx_11_0_x86_64.whl
Size 489.0 kB
Tags CPython 3.14 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
7f6efadba08a7c255b97890967c999e0eb7de4069d8681f19a9236454c5d9feb
BLAKE2b-256 checksum
How to use checksums
390e02e3a1c07e5435ffba1fa2a97e614ec1c100d985176af24aba0685b1db53
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 11, 2026.

Transparency log

Release files / fuda-0.1.0-cp314-abi3-macosx_11_0_arm64.whl

Download URL fuda-0.1.0-cp314-abi3-macosx_11_0_arm64.whl
Size 462.9 kB
Tags CPython 3.14 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
97c41b8c9816cc7f8e63ae9e6bca325938b47aac12e5357faba8aba8c1f41157
BLAKE2b-256 checksum
How to use checksums
b6f5b16f84fb8013e169cf49f0324abf645c4f13235ff4f27e3b4d15456983d9
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 11, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

9 release files

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