Skip to main content

dfukit

Firmware updates over any link. dfukit is a small update protocol with a server for the device and a client for the host, both in C.

  • One protocol for every link: UART, UDP, TCP, BLE, USB, or a link of your own. dfukit sends frames; the link only has to carry them, and may lose some.
  • A pipeline, not a request per frame: the host sends what the device's window allows, the device acknowledges in bulk, and a lost frame is sent again from where it went missing (go-back-N).
  • A 32-bit board ID per image target: it selects the backend that writes the image, and a device refuses IDs it does not know before it touches anything.
  • Backends for what is behind a board ID: your own for an OTA slot or a bootloader's slot, one for RAM that comes with dfukit, or a device further down a chain (pass-through).
  • Resume after a lost link, with the device's state kept for a while.
  • No threads, no heap and no platform code in the core: the application feeds it frames and time, and gets frames back through a callback.

The protocol and the internals are described in DESIGN.md, and what changed in CHANGELOG.md.

Building and testing

pip install pytest "nanobind>=2.5"
cmake -S . -B build && cmake --build build && ctest --test-dir build --no-tests=error

For the C libraries alone, without the Python module and the tests, add -DDFUKIT_PYTHON=OFF.

The tests run the server and the client against each other through a simulated link that drops, duplicates and delays frames. They are in Python, on the C code through its bindings; tests/README.md has how to measure their coverage.

A device: the server

The server is a struct the application owns. Frames go in with dfukit_server_feed(), answers come out through the send callback, and dfukit_server_poll() runs its timers. One task calls into a server at a time.

#include "dfukit_server.h"

static int send_frame(void *ctx, const dfukit_peer_t *to, const uint8_t *frame, size_t len)
{
	// To the peer `to` on your link (its address, as you gave it to dfukit_server_feed())
	return my_link_send(to, frame, len);
}

static dfukit_server_t server;
static dfukit_backend_t backend;

void update_init(void)
{
	const dfukit_server_config_t config = {
		.send = send_frame,
		.name = "my-device",
		.max_frame = 512, // the largest frame the link carries
	};

	dfukit_server_init(&server, &config);
	my_backend_init(&backend, 0x0000a001); // see "Backends"
	dfukit_server_register(&server, &backend);
}

// For each frame from the link, and every few milliseconds
void on_frame(const uint8_t *addr, size_t addr_len, const uint8_t *frame, size_t len)
{
	dfukit_peer_t from = {.len = (uint8_t)addr_len};

	if (addr_len > DFUKIT_PEER_MAX) {
		return; // longer than a peer: map it to 16 bytes of your own (an index, a hash)
	}
	memcpy(from.bytes, addr, addr_len);
	dfukit_server_feed(&server, &from, frame, len, now_ms());
}

void every_10_ms(void)
{
	dfukit_server_poll(&server, now_ms());
}

A peer is an opaque address of up to 16 bytes (DFUKIT_PEER_MAX): a socket address, a BLE connection handle, a bus address; the server drops frames from a longer one. An IPv6 address with its port is 18 bytes: give the server something shorter that names it (a slot in a table of your own). Two peers are the same when their bytes are. The peer that starts a session owns it; another one gets BUSY until it ends. INFO and STATUS are answered to anyone.

on_status in the config reports the session's state and progress, on every change and every acknowledgement: for a light or a display. A pass-through session has no progress to report.

INFO lists as many boards as fit in one frame, after a name cut to fit. A host can use it to warn early, but START is the real check.

Backends

A backend puts an image in place for one board ID (dfukit_backend_t, dfukit_server.h). The server calls it in order:

Callback When What it does
begin START gets ready for an image of start->image_size bytes (may erase)
write data comes in writes the image at offset, in order
window every acknowledgement how many more stream bytes it can take now (0: wait)
finish FINISH its own checks of the whole image; DFUKIT_PENDING while still writing
activate ACTIVATE makes the image the one that runs (restarts, or at the next boot)
abort the session is broken off undoes what it can

The server has checked the image's CRC-32 before it calls finish. The CRC catches accidents, not attackers: signatures are the backend's, which hands the image to whatever checks them on its platform.

The CRC is a small module of its own (lib/crc32). Its dfukit_crc32() is weak, so an application replaces it by defining one (a hardware engine, say), in an object file that gets linked. MSVC has no weak symbols: there the static library gives way to the application's definition.

The ones that come with dfukit:

