Skip to main content

pencilmark

PyPI Python Wheels License: MIT Docs

pencilmark rates sudoku puzzles the way a human solver experiences them. It solves a puzzle step by step with human techniques, easiest first, and reports how hard it is, how long it takes, which band it belongs to and which techniques you need. It works for classic sudoku of any standard size and for many variants (killer, thermo, arrow, kropki, XV, sandwich, multi-grid boards and more). It also solves puzzles, checks uniqueness, imports puzzles from SudokuPad, f-puzzles, penpa-edit and Logic Masters links, and generates new puzzles to a target band or difficulty.

The engine is written in C++ (pybind11). Results are deterministic: the same puzzle always gets the same card.

Install

pip install pencilmark
pip install "pencilmark[verify]"      # optional: OR-Tools CP-SAT as a fallback uniqueness checker

Python 3.10 or newer. Building from source needs a C++17 compiler.

Quick start

import pencilmark

card = pencilmark.rate("....4.8.3.6...8..29.86.5..1235.........7..2.........96..2......8.12..7...9.......")
card["band"], card["difficulty"], card["time"]          # ('Hard', 5.9, 10.7)

card  = pencilmark.rate(puzzle, steps=True)             # add the step-by-step solve with explanations
cards = pencilmark.rate_many(puzzles, jobs=4)           # several puzzles in parallel, input order kept
sol   = pencilmark.solve(puzzle)                        # list of digits; raises NotUnique / NoSolution
exp   = pencilmark.to_export(puzzle, title="My puzzle") # "sudoku-puzzle" exchange format (docs/FORMAT.md)

A puzzle can be a classic string (. or 0 for blanks), a sudoku-puzzle dict, a puzzle JSON dict or string, or a path to a .json file.

Command line:

$ echo '....4.8.3.6...8..29.86.5..1235.........7..2.........96..2......8.12..7...9.......' | pencilmark rate - --report
#1  Hard  -  difficulty 5.9  -  time 10.7 min
   contains: Naked Pair (or Hidden Pair), X-Wing (or 2-String Kite / Simple Colouring / Short chain in the head)

pencilmark rate puzzles.txt --json        # full card per line (python -m pencilmark works too)
pencilmark solve puzzles.txt              # the solution, or 'not unique' / 'no solution'

More in docs/USAGE.md.

The card

rate returns a dict (format "sudoku-grade") with these fields by default (grader, format, format_version are always there); rate(puzzle, fields=[...]) / --fields asks for others by their key names, and only requested fields are computed (docs/GRADE.md):

