pifeat
Zero-Dependency, Sub-Millisecond EEG & Biosignal Feature Extraction Engine in Rust + Python
pip install pifeat
Why pifeat? • Quickstart • 22 Canonical Features • Benchmarks • API Reference
Early development / experimental / no warranties. APIs, behavior, and packaging may change without notice. Research software provided as-is, without warranty of any kind. Not a medical device and not intended for clinical, diagnostic, or safety-critical use. See
LICENSEfor full terms.
⚡ Why pifeat?
Building real-time Brain-Computer Interfaces (BCI), neurofeedback loops, or edge ML pipelines on devices like a Raspberry Pi or embedded Linux usually forces a painful trade-off: pull in hundreds of megabytes of scipy / mne / numba / openblas dependencies—or write fragile DSP glue code by hand.
pifeat solves this in a single ~1.1 MB native wheel:
- Zero Runtime Dependencies: No
numpy,scipy,mne,numba, or C/Fortran BLAS required at runtime. Works out of the box with Python's built-inarray.array,memoryview,bytearray, ornumpy.ndarrayvia the CPython Buffer Protocol. - 100x–173x Faster than SciPy + NumPy: Extracts all 22 time, frequency (Welch PSD), and nonlinear features across 16 channels (500 samples @ 250 Hz) in ~146 µs with the GIL released.
- Zero Steady-State Allocations: Both the Rust core and
extractor.extract_into(...)perform 0 heap allocations on the real-time hot path—eliminating GC pauses and latency spikes. - Drop-In Scientific Equivalence: Matches
scipy.signal.welch(window='hann',detrend='constant',scaling='density') to $< 10^{-12}$ relative error, with compensated two-pass variance to survive large uncalibrated ADC DC offsets ($10^5\text{--}10^6\ \mu\text{V}$). - Hardware-Agnostic: Works with OpenBCI, BrainFlow, LSL (Lab Streaming Layer), MNE, PiEEG, or any raw ADC/SPI stream.
🚀 Developer Quickstart
30-Second Copy-Paste Example (Pure Python — Zero Dependencies)
import array, math
import pifeat as pf
# 1. Generate 2 seconds (500 samples @ 250 Hz) of synthetic 8-channel EEG (10 Hz Alpha + 20 Hz Beta)
n_ch, n_samples, fs = 8, 500, 250.0
raw = array.array("d", [
15.0 * math.sin(2 * math.pi * 10.0 * (s / fs)) + 5.0 * math.cos(2 * math.pi * 20.0 * (s / fs))
for _ in range(n_ch) for s in range(n_samples)
])
# 2. Extract all 22 features per channel in ~70 microseconds
extractor = pf.FeatureExtractor(num_channels=n_ch, window_samples=n_samples, fs=fs)
frame = extractor.extract(raw, layout="channels_first")
print("Features per channel:", len(pf.FEATURE_NAMES)) # 22
print("Ch0 Alpha Power (uV^2):", frame.to_dict()["alpha_power"][0])
print("Ch0 Alpha/Beta Ratio: ", frame.to_dict()["alpha_beta_ratio"][0])
1. Batch Multichannel Extraction (numpy.ndarray, array.array, or memoryview)
Accepts contiguous float64 ('d') or float32 ('f') buffers in either channels_first ([channels, samples]) or samples_first ([samples, channels]) layout:
import array
import pifeat as pf
extractor = pf.FeatureExtractor(
num_channels=16,
window_samples=500, # 2.0 s window at 250 Hz
fs=250.0,
nperseg=250, # 1.0 s Welch segment (1.0 Hz bin spacing)
noverlap=125, # 50% overlap (3 Welch segments per window)
pe_order=3, # Permutation entropy embedding dimension
pe_delay=1, # Permutation entropy sample delay
integration="trapezoid" # "trapezoid" (uV^2) or "bin_mean" (uV^2/Hz)
)
# Pass a 2D numpy.ndarray (shape [16, 500]), memoryview, or stdlib array.array('d'|'f')
raw_window = array.array("d", [0.0] * (16 * 500))
frame = extractor.extract(raw_window, layout="channels_first")
if frame.window_valid:
matrix = frame.matrix() # list[list[float]], shape [16][22]
ch0 = frame.channel(0) # list[float], length 22
by_name = frame.to_dict() # dict[str, list[float]]
# Zero-allocation hot path: writes directly into a preallocated writable f64 buffer (array or np.ndarray)
out_buf = array.array("d", [0.0] * (16 * pf.NUM_FEATURES_PER_CHANNEL))
valid = extractor.extract_into(raw_window, out_buf, layout="channels_first")
2. Continuous Real-Time Streaming (StreamingFeatureEngine)
StreamingFeatureEngine maintains per-channel circular buffers, tracks monotonic sequence numbers and timestamps, detects dropped upstream packets, and caches overlapping Welch segment periodograms so each hop only computes the newly completed segment FFT:
import pifeat as pf
stream = pf.StreamingFeatureEngine(
num_channels=16,
window_samples=500, # 2.0 s sliding window
hop_samples=125, # Emit a FeatureFrame every 125 samples (500 ms at 250 Hz)
fs=250.0,
nperseg=250,
noverlap=125,
pe_order=3,
pe_delay=1,
integration="trapezoid",
)
# Push sample-by-sample from your hardware loop / LSL / BrainFlow / SPI reader
for seq, timestamp, channels in acquisition_stream:
frame = stream.push_sample(seq, timestamp, channels)
if frame is not None:
# Inspect packet-loss & signal-quality flags before feeding your ML model
if not frame.window_valid:
print(f"Warning: {frame.missing_samples} dropped samples or invalid channel (flags={frame.channel_flags})")
features = frame.matrix()
# Or push a contiguous chunk of samples at once ([samples, channels] or [channels, samples])
frames = stream.push_block(block_buf, start_seq=1, start_timestamp=0.0, layout="samples_first")
3. Standalone 1D DSP Functions
Need just one metric on a 1D signal (list[float], array.array, or 1D numpy.ndarray)?
import pifeat as pf
rms = pf.compute_rms(signal_1d)
var = pf.compute_variance(signal_1d)
ll = pf.compute_line_length(signal_1d)
zcr = pf.compute_zero_crossing_rate(signal_1d)
activity, mobility, complexity = pf.compute_hjorth(signal_1d)
pe = pf.compute_permutation_entropy(signal_1d, order=3, delay=1, normalize=True)
# Exact scipy.signal.welch equivalent (returns frequencies and one-sided PSD in uV^2/Hz)
freqs, psd = pf.compute_welch_psd(signal_1d, fs=250.0, nperseg=250, noverlap=125)
# Dict of absolute powers, relative powers, ratios, and spectral entropy
bands = pf.compute_band_powers(signal_1d, fs=250.0, nperseg=250, noverlap=125)
4. Using pifeat in Pure Rust (Cargo.toml)
pifeat can also be embedded directly in Rust firmware, Tauri apps, or native daemons without Python:
[dependencies]
pifeat = { version = "0.1", default-features = false }
🧠 The 22 Features Per Channel
Each channel produces NUM_FEATURES_PER_CHANNEL = 22 features in the canonical order given by pf.FEATURE_NAMES:
| Index | Feature Name | Domain | Units / Range | Definition |
|---|---|---|---|---|
| 0 | rms |
Time | $\mu\text{V}$ | $\sqrt{\frac{1}{N}\sum_{n=0}^{N-1} x_n^2}$ |
| 1 | variance |
Time | $\mu\text{V}^2$ | Sample variance (ddof = 1), two-pass compensated: $\frac{1}{N-1}\sum (x_n - \mu)^2$ |
| 2 | line_length |
Time | $\mu\text{V}$ | $\sum_{n=1}^{N-1} |x_n - x_{n-1}|$ (Esteller et al., 2001) |
| 3 | zero_crossing_rate |
Time | $[0, 1]$ | Mean-centered sign-change rate across $N - 1$ transitions |
| 4 | hjorth_activity |
Time | $\mu\text{V}^2$ | $\text{var}(x)$ (ddof = 1, Hjorth, 1970) |
| 5 | hjorth_mobility |
Time | rad/sample | $\sqrt{\text{var}(d_1) / \text{var}(x)}$, where $d_1[n] = x_n - x_{n-1}$ |
| 6 | hjorth_complexity |
Time | dimensionless | $\frac{\text{Mobility}(d_1)}{\text{Mobility}(x)} = \sqrt{\frac{\text{var}(d_2)/\text{var}(d_1)}{\text{var}(d_1)/\text{var}(x)}}$ |
| 7 | delta_power |
Frequency | $\mu\text{V}^2$ | Integrated Welch PSD over $[0.5, 4.0]\text{ Hz}$ |
| 8 | theta_power |
Frequency | $\mu\text{V}^2$ | Integrated Welch PSD over $[4.0, 8.0]\text{ Hz}$ |
| 9 | alpha_power |
Frequency | $\mu\text{V}^2$ | Integrated Welch PSD over $[8.0, 13.0]\text{ Hz}$ |
| 10 | beta_power |
Frequency | $\mu\text{V}^2$ | Integrated Welch PSD over $[13.0, 30.0]\text{ Hz}$ |
| 11 | gamma_power |
Frequency | $\mu\text{V}^2$ | Integrated Welch PSD over $[30.0, \min(100.0, f_s/2)]\text{ Hz}$ |
| 12 | total_power |
Frequency | $\mu\text{V}^2$ | Sum of absolute powers across Delta, Theta, Alpha, Beta, and Gamma |
| 13..17 | rel_delta .. rel_gamma |
Frequency | $[0, 1]$ | Band power divided by total_power |
| 18 | theta_beta_ratio |
Frequency | dimensionless | theta_power / beta_power (guarded against noise floor) |
| 19 | alpha_beta_ratio |
Frequency | dimensionless | alpha_power / beta_power (guarded against noise floor) |
| 20 | spectral_entropy |
Frequency | $[0, 1]$ | Normalized Shannon entropy of AC Welch PSD bins ($k \ge 1$) |
| 21 | permutation_entropy |
Nonlinear | $[0, 1]$ | Normalized ordinal-pattern Shannon entropy (Bandt & Pompe, 2002) |
Numerical and Scientific Guarantees
- Welch PSD Equivalence (
scipy.signal.welch): Uses a periodic Hann window $w[n] = 0.5 - 0.5\cos(2\pi n / L)$ (fftbins=True), per-segment constant mean detrending (detrend='constant'), and one-sided power spectral density scaling $U = f_s \sum w[n]^2$ (scaling='density'). Matchesscipy.signal.welchto $< 10^{-12}$ relative error. - Band Integration Modes:
"trapezoid"(default): Composite trapezoidal integration with linear interpolation at exact band boundaries ($[f_{\text{lo}}, f_{\text{hi}}]$), preserving Parseval's theorem in $\mu\text{V}^2$."bin_mean": Arithmetic mean of PSD bins in $[f_{\text{lo}}, f_{\text{hi}})$ in $\mu\text{V}^2/\text{Hz}$ (matches legacypieeg_server.spectral).
- Compensated Variance and Single-Pass Hjorth: Two-pass compensated summation prevents catastrophic cancellation when large uncalibrated ADC DC offsets ($10^5\text{--}10^6\ \mu\text{V}$) sit atop microvolt EEG signals. Hjorth first- and second-difference means are evaluated in closed form from boundary samples, requiring zero intermediate allocations.
- Band Ratio Noise-Floor Guard: Denominator band power is guarded by
max(1e-12, total_power * 1e-9)so band-limited signals do not produce arbitrary $10^{16}\text{--}10^{29}$ ratios from floating-point FFT floor differences betweenf32andf64. - Degenerate Signals and Validity Flags:
- Flatlines ($\text{var}(x) \le 10^{-24}$) never produce
NaNorInf; Mobility, Complexity, Spectral Entropy, and Permutation Entropy return0.0and setFLAG_FLATLINE(1 << 1) inframe.channel_flags. - Non-finite inputs (
NaN/Inf) setFLAG_NON_FINITE(1 << 0) on the affected channel andframe.window_valid = False. - Sequence number gaps in streaming mode set
FLAG_SEQ_GAP(1 << 2), record the exact missing count inframe.missing_samples, and setframe.window_valid = False.
- Flatlines ($\text{var}(x) \le 10^{-24}$) never produce
📖 API Reference
FeatureFrame
| Member | Type | Description |
|---|---|---|
num_channels |
int |
Number of channels in the frame |
window_samples |
int |
Number of samples per channel in the window |
timestamp_start |
float |
Timestamp of the oldest sample in the window (streaming) |
timestamp_end |
float |
Timestamp of the newest sample in the window (streaming) |
seq_start |
int |
Sequence index of the oldest sample in the window |
seq_end |
int |
Sequence index of the newest sample in the window |
missing_samples |
int |
Count of dropped samples detected inside the window |
window_valid |
bool |
True when missing_samples == 0 and all channels are finite |
channel_flags |
list[int] |
Per-channel bitmask of FLAG_VALID (0), FLAG_NON_FINITE (1), FLAG_FLATLINE (2), FLAG_SEQ_GAP (4) |
matrix() |
list[list[float]] |
[num_channels][22] feature matrix |
values_flat() |
list[float] |
Flat row-major [num_channels * 22] feature list |
channel(ch) |
list[float] |
22-element feature vector for channel ch |
to_dict() |
dict |
Maps each feature name to a list[float] across channels plus metadata |
📊 Benchmarks (100x–170x Faster)
Measured at $f_s = 250\text{ Hz}$ extracting all 22 features per channel (time-domain, Welch PSD, band powers, ratios, spectral entropy, and permutation entropy). Steady-state heap allocations in Rust are verified via a custom #[global_allocator] counter in tests/bench_native.rs.
Native Rust Latency and Steady-State Allocations
| Channels | Window (@ 250 Hz) |
Layout | Batch Median ($\mu\text{s}$) | Batch p95 ($\mu\text{s}$) | Batch p99 ($\mu\text{s}$) | Streaming Hop Median ($\mu\text{s}$) | Steady-State Heap Allocs |
|---|---|---|---|---|---|---|---|
| 8 | 250 (1.0 s) | [C, N] / [N, C] |
37.0 / 38.4 | 40.5 / 65.8 | 62.8 / 67.7 | 40.2 | 0 |
| 8 | 500 (2.0 s) | [C, N] / [N, C] |
71.8 / 75.9 | 114.9 / 122.0 | 122.7 / 127.7 | 63.5 | 0 |
| 16 | 250 (1.0 s) | [C, N] / [N, C] |
83.3 / 82.0 | 129.9 / 135.3 | 166.4 / 139.5 | 92.0 | 0 |
| 16 | 500 (2.0 s) | [C, N] / [N, C] |
146.2 / 154.2 | 155.3 / 177.7 | 189.1 / 258.1 | 125.7 | 0 |
| 16 | 1000 (4.0 s) | [C, N] / [N, C] |
261.7 / 277.1 | 382.2 / 291.5 | 430.5 / 329.8 | 188.2 | 0 |
| 24 | 250 (1.0 s) | [C, N] / [N, C] |
114.6 / 120.5 | 120.5 / 121.5 | 157.6 / 135.1 | 116.5 | 0 |
| 24 | 500 (2.0 s) | [C, N] / [N, C] |
219.2 / 231.9 | 340.0 / 346.5 | 368.8 / 405.8 | 192.9 | 0 |
| 24 | 1000 (4.0 s) | [C, N] / [N, C] |
401.4 / 426.5 | 429.0 / 636.2 | 590.7 / 678.1 | 279.9 | 0 |
Python API Overhead vs. Reference SciPy / NumPy (benches/bench_python_vs_native.py)
| Channels | Window | extract_into (Med / p95 / p99 $\mu\text{s}$) |
extract() (Med / p95 / p99 $\mu\text{s}$) |
SciPy + NumPy Median ($\mu\text{s}$) | Speedup |
|---|---|---|---|---|---|
| 8 | 250 (1.0 s) | 40.2 / 41.9 / 70.6 | 38.2 / 38.8 / 42.3 | 6,961.9 | 173x |
| 8 | 500 (2.0 s) | 82.6 / 84.0 / 133.7 | 80.0 / 130.0 / 136.6 | 9,066.6 | 110x |
| 16 | 250 (1.0 s) | 85.5 / 86.3 / 92.1 | 82.3 / 83.3 / 86.7 | 14,762.4 | 173x |
| 16 | 500 (2.0 s) | 168.8 / 169.6 / 193.9 | 166.6 / 169.5 / 212.8 | 18,328.4 | 109x |
| 24 | 500 (2.0 s) | 254.8 / 510.1 / 552.7 | 348.4 / 416.5 / 546.3 | 27,512.8 | 108x |
| 24 | 1000 (4.0 s) | 467.8 / 688.4 / 821.3 | 462.9 / 481.1 / 558.9 | 41,161.8 | 88x |
- State footprint:
< 96 KBfor a 16-channel, 500-sampleStreamingFeatureEngine. - Binary size:
~1.18 MBstripped native extension with zero external shared library dependencies.
Build and Test from Source
Requires Rust (rustup) and maturin:
pip install maturin
cd pifeat
maturin develop --release
Run the pure-Rust unit tests and zero-allocation benchmark suite:
cargo test --no-default-features --release
cargo test --no-default-features --release --test bench_native -- --nocapture
Run the Python scientific validation suite and benchmark (requires pytest, numpy, scipy for reference comparison only):
pytest tests/test_scientific_validation.py -v
python benches/bench_python_vs_native.py
Release and Wheel Distribution
.github/workflows/release.yml builds precompiled wheels via PyO3/maturin-action@v1 for:
- Linux:
x86_64,aarch64(Raspberry Pi 4/5 64-bit),armv7(Raspberry Pi OS 32-bit) - Windows:
x64 - Python: CPython 3.10, 3.11, 3.12, 3.13 + source distribution (
sdist)
Metadata
Release files for pifeat 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pifeat-0.1.1.tar.gz | 61.0 kB | With provenance | Details for pifeat-0.1.1.tar.gz |
Built distributions (wheels)
Total release size: 7.9 MB
Release files / pifeat-0.1.1.tar.gz
| Download URL | pifeat-0.1.1.tar.gz |
|---|---|
| Size | 61.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
26bbe7a5e349d687f8062ec0d6f8dc901ed1afe94cad03cf6e648b53bc57464b
|
|
BLAKE2b-256 checksum How to use checksums |
1867c2fa0b50a23a526b2143f1ac51b6fe09d7b6e34bf511e6b68f439ba03225
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp313-cp313-win_amd64.whl
| Download URL | pifeat-0.1.1-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 528.3 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
425c2ef81e71c0138218e9a94a03d2f50af42fdda4aa754258ee23224f5a7db8
|
|
BLAKE2b-256 checksum How to use checksums |
49490abb92cb370687364494ad0e739b08b1ab82f39ab25b91febfd0c6493c43
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | pifeat-0.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 610.2 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
9243bf374319e2337864eb01913703e5084c86495f436fec2d67eab80bdbd296
|
|
BLAKE2b-256 checksum How to use checksums |
c01492e00f52316f9152603586e1030ef885b8a6572839d28a9bb75d25034070
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
| Download URL | pifeat-0.1.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl |
|---|---|
| Size | 374.6 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARMv7l |
|
SHA-256 checksum How to use checksums |
2407dfec294225180a131bfaec90b075386911692fb6d1c2e5aca0bd3a7cfdd3
|
|
BLAKE2b-256 checksum How to use checksums |
4f8a12d1d25175b1c8fc9cbc55d00c1589a4bf235cbec34766edd01ec07e5b00
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
| Download URL | pifeat-0.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl |
|---|---|
| Size | 452.8 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
5bc12f9a8703843630b07027f6ba86e03c32488cbc1af716ef5eb7f1c3592033
|
|
BLAKE2b-256 checksum How to use checksums |
c8bbdc7874bc26d58835366634d4e925ac193a4117f14433bd6435bfc286124b
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp312-cp312-win_amd64.whl
| Download URL | pifeat-0.1.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 528.6 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e38c93ded8ddb812d00baffb0d79d37bc16da40df162dac37f5dd1785d464686
|
|
BLAKE2b-256 checksum How to use checksums |
5dcbfc9b321105cd0b31ee319895c1b2299961a3bed66077cf43ecbbf4e76eff
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | pifeat-0.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 610.4 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
d45afe1ecafd5dbb733450fb85146b951eddf863bdb4fd2e2196b713d43e61c8
|
|
BLAKE2b-256 checksum How to use checksums |
482ad0b2541182ef1385f029dd8306295ef169df8d72c6ffcc273434a41df513
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
| Download URL | pifeat-0.1.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl |
|---|---|
| Size | 374.9 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARMv7l |
|
SHA-256 checksum How to use checksums |
ade35ed735aad99c48338a02a5e1b575083707d2ff30c0dba20d706e24345f96
|
|
BLAKE2b-256 checksum How to use checksums |
e8aa71e04bc042085c02bf84f1846359216c649e2cfc4f3a0ed929f8d562a8fc
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
| Download URL | pifeat-0.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl |
|---|---|
| Size | 452.8 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
aa9df5b2add4c575e559ceaccdaa52a2e9ba5312a78049a1554ee3b38f3b342b
|
|
BLAKE2b-256 checksum How to use checksums |
69daca5dd71ab34c9aa8bfc13678ce0ebd48a8c4cc16b3d50559ce343d81f67f
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp311-cp311-win_amd64.whl
| Download URL | pifeat-0.1.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 527.9 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e776b3dc93a57866bcc13868b5fc7abd5312e45aa37192b55330187fdd4dd887
|
|
BLAKE2b-256 checksum How to use checksums |
c4d2ba387f0cfe53d041d1c522d94a0e47c3467a30447011e99baf94964305ab
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | pifeat-0.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 610.0 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
67b844af5a38792b408b95e61955a8ab3b8f9ff79a2c22ae24d4f50a64f58051
|
|
BLAKE2b-256 checksum How to use checksums |
3b9bb7a92a0f602e4910b64c4d8925cd769489c2413c82171990ec64c33812d1
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
| Download URL | pifeat-0.1.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl |
|---|---|
| Size | 374.7 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARMv7l |
|
SHA-256 checksum How to use checksums |
a1124af085a79d7cc4a60e5d574b64a91cb462bd60c549401daf98464d0d0829
|
|
BLAKE2b-256 checksum How to use checksums |
8adbd4609d91be02015fd68059cb58d20663ac9069115c799304462280100e3c
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
| Download URL | pifeat-0.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl |
|---|---|
| Size | 453.0 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
f449a8b644475112772a7103c460132338390362b2d9dee7f751ddb49af2c3a5
|
|
BLAKE2b-256 checksum How to use checksums |
71efb0ff70aa2c635caa0a791ffe43db7e890b6c32593e461fbe165f398bf731
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp310-cp310-win_amd64.whl
| Download URL | pifeat-0.1.1-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 528.0 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
99d7e567ec86a80f74bcb589b72ac339323e941e836df71de974beb9e3c38afe
|
|
BLAKE2b-256 checksum How to use checksums |
cb6bf3b91b95866448e914be26f15bee2200ba9b3bd3767939f4fb3d56e4fd36
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | pifeat-0.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 610.2 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
eb41451e9f6cea6f46cd04bfbed5d49ee3c4d10404ab5dfdbf88a51ac679c555
|
|
BLAKE2b-256 checksum How to use checksums |
c888f36a1528e1ae97d517de32f971498fcf10f9307ca391ff6d124835a874c5
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
| Download URL | pifeat-0.1.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl |
|---|---|
| Size | 374.8 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARMv7l |
|
SHA-256 checksum How to use checksums |
22672bf55bffefcc2a54b6b29ae8fcd84bd507d10de8ffc54375608fa6a68330
|
|
BLAKE2b-256 checksum How to use checksums |
dd3552fc4df8a889de6d6ed71015c1379c207ff8515e5791040551a3db56ea4d
|
| 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 13, 2026.
Transparency logRelease files / pifeat-0.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
| Download URL | pifeat-0.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl |
|---|---|
| Size | 452.9 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
5dc477bd811a288f01f78e411f652d9f8b8e119cb33af53742a53dd39e03eecd
|
|
BLAKE2b-256 checksum How to use checksums |
8f97ef69b8da04b897f92e7b11798d92fb261794d17508eef0578bbaa18abd6f
|
| 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 13, 2026.
Transparency logSecurity for pifeat 0.1.1
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 17 files in this release have been uploaded with provenance metadata.
Attestation for pifeat-0.1.1.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 13, 2026.
Transparency logA 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.