Backend Platform Writes
ram any a buffer; for tests and for devices that handle the image themselves

A pass-through backend (kind = DFUKIT_KIND_PASSTHROUGH) does not write anything: forward gets the session's frames as they are, for a device further down a chain, and that device's answers go back with dfukit_server_downstream(). The server does not read the session: it ends with the owner's ABORT, after the idle time, or when the backend calls dfukit_server_passthrough_end(). abort is called however it ends.

Notes for integrators

  • The window is the backend's promise to the host, not a limit the server enforces: a host that sends past it still gets its frames to write. A backend that buffers takes more, or fails.
  • begin runs inside the START it answers: it must be done within the client's tries times its RTO (4 s by default), or open with a window of 0 and do the rest in the background.
  • activate only schedules the switch (a restart after delay_ms, from a timer or a task): the server answers ACTIVATE with what it returns, so it must return before restarting.
  • finish may return DFUKIT_PENDING while it still writes what it buffered; the host asks again.

A host: the client

The C client is driven like the server: dfukit_client_feed() with the device's frames, dfukit_client_poll() every few milliseconds, frames out through send, and the image read through read at any offset (a resend reads again), so it need not be in RAM.

#include "dfukit_client.h"

dfukit_client_t client;
const dfukit_client_config_t config = {
	.send = link_send,
	.read = image_read,
	.max_frame = 512,
};
dfukit_start_t start = {
	.board_id = 0x0000a001,
	.encoding = DFUKIT_ENCODING_RAW,
	.image_size = image_len,
	.stream_size = image_len,
};

start.crc32 = dfukit_crc32(0, image, image_len);
dfukit_client_init(&client, &config);
dfukit_client_begin(&client, &start, true, 0, 0, now_ms()); // true: ACTIVATE after FINISH
while (dfukit_client_state(&client) < DFUKIT_CLIENT_DONE) {
	// feed what came in, then:
	dfukit_client_poll(&client, now_ms());
}
// DFUKIT_CLIENT_DONE, or DFUKIT_CLIENT_FAILED and dfukit_client_status() says why

After a lost link (or a DFUKIT_TIMEOUT), dfukit_client_resume() on the new one goes on where the device stopped, or starts over when the device has no state left.

From Python

pip install dfukit

The same client and server, driven the same way. The link and the clock are the caller's, and the clock is passed in as milliseconds that fit 32 bits.

import time

import dfukit


def now_ms() -> int:
    return int(time.monotonic() * 1000) & 0xFFFFFFFF


client = dfukit.Client(link_send, lambda offset, length: image[offset : offset + length], max_frame=512)
client.begin(0x0000A001, image, now_ms())
while client.state not in (dfukit.ClientState.DONE, dfukit.ClientState.FAILED):
    for frame in frames_from_the_link():
        client.feed(frame, now_ms())
    client.poll(now_ms())
if client.state == dfukit.ClientState.FAILED:
    raise RuntimeError(dfukit.status_name(client.status))

dfukit.Server is the device's end, with add() for a backend (RamBackend, PassthroughBackend), feed(peer, frame, now) and poll(now); its send callback gets (peer, frame).

License

Apache-2.0 (LICENSE).

Metadata