Field Meaning
difficulty how hard each step feels, continuous, above 0 (a nearly finished grid is about 0.2), no ceiling; a typical newspaper medium is about 5
time expected minutes for the median player (on request time_mean or any percentile time_pNN, e.g. time_p80: 80% of players finish within it)
band Very Easy, Easy, Medium, Hard, Very Hard, Expert, Extreme; "Unknown" when guessing was allowed and used, or max_seconds passed (on request band_index 0..6)
contains techniques met going easy to hard: code, chip, name, band, uses, alternatives; with stopped_at_step when human logic ran out
on request issues / reject (publishing checks, below), time_mean / time_pNN, steps (technique, placement r2c8=3 or eliminations r4c5#7; explain="notation" / "short" / "teach" adds explanations, from X-Wing: 3 r58 c68 => r679c6<>3 to a short lesson), se, band_index, describe, symmetry

A chip like XWG/KTE/SCL means any one of those techniques gets you through at that point.

Publishing checks are off unless you ask for them. They flag puzzles a publisher would usually not pick: a difficulty spike, a rule that is never used, too many givens, ... (code, severity reject / warning, text, and rules: the offending rules' indices in the exported puzzle); reject is true when any issue is a reject. Each check's limit is adjustable:

card = pencilmark.rate(puzzle, fields=["difficulty", "band", "issues", "reject"], quality={"trivial": {"limit": 0.4}, "trial": {"severity": "off"}})

Guessing is off by default: where no technique applies, the engine proves an elimination by full search (Trial and error, band Extreme), so every uniquely solvable puzzle gets a band. allow_guessing=True (CLI --allow-guessing) lets it guess there instead, which is faster on the hardest puzzles; the card then says Unknown, with stopped_at_step. With max_seconds set, the whole call is capped and the card says completed: false if the limit passed. A puzzle without exactly one solution has no card: rate raises NotUnique / NoSolution.

Exchange format

to_export writes, and every entry point reads, the "sudoku-puzzle" format, format_version 1, specified in docs/FORMAT.md (JSON Schema: docs/sudoku-puzzle.schema.json):

{"format": "sudoku-puzzle", "format_version": 1,
 "meta": {"title": "Heartstring", "author": "...", "source": "example.org", "type": "Killer Sudoku"},
 "board": {"rows": 9, "cols": 9},
 "digits": 9,
 "givens":   [0, 0, 5, 4, 0, ...],
 "solution": [6, 1, 5, 4, 2, ...],
 "rules": [
  {"type": "box_grid", "origin": "r1c1", "box": [3, 3]},
  {"type": "cage", "sum": 15, "cells": ["r1c4", "r1c5", "r2c4"]},
  {"type": "edge", "kind": "kropki", "color": "white", "cells": ["r5c5", "r5c6"]}]}
  • Every constraint is a rule, houses included: a grid gives a sudoku grid's rows and columns, a box_grid adds its regular boxes, so a classic is one box_grid and a jigsaw is a grid plus box rules. Nothing is implied. Cells are named r{row}c{col}, 1-based. givens: 0 = empty, null = no cell (multi-grid gaps).
  • Each rule has one exact meaning and a default drawing, so a renderer needs nothing else; style and decorations are cosmetic only. meta is free-form information that never changes solving.
  • Strict reading: an unknown key or rule type makes the reader refuse the file (FormatError) instead of dropping a rule.
  • pencilmark.dumps writes the canonical text (one grid row per line, one rule per line); pencilmark.fingerprint gives a content hash that ignores metadata and styling; pencilmark.describe names the variant and lists its rules.

Other formats

For convenience pencilmark also reads and writes sudokuwiki.org packed strings, text grids and ipuz, reads pencil-mark grids, and loads SudokuPad, f-puzzles, Penpa+ and Logic Masters links. None of these is needed to use the sudoku-puzzle format; see docs/INTEROP.md. How rules map onto the engine, and how to add one, is in docs/ENGINE.md.

Supported rules

Classic sudoku from 4x4 to 25x25, irregular (jigsaw) regions, diagonals and extra regions, multi-grid layouts (samurai, twodoku, butterfly, windmill and more), killer cages, little killers, sandwich, X-sums, skyscrapers, frame sums, arrows, thermometers (normal and slow), German and Dutch whispers, renban, region-sum, palindrome, zipper, between, entropic, modular and parity lines, kropki, XV, greater-than, difference / ratio dots, anti-knight, anti-king, non-consecutive, odd / even, low / high, Rossini, Vudoku, equal sums, counting rules, and given candidates (Sukaku). Rules that cannot be translated exactly are refused, never dropped silently.

Generator

r = pencilmark.generate({"format": "sudoku-spec", "format_version": 1,
                         "board": {"rows": 9, "cols": 9}, "digits": 9,
                         "rules": [{"type": "box_grid", "origin": "r1c1", "box": [3, 3]}],
                         "where": {"band": "Hard"}})
r["puzzle"], r["card"], r["info"]       # sudoku-puzzle, its card, run details

The request is a sudoku-spec (docs/SPEC.md).

Targets: band, difficulty range, required techniques, symmetry, given counts, and rule elements (cages, thermos, whispers, renban, between lines, arrows, kropki, XV, parity). Every result is checked for uniqueness. Multi-grid boards are not generated.

Puzzle sources

from pencilmark import sources
pj = sources.load("https://sudokupad.app/...")      # SudokuPad, f-puzzles, penpa-edit, Logic Masters, short links
card = pencilmark.rate(pj)

Loaders that fetch pages identify themselves, obey robots.txt and pause between requests. Override the user agent with the PENCILMARK_UA environment variable.

Limitations

  • Bands and difficulty measure different things. The band is the hardest technique a puzzle needs; difficulty is how hard it is overall. A puzzle that needs one X-Wing (Hard) is often easier than a long Medium one, and solvers agree (docs/PHILOSOPHY.md). This is by design, not an error.
  • Difficulty and time are models fitted to human solving data. Differences under one point of difficulty are not meaningful, and a single solve can vary a lot from the predicted time.
  • Bands depend on the technique catalogue; a puzzle that needs a technique the engine does not have is solved with Trial and error at that point and rated Extreme.
  • Very hard puzzles with many-cell rules (killers, arrows, palindromes, thermos) can take minutes while the contents list is minimised; use max_seconds to cap it (the card then says completed: false).
  • The Sudoku Explainer-style ratings (se=True) are approximate and meaningful for classic sudoku only.

Benchmark

On a frozen held-out set of 7,623 puzzles with real human solve data from seven sources, pencilmark's difficulty ranks puzzles by human solve time at Spearman 0.61 to 0.80 within each group, closer than four established graders on the same classics. Details: docs/BENCHMARK.md.

Known issues

Being worked on after 1.0:

  • Speed. Grading takes a median 0.5 s per puzzle, but the slowest few percent take 10 s to minutes. On the benchmark's classics: pencilmark 0.04 s, Rangsk's solver 0.09 s, Sudoku Explainer and HoDoKu under a millisecond (they do not model human solving); on variants: pencilmark 0.49 s, Rangsk's solver 0.13 s. Use max_seconds to bound a call.
  • Generator speed and range. About 20-70 s per puzzle that meets a spec (HoDoKu: 0.05-1 s), and classic Extreme puzzles are not reached within the default 120 s. A maximum on the givens count is not always enforced.
  • Variants on one scale. On classics, difficulty matches established ratings of the same puzzles; across variant types the same difficulty does not yet mean the same experience (puzzle types differ by about 2 points on average, and variants often score above the classic range of their band). Time is most off for the same reason (about 1.4x per puzzle type).
  • The ends of the scale. Between about 2 and 8, each point of difficulty means about 20-40% more solving time per cell. Above about 8 a point is worth less time (5-15% on three sources). Below 2 the scale is gentler (about the square root of effort, so it never goes negative); there it predicts solve times about 1.5% worse than a pure log scale would.
  • Uniqueness on some killers. A few large killers can raise Undecided without OR-Tools (pip install "pencilmark[verify]") although human logic solves them.

License

MIT, see LICENSE.

pencilmark was written with Claude.

Metadata

Release files for pencilmark 1.0.0

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

Source distribution (sdist)

Source distribution for pencilmark 1.0.0
File Size Uploaded Provenance Actions
pencilmark-1.0.0.tar.gz 628.2 kB With provenance Details for pencilmark-1.0.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for pencilmark 1.0.0
File Actions
pencilmark-1.0.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details for pencilmark-1.0.0-cp314-cp314-win_amd64.whl
pencilmark-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details for pencilmark-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
pencilmark-1.0.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details for pencilmark-1.0.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
pencilmark-1.0.0-cp314-cp314-macosx_11_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 11.0+ x86-64 Details for pencilmark-1.0.0-cp314-cp314-macosx_11_0_x86_64.whl
pencilmark-1.0.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details for pencilmark-1.0.0-cp314-cp314-macosx_11_0_arm64.whl
pencilmark-1.0.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details for pencilmark-1.0.0-cp313-cp313-win_amd64.whl
pencilmark-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details for pencilmark-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
pencilmark-1.0.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details for pencilmark-1.0.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
pencilmark-1.0.0-cp313-cp313-macosx_11_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 11.0+ x86-64 Details for pencilmark-1.0.0-cp313-cp313-macosx_11_0_x86_64.whl
pencilmark-1.0.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details for pencilmark-1.0.0-cp313-cp313-macosx_11_0_arm64.whl
pencilmark-1.0.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details for pencilmark-1.0.0-cp312-cp312-win_amd64.whl
pencilmark-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details for pencilmark-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
pencilmark-1.0.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details for pencilmark-1.0.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
pencilmark-1.0.0-cp312-cp312-macosx_11_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 11.0+ x86-64 Details for pencilmark-1.0.0-cp312-cp312-macosx_11_0_x86_64.whl
pencilmark-1.0.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details for pencilmark-1.0.0-cp312-cp312-macosx_11_0_arm64.whl
pencilmark-1.0.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details for pencilmark-1.0.0-cp311-cp311-win_amd64.whl
pencilmark-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details for pencilmark-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
pencilmark-1.0.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details for pencilmark-1.0.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
pencilmark-1.0.0-cp311-cp311-macosx_11_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 11.0+ x86-64 Details for pencilmark-1.0.0-cp311-cp311-macosx_11_0_x86_64.whl
pencilmark-1.0.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details for pencilmark-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
pencilmark-1.0.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details for pencilmark-1.0.0-cp310-cp310-win_amd64.whl
pencilmark-1.0.0-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 pencilmark-1.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
pencilmark-1.0.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 Details for pencilmark-1.0.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
pencilmark-1.0.0-cp310-cp310-macosx_11_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 11.0+ x86-64 Details for pencilmark-1.0.0-cp310-cp310-macosx_11_0_x86_64.whl
pencilmark-1.0.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details for pencilmark-1.0.0-cp310-cp310-macosx_11_0_arm64.whl

Total release size: 33.2 MB

Release files / pencilmark-1.0.0.tar.gz

Download URL pencilmark-1.0.0.tar.gz
Size 628.2 kB
Tags Source
SHA-256 checksum
How to use checksums
2c22c51d50fa9da9c1ae20ca59c19b7b1400403a401f8550961044b72c44e409
BLAKE2b-256 checksum
How to use checksums
8e9e580572e1784a3eea054c542441d2a3d0b09fe985c22e3508f98cef710bc9
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp314-cp314-win_amd64.whl

Download URL pencilmark-1.0.0-cp314-cp314-win_amd64.whl
Size 1.1 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
7083eed04cd9b862e1d5ba642cf26edafbb77b182855c8a984a09539625fefb6
BLAKE2b-256 checksum
How to use checksums
f68194e09de1a119980130293334f997b30fbb112b7198554bef919d2c0f6cb9
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pencilmark-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.4 MB
Tags CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
ff76a6b4ab4e50905841c26db652714e0f74e0eab64185f83421b65d68a28e22
BLAKE2b-256 checksum
How to use checksums
43e97596b5b1631af4ced881315524f2c10e6134d03e4e756fead2cec72cdfa5
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pencilmark-1.0.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 1.3 MB
Tags CPython 3.14 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
a0335b0a768e1e68e6cd4b1f4be89085472c3648823f23d7d727111c2addbd36
BLAKE2b-256 checksum
How to use checksums
0339516036a553d97e06c5928d7dde62d5331237f9eb409514841f3714641533
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp314-cp314-macosx_11_0_x86_64.whl

Download URL pencilmark-1.0.0-cp314-cp314-macosx_11_0_x86_64.whl
Size 1.4 MB
Tags CPython 3.14 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
67e772610ade67ae2efa9ec83dcd93ee2987e5c69611f1f06d463f058b91f6dd
BLAKE2b-256 checksum
How to use checksums
2c0b021752c8120803036060e0175c8f081af3d854556279f177e2cb83a47030
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp314-cp314-macosx_11_0_arm64.whl

Download URL pencilmark-1.0.0-cp314-cp314-macosx_11_0_arm64.whl
Size 1.3 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a06e9c45edc2c3c4832825c6fd14a6a066d277c89f7e2c9262b5c69f3c0d1e89
BLAKE2b-256 checksum
How to use checksums
6019c4568b050b6a10e51f29686cfd841bb8c5d484330062d264f940e4f7daee
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp313-cp313-win_amd64.whl

Download URL pencilmark-1.0.0-cp313-cp313-win_amd64.whl
Size 1.1 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
5344b6b26ff9d6a7b3c93f52a5947ec210fcba0b8330c68f0de43a349a6b9b58
BLAKE2b-256 checksum
How to use checksums
3b2b3e239bc034790c6891609507b9ddf318d371be838c7c1f06b390b96c9a05
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pencilmark-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.4 MB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
717c04813e0197e5e5ca01c1deebde6ff803e97490f1010542c5c94a61db593e
BLAKE2b-256 checksum
How to use checksums
4c4c54e812bed3388ea80f7239b421c485c45e403498458806790838c882564b
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pencilmark-1.0.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 1.3 MB
Tags CPython 3.13 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
b48c78eedeb6a9ed556d8debab337bfd8dbcd79b1546a63562d4038e5c44d660
BLAKE2b-256 checksum
How to use checksums
c79fb1341a748abec127cfa2b45d46cc39288df4f5dafd769763cef3433337f9
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp313-cp313-macosx_11_0_x86_64.whl

Download URL pencilmark-1.0.0-cp313-cp313-macosx_11_0_x86_64.whl
Size 1.4 MB
Tags CPython 3.13 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
a6808ce95f44e043c975551a692bc68d713aced9a88f4672e60cbfab99f744f0
BLAKE2b-256 checksum
How to use checksums
1919518bc2b04ca655159d9f2f317995acee174591e502d4e01c0980dac30265
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL pencilmark-1.0.0-cp313-cp313-macosx_11_0_arm64.whl
Size 1.3 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0819e49faaf3c311fd88698d8c4d9fc14185794f804b15c79e82a2fc08f2ccff
BLAKE2b-256 checksum
How to use checksums
c0756eae025bbcfe48f4f5fdfe525537cd284ad6172d51493a7370696ab4ed9f
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp312-cp312-win_amd64.whl

Download URL pencilmark-1.0.0-cp312-cp312-win_amd64.whl
Size 1.1 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
1acf075b2e4b61b0deaec161ee9ec1891d0010f3cde54355803e685ee164d9fa
BLAKE2b-256 checksum
How to use checksums
1cb52cb37bca2fe801a8df2888bb4b3b224c5c033ced9fc30473769f1cea8f05
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pencilmark-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.4 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
9f4778051d02cc555423003e6bb715ecb6886ab6c361dee930e3bf0a39ed0c81
BLAKE2b-256 checksum
How to use checksums
ea8d114e328e7d89233f45db527f445118c9abdcff113330eba9d813a5f0220b
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pencilmark-1.0.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 1.3 MB
Tags CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
04296454880bcb6f8e28e6a9c98564dee3d3123c6b5889a7e369d4d02150b2bc
BLAKE2b-256 checksum
How to use checksums
0bacd42f444739e63f6252712a35592a3cba0eefabb03ce5fbf40aa600d01d6c
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp312-cp312-macosx_11_0_x86_64.whl

Download URL pencilmark-1.0.0-cp312-cp312-macosx_11_0_x86_64.whl
Size 1.4 MB
Tags CPython 3.12 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
03c856d10ccb1a839aab7fefb50fc1bde1e1e9054720202d860ba8e28a5b46ff
BLAKE2b-256 checksum
How to use checksums
d1687c35bfc45608f222791a6458dd87977e1df3633a55310b2c0a5ffff10e0d
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL pencilmark-1.0.0-cp312-cp312-macosx_11_0_arm64.whl
Size 1.3 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1aee92dcb777dbf29765bd3fd5399f68f7405723c1891228e7420b7262e628ea
BLAKE2b-256 checksum
How to use checksums
d12da08c215c04b44e7dc4efa6ea9e3b4a04defd35cb6f33d61479e550dcabc3
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp311-cp311-win_amd64.whl

Download URL pencilmark-1.0.0-cp311-cp311-win_amd64.whl
Size 1.1 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
fd96ff1abe3b06789cb2c843a83ce2c11696fdf17d5e830bd2b83a3413c44edb
BLAKE2b-256 checksum
How to use checksums
c2356e300752d5be57f0aa45bcd50574e3f1a78b11c0ffd07892bb587e53f11c
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pencilmark-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.4 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
36e0c4e11bcb85cae05293cba940af39aae821e0b16edc63b3150f7831d98fc3
BLAKE2b-256 checksum
How to use checksums
56726bf73ad8b9b72ac8d6bd2f1cf4fe081e09c6be5928e1848c7fa186e56284
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pencilmark-1.0.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 1.3 MB
Tags CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
ee7ecb626ca57752464bf6f2ec5a3477940dea1279424e7a60a8fa19f1a3befc
BLAKE2b-256 checksum
How to use checksums
22f4501231761bd422a4a7a7e8beb06be3fcd97f0fc8eff306d181077e40de38
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp311-cp311-macosx_11_0_x86_64.whl

Download URL pencilmark-1.0.0-cp311-cp311-macosx_11_0_x86_64.whl
Size 1.4 MB
Tags CPython 3.11 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
a9b469b7974c70cbc5b5ff8b276983a92e50314c405bc06c73b01d3d21e26416
BLAKE2b-256 checksum
How to use checksums
68c67278b01e96b5bdce4696a94e140581e4bfd76ca68942bd1137b092566b2a
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL pencilmark-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
Size 1.3 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e7cdf0f08959e222daec1341ff05fe189deff9c0027617a22c6c137e28bfee38
BLAKE2b-256 checksum
How to use checksums
f3f3429fca34be7dcb6acb10f5a00be6be88afe7acb0455c5aa2acf29b0296c3
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp310-cp310-win_amd64.whl

Download URL pencilmark-1.0.0-cp310-cp310-win_amd64.whl
Size 1.1 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
7c8da1afa999326a3e5985dec21fcc9295741b2c1f270371ba8edf3fe1e4373a
BLAKE2b-256 checksum
How to use checksums
03db99c711f6b8cdd570d7661967660534d0f31a1ae194368cbf75fce91a3ff5
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pencilmark-1.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.4 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
11ae441fd7e1e9b84feb41ec05046b15e620c7fd7fbedf10e4d590620a55ac85
BLAKE2b-256 checksum
How to use checksums
b18c619141d2851c61f5ebaa6fed4adc24a0010c4107aa60903fa9de2be5f49a
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pencilmark-1.0.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 1.3 MB
Tags CPython 3.10 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
8647f3d302890c54eff00b23bf80cbf249df43f119bf91a5f5e952967a9f59c5
BLAKE2b-256 checksum
How to use checksums
18275785d18f56bc1f8505ae5e2cb3945d0ca690b3b2a03b1ed3e0ec557e6987
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp310-cp310-macosx_11_0_x86_64.whl

Download URL pencilmark-1.0.0-cp310-cp310-macosx_11_0_x86_64.whl
Size 1.4 MB
Tags CPython 3.10 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
93f81298e5266ac8ed250a9fb4f7afe5885265cb8c7c0ccf60efb09421eac815
BLAKE2b-256 checksum
How to use checksums
050362c7854a0ab80da89e25f768bc4114af6cd811231acbf64a3299a04d39d8
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 Oct 30, 2026.

Transparency log

Release files / pencilmark-1.0.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL pencilmark-1.0.0-cp310-cp310-macosx_11_0_arm64.whl
Size 1.3 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
30f0000b35315b15f6813d65aa882b0b9e76a3a045076a723cbf20e3d0b2bd76
BLAKE2b-256 checksum
How to use checksums
ead202caf92ad83f4a20bf54b1640140a02196e55ddfc72977c2ecf6ac48fdbe
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 Oct 30, 2026.

Transparency log

Security for pencilmark 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 26 files in this release have been uploaded with provenance metadata.

Select from 26 files

Attestation for pencilmark-1.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 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