Public record
Software health reportschema 0.16.0 · metrics 1.13.0 · 2026-07-21 02:21 UTC

data-privacy-stack / presidio

An open-source framework for detecting, redacting, masking, and anonymizing sensitive data (PII) across text, images, and structured data. Supports NLP, pattern matching, and customizable pipelines.

PythonMIT★ 10,090 stars⑂ 1,211 forkssince May 2018View on GitHub ↗

data-privacy-stack/presidio holds a health index of 90 out of 100, placing it in the Excellent band. It scores highest on Security (97/100) and lowest on AI Readiness (70/100). It was last updated 4 days ago. 3 contributors account for most of its recent work.

90
overall / 100
Excellent

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

90
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Data Privacy StackOrganization
17 followers4 public repossince Apr 2026

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
PyPIpresidio2.2.3637,606522 days agopresidio
PyPIpresidio-clipoints to another repo — not scored0.0.816161474 days agopiichecker
PyPIpresidio_analyzer2.2.3636,035,63410722 days agopresidio-analyzer
PyPIpresidio_anonymizer2.2.3634,438,0924322 days agopresidio-anonymizer
PyPIpresidio_structured0.0.7-722 days agopresidio-structured
PyPIpresidio-image-redactor0.0.59-2322 days agopresidio-image-redactor

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

94Excellent · 22% of overall
How it's scored
36/36Push recency — last push 4 days ago
32.5/36Commit cadence — 47/52 weeks with commits
18/18Commit volume — 284 commits in the last year
0/10OpenSSF Scorecard: Maintained — no data
Inputs used
commits_last_year284
human_commit_share
days_since_last_push4
active_weeks_last_year47
How it's scored
27/27Ships releases — 48 releases published
36/36Release recency — latest release 22 days ago
19.8/27Release cadence — a release every ~91.2 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count48
latest_release_tag2.2.363
releases_from_tagsno
days_since_latest_release22
mean_days_between_releases91.2

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

96Excellent · 18% of overall
How it's scored
60/60Stars — 10,090 stars
25/25Forks — 1,211 forks
10.8/15Watchers — 90 watchers
Inputs used
forks1,211
stars10,090
watchers90
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Community health

92Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateyes
How it's scored
80/80Monthly downloads — 10,481,332 downloads/month across pypi
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagespresidio, presidio_analyzer, presidio_anonymizer, presidio_structured, presidio-image-redactor
dependents
ecosystemspypi
total_downloads
monthly_downloads10,481,332
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

74Good · 24% of overall
How it's scored
36/54Bus factor — 3 contributor(s) cover half of all commits
16.3/22.5Commit distribution — top contributor authored 28% of commits
13.5/13.5Contributor breadth — 100 contributors
0/10OpenSSF Scorecard: Contributors — no data
Inputs used
bus_factor3
contributors_sampled100
top_contributor_share0.276
How it's scored
42.7/46.8Issue resolution — 91% of issues closed
29.1/38.3PR acceptance — 1,071/1,408 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — no data
Inputs used
merged_prs1,071
open_issues48
closed_issues504
issue_closed_ratio0.913
closed_unmerged_prs337
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
9/25Owner reach — 17 followers of data-privacy-stack
5.6/25Track record — 4 public repos, account ~0 yr old
Inputs used
followers17
owner_typeOrganization
is_verified
owner_logindata-privacy-stack
public_repos4
account_age_days98
How it's scored
25/25Published & resolvable — 5 package(s) on pypi
35/35Publish recency — latest publish 22 days ago
20/20Version history — 107 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagespresidio, presidio_analyzer, presidio_anonymizer, presidio_structured, presidio-image-redactor
ecosystemspypi
any_deprecatedno
min_days_since_publish22

Engineering Quality

Are baseline engineering and documentation practices in place?

95Excellent · 20% of overall
How it's scored
24/24CI workflows — 6 workflow(s)
24/24Tests present
16/16Linter config
9.6/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configyes

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://presidio.dataprivacystack.org
10/10Repository description
10/10Topics — 20 topics
10/10Wiki
Inputs used
topicspython, pii, privacy, data-anonymization, de-identification, data-masking, transformers, pii-detection, data-obfuscation, data-privacy, data-redaction, guardrails, image-redactor, named-entity-recognition, nlp, personally-identifiable-information, phi, sensitive-data, spacy, anonymization
has_wikiyes
homepagehttps://presidio.dataprivacystack.org
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

97Excellent · 16% of overall

Security posture

100Excellent
How it's scored
30/30Security policy (SECURITY.md)
25/25Dependabot config
0/25Dependency lockfiles — published library — lockfiles are an application concern, not expected
20/20CodeQL workflow
Inputs used
sourcefile_signals
lockfilesuv.lock
manifestsdocs/requirements-docs.txt, e2e-tests/requirements.txt, presidio-analyzer/Pipfile, presidio-analyzer/pyproject.toml, presidio-anonymizer/pyproject.toml, presidio-cli/Pipfile, presidio-cli/pyproject.toml, presidio-image-redactor/pyproject.toml, presidio-structured/pyproject.toml, presidio/pyproject.toml, pyproject.toml
has_codeql_workflowyes
has_security_policyyes
has_dependabot_configyes
Excluded from scoring (no data or not applicable): Dependency lockfiles. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
10/25Indirect dependencies free of known advisories — 1 affected: cryptography 46.0.7 (high 7.5)
40/40No advisories left outstanding — no advisory has been public longer than 90 days
Inputs used
sourceosv
advisories1
affected_packages1
assessed_packages55
unassessed_packages0
affected_by_severityhigh 1
direct_affected_packages0
Matched the pypi:presidio@2.2.363 runtime dependency closure — what installing the published package pulls in — 55 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

70Good · 0% of overall
How it's scored
45/45Agent instructions — .github/copilot-instructions.md
0/15Machine-readable docs (llms.txt)
0/40Legible commit history — no data
Inputs used
has_llms_txtno
legible_history_share
agent_instruction_files.github/copilot-instructions.md
agent_instruction_max_bytes26,062
Excluded from scoring (no data or not applicable): Legible commit history. Remaining weights renormalized.
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config
11/11Static type checking — presidio-analyzer/presidio_analyzer/py.typed, presidio-anonymizer/presidio_anonymizer/py.typed, presidio-image-redactor/presidio_image_redactor/py.typed, presidio-structured/presidio_structured/py.typed
10/10Reproducible environment — devcontainer, Dockerfile, lockfile
0/10Demonstrated agent practice — no data
5/8Automated maintenance — dependency automation configured, none observed in the sampled commits
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsyes
lockfilesuv.lock
has_dockerfileyes
typed_languageno
bootstrap_files
has_devcontaineryes
has_linter_configyes
typecheck_configspresidio-analyzer/presidio_analyzer/py.typed, presidio-anonymizer/presidio_anonymizer/py.typed, presidio-image-redactor/presidio_image_redactor/py.typed, presidio-structured/presidio_structured/py.typed
agent_commit_share
toolchain_manifests
dependency_bot_commit_share0
Excluded from scoring (no data or not applicable): Demonstrated agent practice. Remaining weights renormalized.
How it's scored
27/45Type-checkable code — Python with type-check config (presidio-analyzer/presidio_analyzer/py.typed, presidio-anonymizer/presidio_anonymizer/py.typed, presidio-image-redactor/presidio_image_redactor/py.typed, presidio-structured/presidio_structured/py.typed)
54.9/55Manageable file sizes — 1/468 source files over 60KB
Inputs used
primary_languagePython
largest_source_bytes64,127
source_files_sampled468
oversized_source_files1
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — notebooks, recipes, samples
Inputs used
example_dirsnotebooks, recipes, samples
has_mcp_signalno
api_schema_files

Key facts

10,090GitHub stars
100contributors
284commits, last 12 months
4days since last push
48releases
3bus factor
48open issues
PyPIpackage ecosystems