Release files for dfukit 2.0.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 dfukit 2.0.0
File Size Uploaded Provenance Actions
dfukit-2.0.0.tar.gz 113.2 kB With provenance Details for dfukit-2.0.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for dfukit 2.0.0
File Actions
dfukit-2.0.0-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details for dfukit-2.0.0-cp312-abi3-win_amd64.whl
dfukit-2.0.0-cp312-abi3-win32.whl CPython 3.12 abi3 Windows x86-32 Details for dfukit-2.0.0-cp312-abi3-win32.whl
dfukit-2.0.0-cp312-abi3-musllinux_1_2_x86_64.whl CPython 3.12 abi3 Linux musl 1.2+ x86-64 Details for dfukit-2.0.0-cp312-abi3-musllinux_1_2_x86_64.whl
dfukit-2.0.0-cp312-abi3-musllinux_1_2_i686.whl CPython 3.12 abi3 Linux musl 1.2+ x86-32 Details for dfukit-2.0.0-cp312-abi3-musllinux_1_2_i686.whl
dfukit-2.0.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 abi3 Linux glibc 2.17+ x86-64 Details for dfukit-2.0.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
dfukit-2.0.0-cp312-abi3-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.12 abi3 Linux glibc 2.17+ x86-32 Details for dfukit-2.0.0-cp312-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
dfukit-2.0.0-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details for dfukit-2.0.0-cp312-abi3-macosx_11_0_arm64.whl
dfukit-2.0.0-cp312-abi3-macosx_10_14_x86_64.whl CPython 3.12 abi3 macOS 10.14+ x86-64 Details for dfukit-2.0.0-cp312-abi3-macosx_10_14_x86_64.whl
dfukit-2.0.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details for dfukit-2.0.0-cp311-cp311-win_amd64.whl
dfukit-2.0.0-cp311-cp311-win32.whl CPython 3.11 CPython 3.11 Windows x86-32 Details for dfukit-2.0.0-cp311-cp311-win32.whl
dfukit-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details for dfukit-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl
dfukit-2.0.0-cp311-cp311-musllinux_1_2_i686.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-32 Details for dfukit-2.0.0-cp311-cp311-musllinux_1_2_i686.whl
dfukit-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details for dfukit-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
dfukit-2.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-32 Details for dfukit-2.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
dfukit-2.0.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details for dfukit-2.0.0-cp311-cp311-macosx_11_0_arm64.whl
dfukit-2.0.0-cp311-cp311-macosx_10_14_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.14+ x86-64 Details for dfukit-2.0.0-cp311-cp311-macosx_10_14_x86_64.whl
dfukit-2.0.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details for dfukit-2.0.0-cp310-cp310-win_amd64.whl
dfukit-2.0.0-cp310-cp310-win32.whl CPython 3.10 CPython 3.10 Windows x86-32 Details for dfukit-2.0.0-cp310-cp310-win32.whl
dfukit-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-64 Details for dfukit-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl
dfukit-2.0.0-cp310-cp310-musllinux_1_2_i686.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-32 Details for dfukit-2.0.0-cp310-cp310-musllinux_1_2_i686.whl
dfukit-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details for dfukit-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
dfukit-2.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-32 Details for dfukit-2.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
dfukit-2.0.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details for dfukit-2.0.0-cp310-cp310-macosx_11_0_arm64.whl
dfukit-2.0.0-cp310-cp310-macosx_10_14_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.14+ x86-64 Details for dfukit-2.0.0-cp310-cp310-macosx_10_14_x86_64.whl

Total release size: 5.4 MB

Release files / dfukit-2.0.0.tar.gz

Download URL dfukit-2.0.0.tar.gz
Size 113.2 kB
Tags Source
SHA-256 checksum
How to use checksums
f62b6044c290d5e02c08c2d2102a76cdf0e41bc10f212ff812da4931f8959971
BLAKE2b-256 checksum
How to use checksums
015dd360f041ec135c0df68e923e2d9a5bd3bb8ada8edb0eba14235727bf680b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp312-abi3-win_amd64.whl

Download URL dfukit-2.0.0-cp312-abi3-win_amd64.whl
Size 98.8 kB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
f5d28bc078dbee6a16abd78418023f7d99de348ed47bbd1ee1b4799296762573
BLAKE2b-256 checksum
How to use checksums
fdbb121343e9571c2246962c6b92c5de0a616e2008257fc359fd6816677ca8c4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp312-abi3-win32.whl

Download URL dfukit-2.0.0-cp312-abi3-win32.whl
Size 90.1 kB
Tags CPython 3.12 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
fefb8200ebed47ff2e0382f8e4add4f4391aac1e2ff9f85dab1d69f27811c895
BLAKE2b-256 checksum
How to use checksums
38c03d244907a2dd3959aa65ef4cb1aa444a44ba7e6384fc0825e564dc550770
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp312-abi3-musllinux_1_2_x86_64.whl

Download URL dfukit-2.0.0-cp312-abi3-musllinux_1_2_x86_64.whl
Size 558.9 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
2089aaa33172a24bf158098b27220dce2a901da57fa0cfcfce8d9351ca8fa0b9
BLAKE2b-256 checksum
How to use checksums
fd84d7a07a33f985493649657d107ce2a753ca9902d07d1541cc508a87a43784
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp312-abi3-musllinux_1_2_i686.whl

