Skip to main content

nanofractal

codecov docs

Documentation: https://onikore.github.io/nanofractal/

Fast fractal fiducial-marker detection for Python. Fractal markers are nested square markers: they stay detectable under heavy occlusion and over a wide range of distances, and every visible level contributes corner correspondences for accurate pose.

nanofractal wraps an optimised C++ pipeline with nanobind: zero-copy NumPy ↔ cv::Mat, the GIL is released during detection, multi-threaded single-frame detection, and a parallel batch API.

Since 0.6 the library is fractal-only (the ArUco detector was removed). 0.7 reads far markers the reference detector misses (2.6–3 px per cell), explains rejected candidates (diagnose), drops levels that do not fit the rest, finds every copy of a marker, reports pose uncertainty, scales the tracker to the marker size and adds NEON code for aarch64. 0.7.1 finds markers seen from very close on dark frames (a second threshold pass); 0.7.2 reports the reading quality of every level and keeps a marker that flickers at the edge of range (prior / FractalTracker(use_prior=True)). 0.7.3 picks up a marker that is in view but never read yet, once it holds its place for a few frames (FractalTracker(capture_frames=3)). 0.7.4 reads a far marker with a looser tolerance when its size is known from the height (expected_side_px), reports lookalikes, and gives one number for the pose uncertainty (Pose.sd_t). 0.7.5 reads overexposed far markers a little better with the size hint and comes with a documentation site and a landing recipe. 0.7.6 reads a quad a third way when a few cells are off (edge-fitted corners, sharpened cells), refines corners with a window that follows the marker's size, and ships one stable-ABI wheel for Python 3.12+.

📖 User guide (also in guide/) — markers and printing, detection, pose, video, how to use it most efficiently, parameter tuning, API reference, troubleshooting, and a landing recipe (one step per frame for a drone). Every Python example in it, and in this README, is executed by the test-suite.


Performance

The hot path (adaptive threshold, contour tracing, polygon fitting, decoding) is a purpose-built reimplementation: every level the reference detector finds is found with the same quad, and with the reference's corner window (subpix_win_size = 4) with bit-identical corners (checked by the test-suite against _reference_detect); it runs on all cores within a single frame. By default the corner window follows the size of each level, which takes about a third off the corner error of small and of large markers.

Median latency per frame, FRACTAL_5L_6, synthetic scenes from nanofractal.bench, i5-12400 (6 cores / 12 threads), NF_MARCH=x86-64-v3, OpenCV 4.10 — the configuration of the published wheels:

scene / mode res 0.5, 1 core 0.7.3, 1 core 0.5, all cores 0.7.3, all cores gain (all cores)
marker in clutter, detect 1080p 11.3 ms 3.21 ms 12.3 ms 0.99 ms ×12.4
marker in clutter, with_inner_points 1080p 13.4 ms 4.50 ms 14.4 ms 2.18 ms ×6.6
no marker (clutter only) 1080p 12.7 ms 3.42 ms 13.8 ms 0.85 ms ×16
marker in clutter, detect 4K 52.6 ms 12.1 ms 49.5 ms 4.69 ms ×10.6
marker in clutter, with_inner_points 4K 54.6 ms 15.6 ms 55.3 ms 7.20 ms ×7.7
no marker (clutter only) 4K 55.3 ms 13.3 ms 55.1 ms 4.95 ms ×11
detect_batch, 48 × 1080p — — — 382 fps ~1500 fps ×3.9

0.7.3 measured 2026-11-03 (one core pinned with taskset); 0.5 on the same machine earlier. A frame with no marker costs 0.1–0.7 ms more than in 0.6: it is thresholded a second time for markers seen from very close (params.close_pass = False skips that).