Data collection warnings

  • pypi package 'presidio-cli' points at a different repository (https://github.com/insightsengineering/presidio-cli); excluded from ecosystem scoring
  • OpenSSF Scorecard did not return a usable result (2026/07/21 02:20:02 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks

More detail

Direct dependencies 31
RegistryPackageVersion constraintManifest
PyPIspacy(>=3.4.4,!=3.7.0,<4.0.0)presidio-analyzer/pyproject.toml
PyPIspacy(>=3.4.4,!=3.7.0,!=3.8.14,<4.0.0)presidio-analyzer/pyproject.toml
PyPInumpy(>=1.19.0,<2.5.0)presidio-analyzer/pyproject.toml
PyPIclick(>=8.1.0,<9.0.0)presidio-analyzer/pyproject.toml
PyPIregex(>=2023.0.0)presidio-analyzer/pyproject.toml
PyPItldextract(>=5.3.1,<6.0.0)presidio-analyzer/pyproject.toml
PyPIpyyaml(>=6.0.3,<7.0.0)presidio-analyzer/pyproject.toml
PyPIphonenumbers(>=9.0.28,<10.0.0)presidio-analyzer/pyproject.toml
PyPIpydantic(>=2.12.5,<3.0.0)presidio-analyzer/pyproject.toml
PyPIcryptography(>=48.0.1,<49.0.0)presidio-anonymizer/pyproject.toml
PyPIpresidio-analyzer(>=2.2.0,<3.0.0)presidio-cli/pyproject.toml
PyPIpyyaml(>=6.0.0,<7.0.0)presidio-cli/pyproject.toml
PyPIpathspec(>=0.9.0,<2.0.0)presidio-cli/pyproject.toml
PyPIclick(>=8.1.0,<9.0.0)presidio-cli/pyproject.toml
PyPIpillow(>=9.0.0,<13.0.0)presidio-image-redactor/pyproject.toml
PyPIpytesseract(>=0.3.13,<0.4)presidio-image-redactor/pyproject.toml
PyPIpresidio-analyzer(>=2.2.0,<3.0.0)presidio-image-redactor/pyproject.toml
PyPImatplotlib(>=3.6.0,<4.0.0)presidio-image-redactor/pyproject.toml
PyPIpydicom(>=2.3.0,<4.0.0)presidio-image-redactor/pyproject.toml
PyPIpypng(>=0.20220715.0,<1.0.0)presidio-image-redactor/pyproject.toml
PyPIazure-ai-formrecognizer(>=3.3.3,<4.0.0)presidio-image-redactor/pyproject.toml
PyPIopencv-python(>=4.13.0.92,<5.0.0)presidio-image-redactor/pyproject.toml
PyPIpython-gdcm(>=3.0.24.1,<4.0.0)presidio-image-redactor/pyproject.toml
PyPIspacy(>=3.8.7,<4.0.0)presidio-image-redactor/pyproject.toml
PyPIspacy(>=3.8.7,!=3.8.14,<4.0.0)presidio-image-redactor/pyproject.toml
PyPIpresidio-analyzer(>=2.2.0,<3.0.0)presidio-structured/pyproject.toml
PyPIpresidio-anonymizer(>=2.2.0,<3.0.0)presidio-structured/pyproject.toml
PyPIpandas(>=1.5.2,<4.0.0)presidio-structured/pyproject.toml
PyPIclick(>=8.1.0,<9.0.0)presidio-structured/pyproject.toml
PyPIpresidio-analyzer(>=2.2.0,<3.0.0)presidio/pyproject.toml
PyPIpresidio-anonymizer(>=2.2.0,<3.0.0)presidio/pyproject.toml
All dependencies 293

Full resolved dependency set from the GitHub dependency graph: 42 direct and 251 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
PyPIazure-ai-formrecognizer3.3.3direct
PyPIclick8.4.2direct
PyPIcryptography46.0.7direct
PyPIcryptography48.0.1direct
PyPIcryptography49.0.0direct
PyPImatplotlib3.10.9direct
PyPImatplotlib3.11.0direct
PyPInumpy2.0.2direct
PyPInumpy2.2.6direct
PyPInumpy2.4.6direct
PyPIopencv-python4.13.0.92direct
PyPIpandasdirect
PyPIpandas2.3.3direct
PyPIpandas3.0.3direct
PyPIpathspecdirect
PyPIpathspec1.1.1direct
PyPIphonenumbers9.0.33direct
PyPIphonenumbers9.0.34direct
PyPIpillow12.2.0direct
PyPIpillow12.3.0direct
PyPIpresidio-analyzerdirect
PyPIpresidio-analyzer2.2.355direct
PyPIpresidio-analyzer2.2.359direct
PyPIpresidio-analyzer2.2.362direct
PyPIpresidio-analyzer2.2.363direct
PyPIpresidio-anonymizerdirect
PyPIpresidio-anonymizer2.2.355direct
PyPIpresidio-anonymizer2.2.363direct
PyPIpydantic2.13.4direct
PyPIpydantic2.9.2direct
PyPIpydicom3.0.2direct
PyPIpypng0.20220715.0direct
PyPIpytesseract0.3.13direct
PyPIpython-gdcm3.2.6direct
PyPIpyyamldirect
PyPIpyyaml6.0.3direct
PyPIregex2026.6.28direct
PyPIregex2026.7.10direct
PyPIspacy3.8.13direct
PyPIspacy3.8.14direct
PyPIspacy3.8.2direct
PyPItldextract5.3.1direct
PyPIabsl-py2.4.0indirect
PyPIabsl-py2.5.0indirect
PyPIaccelerate1.14.0indirect
PyPIaiohappyeyeballs2.7.1indirect
PyPIaiohttp3.14.1indirect
PyPIaiosignal1.4.0indirect
PyPIannotated-doc0.0.4indirect
PyPIannotated-types0.7.0indirect
PyPIanyio4.14.1indirect
PyPIasync-timeout5.0.1indirect
PyPIattrs26.1.0indirect
PyPIazure-ai-textanalyticsindirect
PyPIazure-ai-textanalytics5.4.0indirect
PyPIazure-common1.1.28indirect
PyPIazure-core1.41.0indirect
PyPIazure-health-deidentification1.1.0b1indirect
PyPIazure-identity1.25.3indirect
PyPIblackindirect
PyPIblinker1.9.0indirect
PyPIblis1.0.2indirect
PyPIblis1.3.3indirect
PyPIbuild1.2.2.post1indirect
PyPIcatalogue2.0.10indirect
PyPIcertifi2026.6.17indirect
PyPIcffi2.0.0indirect
PyPIcffi2.1.0indirect
PyPIcfgv3.5.0indirect
PyPIchardet7.4.3indirect
PyPIcharset-normalizer3.4.7indirect
PyPIcharset-normalizer3.4.9indirect
PyPIcloudpathlib0.24.0indirect
PyPIcolorama0.4.6indirect
PyPIcoloredlogs15.0.1indirect
PyPIconfection0.1.5indirect
PyPIconfection1.3.3indirect
PyPIconfigargparse1.7indirect
PyPIcontourpy1.3.2indirect
PyPIcontourpy1.3.3indirect
PyPIcoverage7.14.3indirect
PyPIcoverage7.15.0indirect
PyPIcuda-bindings13.3.1indirect
PyPIcuda-pathfinder1.5.6indirect
PyPIcuda-toolkit13.0.2indirect
PyPIcuda-toolkit13.0.3.0indirect
PyPIcycler0.12.1indirect
PyPIcymem2.0.11indirect
PyPIcymem2.0.13indirect
PyPIdiff-cover10.3.0indirect
PyPIdistlib0.4.3indirect
PyPIdistro1.9.0indirect
PyPIemoji2.15.0indirect
PyPIexceptiongroup1.3.1indirect
PyPIfastapiindirect
PyPIfastapi0.129.0indirect
PyPIfilelock3.29.4indirect
PyPIfilelock3.29.5indirect
PyPIfilelock3.29.7indirect
PyPIflairindirect
PyPIflask3.1.3indirect
PyPIflatbuffers25.12.19indirect
PyPIfonttools4.63.0indirect
PyPIfrozenlist1.8.0indirect
PyPIfsspec2026.6.0indirect
PyPIgliner0.2.27indirect
PyPIgoogle-api-core2.31.0indirect
PyPIgoogle-auth2.55.1indirect
PyPIgoogle-auth2.55.2indirect
PyPIgoogle-cloud-core2.6.0indirect
PyPIgoogle-cloud-storage3.12.0indirect
PyPIgoogle-cloud-storage3.12.1indirect
PyPIgoogle-crc32c1.8.0indirect
PyPIgoogle-genai2.10.0indirect
PyPIgoogle-genai2.11.0indirect
PyPIgoogle-resumable-media2.10.0indirect
PyPIgoogleapis-common-protos1.75.0indirect
PyPIgunicorn25.3.0indirect
PyPIh110.16.0indirect
PyPIhf-xet1.5.1indirect
PyPIhttpcore1.0.9indirect
PyPIhttpx0.28.1indirect
PyPIhuggingface-hub0.36.2indirect
PyPIhumanfriendly10.0indirect
PyPIidentify2.6.19indirect
PyPIidna3.18indirect
PyPIiniconfig2.3.0indirect
PyPIisodate0.7.2indirect
PyPIitsdangerous2.2.0indirect
PyPIjinja23.1.6indirect
PyPIjiter0.16.0indirect
PyPIkiwisolver1.5.0indirect
PyPIlangcodes3.5.1indirect
PyPIlangextract1.5.0indirect
PyPIlangextract1.6.0indirect
PyPImarkdownindirect
PyPImarkdown-it-py4.2.0indirect
PyPImarkupsafe3.0.3indirect
PyPImdurl0.1.2indirect
PyPImkdocstrings-pythonindirect
PyPIml-collections1.1.0indirect
PyPImore-itertools11.1.0indirect
PyPImpmath1.3.0indirect
PyPImsal1.37.0indirect
PyPImsal-extensions1.3.1indirect
PyPImsrest0.7.1indirect
PyPImultidict6.7.1indirect
PyPImurmurhash1.0.12indirect
PyPImurmurhash1.0.15indirect
PyPInbconvertindirect
PyPInetworkx3.4.2indirect
PyPInetworkx3.6.1indirect
PyPInodeenv1.10.0indirect
PyPInvidia-cublas13.1.1.3indirect
PyPInvidia-cuda-cupti13.0.85indirect
PyPInvidia-cuda-nvrtc13.0.88indirect
PyPInvidia-cuda-runtime13.0.96indirect
PyPInvidia-cudnn-cu139.20.0.48indirect
PyPInvidia-cufft12.0.0.61indirect
PyPInvidia-cufile1.15.1.6indirect
PyPInvidia-curand10.4.0.35indirect
PyPInvidia-cusolver12.0.4.66indirect
PyPInvidia-cusparse12.6.3.3indirect
PyPInvidia-cusparselt-cu130.8.1indirect
PyPInvidia-nccl-cu132.29.7indirect
PyPInvidia-nvjitlink13.0.88indirect
PyPInvidia-nvjitlink13.3.33indirect
PyPInvidia-nvshmem-cu133.4.5indirect
PyPInvidia-nvtx13.0.85indirect
PyPIoauthlib3.3.1indirect
PyPIonnxruntime1.23.2indirect
PyPIonnxruntime1.27.0indirect
PyPIopenaiindirect
PyPIopenai1.37.1indirect
PyPIopenai2.44.0indirect
PyPIopenai2.45.0indirect
PyPIopentelemetry-apiindirect
PyPIopentelemetry-exporter-otlp-proto-grpcindirect
PyPIopentelemetry-sdkindirect
PyPIpackaging26.0indirect
PyPIpackaging26.2indirect
PyPIpip26.1.2indirect
PyPIplatformdirs4.10.0indirect
PyPIpluggy1.6.0indirect
PyPIpre-commitindirect
PyPIpre-commit4.6.0indirect
PyPIpreshed3.0.13indirect
PyPIpreshed3.0.9indirect
PyPIpresidio-cli0.0.9indirect
PyPIpresidio-image-redactorindirect
PyPIpresidio-image-redactor0.0.59indirect
PyPIpresidio-structuredindirect
PyPIpresidio-structured0.0.7indirect
PyPIpropcache0.5.2indirect
PyPIproto-plus1.28.0indirect
PyPIproto-plus1.28.1indirect
PyPIprotobuf7.35.1indirect
PyPIpsutil7.2.2indirect
PyPIpyasn10.6.3indirect
PyPIpyasn10.6.4indirect
PyPIpyasn1-modules0.4.2indirect
PyPIpycparser3.0indirect
PyPIpydantic-core2.46.4indirect
PyPIpygmentsindirect
PyPIpygments2.20.0indirect
PyPIpyjwt2.13.0indirect
PyPIpymdown-extensionsindirect
PyPIpyparsing3.3.2indirect
PyPIpyproject-hooks1.2.0indirect
PyPIpyreadline33.5.6indirect
PyPIpytestindirect
PyPIpytest9.1.1indirect
PyPIpytest-covindirect
PyPIpytest-cov7.1.0indirect
PyPIpytest-mockindirect
PyPIpytest-mock3.15.1indirect
PyPIpython-dateutil2.9.0.post0indirect
PyPIpython-discovery1.4.2indirect
PyPIpython-discovery1.4.3indirect
PyPIpython-discovery1.4.4indirect
PyPIpython-dotenvindirect
PyPIpython-dotenv1.2.2indirect
PyPIpytz2026.2indirect
PyPIredis5.0.8indirect
PyPIrequestsindirect
PyPIrequests2.34.2indirect
PyPIrequests-file3.0.1indirect
PyPIrequests-oauthlib2.0.0indirect
PyPIrich15.0.0indirect
PyPIruffindirect
PyPIruff0.15.20indirect
PyPIruff0.15.21indirect
PyPIruff0.9.2indirect
PyPIsafetensors0.8.0indirect
PyPIsentencepiece0.2.1indirect
PyPIsentencepiece0.2.2indirect
PyPIsetuptools81.0.0indirect
PyPIsetuptools82.0.1indirect
PyPIsetuptools83.0.0indirect
PyPIshellingham1.5.4indirect
PyPIsix1.17.0indirect
PyPIsmart-open7.7.1indirect
PyPIsmart-open8.0.0indirect
PyPIsniffio1.3.1indirect
PyPIspacy-huggingface-pipelines0.0.4indirect
PyPIspacy-legacy3.0.12indirect
PyPIspacy-loggers1.0.5indirect
PyPIsrsly2.4.8indirect
PyPIsrsly2.5.3indirect
PyPIst-annotated-textindirect
PyPIstanza1.13.0indirect
PyPIstreamlitindirect
PyPIstreamlit-tagsindirect
PyPIsympy1.14.0indirect
PyPItenacity9.1.4indirect
PyPItermcolor3.3.0indirect
PyPItextual0.79.1indirect
PyPItextual-serve1.1.1indirect
PyPIthinc8.3.13indirect
PyPIthinc8.3.2indirect
PyPItokenizers0.22.2indirect
PyPItomli2.4.1indirect
PyPItorchindirect
PyPItorch2.12.1indirect
PyPItorch2.13.0indirect
PyPItqdm4.68.3indirect
PyPItqdm4.68.4indirect
PyPItransformers4.57.6indirect
PyPItriton3.7.1indirect
PyPItyper0.26.8indirect
PyPItyper-slim0.24.0indirect
PyPItyping-extensions4.15.0indirect
PyPItyping-extensions4.16.0indirect
PyPItyping-inspection0.4.2indirect
PyPItzdata2026.2indirect
PyPItzdata2026.3indirect
PyPIudapi0.5.2indirect
PyPIudtools0.2.8indirect
PyPIurllib32.7.0indirect
PyPIuvicornindirect
PyPIuvicorn0.30.6indirect
PyPIvirtualenv21.5.1indirect
PyPIvirtualenv21.6.1indirect
PyPIwaitress3.0.2indirect
PyPIwasabi1.1.3indirect
PyPIweasel0.4.3indirect
PyPIweasel1.0.0indirect
PyPIwebsockets16.0indirect
PyPIwebsockets16.1indirect
PyPIwerkzeug3.1.8indirect
PyPIwrapt2.2.2indirect
PyPIyarl1.24.2indirect
PyPIzensicalindirect
Dependency advisories 1

Installing pypi:presidio@2.2.363 pulls in 55 packages, direct and transitive: 1 carry known advisories, of which 0 are direct dependencies.

PackageVersionRelationSeverityAdvisoriesFixed in
cryptography46.0.7indirecthigh148.0.1

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "python",
        "pii",
        "privacy",
        "data-anonymization",
        "de-identification",
        "data-masking",
        "transformers",
        "pii-detection",
        "data-obfuscation",
        "data-privacy",
        "data-redaction",
        "guardrails",
        "image-redactor",
        "named-entity-recognition",
        "nlp",
        "personally-identifiable-information",
        "phi",
        "sensitive-data",
        "spacy",
        "anonymization"
      ],
      "is_fork": false,
      "size_kb": 345368,
      "has_wiki": true,
      "homepage": "https://presidio.dataprivacystack.org",
      "languages": {
        "HTML": 4901,
        "Jinja": 1321,
        "Shell": 369,
        "Python": 2064516,
        "Dockerfile": 4558
      },
      "pushed_at": "2026-07-16T07:08:59Z",
      "created_at": "2018-05-04T11:08:58Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T02:02:40Z",
      "description": "An open-source framework for detecting, redacting, masking, and anonymizing sensitive data (PII) across text, images, and structured data. Supports NLP, pattern matching, and customizable pipelines.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "dataprivacystack.org",
      "name": "Data Privacy Stack",
      "type": "Organization",
      "login": "data-privacy-stack",
      "company": null,
      "location": null,
      "followers": 17,
      "avatar_url": "https://avatars.githubusercontent.com/u/275623515?v=4",
      "created_at": "2026-04-13T06:36:21Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 98
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": null,
      "profile_has_license": true
    },
    "activity": {
      "releases_count": 48,
      "commits_last_year": 284,
      "latest_release_at": "2026-06-28T16:21:00Z",
      "latest_release_tag": "2.2.363",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 47,
      "days_since_latest_release": 22,
      "mean_days_between_releases": 91.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "presidio",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "presidio",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/presidio/",
          "is_deprecated": false,
          "latest_version": "2.2.363",
          "repository_url": "https://github.com/data-privacy-stack/presidio",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 7606,
          "first_published_at": "2026-01-21T12:27:42.735217Z",
          "latest_published_at": "2026-06-28T16:09:12.856681Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 22
        },
        {
          "name": "presidio-cli",
          "exists": true,
          "license": "Apache 2.0",
          "keywords": [
            "pii",
            "checker",
            "License :: OSI Approved :: Apache Software License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.8",
            "Programming Language :: Python :: 3.9"
          ],
          "ecosystem": "pypi",
          "matches_repo": false,
          "registry_url": "https://pypi.org/project/presidio-cli/",
          "is_deprecated": false,
          "latest_version": "0.0.8",
          "repository_url": "https://github.com/insightsengineering/presidio-cli",
          "versions_count": 6,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 161,
          "first_published_at": "2022-02-04T16:40:30.164777Z",
          "latest_published_at": "2022-07-07T16:41:39.469459Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1474
        },
        {
          "name": "presidio_analyzer",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "presidio_analyzer",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.14"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/presidio_analyzer/",
          "is_deprecated": false,
          "latest_version": "2.2.363",
          "repository_url": "https://github.com/data-privacy-stack/presidio",
          "versions_count": 107,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 6035634,
          "first_published_at": "2020-03-10T10:04:47.330152Z",
          "latest_published_at": "2026-06-28T16:09:10.613756Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 22
        },
        {
          "name": "presidio_anonymizer",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "presidio_anonymizer",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/presidio_anonymizer/",
          "is_deprecated": false,
          "latest_version": "2.2.363",
          "repository_url": "https://github.com/data-privacy-stack/presidio",
          "versions_count": 43,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 4438092,
          "first_published_at": "2021-02-07T13:13:44.514697Z",
          "latest_published_at": "2026-06-28T16:09:14.089140Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 22
        },
        {
          "name": "presidio_structured",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "presidio_structured",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/presidio_structured/",
          "is_deprecated": false,
          "latest_version": "0.0.7",
          "repository_url": "https://github.com/data-privacy-stack/presidio",
          "versions_count": 7,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2024-02-12T15:44:12.740379Z",
          "latest_published_at": "2026-06-28T16:09:15.287210Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 22
        },
        {
          "name": "presidio-image-redactor",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "presidio_image_redactor",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/presidio-image-redactor/",
          "is_deprecated": false,
          "latest_version": "0.0.59",
          "repository_url": "https://github.com/data-privacy-stack/presidio",
          "versions_count": 23,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2021-03-01T10:57:26.964463Z",
          "latest_published_at": "2026-06-28T16:09:13.449853Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 22
        }
      ]
    },
    "popularity": {
      "forks": 1211,
      "stars": 10090,
      "watchers": 90,
      "open_issues_and_prs": 89
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "notebooks",
        "recipes",
        "samples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": true,
      "typecheck_configs": [
        "presidio-analyzer/presidio_analyzer/py.typed",
        "presidio-anonymizer/presidio_anonymizer/py.typed",
        "presidio-image-redactor/presidio_image_redactor/py.typed",
        "presidio-structured/presidio_structured/py.typed"
      ],
      "largest_source_bytes": 64127,
      "source_files_sampled": 468,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        ".github/copilot-instructions.md"
      ],
      "agent_instruction_max_bytes": 26062
    },
    "dependencies": {
      "manifests": [
        "docs/requirements-docs.txt",
        "e2e-tests/requirements.txt",
        "presidio-analyzer/Pipfile",
        "presidio-analyzer/pyproject.toml",
        "presidio-anonymizer/pyproject.toml",
        "presidio-cli/Pipfile",
        "presidio-cli/pyproject.toml",
        "presidio-image-redactor/pyproject.toml",
        "presidio-structured/pyproject.toml",
        "presidio/pyproject.toml",
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "cryptography",
            "direct": false,
            "version": "46.0.7",
            "severity": "high",
            "ecosystem": "pypi",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-537c-gmf6-5ccf"
            ],
            "fixed_version": "48.0.1",
            "advisory_count": 1,
            "oldest_advisory_days": 35
          }
        ],
        "collected": true,
        "truncated": false,
        "by_severity": {
          "high": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 55,
        "assessed_package": "pypi:presidio@2.2.363",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "spacy",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=3.4.4,!=3.7.0,<4.0.0)"
        },
        {
          "name": "spacy",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=3.4.4,!=3.7.0,!=3.8.14,<4.0.0)"
        },
        {
          "name": "numpy",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=1.19.0,<2.5.0)"
        },
        {
          "name": "click",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=8.1.0,<9.0.0)"
        },
        {
          "name": "regex",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2023.0.0)"
        },
        {
          "name": "tldextract",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=5.3.1,<6.0.0)"
        },
        {
          "name": "pyyaml",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=6.0.3,<7.0.0)"
        },
        {
          "name": "phonenumbers",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=9.0.28,<10.0.0)"
        },
        {
          "name": "pydantic",
          "manifest": "presidio-analyzer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2.12.5,<3.0.0)"
        },
        {
          "name": "cryptography",
          "manifest": "presidio-anonymizer/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=48.0.1,<49.0.0)"
        },
        {
          "name": "presidio-analyzer",
          "manifest": "presidio-cli/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2.2.0,<3.0.0)"
        },
        {
          "name": "pyyaml",
          "manifest": "presidio-cli/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=6.0.0,<7.0.0)"
        },
        {
          "name": "pathspec",
          "manifest": "presidio-cli/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=0.9.0,<2.0.0)"
        },
        {
          "name": "click",
          "manifest": "presidio-cli/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=8.1.0,<9.0.0)"
        },
        {
          "name": "pillow",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=9.0.0,<13.0.0)"
        },
        {
          "name": "pytesseract",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=0.3.13,<0.4)"
        },
        {
          "name": "presidio-analyzer",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2.2.0,<3.0.0)"
        },
        {
          "name": "matplotlib",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=3.6.0,<4.0.0)"
        },
        {
          "name": "pydicom",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2.3.0,<4.0.0)"
        },
        {
          "name": "pypng",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=0.20220715.0,<1.0.0)"
        },
        {
          "name": "azure-ai-formrecognizer",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=3.3.3,<4.0.0)"
        },
        {
          "name": "opencv-python",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=4.13.0.92,<5.0.0)"
        },
        {
          "name": "python-gdcm",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=3.0.24.1,<4.0.0)"
        },
        {
          "name": "spacy",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=3.8.7,<4.0.0)"
        },
        {
          "name": "spacy",
          "manifest": "presidio-image-redactor/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=3.8.7,!=3.8.14,<4.0.0)"
        },
        {
          "name": "presidio-analyzer",
          "manifest": "presidio-structured/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2.2.0,<3.0.0)"
        },
        {
          "name": "presidio-anonymizer",
          "manifest": "presidio-structured/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2.2.0,<3.0.0)"
        },
        {
          "name": "pandas",
          "manifest": "presidio-structured/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=1.5.2,<4.0.0)"
        },
        {
          "name": "click",
          "manifest": "presidio-structured/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=8.1.0,<9.0.0)"
        },
        {
          "name": "presidio-analyzer",
          "manifest": "presidio/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2.2.0,<3.0.0)"
        },
        {
          "name": "presidio-anonymizer",
          "manifest": "presidio/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "(>=2.2.0,<3.0.0)"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "azure-ai-formrecognizer",
            "direct": true,
            "version": "3.3.3",
            "ecosystem": "pypi"
          },
          {
            "name": "click",
            "direct": true,
            "version": "8.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "cryptography",
            "direct": true,
            "version": "46.0.7",
            "ecosystem": "pypi"
          },
          {
            "name": "cryptography",
            "direct": true,
            "version": "48.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "cryptography",
            "direct": true,
            "version": "49.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "matplotlib",
            "direct": true,
            "version": "3.10.9",
            "ecosystem": "pypi"
          },
          {
            "name": "matplotlib",
            "direct": true,
            "version": "3.11.0",
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": true,
            "version": "2.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": true,
            "version": "2.2.6",
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": true,
            "version": "2.4.6",
            "ecosystem": "pypi"
          },
          {
            "name": "opencv-python",
            "direct": true,
            "version": "4.13.0.92",
            "ecosystem": "pypi"
          },
          {
            "name": "pandas",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pandas",
            "direct": true,
            "version": "2.3.3",
            "ecosystem": "pypi"
          },
          {
            "name": "pandas",
            "direct": true,
            "version": "3.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "pathspec",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pathspec",
            "direct": true,
            "version": "1.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "phonenumbers",
            "direct": true,
            "version": "9.0.33",
            "ecosystem": "pypi"
          },
          {
            "name": "phonenumbers",
            "direct": true,
            "version": "9.0.34",
            "ecosystem": "pypi"
          },
          {
            "name": "pillow",
            "direct": true,
            "version": "12.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pillow",
            "direct": true,
            "version": "12.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-analyzer",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-analyzer",
            "direct": true,
            "version": "2.2.355",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-analyzer",
            "direct": true,
            "version": "2.2.359",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-analyzer",
            "direct": true,
            "version": "2.2.362",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-analyzer",
            "direct": true,
            "version": "2.2.363",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-anonymizer",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-anonymizer",
            "direct": true,
            "version": "2.2.355",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-anonymizer",
            "direct": true,
            "version": "2.2.363",
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic",
            "direct": true,
            "version": "2.13.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic",
            "direct": true,
            "version": "2.9.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pydicom",
            "direct": true,
            "version": "3.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pypng",
            "direct": true,
            "version": "0.20220715.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pytesseract",
            "direct": true,
            "version": "0.3.13",
            "ecosystem": "pypi"
          },
          {
            "name": "python-gdcm",
            "direct": true,
            "version": "3.2.6",
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": "6.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "regex",
            "direct": true,
            "version": "2026.6.28",
            "ecosystem": "pypi"
          },
          {
            "name": "regex",
            "direct": true,
            "version": "2026.7.10",
            "ecosystem": "pypi"
          },
          {
            "name": "spacy",
            "direct": true,
            "version": "3.8.13",
            "ecosystem": "pypi"
          },
          {
            "name": "spacy",
            "direct": true,
            "version": "3.8.14",
            "ecosystem": "pypi"
          },
          {
            "name": "spacy",
            "direct": true,
            "version": "3.8.2",
            "ecosystem": "pypi"
          },
          {
            "name": "tldextract",
            "direct": true,
            "version": "5.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "absl-py",
            "direct": false,
            "version": "2.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "absl-py",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "accelerate",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "pypi"
          },
          {
            "name": "aiohappyeyeballs",
            "direct": false,
            "version": "2.7.1",
            "ecosystem": "pypi"
          },
          {
            "name": "aiohttp",
            "direct": false,
            "version": "3.14.1",
            "ecosystem": "pypi"
          },
          {
            "name": "aiosignal",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "annotated-doc",
            "direct": false,
            "version": "0.0.4",
            "ecosystem": "pypi"
          },
          {
            "name": "annotated-types",
            "direct": false,
            "version": "0.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "anyio",
            "direct": false,
            "version": "4.14.1",
            "ecosystem": "pypi"
          },
          {
            "name": "async-timeout",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "attrs",
            "direct": false,
            "version": "26.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "azure-ai-textanalytics",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "azure-ai-textanalytics",
            "direct": false,
            "version": "5.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "azure-common",
            "direct": false,
            "version": "1.1.28",
            "ecosystem": "pypi"
          },
          {
            "name": "azure-core",
            "direct": false,
            "version": "1.41.0",
            "ecosystem": "pypi"
          },
          {
            "name": "azure-health-deidentification",
            "direct": false,
            "version": "1.1.0b1",
            "ecosystem": "pypi"
          },
          {
            "name": "azure-identity",
            "direct": false,
            "version": "1.25.3",
            "ecosystem": "pypi"
          },
          {
            "name": "black",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "blinker",
            "direct": false,
            "version": "1.9.0",
            "ecosystem": "pypi"
          },
          {
            "name": "blis",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "blis",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "pypi"
          },
          {
            "name": "build",
            "direct": false,
            "version": "1.2.2.post1",
            "ecosystem": "pypi"
          },
          {
            "name": "catalogue",
            "direct": false,
            "version": "2.0.10",
            "ecosystem": "pypi"
          },
          {
            "name": "certifi",
            "direct": false,
            "version": "2026.6.17",
            "ecosystem": "pypi"
          },
          {
            "name": "cffi",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cffi",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cfgv",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "chardet",
            "direct": false,
            "version": "7.4.3",
            "ecosystem": "pypi"
          },
          {
            "name": "charset-normalizer",
            "direct": false,
            "version": "3.4.7",
            "ecosystem": "pypi"
          },
          {
            "name": "charset-normalizer",
            "direct": false,
            "version": "3.4.9",
            "ecosystem": "pypi"
          },
          {
            "name": "cloudpathlib",
            "direct": false,
            "version": "0.24.0",
            "ecosystem": "pypi"
          },
          {
            "name": "colorama",
            "direct": false,
            "version": "0.4.6",
            "ecosystem": "pypi"
          },
          {
            "name": "coloredlogs",
            "direct": false,
            "version": "15.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "confection",
            "direct": false,
            "version": "0.1.5",
            "ecosystem": "pypi"
          },
          {
            "name": "confection",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "pypi"
          },
          {
            "name": "configargparse",
            "direct": false,
            "version": "1.7",
            "ecosystem": "pypi"
          },
          {
            "name": "contourpy",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "pypi"
          },
          {
            "name": "contourpy",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "pypi"
          },
          {
            "name": "coverage",
            "direct": false,
            "version": "7.14.3",
            "ecosystem": "pypi"
          },
          {
            "name": "coverage",
            "direct": false,
            "version": "7.15.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cuda-bindings",
            "direct": false,
            "version": "13.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "cuda-pathfinder",
            "direct": false,
            "version": "1.5.6",
            "ecosystem": "pypi"
          },
          {
            "name": "cuda-toolkit",
            "direct": false,
            "version": "13.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "cuda-toolkit",
            "direct": false,
            "version": "13.0.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cycler",
            "direct": false,
            "version": "0.12.1",
            "ecosystem": "pypi"
          },
          {
            "name": "cymem",
            "direct": false,
            "version": "2.0.11",
            "ecosystem": "pypi"
          },
          {
            "name": "cymem",
            "direct": false,
            "version": "2.0.13",
            "ecosystem": "pypi"
          },
          {
            "name": "diff-cover",
            "direct": false,
            "version": "10.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "distlib",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "pypi"
          },
          {
            "name": "distro",
            "direct": false,
            "version": "1.9.0",
            "ecosystem": "pypi"
          },
          {
            "name": "emoji",
            "direct": false,
            "version": "2.15.0",
            "ecosystem": "pypi"
          },
          {
            "name": "exceptiongroup",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "fastapi",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "fastapi",
            "direct": false,
            "version": "0.129.0",
            "ecosystem": "pypi"
          },
          {
            "name": "filelock",
            "direct": false,
            "version": "3.29.4",
            "ecosystem": "pypi"
          },
          {
            "name": "filelock",
            "direct": false,
            "version": "3.29.5",
            "ecosystem": "pypi"
          },
          {
            "name": "filelock",
            "direct": false,
            "version": "3.29.7",
            "ecosystem": "pypi"
          },
          {
            "name": "flair",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "flask",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "pypi"
          },
          {
            "name": "flatbuffers",
            "direct": false,
            "version": "25.12.19",
            "ecosystem": "pypi"
          },
          {
            "name": "fonttools",
            "direct": false,
            "version": "4.63.0",
            "ecosystem": "pypi"
          },
          {
            "name": "frozenlist",
            "direct": false,
            "version": "1.8.0",
            "ecosystem": "pypi"
          },
          {
            "name": "fsspec",
            "direct": false,
            "version": "2026.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "gliner",
            "direct": false,
            "version": "0.2.27",
            "ecosystem": "pypi"
          },
          {
            "name": "google-api-core",
            "direct": false,
            "version": "2.31.0",
            "ecosystem": "pypi"
          },
          {
            "name": "google-auth",
            "direct": false,
            "version": "2.55.1",
            "ecosystem": "pypi"
          },
          {
            "name": "google-auth",
            "direct": false,
            "version": "2.55.2",
            "ecosystem": "pypi"
          },
          {
            "name": "google-cloud-core",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "google-cloud-storage",
            "direct": false,
            "version": "3.12.0",
            "ecosystem": "pypi"
          },
          {
            "name": "google-cloud-storage",
            "direct": false,
            "version": "3.12.1",
            "ecosystem": "pypi"
          },
          {
            "name": "google-crc32c",
            "direct": false,
            "version": "1.8.0",
            "ecosystem": "pypi"
          },
          {
            "name": "google-genai",
            "direct": false,
            "version": "2.10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "google-genai",
            "direct": false,
            "version": "2.11.0",
            "ecosystem": "pypi"
          },
          {
            "name": "google-resumable-media",
            "direct": false,
            "version": "2.10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "googleapis-common-protos",
            "direct": false,
            "version": "1.75.0",
            "ecosystem": "pypi"
          },
          {
            "name": "gunicorn",
            "direct": false,
            "version": "25.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "h11",
            "direct": false,
            "version": "0.16.0",
            "ecosystem": "pypi"
          },
          {
            "name": "hf-xet",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "pypi"
          },
          {
            "name": "httpcore",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "pypi"
          },
          {
            "name": "httpx",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "pypi"
          },
          {
            "name": "huggingface-hub",
            "direct": false,
            "version": "0.36.2",
            "ecosystem": "pypi"
          },
          {
            "name": "humanfriendly",
            "direct": false,
            "version": "10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "identify",
            "direct": false,
            "version": "2.6.19",
            "ecosystem": "pypi"
          },
          {
            "name": "idna",
            "direct": false,
            "version": "3.18",
            "ecosystem": "pypi"
          },
          {
            "name": "iniconfig",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "isodate",
            "direct": false,
            "version": "0.7.2",
            "ecosystem": "pypi"
          },
          {
            "name": "itsdangerous",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "jinja2",
            "direct": false,
            "version": "3.1.6",
            "ecosystem": "pypi"
          },
          {
            "name": "jiter",
            "direct": false,
            "version": "0.16.0",
            "ecosystem": "pypi"
          },
          {
            "name": "kiwisolver",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "langcodes",
            "direct": false,
            "version": "3.5.1",
            "ecosystem": "pypi"
          },
          {
            "name": "langextract",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "langextract",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "markdown",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "markdown-it-py",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "markupsafe",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "mdurl",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "mkdocstrings-python",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ml-collections",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "more-itertools",
            "direct": false,
            "version": "11.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "mpmath",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "msal",
            "direct": false,
            "version": "1.37.0",
            "ecosystem": "pypi"
          },
          {
            "name": "msal-extensions",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "msrest",
            "direct": false,
            "version": "0.7.1",
            "ecosystem": "pypi"
          },
          {
            "name": "multidict",
            "direct": false,
            "version": "6.7.1",
            "ecosystem": "pypi"
          },
          {
            "name": "murmurhash",
            "direct": false,
            "version": "1.0.12",
            "ecosystem": "pypi"
          },
          {
            "name": "murmurhash",
            "direct": false,
            "version": "1.0.15",
            "ecosystem": "pypi"
          },
          {
            "name": "nbconvert",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "networkx",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "networkx",
            "direct": false,
            "version": "3.6.1",
            "ecosystem": "pypi"
          },
          {
            "name": "nodeenv",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cublas",
            "direct": false,
            "version": "13.1.1.3",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cuda-cupti",
            "direct": false,
            "version": "13.0.85",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cuda-nvrtc",
            "direct": false,
            "version": "13.0.88",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cuda-runtime",
            "direct": false,
            "version": "13.0.96",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cudnn-cu13",
            "direct": false,
            "version": "9.20.0.48",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cufft",
            "direct": false,
            "version": "12.0.0.61",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cufile",
            "direct": false,
            "version": "1.15.1.6",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-curand",
            "direct": false,
            "version": "10.4.0.35",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cusolver",
            "direct": false,
            "version": "12.0.4.66",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cusparse",
            "direct": false,
            "version": "12.6.3.3",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-cusparselt-cu13",
            "direct": false,
            "version": "0.8.1",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-nccl-cu13",
            "direct": false,
            "version": "2.29.7",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-nvjitlink",
            "direct": false,
            "version": "13.0.88",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-nvjitlink",
            "direct": false,
            "version": "13.3.33",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-nvshmem-cu13",
            "direct": false,
            "version": "3.4.5",
            "ecosystem": "pypi"
          },
          {
            "name": "nvidia-nvtx",
            "direct": false,
            "version": "13.0.85",
            "ecosystem": "pypi"
          },
          {
            "name": "oauthlib",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "onnxruntime",
            "direct": false,
            "version": "1.23.2",
            "ecosystem": "pypi"
          },
          {
            "name": "onnxruntime",
            "direct": false,
            "version": "1.27.0",
            "ecosystem": "pypi"
          },
          {
            "name": "openai",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "openai",
            "direct": false,
            "version": "1.37.1",
            "ecosystem": "pypi"
          },
          {
            "name": "openai",
            "direct": false,
            "version": "2.44.0",
            "ecosystem": "pypi"
          },
          {
            "name": "openai",
            "direct": false,
            "version": "2.45.0",
            "ecosystem": "pypi"
          },
          {
            "name": "opentelemetry-api",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "opentelemetry-exporter-otlp-proto-grpc",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "opentelemetry-sdk",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "packaging",
            "direct": false,
            "version": "26.0",
            "ecosystem": "pypi"
          },
          {
            "name": "packaging",
            "direct": false,
            "version": "26.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pip",
            "direct": false,
            "version": "26.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "platformdirs",
            "direct": false,
            "version": "4.10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pluggy",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pre-commit",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pre-commit",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "preshed",
            "direct": false,
            "version": "3.0.13",
            "ecosystem": "pypi"
          },
          {
            "name": "preshed",
            "direct": false,
            "version": "3.0.9",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-cli",
            "direct": false,
            "version": "0.0.9",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-image-redactor",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-image-redactor",
            "direct": false,
            "version": "0.0.59",
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-structured",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "presidio-structured",
            "direct": false,
            "version": "0.0.7",
            "ecosystem": "pypi"
          },
          {
            "name": "propcache",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "pypi"
          },
          {
            "name": "proto-plus",
            "direct": false,
            "version": "1.28.0",
            "ecosystem": "pypi"
          },
          {
            "name": "proto-plus",
            "direct": false,
            "version": "1.28.1",
            "ecosystem": "pypi"
          },
          {
            "name": "protobuf",
            "direct": false,
            "version": "7.35.1",
            "ecosystem": "pypi"
          },
          {
            "name": "psutil",
            "direct": false,
            "version": "7.2.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pyasn1",
            "direct": false,
            "version": "0.6.3",
            "ecosystem": "pypi"
          },
          {
            "name": "pyasn1",
            "direct": false,
            "version": "0.6.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pyasn1-modules",
            "direct": false,
            "version": "0.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pycparser",
            "direct": false,
            "version": "3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic-core",
            "direct": false,
            "version": "2.46.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pygments",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pygments",
            "direct": false,
            "version": "2.20.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pyjwt",
            "direct": false,
            "version": "2.13.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pymdown-extensions",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyparsing",
            "direct": false,
            "version": "3.3.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pyproject-hooks",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pyreadline3",
            "direct": false,
            "version": "3.5.6",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": "9.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-cov",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-cov",
            "direct": false,
            "version": "7.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-mock",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-mock",
            "direct": false,
            "version": "3.15.1",
            "ecosystem": "pypi"
          },
          {
            "name": "python-dateutil",
            "direct": false,
            "version": "2.9.0.post0",
            "ecosystem": "pypi"
          },
          {
            "name": "python-discovery",
            "direct": false,
            "version": "1.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "python-discovery",
            "direct": false,
            "version": "1.4.3",
            "ecosystem": "pypi"
          },
          {
            "name": "python-discovery",
            "direct": false,
            "version": "1.4.4",
            "ecosystem": "pypi"
          },
          {
            "name": "python-dotenv",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-dotenv",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pytz",
            "direct": false,
            "version": "2026.2",
            "ecosystem": "pypi"
          },
          {
            "name": "redis",
            "direct": false,
            "version": "5.0.8",
            "ecosystem": "pypi"
          },
          {
            "name": "requests",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "requests",
            "direct": false,
            "version": "2.34.2",
            "ecosystem": "pypi"
          },
          {
            "name": "requests-file",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "requests-oauthlib",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "rich",
            "direct": false,
            "version": "15.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": "0.15.20",
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": "0.15.21",
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": "0.9.2",
            "ecosystem": "pypi"
          },
          {
            "name": "safetensors",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sentencepiece",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "pypi"
          },
          {
            "name": "sentencepiece",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "pypi"
          },
          {
            "name": "setuptools",
            "direct": false,
            "version": "81.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "setuptools",
            "direct": false,
            "version": "82.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "setuptools",
            "direct": false,
            "version": "83.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "shellingham",
            "direct": false,
            "version": "1.5.4",
            "ecosystem": "pypi"
          },
          {
            "name": "six",
            "direct": false,
            "version": "1.17.0",
            "ecosystem": "pypi"
          },
          {
            "name": "smart-open",
            "direct": false,
            "version": "7.7.1",
            "ecosystem": "pypi"
          },
          {
            "name": "smart-open",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sniffio",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "spacy-huggingface-pipelines",
            "direct": false,
            "version": "0.0.4",
            "ecosystem": "pypi"
          },
          {
            "name": "spacy-legacy",
            "direct": false,
            "version": "3.0.12",
            "ecosystem": "pypi"
          },
          {
            "name": "spacy-loggers",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "pypi"
          },
          {
            "name": "srsly",
            "direct": false,
            "version": "2.4.8",
            "ecosystem": "pypi"
          },
          {
            "name": "srsly",
            "direct": false,
            "version": "2.5.3",
            "ecosystem": "pypi"
          },
          {
            "name": "st-annotated-text",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "stanza",
            "direct": false,
            "version": "1.13.0",
            "ecosystem": "pypi"
          },
          {
            "name": "streamlit",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "streamlit-tags",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sympy",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "pypi"
          },
          {
            "name": "tenacity",
            "direct": false,
            "version": "9.1.4",
            "ecosystem": "pypi"
          },
          {
            "name": "termcolor",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "textual",
            "direct": false,
            "version": "0.79.1",
            "ecosystem": "pypi"
          },
          {
            "name": "textual-serve",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "thinc",
            "direct": false,
            "version": "8.3.13",
            "ecosystem": "pypi"
          },
          {
            "name": "thinc",
            "direct": false,
            "version": "8.3.2",
            "ecosystem": "pypi"
          },
          {
            "name": "tokenizers",
            "direct": false,
            "version": "0.22.2",
            "ecosystem": "pypi"
          },
          {
            "name": "tomli",
            "direct": false,
            "version": "2.4.1",
            "ecosystem": "pypi"
          },
          {
            "name": "torch",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "torch",
            "direct": false,
            "version": "2.12.1",
            "ecosystem": "pypi"
          },
          {
            "name": "torch",
            "direct": false,
            "version": "2.13.0",
            "ecosystem": "pypi"
          },
          {
            "name": "tqdm",
            "direct": false,
            "version": "4.68.3",
            "ecosystem": "pypi"
          },
          {
            "name": "tqdm",
            "direct": false,
            "version": "4.68.4",
            "ecosystem": "pypi"
          },
          {
            "name": "transformers",
            "direct": false,
            "version": "4.57.6",
            "ecosystem": "pypi"
          },
          {
            "name": "triton",
            "direct": false,
            "version": "3.7.1",
            "ecosystem": "pypi"
          },
          {
            "name": "typer",
            "direct": false,
            "version": "0.26.8",
            "ecosystem": "pypi"
          },
          {
            "name": "typer-slim",
            "direct": false,
            "version": "0.24.0",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-extensions",
            "direct": false,
            "version": "4.15.0",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-extensions",
            "direct": false,
            "version": "4.16.0",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-inspection",
            "direct": false,
            "version": "0.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "tzdata",
            "direct": false,
            "version": "2026.2",
            "ecosystem": "pypi"
          },
          {
            "name": "tzdata",
            "direct": false,
            "version": "2026.3",
            "ecosystem": "pypi"
          },
          {
            "name": "udapi",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "pypi"
          },
          {
            "name": "udtools",
            "direct": false,
            "version": "0.2.8",
            "ecosystem": "pypi"
          },
          {
            "name": "urllib3",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "uvicorn",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "uvicorn",
            "direct": false,
            "version": "0.30.6",
            "ecosystem": "pypi"
          },
          {
            "name": "virtualenv",
            "direct": false,
            "version": "21.5.1",
            "ecosystem": "pypi"
          },
          {
            "name": "virtualenv",
            "direct": false,
            "version": "21.6.1",
            "ecosystem": "pypi"
          },
          {
            "name": "waitress",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "wasabi",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "pypi"
          },
          {
            "name": "weasel",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "pypi"
          },
          {
            "name": "weasel",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "websockets",
            "direct": false,
            "version": "16.0",
            "ecosystem": "pypi"
          },
          {
            "name": "websockets",
            "direct": false,
            "version": "16.1",
            "ecosystem": "pypi"
          },
          {
            "name": "werkzeug",
            "direct": false,
            "version": "3.1.8",
            "ecosystem": "pypi"
          },
          {
            "name": "wrapt",
            "direct": false,
            "version": "2.2.2",
            "ecosystem": "pypi"
          },
          {
            "name": "yarl",
            "direct": false,
            "version": "1.24.2",
            "ecosystem": "pypi"
          },
          {
            "name": "zensical",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 293,
        "direct_count": 42,
        "indirect_count": 251
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 41,
        "merged_prs": 1071,
        "open_issues": 48,
        "closed_ratio": 0.913,
        "closed_issues": 504,
        "closed_unmerged_prs": 337
      },
      "bus_factor": 3,
      "top_contributors": [
        {
          "type": "User",
          "login": "omri374",
          "commits": 378,
          "avatar_url": "https://avatars.githubusercontent.com/u/3776619?v=4"
        },
        {
          "type": "User",
          "login": "SharonHart",
          "commits": 175,
          "avatar_url": "https://avatars.githubusercontent.com/u/15013757?v=4"
        },
        {
          "type": "User",
          "login": "shiranr",
          "commits": 152,
          "avatar_url": "https://avatars.githubusercontent.com/u/1862328?v=4"
        },
        {
          "type": "User",
          "login": "balteravishay",
          "commits": 113,
          "avatar_url": "https://avatars.githubusercontent.com/u/12952294?v=4"
        },
        {
          "type": "User",
          "login": "navalev",
          "commits": 71,
          "avatar_url": "https://avatars.githubusercontent.com/u/13420239?v=4"
        },
        {
          "type": "Bot",
          "login": "dependabot[bot]",
          "commits": 71,
          "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4"
        },
        {
          "type": "User",
          "login": "eladiw",
          "commits": 52,
          "avatar_url": "https://avatars.githubusercontent.com/u/13205761?v=4"
        },
        {
          "type": "Bot",
          "login": "Copilot",
          "commits": 36,
          "avatar_url": "https://avatars.githubusercontent.com/in/1143301?v=4"
        },
        {
          "type": "User",
          "login": "itye-msft",
          "commits": 33,
          "avatar_url": "https://avatars.githubusercontent.com/u/26870839?v=4"
        },
        {
          "type": "User",
          "login": "niwilso",
          "commits": 28,
          "avatar_url": "https://avatars.githubusercontent.com/u/55208683?v=4"
        }
      ],
      "contributors_sampled": 100,
      "top_contributor_share": 0.276
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "codeql-analysis.yml",
        "defender-for-devops.yml",
        "label-external.yml",
        "release-docs.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [
        "uv.lock"
      ],
      "scorecard": null,
      "has_codeql_workflow": true,
      "has_security_policy": true,
      "has_dependabot_config": true
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/data-privacy-stack/presidio",
    "host": "github.com",
    "name": "presidio",
    "owner": "data-privacy-stack"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 90,
      "inputs": {
        "security": 97,
        "vitality": 94,
        "community": 96,
        "governance": 74,
        "engineering": 95
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 94,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 96,
            "inputs": {
              "commits_last_year": 284,
              "human_commit_share": null,
              "days_since_last_push": 4,
              "active_weeks_last_year": 47
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "47/52 weeks with commits",
                "points": 32.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 47
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "284 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 284
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "releases_count": 48,
              "latest_release_tag": "2.2.363",
              "releases_from_tags": false,
              "days_since_latest_release": 22,
              "mean_days_between_releases": 91.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "48 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 48
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 22 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~91.2 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 91.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "no_commit_sample",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "excellent",
        "name": "Community & Adoption",
        "value": 96,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "excellent",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 96,
            "inputs": {
              "forks": 1211,
              "stars": 10090,
              "watchers": 90,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "10,090 stars",
                "points": 60,
                "status": "met",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 10090
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1,211 forks",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1211
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "90 watchers",
                "points": 10.8,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 90
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "packages": [
                "presidio",
                "presidio_analyzer",
                "presidio_anonymizer",
                "presidio_structured",
                "presidio-image-redactor"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 10481332
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "10,481,332 downloads/month across pypi",
                "points": 80,
                "status": "met",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 10481332,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 74,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "good",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "bus_factor": 3,
              "contributors_sampled": 100,
              "top_contributor_share": 0.276
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "3 contributor(s) cover half of all commits",
                "points": 36,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 28% of commits",
                "points": 16.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 28
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "100 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 1071,
              "open_issues": 48,
              "closed_issues": 504,
              "issue_closed_ratio": 0.913,
              "closed_unmerged_prs": 337
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "91% of issues closed",
                "points": 42.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 91
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1071/1408 decided PRs merged",
                "points": 29.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1071,
                      "decided": 1408
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 45,
            "inputs": {
              "followers": 17,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "data-privacy-stack",
              "public_repos": 4,
              "account_age_days": 98
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "17 followers of data-privacy-stack",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 17,
                      "login": "data-privacy-stack"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~0 yr old",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "presidio",
                "presidio_analyzer",
                "presidio_anonymizer",
                "presidio_structured",
                "presidio-image-redactor"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 22
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "5 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 5,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 22 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 22
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "107 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 107
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 95,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "6 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "python",
                "pii",
                "privacy",
                "data-anonymization",
                "de-identification",
                "data-masking",
                "transformers",
                "pii-detection",
                "data-obfuscation",
                "data-privacy",
                "data-redaction",
                "guardrails",
                "image-redactor",
                "named-entity-recognition",
                "nlp",
                "personally-identifiable-information",
                "phi",
                "sensitive-data",
                "spacy",
                "anonymization"
              ],
              "has_wiki": true,
              "homepage": "https://presidio.dataprivacystack.org",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://presidio.dataprivacystack.org",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "20 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "excellent",
        "name": "Security",
        "value": 97,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "excellent",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dependency lockfiles. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dependency_lockfiles"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "file_signals",
              "lockfiles": [
                "uv.lock"
              ],
              "manifests": [
                "docs/requirements-docs.txt",
                "e2e-tests/requirements.txt",
                "presidio-analyzer/Pipfile",
                "presidio-analyzer/pyproject.toml",
                "presidio-anonymizer/pyproject.toml",
                "presidio-cli/Pipfile",
                "presidio-cli/pyproject.toml",
                "presidio-image-redactor/pyproject.toml",
                "presidio-structured/pyproject.toml",
                "presidio/pyproject.toml",
                "pyproject.toml"
              ],
              "has_codeql_workflow": true,
              "has_security_policy": true,
              "has_dependabot_config": true
            },
            "components": [
              {
                "key": "security_policy_security_md",
                "name": "Security policy (SECURITY.md)",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "dependabot_config",
                "name": "Dependabot config",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "dependency_lockfiles",
                "name": "Dependency lockfiles",
                "detail": "published library — lockfiles are an application concern, not expected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "lockfiles_not_expected",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "codeql_workflow",
                "name": "CodeQL workflow",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Matched the pypi:presidio@2.2.363 runtime dependency closure — what installing the published package pulls in — 55 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:presidio@2.2.363",
                  "assessed": 55
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 85,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 55,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "1 affected: cryptography 46.0.7 (high 7.5)",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "cryptography 46.0.7 (high 7.5)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 55,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 5
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 70,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": "Excluded from scoring (no data or not applicable): Legible commit history. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "legible_commit_history"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 75,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": null,
              "agent_instruction_files": [
                ".github/copilot-instructions.md"
              ],
              "agent_instruction_max_bytes": 26062
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".github/copilot-instructions.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".github/copilot-instructions.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): Demonstrated agent practice. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "demonstrated_agent_practice"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 74,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "uv.lock"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": true,
              "has_linter_config": true,
              "typecheck_configs": [
                "presidio-analyzer/presidio_analyzer/py.typed",
                "presidio-anonymizer/presidio_anonymizer/py.typed",
                "presidio-image-redactor/presidio_image_redactor/py.typed",
                "presidio-structured/presidio_structured/py.typed"
              ],
              "agent_commit_share": null,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "presidio-analyzer/presidio_analyzer/py.typed, presidio-anonymizer/presidio_anonymizer/py.typed, presidio-image-redactor/presidio_image_redactor/py.typed, presidio-structured/presidio_structured/py.typed",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "presidio-analyzer/presidio_analyzer/py.typed, presidio-anonymizer/presidio_anonymizer/py.typed, presidio-image-redactor/presidio_image_redactor/py.typed, presidio-structured/presidio_structured/py.typed"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "devcontainer, Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "devcontainer, Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 64127,
              "source_files_sampled": 468,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (presidio-analyzer/presidio_analyzer/py.typed, presidio-anonymizer/presidio_anonymizer/py.typed, presidio-image-redactor/presidio_image_redactor/py.typed, presidio-structured/presidio_structured/py.typed)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "presidio-analyzer/presidio_analyzer/py.typed, presidio-anonymizer/presidio_anonymizer/py.typed, presidio-image-redactor/presidio_image_redactor/py.typed, presidio-structured/presidio_structured/py.typed",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/468 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 468,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "notebooks",
                "recipes",
                "samples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "notebooks, recipes, samples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "notebooks, recipes, samples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "pypi package 'presidio-cli' points at a different repository (https://github.com/insightsengineering/presidio-cli); excluded from ecosystem scoring",
    "OpenSSF Scorecard did not return a usable result (2026/07/21 02:20:02 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T02:21:02.917332Z",
  "schema_version": "0.16.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/data-privacy-stack/presidio.svg",
  "full_name": "data-privacy-stack/presidio",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.16.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsPyPI.