{"id":13394062,"url":"https://github.com/ericchiang/pup","last_synced_at":"2026-01-26T13:02:47.731Z","repository":{"id":20254382,"uuid":"23527160","full_name":"ericchiang/pup","owner":"ericchiang","description":"Parsing HTML at the command line","archived":false,"fork":false,"pushed_at":"2024-05-02T13:43:38.000Z","size":3865,"stargazers_count":8371,"open_issues_count":108,"forks_count":267,"subscribers_count":87,"default_branch":"master","last_synced_at":"2025-12-27T19:52:09.479Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ericchiang.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-09-01T01:31:29.000Z","updated_at":"2025-12-27T13:42:33.000Z","dependencies_parsed_at":"2023-01-13T20:52:17.956Z","dependency_job_id":"703cb31a-852e-4ad4-ad25-51f23955ff04","html_url":"https://github.com/ericchiang/pup","commit_stats":{"total_commits":87,"total_committers":12,"mean_commits":7.25,"dds":"0.13793103448275867","last_synced_commit":"5a57cf111366c7c08999a34b2afd7ba36d58a96d"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/ericchiang/pup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchiang%2Fpup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchiang%2Fpup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchiang%2Fpup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchiang%2Fpup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericchiang","download_url":"https://codeload.github.com/ericchiang/pup/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchiang%2Fpup/sbom","scorecard":{"id":380130,"data":{"date":"2025-08-11","repo":{"name":"github.com/ericchiang/pup","commit":"5a57cf111366c7c08999a34b2afd7ba36d58a96d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Code-Review","score":1,"reason":"Found 5/26 approved changesets -- score normalized to 1","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":"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/test.yaml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ericchiang/pup/test.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yaml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/ericchiang/pup/test.yaml/master?enable=pin","Info:   0 out of   2 GitHub-owned 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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.yaml: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":"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: MIT License: 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":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.4.0 not signed: https://api.github.com/repos/ericchiang/pup/releases/3723753","Warn: release artifact v0.3.9 not signed: https://api.github.com/repos/ericchiang/pup/releases/1127686","Warn: release artifact v0.3.8 not signed: https://api.github.com/repos/ericchiang/pup/releases/906053","Warn: release artifact v0.3.7 not signed: https://api.github.com/repos/ericchiang/pup/releases/781426","Warn: release artifact v0.3.6 not signed: https://api.github.com/repos/ericchiang/pup/releases/762480","Warn: release artifact v0.4.0 does not have provenance: https://api.github.com/repos/ericchiang/pup/releases/3723753","Warn: release artifact v0.3.9 does not have provenance: https://api.github.com/repos/ericchiang/pup/releases/1127686","Warn: release artifact v0.3.8 does not have provenance: https://api.github.com/repos/ericchiang/pup/releases/906053","Warn: release artifact v0.3.7 does not have provenance: https://api.github.com/repos/ericchiang/pup/releases/781426","Warn: release artifact v0.3.6 does not have provenance: https://api.github.com/repos/ericchiang/pup/releases/762480"],"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"Vulnerabilities","score":0,"reason":"23 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2021-0078 / GHSA-5p4h-3377-7w67","Warn: Project is vulnerable to: GO-2022-0193 / GHSA-fcf9-6fv2-fc5v","Warn: Project is vulnerable to: GO-2022-0192 / GHSA-2wp2-chmh-r934","Warn: Project is vulnerable to: GO-2022-0197 / GHSA-4r78-hx75-jjj2 / GHSA-mv93-wvcp-7m7r","Warn: Project is vulnerable to: GO-2020-0014 / GHSA-vfw5-hrgq-h5wf","Warn: Project is vulnerable to: GO-2022-0536 / GHSA-39qc-96h7-956f / GHSA-hgr8-6h9x-f7q9","Warn: Project is vulnerable to: GO-2022-0236 / GHSA-h86h-8ppg-mxmh","Warn: Project is vulnerable to: GO-2021-0238 / GHSA-83g2-8m93-v3w7","Warn: Project is vulnerable to: GO-2022-0288","Warn: Project is vulnerable to: GO-2022-0969 / GHSA-69cg-p879-7622","Warn: Project is vulnerable to: GO-2022-1144 / GHSA-xrjj-mj9h-534m","Warn: Project is vulnerable to: GO-2023-1571 / GHSA-vvpx-j8f3-3w6h","Warn: Project is vulnerable to: GO-2023-1988 / GHSA-2wrh-6pvc-2jm9","Warn: Project is vulnerable to: GO-2023-2102 / GHSA-4374-p667-p6c8","Warn: Project is vulnerable to: GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GO-2024-2687 / GHSA-4v7x-pqxf-cx7m","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8","Warn: Project is vulnerable to: GO-2020-0015 / GHSA-5rcv-m4m3-hfh7","Warn: Project is vulnerable to: GO-2021-0113 / GHSA-ppp9-7jff-5vj2","Warn: Project is vulnerable to: GO-2022-1059 / GHSA-69ch-w2m2-3vjp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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"}}]},"last_synced_at":"2025-08-18T15:13:41.377Z","repository_id":20254382,"created_at":"2025-08-18T15:13:41.377Z","updated_at":"2025-08-18T15:13:41.377Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28778728,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T11:46:04.308Z","status":"ssl_error","status_checked_at":"2026-01-26T11:46:02.664Z","response_time":59,"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":[],"created_at":"2024-07-30T17:01:07.691Z","updated_at":"2026-01-26T13:02:47.697Z","avatar_url":"https://github.com/ericchiang.png","language":"HTML","readme":"# pup\n\npup is a command line tool for processing HTML. It reads from stdin,\nprints to stdout, and allows the user to filter parts of the page using\n[CSS selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started/Selectors).\n\nInspired by [jq](http://stedolan.github.io/jq/), pup aims to be a\nfast and flexible way of exploring HTML from the terminal.\n\n## Install\n\nDirect downloads are available through the [releases page](https://github.com/EricChiang/pup/releases/latest).\n\nIf you have Go installed on your computer just run `go get`.\n\n    go get github.com/ericchiang/pup\n\nIf you're on OS X, use [Homebrew](http://brew.sh/) to install (no Go required).\n\n    brew install https://raw.githubusercontent.com/EricChiang/pup/master/pup.rb\n\n## Quick start\n\n```bash\n$ curl -s https://news.ycombinator.com/\n```\n\nEw, HTML. Let's run that through some pup selectors:\n\n```bash\n$ curl -s https://news.ycombinator.com/ | pup 'table table tr:nth-last-of-type(n+2) td.title a'\n```\n\nOkay, how about only the links?\n\n```bash\n$ curl -s https://news.ycombinator.com/ | pup 'table table tr:nth-last-of-type(n+2) td.title a attr{href}'\n```\n\nEven better, let's grab the titles too:\n\n```bash\n$ curl -s https://news.ycombinator.com/ | pup 'table table tr:nth-last-of-type(n+2) td.title a json{}'\n```\n\n## Basic Usage\n\n```bash\n$ cat index.html | pup [flags] '[selectors] [display function]'\n```\n\n## Examples\n\nDownload a webpage with wget.\n\n```bash\n$ wget http://en.wikipedia.org/wiki/Robots_exclusion_standard -O robots.html\n```\n\n#### Clean and indent\n\nBy default pup will fill in missing tags and properly indent the page.\n\n```bash\n$ cat robots.html\n# nasty looking HTML\n$ cat robots.html | pup --color\n# cleaned, indented, and colorful HTML\n```\n\n#### Filter by tag\n\n```bash\n$ cat robots.html | pup 'title'\n\u003ctitle\u003e\n Robots exclusion standard - Wikipedia, the free encyclopedia\n\u003c/title\u003e\n```\n\n#### Filter by id\n\n```bash\n$ cat robots.html | pup 'span#See_also'\n\u003cspan class=\"mw-headline\" id=\"See_also\"\u003e\n See also\n\u003c/span\u003e\n```\n\n#### Filter by attribute\n\n```bash\n$ cat robots.html | pup 'th[scope=\"row\"]'\n\u003cth scope=\"row\" class=\"navbox-group\"\u003e\n Exclusion standards\n\u003c/th\u003e\n\u003cth scope=\"row\" class=\"navbox-group\"\u003e\n Related marketing topics\n\u003c/th\u003e\n\u003cth scope=\"row\" class=\"navbox-group\"\u003e\n Search marketing related topics\n\u003c/th\u003e\n\u003cth scope=\"row\" class=\"navbox-group\"\u003e\n Search engine spam\n\u003c/th\u003e\n\u003cth scope=\"row\" class=\"navbox-group\"\u003e\n Linking\n\u003c/th\u003e\n\u003cth scope=\"row\" class=\"navbox-group\"\u003e\n People\n\u003c/th\u003e\n\u003cth scope=\"row\" class=\"navbox-group\"\u003e\n Other\n\u003c/th\u003e\n```\n\n#### Pseudo Classes\n\nCSS selectors have a group of specifiers called [\"pseudo classes\"](\nhttps://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes)  which are pretty\ncool. pup implements a majority of the relevant ones them.\n\nHere are some examples.\n\n```bash\n$ cat robots.html | pup 'a[rel]:empty'\n\u003ca rel=\"license\" href=\"//creativecommons.org/licenses/by-sa/3.0/\" style=\"display:none;\"\u003e\n\u003c/a\u003e\n```\n\n```bash\n$ cat robots.html | pup ':contains(\"History\")'\n\u003cspan class=\"toctext\"\u003e\n History\n\u003c/span\u003e\n\u003cspan class=\"mw-headline\" id=\"History\"\u003e\n History\n\u003c/span\u003e\n```\n\n```bash\n$ cat robots.html | pup ':parent-of([action=\"edit\"])'\n\u003cspan class=\"wb-langlinks-edit wb-langlinks-link\"\u003e\n \u003ca action=\"edit\" href=\"//www.wikidata.org/wiki/Q80776#sitelinks-wikipedia\" text=\"Edit links\" title=\"Edit interlanguage links\" class=\"wbc-editpage\"\u003e\n  Edit links\n \u003c/a\u003e\n\u003c/span\u003e\n```\n\nFor a complete list, view the [implemented selectors](#implemented-selectors)\nsection.\n\n\n#### `+`, `\u003e`, and `,`\n\nThese are intermediate characters that declare special instructions. For\ninstance, a comma `,` allows pup to specify multiple groups of selectors.\n\n```bash\n$ cat robots.html | pup 'title, h1 span[dir=\"auto\"]'\n\u003ctitle\u003e\n Robots exclusion standard - Wikipedia, the free encyclopedia\n\u003c/title\u003e\n\u003cspan dir=\"auto\"\u003e\n Robots exclusion standard\n\u003c/span\u003e\n```\n\n#### Chain selectors together\n\nWhen combining selectors, the HTML nodes selected by the previous selector will\nbe passed to the next ones.\n\n```bash\n$ cat robots.html | pup 'h1#firstHeading'\n\u003ch1 id=\"firstHeading\" class=\"firstHeading\" lang=\"en\"\u003e\n \u003cspan dir=\"auto\"\u003e\n  Robots exclusion standard\n \u003c/span\u003e\n\u003c/h1\u003e\n```\n\n```bash\n$ cat robots.html | pup 'h1#firstHeading span'\n\u003cspan dir=\"auto\"\u003e\n Robots exclusion standard\n\u003c/span\u003e\n```\n\n## Implemented Selectors\n\nFor further examples of these selectors head over to [MDN](\nhttps://developer.mozilla.org/en-US/docs/Web/CSS/Reference).\n\n```bash\npup '.class'\npup '#id'\npup 'element'\npup 'selector + selector'\npup 'selector \u003e selector'\npup '[attribute]'\npup '[attribute=\"value\"]'\npup '[attribute*=\"value\"]'\npup '[attribute~=\"value\"]'\npup '[attribute^=\"value\"]'\npup '[attribute$=\"value\"]'\npup ':empty'\npup ':first-child'\npup ':first-of-type'\npup ':last-child'\npup ':last-of-type'\npup ':only-child'\npup ':only-of-type'\npup ':contains(\"text\")'\npup ':nth-child(n)'\npup ':nth-of-type(n)'\npup ':nth-last-child(n)'\npup ':nth-last-of-type(n)'\npup ':not(selector)'\npup ':parent-of(selector)'\n```\n\nYou can mix and match selectors as you wish.\n\n```bash\ncat index.html | pup 'element#id[attribute=\"value\"]:first-of-type'\n```\n\n## Display Functions\n\nNon-HTML selectors which effect the output type are implemented as functions\nwhich can be provided as a final argument.\n\n#### `text{}`\n\nPrint all text from selected nodes and children in depth first order.\n\n```bash\n$ cat robots.html | pup '.mw-headline text{}'\nHistory\nAbout the standard\nDisadvantages\nAlternatives\nExamples\nNonstandard extensions\nCrawl-delay directive\nAllow directive\nSitemap\nHost\nUniversal \"*\" match\nMeta tags and headers\nSee also\nReferences\nExternal links\n```\n\n#### `attr{attrkey}`\n\nPrint the values of all attributes with a given key from all selected nodes.\n\n```bash\n$ cat robots.html | pup '.catlinks div attr{id}'\nmw-normal-catlinks\nmw-hidden-catlinks\n```\n\n#### `json{}`\n\nPrint HTML as JSON.\n\n```bash\n$ cat robots.html  | pup 'div#p-namespaces a'\n\u003ca href=\"/wiki/Robots_exclusion_standard\" title=\"View the content page [c]\" accesskey=\"c\"\u003e\n Article\n\u003c/a\u003e\n\u003ca href=\"/wiki/Talk:Robots_exclusion_standard\" title=\"Discussion about the content page [t]\" accesskey=\"t\"\u003e\n Talk\n\u003c/a\u003e\n```\n\n```bash\n$ cat robots.html | pup 'div#p-namespaces a json{}'\n[\n {\n  \"accesskey\": \"c\",\n  \"href\": \"/wiki/Robots_exclusion_standard\",\n  \"tag\": \"a\",\n  \"text\": \"Article\",\n  \"title\": \"View the content page [c]\"\n },\n {\n  \"accesskey\": \"t\",\n  \"href\": \"/wiki/Talk:Robots_exclusion_standard\",\n  \"tag\": \"a\",\n  \"text\": \"Talk\",\n  \"title\": \"Discussion about the content page [t]\"\n }\n]\n```\n\nUse the `-i` / `--indent` flag to control the intent level.\n\n```bash\n$ cat robots.html | pup -i 4 'div#p-namespaces a json{}'\n[\n    {\n        \"accesskey\": \"c\",\n        \"href\": \"/wiki/Robots_exclusion_standard\",\n        \"tag\": \"a\",\n        \"text\": \"Article\",\n        \"title\": \"View the content page [c]\"\n    },\n    {\n        \"accesskey\": \"t\",\n        \"href\": \"/wiki/Talk:Robots_exclusion_standard\",\n        \"tag\": \"a\",\n        \"text\": \"Talk\",\n        \"title\": \"Discussion about the content page [t]\"\n    }\n]\n```\n\nIf the selectors only return one element the results will be printed as a JSON\nobject, not a list.\n\n```bash\n$ cat robots.html  | pup --indent 4 'title json{}'\n{\n    \"tag\": \"title\",\n    \"text\": \"Robots exclusion standard - Wikipedia, the free encyclopedia\"\n}\n```\n\nBecause there is no universal standard for converting HTML/XML to JSON, a\nmethod has been chosen which hopefully fits. The goal is simply to get the\noutput of pup into a more consumable format.\n\n## Flags\n\nRun `pup --help` for a list of further options\n","funding_links":[],"categories":["HTML","Uncategorized","HTML (177)","others","Tools","Programming Languages","\u003ca name=\"data\"\u003e\u003c/a\u003edata","\u003ca name=\"text-processing\"\u003e\u003c/a\u003eText processing","Lovely Commands"],"sub_categories":["Uncategorized","Go"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericchiang%2Fpup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericchiang%2Fpup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericchiang%2Fpup/lists"}