Skip to main content

pencilmark

pencilmark: human-like difficulty grader, solver and generator for classic and variant sudoku

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

Written with AI. Almost all of pencilmark's code, data analysis and documentation was written by an AI model (Claude), directed and reviewed by its maintainer. If you object to AI-written software, take that into account before you use it or contribute.

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") # the sudoku-puzzle format

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

The card

rate returns a "sudoku-grade" card: by default the band (Very Easy to Extreme: what you need to know), the difficulty (how hard the steps are to find, no ceiling; a newspaper medium is about 5), the predicted median solve time in minutes, and the techniques the puzzle contains, easiest first. On request it adds publishing checks (a difficulty spike, a rule nobody needs, too many givens), the steps with explanations, time percentiles and more; only requested fields are computed. A puzzle without exactly one solution has no card: rate raises NotUnique / NoSolution. Every field is in Grade card.

Puzzle format

to_export writes, and every entry point reads, the "sudoku-puzzle" format, format_version 1: every constraint is a rule, houses included, each with one exact meaning and a default drawing, and an unknown key makes the reader refuse the file instead of dropping a rule.

{"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"]}]}

The specification is Puzzle format (JSON Schema: docs/sudoku-puzzle.schema.json).

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/formats/other-formats.md. How rules map onto the engine is in docs/library/engine-mapping.md; how to add one, in Add a rule kind.

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/formats/generator-spec.md).

Targets: band, a difficulty range or the hardest / easiest found, required techniques, symmetry, given counts (per grid on a multi-grid layout), and rule elements with counts and shape limits (cages, thermos, whispers, renban, between lines, arrows, kropki, XV, parity). Boards: one grid, or a named multi-grid layout such as samurai, with locked rules of different digits. Every result is checked for uniqueness.

Puzzle sources

card = pencilmark.rate("https://sudokupad.app/...")  # SudokuPad, f-puzzles, Penpa+, Logic Masters, short links
exp = pencilmark.to_export("https://sudokupad.app/...")  # the same puzzle as a sudoku-puzzle file

The command line takes links too: pencilmark rate links.txt, one link per line.

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 (philosophy). 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 technique list (contains) is made minimal; 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/grades/benchmark.mdx.

Known issues

Being worked on after 1.0:

  • Speed. Grading takes a median 0.49 s per puzzle on the benchmark (classics 0.04 s; 90th percentile 3.8 s), and the slowest few percent take 10 s to minutes. Sudoku Explainer and HoDoKu answer in under a millisecond (they do not model human solving), Rangsk's solver in 0.07-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.
  • 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.

Metadata

Release files for pencilmark 1.1.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.1.0
File Size Uploaded Provenance Actions
pencilmark-1.1.0.tar.gz 688.6 kB With provenance Details for pencilmark-1.1.0.tar.gz

Built distributions (wheels)

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

Total release size: 31.5 MB

Release files / pencilmark-1.1.0.tar.gz

Download URL pencilmark-1.1.0.tar.gz
Size 688.6 kB
Tags Source
SHA-256 checksum
How to use checksums
8ec776ee748dfe21048506417eb88939b667a0e6f5f167efe8d90dfdc2b33cc6
BLAKE2b-256 checksum
How to use checksums
c9c8865ba6ecb68ed9747c11682002ff9ce5c93242443525a75ad054def7dcad
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp314-cp314-win_amd64.whl
Size 1.1 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
f77ef58bfa98bb3ce5422c3bfa0bf6790da0a80db56e0e2ab4d0eec667b2d8d0
BLAKE2b-256 checksum
How to use checksums
8acccd233581ff530e9cbc9440d5ec1e0fdec7f5a416404a116540a9529d6c01
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.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
4c33c11def92b8f6950b6ad2b0b0f426121de1686cd22820d9de7f7433d443e8
BLAKE2b-256 checksum
How to use checksums
60cd3f49c1e1441c922262a33b2aa8415a3618389108bae42dba97702a73a0de
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.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
e6c962dfde635014ef2748258888f0652e4869f1eb4fca2e683923f2e9f61e47
BLAKE2b-256 checksum
How to use checksums
99a510df0a6e52f82b19ac1ae70c348316b650984d55c0eb43aa2f69fbd74f73
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp314-cp314-macosx_11_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.14 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
75c6e969a7356b0a383b5084ffb17fefba196ba31e64324d3a9ff10901dd7fac
BLAKE2b-256 checksum
How to use checksums
16dc2d55ae65b4146c2629ded67358c45bc32acad3a573cffb797ea8538af3a4
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp314-cp314-macosx_11_0_arm64.whl
Size 1.2 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5a69f2c2ce422134870e58310ba33390777809bd9fd0ceb50d6538b06ff9b989
BLAKE2b-256 checksum
How to use checksums
914ec5b8423afefa76cea201366d9ae7239b168f9a5a148cde2f3aebb050f46e
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp313-cp313-win_amd64.whl
Size 1.1 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
0d5d9beaef853f6b620c434c28d28418a86a9099db10edef3fb42cb10f3856e3
BLAKE2b-256 checksum
How to use checksums
3b1e64da1d543d6b256ce448c18925de6874a652caf853ba2a82083f203145e3
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.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
d7bd23d31d859c54656a94d77be57714fbeca01175a3381b6d25aaaa18acf0d3
BLAKE2b-256 checksum
How to use checksums
1699929d141eb324eaa23d92cea4931e536de590fe3f995b95ad1f87945df787
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.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
c6cb7f5e44a9a423e4e74393ba29d8d94820f2a1936c9714e3a1a531215f4990
BLAKE2b-256 checksum
How to use checksums
da8b683368249d48ed7518e0463d3b8058fbd6e062e9f2ff95e4599ad977fc0e
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp313-cp313-macosx_11_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.13 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
ab0311543ae065fedf202127a94e98b01ec48d4d03cdcbd56c25c93b0593a2f3
BLAKE2b-256 checksum
How to use checksums
d8a5d178d0e2435d711427814493e9c2c745ce3f61aa7b0dbd706b6117d4a4c5
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp313-cp313-macosx_11_0_arm64.whl
Size 1.2 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5f86d68f2ebd92205c6ce1d0608b621d337281c4627b9381e581de33c38c558d
BLAKE2b-256 checksum
How to use checksums
97e880af15cf9f7a46e96c58071ebad17e7006d87bb9bfc2d9fbd31c36107cc4
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 1, 2026.