With OpenCV 5.0 (whose own findContours is already ~3× faster than 4.10's) 0.6 is 2–2.5× faster than 0.5 on one core and 3–8.5× with all cores, e.g. 1080p detect 4.66 → 0.92 ms and 4K 15.9 → 4.14 ms.

0.7 adds a SIMD prefix-scan threshold (detect on one core ×1.17–1.34 at 4K, ×1.05–1.12 at 1080p) and NEON code for aarch64 (Raspberry Pi 5, one core: 1.5–2× faster than the scalar build). The second bit reading costs nothing measurable on scenes the reference already reads. Every push is timed against the previous commit in CI and fails on a slowdown.

Reproduce on your machine:

python -m nanofractal.bench --resolution 1920x1080 --scene perspective
python benchmarks/fractal_bench.py run --resolutions 1920x1080 3840x2160 --batch

Levers:

  • nf.set_num_threads(n) — threads used inside one detect() call (default: all cores; 1 = sequential, best for many concurrent detectors). Next to video capture/encoding, fewer threads are often faster (Raspberry Pi 5 with a 60 fps camera and preview: 2 threads 57.5 frames/s, 4 threads 32.5) — start with half the cores and measure the whole pipeline.
  • params.detection_scale — runs the threshold/contour stage on a downscaled frame (corners are still refined at full resolution); 0.5 is roughly 3–4× faster at 4K.
  • FractalTracker — for video: searches near the previous frame's markers (whole frame when they are lost), with identical accuracy; ~2× faster at 4K and 1.4–1.8× at 1080p on a moving-marker sequence. With auto_scale=True it also shrinks the searched region to the marker size (corners still refined on the full frame): 4K, one core, ×5.7 vs detect.
  • detect_batch — parallelises across frames for offline throughput.

Installation

pip install nanofractal

Wheels are available for Linux x86_64/aarch64, macOS arm64/x86_64 (macOS 11+) and Windows AMD64, CPython 3.9–3.14 (x86_64 wheels require AVX2, i.e. Haswell 2013 or newer). They bundle a minimal OpenCV, so no system OpenCV is required at runtime.

Build from source

You need a C++17 compiler, CMake ≥ 3.18 and a development OpenCV — 4.x (core, imgproc, calib3d, features2d) or 5.x (core, imgproc, geometry, features):

sudo apt-get install -y build-essential cmake libopencv-dev   # Debian/Ubuntu
pip install .
NF_MARCH=x86-64-v3 pip install .     # AVX2 build (what the x86_64 wheels use)

Quick start

Inputs are plain NumPy uint8 arrays — (H, W) / (H, W, 1) grayscale or (H, W, 3) BGR, C-contiguous.

Generate a marker

import nanofractal as nf

marker = nf.generate_fractal("FRACTAL_5L_6", size_px=1200)   # every nested level
outer = nf.generate_fractal("FRACTAL_5L_6", size_px=1200, nested=False)  # external level only

The image spans the marker's black border exactly; leave a white quiet zone around it when printing. Configs: FRACTAL_2L_6, FRACTAL_3L_6, FRACTAL_4L_6, FRACTAL_5L_6 (number of nested levels).

Detect

import numpy as np
import nanofractal as nf

# a test frame: the marker on a white page (or image = cv2.imread("scene.png"))
image = np.full((900, 1200), 255, np.uint8)
image[150:750, 300:900] = nf.generate_fractal("FRACTAL_5L_6", 600)
det = nf.FractalDetector("FRACTAL_5L_6", marker_size=0.2)  # side in metres

res = det.detect(image)
print(res.ids)       # int32 (N,)      — one entry per visible marker level
print(res.corners)   # float32 (N,4,2) — outer corners, sub-pixel
for level_id, corners in res:
    print(level_id, corners[0])
assert 0 in res.ids

Pose (occlusion-robust)

estimate_pose returns (rvec, tvec, reproj_err) or None. It uses every visible inner and outer corner correspondence when available and falls back to the outer corners of every detected level otherwise (each at its true size, so the scale is right even when only an inner level is visible); reproj_err (RMS px) lets you gate noisy poses.

camera_matrix = np.array([[1000.0, 0, 600], [0, 1000.0, 450], [0, 0, 1]])
dist_coeffs = np.zeros(5)

res = det.detect(image, with_inner_points=True)
pose = det.estimate_pose(res, camera_matrix, dist_coeffs)       # fisheye=True for the fisheye model
if pose is not None:
    rvec, tvec, reproj_err = pose
    print(tvec.ravel(), reproj_err)    # marker 0.2 m wide, 600 px: about 0.33 m away
    vis = det.draw(image, res, camera_matrix, dist_coeffs, rvec, tvec)   # outlines + axes

The raw correspondences are exposed too: res.points_2d float32 (M, 2), res.points_3d float32 (M, 3) (planar, z = 0) and res.points_level, the level of each point.

estimate_pose(..., full=True) returns a Pose with the method used, the number of points and inliers, the 6×6 covariance cov of (rvec, tvec) and the other planar solution (rvec_alt, tvec_alt, reproj_err_alt): when reproj_err_alt is close to reproj_err the tilt is ambiguous.

Tune detection

p = nf.DetectorParams()
p.detection_scale = 0.5      # downscaled threshold/contour stage
p.min_contour_size = 60      # detect smaller markers (default 120 px perimeter)
p.adaptive_block_size = 21   # threshold window (odd, >= 3; -1 = auto)
p.adaptive_c = 7.0           # threshold constant
p.approx_poly_rate = 0.05    # polygon fit epsilon = perimeter * rate
p.subpix_win_size = -1       # corner refinement half-window: -1 = by level size, 4 = reference, 0 = off
p.kfilter_min_dist = 10.0    # min distance between inner-corner keypoints
p.close_pass = True          # retry empty frames with a large threshold block (very close markers)
det = nf.FractalDetector("FRACTAL_5L_6", params=p)
det.params.adaptive_c = 5.0  # changes apply to the next detect()

Video

frames = [np.roll(image, 20 * k, axis=1) for k in range(5)]   # stand-in for a camera
tracker = nf.FractalTracker(det, auto_scale=True, use_prior=True)   # margin=0.25, pad=16
for frame in frames:
    res = tracker.detect(frame)           # det.detect(frame), plus levels read through the last result
    print(res.cell_px, res.contrast, res.bit_errors)   # reading quality per level

# on a drone's approach: also pick up the marker before it is first read
tracker = nf.FractalTracker(det, use_prior=True, capture_frames=3)

More

  • detect(image, roi=(x, y, w, h)) — detect in a zero-copy sub-rectangle; corners come back in full-image coordinates.
  • detect_batch(images, num_threads=0, roi=None) — parallel over frames.
  • detect(image, all_instances=True) — every copy of the marker in view; res.instance(k) is copy k, ready for estimate_pose.
  • res.inconsistent_ids — levels dropped because they do not fit the larger levels (a marker-like pattern elsewhere in the frame).
  • detect(image, prior=last_result) — a level the plain reading misses by a few cells where it was a moment ago is kept and marked by bit_errors > 0 (outer levels only; flight video: 10 more frames of 203).
  • FractalTracker(det, capture_frames=3) — a quad within the same tolerance of a level's code that stays in place for 2 frames is read with it as prior in the 3rd (flight videos: the marker read 8–39 s earlier on the approach; no candidate on 2400 frames without it).
  • detect(image, expected_side_px=(lo, hi)) — the marker's size from the height (rangefinder): that size is read with a looser tolerance and res.lookalikes lists near misses with centre, border errors and contrast (flight videos: 4976 frames with the marker instead of 4601, first read 13–36 s earlier; no false read or lookalike without a marker).
  • res.cell_px, res.contrast, res.bit_errors — reading quality of every level, to weigh a detection instead of a yes/no; Pose.sd_t / Pose.sd_rot_deg — one number for the pose uncertainty.
  • diagnose(image) — every candidate quad with the reason it was kept or dropped ("duplicate", "border", "bits", "inconsistent"), its closest code and cell contrast: why a marker is not found.
  • refine_corners(image, corners, win_size=5) — standalone cornerSubPix.
  • PoseSmoother(process_noise, measurement_noise, mode="kalman"|"ema") — temporal pose smoothing.
  • draw(..., inplace=False) — draw on a copy.

Errors: wrong dtype / non-contiguous input → TypeError; unsupported shape, empty frame, invalid config or parameters, invalid intrinsics → ValueError.


How it is fast

  • Fused adaptive threshold. Separable box sums (horizontal first, uint16, ring buffer + running vertical window), reproducing OpenCV's fixed-point / float rounding of the mean exactly, written straight into a zero-bordered buffer together with 8-neighbour occupancy masks. Horizontal sums come from a SIMD prefix scan (AVX2 / NEON). Row stripes run in parallel.
  • Contour tracing. Suzuki–Abe border following identical to cv::findContours(RETR_LIST, CHAIN_APPROX_NONE) (sequential), with SIMD start detection, one mask load per step and no allocation for contours below the minimum size. Isolated speckle pixels (most contours in noisy frames) are skipped without tracing. Row bands are traced in parallel: each band keeps its own pixel labels and a contour is kept by the band holding its start, the ownership rule also used by OpenCV's data-race-free TRUCO tracer; the test-suite checks the result against findContours on millions of contours, including bands one row high. It is 2–3× faster than OpenCV 5.0's own parallel findContours at every thread count (1080p, 12 threads: 0.31 vs 0.72 ms).
  • Polygon fit + decoding in parallel per contour, with exact replicas of OpenCV 4's and OpenCV 5's approxPolyDP (they differ) and no per-frame heap traffic. A quad the reference reader rejects is read again with each cell sampled exactly at its centre (the reference sampler is up to a pixel off, a whole cell for far markers).
  • Inner points. FAST runs only around the marker; keypoint filtering and matching use grids instead of O(n²) scans.
  • Tracking (FractalTracker): region-of-interest search around the previous detection, after Romero-Ramirez et al., Speeded up detection of squared fiducial markers (2018). Their other lever — shrinking the image to the previous marker size — was tested and rejected: it raised the corner error from 0.39 to 1.3 px.
  • Zero-copy input, GIL released, a detector pool for detect_batch.

Intentional differences from the reference detector: the outer corners are refined with a window that follows the size of each level (side / 20, 2 to 9; the reference uses 4); the second bit reading finds more levels (far, blurred, steeply tilted markers) — levels the reference finds are unchanged; a frame where nothing is found is thresholded again with a large block (close_pass, markers seen from very close); levels that do not fit the larger levels are dropped (inconsistent_ids); with with_inner_points=True, the FAST response threshold is computed over the marker's neighbourhood instead of the whole frame. Reading with a prior is off unless asked for.


Changelog

See CHANGELOG.md.

Citation

If you use this in research, please cite the original work:

  • F. J. Romero-Ramirez, R. Muñoz-Salinas, R. Medina-Carnicer, "Fractal Markers: A New Approach for Long-Range Marker Pose Estimation Under Occlusion", IEEE Access, 7, 2019.
  • F. J. Romero-Ramirez, R. Muñoz-Salinas, R. Medina-Carnicer, "Speeded up detection of squared fiducial markers", Image and Vision Computing, 76, 2018.

License

Apache-2.0. The vendored fractal detector is © its authors and used under its terms; see third_party/ and PATCHES.md.

Metadata

Release files for nanofractal 0.7.6

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

Source distribution (sdist)

Source distribution for nanofractal 0.7.6
File Size Uploaded Provenance Actions
nanofractal-0.7.6.tar.gz 220.8 kB With provenance Details for nanofractal-0.7.6.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for nanofractal 0.7.6
File Actions
nanofractal-0.7.6-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details for nanofractal-0.7.6-cp312-abi3-win_amd64.whl
nanofractal-0.7.6-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details for nanofractal-0.7.6-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
nanofractal-0.7.6-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 abi3 Linux glibc 2.28+ ARM64, Linux glibc 2.27+ ARM64 Details for nanofractal-0.7.6-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
nanofractal-0.7.6-cp312-abi3-macosx_11_0_x86_64.whl CPython 3.12 abi3 macOS 11.0+ x86-64 Details for nanofractal-0.7.6-cp312-abi3-macosx_11_0_x86_64.whl
nanofractal-0.7.6-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details for nanofractal-0.7.6-cp312-abi3-macosx_11_0_arm64.whl
nanofractal-0.7.6-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details for nanofractal-0.7.6-cp311-cp311-win_amd64.whl
nanofractal-0.7.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details for nanofractal-0.7.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
nanofractal-0.7.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.27+ ARM64, Linux glibc 2.28+ ARM64 Details for nanofractal-0.7.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
nanofractal-0.7.6-cp311-cp311-macosx_11_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 11.0+ x86-64 Details for nanofractal-0.7.6-cp311-cp311-macosx_11_0_x86_64.whl
nanofractal-0.7.6-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details for nanofractal-0.7.6-cp311-cp311-macosx_11_0_arm64.whl
nanofractal-0.7.6-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details for nanofractal-0.7.6-cp310-cp310-win_amd64.whl
nanofractal-0.7.6-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details for nanofractal-0.7.6-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
nanofractal-0.7.6-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ ARM64, Linux glibc 2.27+ ARM64 Details for nanofractal-0.7.6-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
nanofractal-0.7.6-cp310-cp310-macosx_11_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 11.0+ x86-64 Details for nanofractal-0.7.6-cp310-cp310-macosx_11_0_x86_64.whl
nanofractal-0.7.6-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details for nanofractal-0.7.6-cp310-cp310-macosx_11_0_arm64.whl
nanofractal-0.7.6-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details for nanofractal-0.7.6-cp39-cp39-win_amd64.whl
nanofractal-0.7.6-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details for nanofractal-0.7.6-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
nanofractal-0.7.6-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl CPython 3.9 CPython 3.9 Linux glibc 2.27+ ARM64, Linux glibc 2.28+ ARM64 Details for nanofractal-0.7.6-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
nanofractal-0.7.6-cp39-cp39-macosx_11_0_x86_64.whl CPython 3.9 CPython 3.9 macOS 11.0+ x86-64 Details for nanofractal-0.7.6-cp39-cp39-macosx_11_0_x86_64.whl
nanofractal-0.7.6-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details for nanofractal-0.7.6-cp39-cp39-macosx_11_0_arm64.whl

Total release size: 143.8 MB

Release files / nanofractal-0.7.6.tar.gz

Download URL nanofractal-0.7.6.tar.gz
Size 220.8 kB
Tags Source
SHA-256 checksum
How to use checksums
7b79120a6138e5b9fcf31ca6c2c2c40d563ebd0bbf9fca6e38465f73fa7417a8
BLAKE2b-256 checksum
How to use checksums
e1f04504c27a4bc2871cd9b1c46619540d74bac6f5c410eddaf580456db25c97
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp312-abi3-win_amd64.whl

Download URL nanofractal-0.7.6-cp312-abi3-win_amd64.whl
Size 24.0 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
00dd44f37d507daced3003783fd203fca9146582c7162e99b16c649f8f96547f
BLAKE2b-256 checksum
How to use checksums
f506bcc842333c466f0ad0ddcab3a5dddf854c8babab703e0de60bfb44018e80
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL nanofractal-0.7.6-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 3.2 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
980979fb7368aa8839f4b107a8a705dc2fb1a7f3ff40beb5d9d7f3f8122d6356
BLAKE2b-256 checksum
How to use checksums
674b95161b76fcfb87d26998f3f84d4c0b27a7afa46da03d66551a4a6d2b0921
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL nanofractal-0.7.6-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Size 2.5 MB
Tags CPython 3.12 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
98a1d27eae4727c697d17e94b3efd7ab8deea70b4b4f477393f78c07e2649882
BLAKE2b-256 checksum
How to use checksums
d4fe7c944016d255672704528575eaa10bbac1a866e6ebc7b622cd317e064896
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp312-abi3-macosx_11_0_x86_64.whl

Download URL nanofractal-0.7.6-cp312-abi3-macosx_11_0_x86_64.whl
Size 3.5 MB
Tags CPython 3.12 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
a1e2c3984fb5a3dd5850864890454362da675bd3b5c636693d92e6522656e2e7
BLAKE2b-256 checksum
How to use checksums
45ab71b592a2e3cba67258dea472801796589912b48a42e503953a49024000be
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp312-abi3-macosx_11_0_arm64.whl

Download URL nanofractal-0.7.6-cp312-abi3-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7a2f2354a1567f7d1f220b84f1c020b6e35d135e2d136e07c36e14f7a159f37b
BLAKE2b-256 checksum
How to use checksums
a37140cc53bce223ff23508c8c9165fc1c752bb700e994ce01f70e381038febe
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp311-cp311-win_amd64.whl

Download URL nanofractal-0.7.6-cp311-cp311-win_amd64.whl
Size 24.0 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
1dfdd498561e7bbc69042f5ebd1bca86de99d27871694b882edce2b08b9bbe4c
BLAKE2b-256 checksum
How to use checksums
a9bb296abe5b6215b8e23079c8f79fceda40ec359437fc58355d97377ef8f282
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL nanofractal-0.7.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 3.2 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
1e6fcbd504ac8c8ba5c4a3e9ea68dd21ab9fdcdfe17b371f26edd47feae16af9
BLAKE2b-256 checksum
How to use checksums
d08e6cc5035be20c208e9face38eacecff2b00575799967030793daef8b2bb35
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL nanofractal-0.7.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Size 2.5 MB
Tags CPython 3.11 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
25d862a0ff7d9da454740a9c0cfb4c1218242976a8e8f3cf03175cd1d952a4fb
BLAKE2b-256 checksum
How to use checksums
9d87dc36059e40a4f9916810bc449d5979b85038e316c4bf9c4c05cb7e631356
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp311-cp311-macosx_11_0_x86_64.whl

Download URL nanofractal-0.7.6-cp311-cp311-macosx_11_0_x86_64.whl
Size 3.5 MB
Tags CPython 3.11 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
891063c76b9255e045a04199fe780685c963b1c7d2c0b5f2b3b26fa49007410f
BLAKE2b-256 checksum
How to use checksums
6bc394a9e5addf4524d8433ac06318b53216fe97a11583fba9b1666f85fed81a
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp311-cp311-macosx_11_0_arm64.whl

Download URL nanofractal-0.7.6-cp311-cp311-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e3dfe59ef3294d5460b605c25b43b7830087a79cb2f52217273842de7981759e
BLAKE2b-256 checksum
How to use checksums
1874b2c63c8686ff9ab79b6c379424c83d816717fe8113261d3a97d399ec1216
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp310-cp310-win_amd64.whl

Download URL nanofractal-0.7.6-cp310-cp310-win_amd64.whl
Size 24.0 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
fb87c5c0db2a3c4c08a5f0b7faa3e7c97ba0fbb84e1332862e7dc2a47592d7fc
BLAKE2b-256 checksum
How to use checksums
30fb21388539c00924c0459a4741eb68d2b432aba91fc743033c3aa9d6695d6a
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL nanofractal-0.7.6-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 3.2 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
f29d2db3fecd9505e8f4bfd157b86ba8e05a21ba7c982fb5a632ab5b5c45c2a4
BLAKE2b-256 checksum
How to use checksums
9e86089ab032bf114656ab893da446bea4eeb508125e04440da79d3913a2affa
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL nanofractal-0.7.6-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Size 2.5 MB
Tags CPython 3.10 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
fd3e999377b1a233ec13e33912326b7eb2c0014926f3e8263ffd59d24a6538c0
BLAKE2b-256 checksum
How to use checksums
08e8a017aa1d66612bc91c93676b80bb6dc5cacc22dc1a9c3865d73a5b83be18
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp310-cp310-macosx_11_0_x86_64.whl

Download URL nanofractal-0.7.6-cp310-cp310-macosx_11_0_x86_64.whl
Size 3.5 MB
Tags CPython 3.10 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
155460420cc2c0b1de58ddb7a6c9882a6074cf5c6e17b3f9d6797495cedb84d0
BLAKE2b-256 checksum
How to use checksums
87ddadd94d09428d5a68023c9c85215b7074c4305f02527f28a7998f97381f43
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp310-cp310-macosx_11_0_arm64.whl

Download URL nanofractal-0.7.6-cp310-cp310-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b7239271aa7115797861e70f1c91887a2ecb05a0667ef6a4e133646dcbced1bc
BLAKE2b-256 checksum
How to use checksums
ae431d2d8350c75a459692376f49347ad6a119e9a64b48980fda6ccd31073cc0
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp39-cp39-win_amd64.whl

Download URL nanofractal-0.7.6-cp39-cp39-win_amd64.whl
Size 23.9 MB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
91aa6c1dec0832aaf7619e118df3f0e611170a1c991abcbbad6c858eaac54acd
BLAKE2b-256 checksum
How to use checksums
0fd95bf95ad20128111a7c9e837c740d9e2152a8bbceabe6711f02c31aa3a2d9
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL nanofractal-0.7.6-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 3.2 MB
Tags CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
baac80f73b738d75e7912892a3840266fa20f117a9f727fde683bd56033adadb
BLAKE2b-256 checksum
How to use checksums
5387c7fa820f7303a53618595f5fef117203b3eaec5caa4fe509364e3fc65a05
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL nanofractal-0.7.6-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Size 2.5 MB
Tags CPython 3.9 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
a2e36db2a488f2d0376d24a02efaf5a8b33f2a4d6a81c9e9709c6ce8de5badcc
BLAKE2b-256 checksum
How to use checksums
fcfe72a6ec1e66f20785cbf2ca264257e5401a3018e8baa9f001232adcf4e8e4
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp39-cp39-macosx_11_0_x86_64.whl

Download URL nanofractal-0.7.6-cp39-cp39-macosx_11_0_x86_64.whl
Size 3.5 MB
Tags CPython 3.9 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
a26847c979790e2082b63c101361f937c1ca64a0a4cf6089038d8ede38125619
BLAKE2b-256 checksum
How to use checksums
56f03b516ccf99c761b9ae5f8c8a62da101c4413d46eb4f20706557eeb260bd5
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 3, 2026.

Transparency log

Release files / nanofractal-0.7.6-cp39-cp39-macosx_11_0_arm64.whl

Download URL nanofractal-0.7.6-cp39-cp39-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c7f5318192068182c9d355fa732fc62d009de8936ab52c5e4f57e6da08b29e5c
BLAKE2b-256 checksum
How to use checksums
ec5ca188cf2e7b73644d987772edd6d095ea8987edafd1aac530a66862c76e24
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 3, 2026.

Transparency log

Security for nanofractal 0.7.6

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 21 files in this release have been uploaded with provenance metadata.

Select from 21 files

Attestation for nanofractal-0.7.6.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 3, 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