{"id":34066951,"url":"https://github.com/pd3f/pd3f-core","last_synced_at":"2026-04-08T15:31:12.112Z","repository":{"id":37200498,"uuid":"263993392","full_name":"pd3f/pd3f-core","owner":"pd3f","description":"📑 Python Package to reconstruct the original continuous text from PDFs with language models","archived":false,"fork":false,"pushed_at":"2023-09-08T19:47:01.000Z","size":1372,"stargazers_count":32,"open_issues_count":25,"forks_count":8,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-03-05T18:24:38.619Z","etag":null,"topics":["dehyphenation","language-model","machine-learning","pd3f","pdf","text-extraction"],"latest_commit_sha":null,"homepage":"https://pd3f.github.io/pd3f-core/index.html","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pd3f.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-14T18:25:00.000Z","updated_at":"2025-01-12T01:47:45.000Z","dependencies_parsed_at":"2023-01-31T05:00:31.971Z","dependency_job_id":null,"html_url":"https://github.com/pd3f/pd3f-core","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/pd3f/pd3f-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pd3f%2Fpd3f-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pd3f%2Fpd3f-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pd3f%2Fpd3f-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pd3f%2Fpd3f-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pd3f","download_url":"https://codeload.github.com/pd3f/pd3f-core/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pd3f%2Fpd3f-core/sbom","scorecard":{"id":725356,"data":{"date":"2025-08-11","repo":{"name":"github.com/pd3f/pd3f-core","commit":"00730834e23f387cbe079ef8ddec9483160d6a7f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/19 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/publish_docs.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish_docs.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/pd3f/pd3f-core/publish_docs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish_docs.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/pd3f/pd3f-core/publish_docs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish_docs.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/pd3f/pd3f-core/publish_docs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish_docs.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/pd3f/pd3f-core/publish_docs.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU Affero General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 11 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"83 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2022-42986 / GHSA-43fp-rhv2-5gv8","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2022-42991 / GHSA-v3c5-jqr6-7qm8","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-29gw-9793-fvw7","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: PYSEC-2022-288 / GHSA-6hrg-qmvc-2xh8","Warn: Project is vulnerable to: GHSA-33p9-3p43-82vq","Warn: Project is vulnerable to: PYSEC-2022-42974 / GHSA-m678-f26j-3hrp","Warn: Project is vulnerable to: GHSA-44cc-43rp-5947","Warn: Project is vulnerable to: PYSEC-2021-130 / GHSA-4952-p58q-6crx","Warn: Project is vulnerable to: GHSA-9q39-rmj3-p4r2","Warn: Project is vulnerable to: PYSEC-2022-249 / GHSA-9jmq-rx5f-8jwq","Warn: Project is vulnerable to: PYSEC-2022-180 / GHSA-m87f-39q9-6f55","Warn: Project is vulnerable to: PYSEC-2022-212 / GHSA-v7vq-3x77-87vg","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: PYSEC-2022-43012 / GHSA-r9hx-vwmv-q579","Warn: Project is vulnerable to: GHSA-3749-ghw9-m3mg","Warn: Project is vulnerable to: PYSEC-2022-43015 / GHSA-47fc-vmwq-366v","Warn: Project is vulnerable to: PYSEC-2025-41 / GHSA-53q9-r3pm-6pq6","Warn: Project is vulnerable to: PYSEC-2024-252 / GHSA-5pcm-hx3q-hm94","Warn: Project is vulnerable to: GHSA-887c-mr87-cxwp","Warn: Project is vulnerable to: PYSEC-2024-251 / GHSA-pg7h-5qx3-wjr3","Warn: Project is vulnerable to: PYSEC-2024-250","Warn: Project is vulnerable to: PYSEC-2024-259","Warn: Project is vulnerable to: GHSA-753j-mpmx-qq6g","Warn: Project is vulnerable to: GHSA-7cx3-6m66-7c5m","Warn: Project is vulnerable to: GHSA-8w49-h785-mj3c","Warn: Project is vulnerable to: PYSEC-2023-75 / GHSA-hj3f-6gcp-jg8j","Warn: Project is vulnerable to: GHSA-qppv-j76h-2rpx","Warn: Project is vulnerable to: GHSA-w235-7p84-xx57","Warn: Project is vulnerable to: GHSA-g7vv-2v7x-gj9p","Warn: Project is vulnerable to: PYSEC-2023-299 / GHSA-282v-666c-3fvg","Warn: Project is vulnerable to: GHSA-37mw-44qp-f5jm","Warn: Project is vulnerable to: GHSA-37q5-v5qm-c9v8","Warn: Project is vulnerable to: PYSEC-2023-300 / GHSA-3863-2447-669p","Warn: Project is vulnerable to: GHSA-6rvg-6v2m-4j46","Warn: Project is vulnerable to: GHSA-9356-575x-2w9m","Warn: Project is vulnerable to: GHSA-fpwr-67px-3qhx","Warn: Project is vulnerable to: PYSEC-2024-229 / GHSA-hxxf-235m-72v3","Warn: Project is vulnerable to: GHSA-jjph-296x-mrcr","Warn: Project is vulnerable to: GHSA-phhr-52qp-3mj4","Warn: Project is vulnerable to: GHSA-q2wp-rjmx-x6x9","Warn: Project is vulnerable to: PYSEC-2025-40 / GHSA-qq3j-4f4f-9583","Warn: Project is vulnerable to: PYSEC-2024-227 / GHSA-qxrp-vhvm-j765","Warn: Project is vulnerable to: PYSEC-2023-301 / GHSA-v68g-wm8c-6x7j","Warn: Project is vulnerable to: PYSEC-2024-228 / GHSA-wrfc-pvp9-mr9g","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: GHSA-jfmj-5v4g-7637","Warn: Project is vulnerable to: GHSA-6673-4983-2vx5","Warn: Project is vulnerable to: PYSEC-2023-163 / GHSA-f73w-4m7g-ch9x","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: GHSA-3f63-hfp8-52jq","Warn: Project is vulnerable to: GHSA-44wm-f244-xhp3","Warn: Project is vulnerable to: PYSEC-2023-227 / GHSA-8ghj-p4vj-mr35","Warn: Project is vulnerable to: GHSA-j7hp-h8jx-5ppr","Warn: Project is vulnerable to: PYSEC-2022-42979 / GHSA-m2vv-5vj5-2hm7","Warn: Project is vulnerable to: PYSEC-2023-175","Warn: Project is vulnerable to: GHSA-mr82-8j83-vxmv","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114","Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6","Warn: Project is vulnerable to: PYSEC-2023-157 / GHSA-64x5-55rw-9974","Warn: Project is vulnerable to: PYSEC-2023-272 / GHSA-h56g-gq9v-vc8r","Warn: Project is vulnerable to: PYSEC-2024-165 / GHSA-hrw6-wg82-cm62","Warn: Project is vulnerable to: PYSEC-2022-179 / GHSA-p737-p57g-4cpr","Warn: Project is vulnerable to: PYSEC-2022-211 / GHSA-q874-g24w-4q9g","Warn: Project is vulnerable to: PYSEC-2023-155 / GHSA-r726-vmfq-j9j3","Warn: Project is vulnerable to: PYSEC-2022-260 / GHSA-v973-fxgf-6xhp","Warn: Project is vulnerable to: PYSEC-2022-42969"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T12:37:50.730Z","repository_id":37200498,"created_at":"2025-08-22T12:37:50.730Z","updated_at":"2025-08-22T12:37:50.730Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31562685,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dehyphenation","language-model","machine-learning","pd3f","pdf","text-extraction"],"created_at":"2025-12-14T06:56:20.090Z","updated_at":"2026-04-08T15:31:12.104Z","avatar_url":"https://github.com/pd3f.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `pd3f-core` [![PyPI](https://img.shields.io/pypi/v/pd3f.svg)](https://pypi.org/project/pd3f/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pd3f.svg)](https://pypi.org/project/pd3f/) [![PyPI - Downloads](https://img.shields.io/pypi/dm/pd3f)](https://pypistats.org/packages/pd3f)\n\n_Experimental, use with care._\n\n`pd3f-core` is Python package to **reconstruct** the original **continuous text** from **PDFs** with language models.\n`pd3f-core` assumes your PDF is either text-based or already OCRd.\n`pd3f-core` is at the heart of [pd3f](https://github.com/pd3f/pd3f): a full Docker-based text extraction pipeline (including OCR).\n\n`pd3f-core` first uses [Parsr](https://github.com/axa-group/Parsr) to chunk PDFs into lines and paragraphs.\nThen, it uses the Python package [dehyphen](https://github.com/jfilter/dehyphen) to reconstruct the paragraphs in the most probable way.\nThe probability is derived by calculating the [perplexity](https://en.wikipedia.org/wiki/Perplexity) with [Flair](https://github.com/flairNLP/flair)'s character-based [language models](https://machinelearningmastery.com/statistical-language-modeling-and-neural-language-models/).\nUnnecessary hyphens are removed, space or new lines are kept or dropt depending on the surround words.\n\nIt's mainly developed for German but should work with other languages as well.\nThe project is still in an early stage.\nExpect rough edges and rapid changes.\n\n## Documentation\n\nAPI Documentation of pd3f-core: \u003chttps://pd3f.github.io/pd3f-core/index.html\u003e\n\nDocumentation of pd3f (the ): \u003chttps://pd3f.com/docs/\u003e\n\n## Features\n\n### Dehyphenation of Lines\n\nCheck if two lines can be joined by removing hyphens ('-').\n\n### Reasonable Joining of Lines\n\nDecide between adding a simple space (' ') or a new line ('\\n') when joining lines.\n\n### Reverse Page Break (Experimental)\n\nCheck if the last paragraph of a page und the first paragraph of the following page can be joined.\n\n### Footnote to Endnotes (Experimental)\n\nIn order to join paragraphs (and reverse page breaks), detect footnotes and turn them into endnotes.\nFor now, the footnotes are pulled to the end of a file.\n\n### Deduplication of Pager Header / Footer (Experimental)\n\nIf the header or the footer are the same for all pages, only display them once.\nHeaders are pulled to the start of the document and footer to the end.\nSome heuristic based on the similarity of footers are used. (Jaccard distance for text, and compare overlapping shapes)\n\n\u003c!-- TODO --\u003e\n\u003c!-- Special case for OCRd PDFs: Choose the Header / Footer with the best Flair score to display.\nSince header / footer are small, the OCR may fail to get the text output. --\u003e\n\n## Installation\n\n```bash\npip install pd3f\n```\n\nor\n\n```bash\npoetry add pd3f\n```\n\n## Usage\n\nStart a local Parsr instance:\n\n```bash\ndocker-compose up\n```\n\n(You may also use tunnel a remote Parsr instance ([script](./scripts/locale_parsr.sh)) or choose a remote address.)\n\n```python\nfrom pd3f import extract\n\ntext, tables = extract(file_path, tables=False, experimental=False, force_gpu=False, lang=\"multi\", fast=False, parsr_location=\"localhost:3001\")\n```\n\nExplanations of the paramaters in the docs: https://pd3f.github.io/pd3f-core/export.html#pd3f.export.extract\n\n### GPU Support (CUDA)\n\nUsing CUDA speeds up the evaluation with Flair.\nBut you need an (expensive) GPU.\nYou need to set up your GPU with CUDA.\n[Here a guide for Ubuntu 18.04](https://towardsdatascience.com/deep-learning-gpu-installation-on-ubuntu-18-4-9b12230a1d31)\n\n1. install [conda (via miniconda)](https://docs.conda.io/en/latest/miniconda.html) and [poetry](https://python-poetry.org/docs/)\n2. create a new conda enviroment \u0026 activate it\n3. Install [PyTorch](https://pytorch.org/) with CUDA: `conda install pytorch torchvision cudatoolkit=10.2 -c pytorch` (example)\n4. Install `pd3f-core` with poetry: `poetry add pd3f`\n\nPoetry realizes that it is run within a conda virtual env so it doesn't create a new one.\nSince setting up CUDA is hard, install it with the most easy way (with conda).\n\n## Background\n\n### Parsr Config\n\nAt the heart of `pd3f-core` is the JSON output of Parsr.\nSome comments on how and why certain things were chosen.\n[Parsr's documentation about the different modules](https://github.com/axa-group/Parsr/tree/master/server/src/processing)\n\nParsr has several module to classify paragraphs into certain types.\nThey offer a list detections as well as an heading detection.\nIn my experience, the accuracy is too low for both, so we don't use it right now.\nThis also means all the extracted (output) text is flat (no headings, different formattings etc.).\n\nWe enable Drawing + Image Detection because we may need to understand what paragraph is following which other one.\nThis may be helpful when to decide whether to join paragraphs.\nBut it's dropped when activating the `fast` setting.\n\nIn the JSON output is a field `pageNumber`.\nThis comes from the page detection module.\nSo `pageNumber` is derived from header / footer of each page.\nSo it may be different from the index in the page array.\nDon't relay on `pageNumber` in the JSON output.\n\n`words-to-line-new` has be used like this.\nThere is no error but the accuracy decreases if it used otherwise.\n\n```json\n\"words-to-line-new\",\n[\n    \"reading-order-detection\",\n```\n\nDon't do OCR with Parsr because the results are worse than OCRmyPDF (because the latter uses image preprocessing).\n\n## Future Work / TODO\n\n-   make reverse page break work without requiring the experimental features\n\n## Developement\n\nInstall and use [poetry](https://python-poetry.org/).\n\n## License\n\nAffero General Public License 3.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpd3f%2Fpd3f-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpd3f%2Fpd3f-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpd3f%2Fpd3f-core/lists"}