Transparency log

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

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

Transparency log

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

Download URL pencilmark-1.1.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
e7be423bd325d5e40e891c079eaffc1cda1dedd6d49dffd03fad6f00de29a50f
BLAKE2b-256 checksum
How to use checksums
806876925c0659b5995858989bfd20b958af1136855c62315eef48990d9c627e
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.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
ae4f97338b47de8feddb9dc2a2866c3faedc6b20535c170aaf3f6898a9a5aa59
BLAKE2b-256 checksum
How to use checksums
897839ab8efdc8bf8d6bfc7d0511917e8029bca5a996d084397639258a34830c
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp312-cp312-macosx_11_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.12 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
b3f021b9a2b8d475bdc704314a231dbad489f2e476769d1d86ca64154b04643a
BLAKE2b-256 checksum
How to use checksums
8ae389b237b565abb05f4f32cc3e9f06bcfd12d1826cdb6469e1be0ccb8b292d
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp312-cp312-macosx_11_0_arm64.whl
Size 1.2 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e2b453fd2abc244b3e6d2fd8c784e9a26f0160ccb0428ca7075e007ceef96514
BLAKE2b-256 checksum
How to use checksums
60a17fd233c2e444c18e3a4e06d7581aace5eedcdc277f3d0104cdb049377bde
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp311-cp311-win_amd64.whl
Size 1.1 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
8e999f90bc7c0aa18ed07e97c9150fb5f45462230c27ff80e18eff2040cf64c3
BLAKE2b-256 checksum
How to use checksums
ceb72c70b71ac0528aa779417cb196d7803d2d3286934c41ef8078970eaaf681
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.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
69e89e0816f09c629ef5db4a789c591aaaba908f007b70d71f079ed74e7cd5df
BLAKE2b-256 checksum
How to use checksums
89097146b3d47dad54f6b22f18edf530f4b88aa95dc570853a14e93fdfccb029
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.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
12d944b5a07035b7afb650625fa8d125b0835a7ed9d523f76dc5ad42ab624b88
BLAKE2b-256 checksum
How to use checksums
e4a80b97c9be90c2f099d2258574d2e52f05be2db20b17aafc4048b86c9db085
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp311-cp311-macosx_11_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.11 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
e5628898107a9b33fdd4aaad9b4e144b9eca250fff331072217b795e8d1c97a6
BLAKE2b-256 checksum
How to use checksums
e28be9735cc16c5f218893b4352fde9f362d0568470dd60280e60ba32609322b
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp311-cp311-macosx_11_0_arm64.whl
Size 1.2 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
179af34ee556ff08d74db1e5a998cff7484f663362b77f778259ea399c5d55e1
BLAKE2b-256 checksum
How to use checksums
f868335961d7282d6d641027ad32360a0956121f9c4154e225e42979ff1f749b
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp310-cp310-win_amd64.whl
Size 1.0 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
b578d222dc8f0666d11b82f87db3a996f957a4de86f0ecfa94d990932cc8c0cc
BLAKE2b-256 checksum
How to use checksums
cb2b7f0a76e7a8da7ffe5d78f1df26a10f99ea966a2a9c884f936c908d223870
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
51d90cc7e73c3e43ba3f57e91dce1a5c8adfb73d2834cae5132b4d85d8b787bd
BLAKE2b-256 checksum
How to use checksums
77e3c50567d0e3e319c056ca2c74f6b371065f5f5e874ea21c8cb5573cac28c4
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.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
82e56739131afa4e0a5f9624bcb938cf00e251566f63ef2134b83391d3f81b83
BLAKE2b-256 checksum
How to use checksums
28d06cb41544b56aa11e73e7bdf3ee698e40e41ebe1e235777baf68cea40f7c1
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp310-cp310-macosx_11_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.10 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
11045864f44ebbad09724a8b5e58658ac4b8352a365dc64c563862343f51e775
BLAKE2b-256 checksum
How to use checksums
1e6eb7bc68fc68d08ae2b3aea04de540f809c93f2f103d9ef35b4cefc39b976d
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 1, 2026.

Transparency log

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

Download URL pencilmark-1.1.0-cp310-cp310-macosx_11_0_arm64.whl
Size 1.2 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d7980b29450d7bc57f8542479c051eaf2b26b9e636f45544205151cc7e6a24d4
BLAKE2b-256 checksum
How to use checksums
a0c575b15c964e811a6624456296d3a2aa467eb8e37bfcb80d9d3d6fcace7c39
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 1, 2026.

Transparency log

Security for pencilmark 1.1.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.1.0.tar.gz

PyPI Publish Attestation

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

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