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+. 0.7.7 goes back to the reference's corner window (the size-following one did not hold up on flight frames) and matches inner points again through a refined homography (a small level at the frame edge: pose 4.7 -> 0.96 px).

📖 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 comes back with bit-identical corners (checked by the test-suite against _reference_detect), and it runs on all cores within a single frame.

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 = 4        # corner refinement half-window (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: inner points are matched a second time through a homography fitted to the first matches; 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.7

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.7
File Size Uploaded Provenance Actions
nanofractal-0.7.7.tar.gz 221.7 kB With provenance Details for nanofractal-0.7.7.tar.gz

Built distributions (wheels)

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

Total release size: 143.8 MB

Release files / nanofractal-0.7.7.tar.gz

Download URL nanofractal-0.7.7.tar.gz
Size 221.7 kB
Tags Source
SHA-256 checksum
How to use checksums
9d26777de1441e4eefee1c74d125796b8062adbfc72f880c0db226f66b985ff5
BLAKE2b-256 checksum
How to use checksums
317fa316f98fb0554a59a6abd91734c0f99b68249795468b5614c6a62c5d2d31
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.7-cp312-abi3-win_amd64.whl

Download URL nanofractal-0.7.7-cp312-abi3-win_amd64.whl
Size 24.0 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
796f896c8d465e93457b3dd604e50de25a4ef6d4ebcb88d4f9b547063bdcb649
BLAKE2b-256 checksum
How to use checksums
387393ae6f4396507a80a3a707ae4f931a9f7f325051f125bfa114ca3cbffa0c
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.7-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL nanofractal-0.7.7-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
2fa25229f69d5b7f672283a33decd4d7664c07f643f06e91a8073f543f02ddec
BLAKE2b-256 checksum
How to use checksums
6b0aa3a201a6e839dc92292854b53f1b2f7e5e40d5e2054a2bac92c760db1408
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.7-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL nanofractal-0.7.7-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
e4e1b26c97500537f6742d831e08cf29db4e544573b5be73cfa64f6768131e17
BLAKE2b-256 checksum
How to use checksums
124be0a87388538889d8170465721c09b577d659b5c96a047dba669dfbf9b96b
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.7-cp312-abi3-macosx_11_0_x86_64.whl

Download URL nanofractal-0.7.7-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
d97783187afcdcdfe0ee1c3e2164ab4074dfb65c9d3f1942b002db9dde56ef07
BLAKE2b-256 checksum
How to use checksums
673ed691f0aae9065dd0fed25470887f92329d22df78bdea966b4dc0ce043041
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.7-cp312-abi3-macosx_11_0_arm64.whl

Download URL nanofractal-0.7.7-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
db1e8cfa7838cfee09a26ee987ed06c54696f526ab0715edda7e1b4b51225022
BLAKE2b-256 checksum
How to use checksums
1addfe06d6de1bb77f736c2c1614ed7f2d50cca9fa529f4230dfa1d9c7267c51
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.7-cp311-cp311-win_amd64.whl

Download URL nanofractal-0.7.7-cp311-cp311-win_amd64.whl
Size 24.0 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
921c6b5216f8591d65e10845e5685b9c5bd4a7f31fd3fdb0ab2b805debf290cd
BLAKE2b-256 checksum
How to use checksums
e0464bb302ab7baad0b5c2b00e035752748e2a4601cb474a5b92998a454f8db0
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.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL nanofractal-0.7.7-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
33aee3d4b99d5256ca773532f1986070fc793794b051b3f3d10f29c63763dc0b
BLAKE2b-256 checksum
How to use checksums
360fb818e4db9bca47e0efc4297b3944a23845a29c51d61ce1831661c9b86dc0
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.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL nanofractal-0.7.7-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
f02816e83606ff8c2fac7ad3a44ff50f2002a18fffe42eac3c0a217b7edebf0e
BLAKE2b-256 checksum
How to use checksums
59556818d534f63ceb626f8b076a0c0d82cc5ee4288e285354c0fae9aa9a4dac
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.7-cp311-cp311-macosx_11_0_x86_64.whl

Download URL nanofractal-0.7.7-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
ec61f101c1f837b933b682c118b3f1c46fe73816f1d98db7bd8283fe4550b8c8
BLAKE2b-256 checksum
How to use checksums
458d3ad1d22d5877aa8c50bc6938584052556694d1347ae7c0c0d4b99eef16b6
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.7-cp311-cp311-macosx_11_0_arm64.whl