Download URL dfukit-2.0.0-cp312-abi3-musllinux_1_2_i686.whl
Size 606.8 kB
Tags CPython 3.12 Linux musl 1.2+ x86-32 abi3
SHA-256 checksum
How to use checksums
d5ebaf5c9b7dd233b22a0d10acf8c44a02d085694beaaf468373b3bdcefe424f
BLAKE2b-256 checksum
How to use checksums
e722846693ab3135108ac4e89656323833fbe023137d0cef0bb75f16e8697739
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL dfukit-2.0.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 110.8 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
d51904d59f6317480a8979c96412d241b1bb7921b9bf55ee5cfeacd239211739
BLAKE2b-256 checksum
How to use checksums
6d74f93325ea69d8580500042f358c1979fbd2497fcdc1d4e2ba9a181e41c337
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp312-abi3-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL dfukit-2.0.0-cp312-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Size 116.6 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-32 abi3
SHA-256 checksum
How to use checksums
f595e9ac41460360fa551e8b0e1bcbf7cb8219ba82f7ddcb74b04f8786de5970
BLAKE2b-256 checksum
How to use checksums
df60abee7cc8f3582e7848adec159cf78f58c24ea55f9c042ff9e0038793f648
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp312-abi3-macosx_11_0_arm64.whl

Download URL dfukit-2.0.0-cp312-abi3-macosx_11_0_arm64.whl
Size 77.9 kB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
458dfece078b1cc1f2c33fe95a485c53678683f453d3cccd20e504e12263b092
BLAKE2b-256 checksum
How to use checksums
b013ae26a97c8b44b56309b6e962057d063ba6aef280a18feb4016a723f96c7c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp312-abi3-macosx_10_14_x86_64.whl

Download URL dfukit-2.0.0-cp312-abi3-macosx_10_14_x86_64.whl
Size 81.8 kB
Tags CPython 3.12 abi3 macOS 10.14+ x86-64
SHA-256 checksum
How to use checksums
fb40d1bddc5a3a3582ecc5fcac9fef398a09d2173db097860739f64cf893c2ff
BLAKE2b-256 checksum
How to use checksums
4c0dfc4c1ac2281dc316599cca3387d1eabb1f2323ffacf344ce740d5ea353dc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp311-cp311-win_amd64.whl

Download URL dfukit-2.0.0-cp311-cp311-win_amd64.whl
Size 99.3 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
46613982f8e5ac92f48dc485b748e1d357ff12f40fd7aea87c63515b9697b944
BLAKE2b-256 checksum
How to use checksums
cd2752ec5636ab819180aa2ce300d48f1289d0495a90a70fa658a3664a3772a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp311-cp311-win32.whl

Download URL dfukit-2.0.0-cp311-cp311-win32.whl
Size 91.1 kB
Tags CPython 3.11 Windows x86-32
SHA-256 checksum
How to use checksums
1a2457fd2f72cd81d360d34d3dff5bb10cbfb269b9e0d9f814643ef0270ac3e3
BLAKE2b-256 checksum
How to use checksums
ddec5f53dad7402c10f6bd62823cc382f13060e3bcc6e423a0ebb08350282de5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL dfukit-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl
Size 563.5 kB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
95e498a175003278375c2c5cd82becd760d0170e13123586c50cf5f920583f65
BLAKE2b-256 checksum
How to use checksums
b17c99b0fe6ae29ea7d75ba85fe6d005562ae7d7a0e239ab8c67a995577ead65
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp311-cp311-musllinux_1_2_i686.whl

Download URL dfukit-2.0.0-cp311-cp311-musllinux_1_2_i686.whl
Size 612.7 kB
Tags CPython 3.11 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
69656a1390cf8b490d77d9871d9b2582a0d8de2b56e0526d8bf010a9d8fdda2c
BLAKE2b-256 checksum
How to use checksums
19434a0254a361364f3ac38ab9cc66291182d5391002d5a31180091c7ac3460f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL dfukit-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 115.5 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
7c23fe8aceffb05f53cff62d00b48d529fdd6ee70d68e9f7182101017e39bf79
BLAKE2b-256 checksum
How to use checksums
feabb5b47f1e7245f87aac4acc6750855fc26bafe0beea5ebbd0cfbac124fed3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL dfukit-2.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Size 122.3 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
7f12982686983aa4489383c851f4a322e8849a42347b8c769432eae28ed1ce88
BLAKE2b-256 checksum
How to use checksums
fcfa253486564b4d2e1d9be6ed799d11b988ad2a54da7c6165832a32d19b1109
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL dfukit-2.0.0-cp311-cp311-macosx_11_0_arm64.whl
Size 79.6 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4bd4e9d939060541e973c19ce4c6740f27181565f2d5c1cd046b1cdfb5dfcf56
BLAKE2b-256 checksum
How to use checksums
fac20056c667bef63a555490db50691578b980a12b9697a9f4bf04a4a086f2ca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp311-cp311-macosx_10_14_x86_64.whl

Download URL dfukit-2.0.0-cp311-cp311-macosx_10_14_x86_64.whl
Size 83.8 kB
Tags CPython 3.11 macOS 10.14+ x86-64
SHA-256 checksum
How to use checksums
57068d14ebcb6b50b5d4a98ddaf4086ef166df0f64aee3fb18eaafc0b708a100
BLAKE2b-256 checksum
How to use checksums
98c9b4e8708ebba7fd73edda81f5416eaf92857105742315db52d272d891fa0a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp310-cp310-win_amd64.whl

Download URL dfukit-2.0.0-cp310-cp310-win_amd64.whl
Size 99.0 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
b4962fb094a67a98716baf23eae867e8f1e1a6f71926e005f01f1d4bce45d7cf
BLAKE2b-256 checksum
How to use checksums
80e2257e3c102367f6723ab50ddc6a74a69e9799c25f2dbee5305e4d19664081
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp310-cp310-win32.whl

Download URL dfukit-2.0.0-cp310-cp310-win32.whl
Size 90.9 kB
Tags CPython 3.10 Windows x86-32
SHA-256 checksum
How to use checksums
f6772ee19df55f748bfe869ec1d3013b0175860320a3e6b9d44c6b65a97d43fb
BLAKE2b-256 checksum
How to use checksums
a6e4e3a16bdd6a45d2b29c7fd40060c8ef8bd83f2a4f12d16067f531fb61fd55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl

Download URL dfukit-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl
Size 563.1 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
8f2f8e6524fbcc0b8467876affb21e1a716ae72fedb7e5ea3cf12b501fa35e62
BLAKE2b-256 checksum
How to use checksums
bd20f69d17bf48ea9623a5fc806c9a604529c98bda435a66b3d34141ab5a4971
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp310-cp310-musllinux_1_2_i686.whl

Download URL dfukit-2.0.0-cp310-cp310-musllinux_1_2_i686.whl
Size 612.4 kB
Tags CPython 3.10 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
2adc3055137d2980db6f7ea56f10a6d68aa2fb303bd05847ee6386e246796ef8
BLAKE2b-256 checksum
How to use checksums
08cdd2819b39c7de82aad8d7cc5b76df13b1167af9479a1a5d50245b5bec5907
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL dfukit-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 114.9 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
61af57df2e50f0c9fdac7d20527a040e4d337722369fe0ddc0b9f52f2fabd3ad
BLAKE2b-256 checksum
How to use checksums
f8170f8804039b88a5a7841fa01b2fef893a1130647c850dbfabc6327b202852
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL dfukit-2.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Size 122.2 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
f272ad679cf211216ac7b028d3df134f8d2647314bd7a28be4f9516a86544247
BLAKE2b-256 checksum
How to use checksums
ff323c12717262a11063dc6636a1fd858fb0f53911c5a0d399738c0946c09009
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL dfukit-2.0.0-cp310-cp310-macosx_11_0_arm64.whl
Size 79.2 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7ee9f44233a801d61514125cfead8e6c6a70c17c8e9ca7e6b17537e0862b4f3a
BLAKE2b-256 checksum
How to use checksums
746cf34372e89860193915959d5c9fa0670f90fc6eba859aacba88ac6536cb3e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / dfukit-2.0.0-cp310-cp310-macosx_10_14_x86_64.whl

Download URL dfukit-2.0.0-cp310-cp310-macosx_10_14_x86_64.whl
Size 83.2 kB
Tags CPython 3.10 macOS 10.14+ x86-64
SHA-256 checksum
How to use checksums
cf7aeb65bd2f78064968e471457217b796e9eb120d6b8abe8cca9fbe95128819
BLAKE2b-256 checksum
How to use checksums
87555dd0f5d3715613fb41b4a2f6a2ab2dbe34b7ae6cc5c62df4662619c01532
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Security for dfukit 2.0.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 25 files in this release have been uploaded with provenance metadata.

Select from 25 files

Attestation for dfukit-2.0.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 Nov 4, 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.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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