Download URL nanofractal-0.7.7-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
55e60e9ab352a73a9688ce4cbdb9eadc9a6dbddcea4e8cbd2c23143fe6b41d6c
BLAKE2b-256 checksum
How to use checksums
463a7e1bb82ca29555d54d3e4403a837eaae2eb89b7a3ab0c557f3135cc63520
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.7-cp310-cp310-win_amd64.whl

Download URL nanofractal-0.7.7-cp310-cp310-win_amd64.whl
Size 24.0 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
fa1d5e0fea40e91bfb23959ece8060ef54b0aa5640f45497342c2a651ca48a4b
BLAKE2b-256 checksum
How to use checksums
fd65a439cc16b75acbb3bbc026915e90a9c31821b6671fe8d48bc57fa2230549
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.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL nanofractal-0.7.7-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
be0ef3b25044bb0ff3e81dd08d4a84f557b1d7f2fd57173e4bf489e5a31ac559
BLAKE2b-256 checksum
How to use checksums
16bc52cee37e2de2f2c36b744d55b62dfda9c49347636d16e2bfc09b1677a126
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.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL nanofractal-0.7.7-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
5fcd4e5f4eb7e5f17ee6933cff206b8bc0777dbd9904c4bf6420e024b3b3768a
BLAKE2b-256 checksum
How to use checksums
d2bdd5e7cd738423203b7038d8002b12af4373e8feb74f249343cb4fc5fa3e6a
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.7-cp310-cp310-macosx_11_0_x86_64.whl

Download URL nanofractal-0.7.7-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
71dc76e77b23fc1ecdb0bb2ada20e66bed7db6b4ec91832f6ccda48682a56e74
BLAKE2b-256 checksum
How to use checksums
60c2bf0ede37dc96e2b48597b601df28ccf73b8835940c962d81d823976319c5
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.7-cp310-cp310-macosx_11_0_arm64.whl

Download URL nanofractal-0.7.7-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
adc653ff87a50641ea9b2ebaf0ec31d293f0bad123ac95a6fcc598b62f3ecdf1
BLAKE2b-256 checksum
How to use checksums
99de6153e3846e8f2d99048b31a0fe3bec85f0408643792a27598975943edd2a
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.7-cp39-cp39-win_amd64.whl

Download URL nanofractal-0.7.7-cp39-cp39-win_amd64.whl
Size 23.9 MB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
48b6cf78a4a838788c3ad4cee148ba934f3f190f0f37263f28a06da12d97f937
BLAKE2b-256 checksum
How to use checksums
b699c811e4b87c5f6bbc2282077555f98a65c9c526c920e13af861aac77ce383
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.7-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL nanofractal-0.7.7-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
41b480a6e42bfe47072c44dc77871013a41b160e5651ef10ce01cb769e2c6239
BLAKE2b-256 checksum
How to use checksums
13d6e074c9fc5d8a821e2897c9d9f63f65aefa0919bd9cfb85f669ca791b9abe
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.7-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL nanofractal-0.7.7-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
15da6519aca4579bcd235d1aca1b9b23220a0ba402aabac7fbfd085371b96dff
BLAKE2b-256 checksum
How to use checksums
59a00a6fcfe6cade49e7838a9c00b1fd85454f5bf95709c164d3d98564f5cbe0
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.7-cp39-cp39-macosx_11_0_x86_64.whl

Download URL nanofractal-0.7.7-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
7d34faa1087f526a7736079d8622993b0eee6227cf373077f4dc9005f8d2611a
BLAKE2b-256 checksum
How to use checksums
f51d8b1205eb0cbf0d1f34aabf5ec5dd6e497a1b1d73c208b4ab809090869611
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.7-cp39-cp39-macosx_11_0_arm64.whl

Download URL nanofractal-0.7.7-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
020293a41ac1b2194bdf7c188d729cfc6d6b95ac1477e38bcf097d342beb26c9
BLAKE2b-256 checksum
How to use checksums
b347e3d4998fcb59b7ea0ed5e9c58c1d6eb1baad333eba0a6bf6f8278e410eba
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.7

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.7.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