{"id":11387823,"name":"defuddle","ecosystem":"npm","description":"Extract article content and metadata from web pages.","homepage":"https://github.com/kepano/defuddle","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/kepano/defuddle","keywords_array":["readability","content-extraction","article-extraction","web-scraping","html-cleanup","content-parser","article-parser","dom"],"namespace":null,"versions_count":41,"first_release_published_at":"2025-02-27T23:44:56.594Z","latest_release_published_at":"2026-04-21T23:59:57.386Z","latest_release_number":"0.18.1","last_synced_at":"2026-05-18T02:21:32.204Z","created_at":"2025-02-27T23:45:53.913Z","updated_at":"2026-05-19T02:14:36.571Z","registry_url":"https://www.npmjs.com/package/defuddle","install_command":"npm install defuddle","documentation_url":null,"metadata":{"funding":null,"dist-tags":{"latest":"0.18.1"}},"repo_metadata":{"id":279872553,"uuid":"940076402","full_name":"kepano/defuddle","owner":"kepano","description":"Get the main content of any page as Markdown.","archived":false,"fork":false,"pushed_at":"2026-04-28T15:37:46.000Z","size":3833,"stargazers_count":7095,"open_issues_count":29,"forks_count":291,"subscribers_count":19,"default_branch":"main","last_synced_at":"2026-04-29T01:52:01.910Z","etag":null,"topics":["cli","defuddle","html","markdown","md"],"latest_commit_sha":null,"homepage":"https://defuddle.md","language":"TypeScript","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/kepano.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-27T15:20:42.000Z","updated_at":"2026-04-29T00:34:23.000Z","dependencies_parsed_at":"2025-02-28T07:39:48.052Z","dependency_job_id":"be45b653-bdbb-4f83-9c09-5bfb38b6037b","html_url":"https://github.com/kepano/defuddle","commit_stats":null,"previous_names":["kepano/defuddle"],"tags_count":40,"template":false,"template_full_name":null,"purl":"pkg:github/kepano/defuddle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kepano","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33125184,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T18:38:32.183Z","status":"online","status_checked_at":"2026-05-17T02:00:05.366Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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"},"owner_record":{"login":"kepano","name":"Steph Ango","uuid":"10565871","kind":"user","description":"","email":"","website":"stephango.com","location":null,"twitter":"kepano","company":"Obsidian","icon_url":"https://avatars.githubusercontent.com/u/10565871?u=331db9a72c1d1d7ff58c32b3e7236fd6d2753527\u0026v=4","repositories_count":44,"last_synced_at":"2025-11-29T07:54:43.848Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/kepano","funding_links":["https://github.com/sponsors/kepano"],"total_stars":15128,"followers":2823,"following":36,"created_at":"2022-11-15T03:53:07.339Z","updated_at":"2025-11-29T07:54:43.848Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kepano","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kepano/repositories"},"tags":[{"name":"0.18.0","sha":"c11b9bb0504a66d5f60c4e7a26f3ebe8760288a3","kind":"commit","published_at":"2026-04-21T20:16:52.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.18.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.18.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.18.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.18.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.18.0/manifests"},{"name":"0.17.0","sha":"fd921391b0425f2214aeb64a604e4c4eb04884d0","kind":"commit","published_at":"2026-04-15T03:25:22.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.17.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.17.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.17.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.17.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.17.0/manifests"},{"name":"0.16.0","sha":"66049af2aab6bd16bc38d24176f3dd19a86a086d","kind":"commit","published_at":"2026-04-09T23:20:54.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.16.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.16.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.16.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.16.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.16.0/manifests"},{"name":"0.15.0","sha":"e29efd1bf4645ca20baa38cd83df532f338aa53c","kind":"commit","published_at":"2026-03-31T17:13:21.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.15.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.15.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.15.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.15.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.15.0/manifests"},{"name":"0.14.0","sha":"b1983b2c46f68696c2dd132344299b37d2bebfde","kind":"commit","published_at":"2026-03-17T00:04:55.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.14.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.14.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.14.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.14.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.14.0/manifests"},{"name":"0.13.0","sha":"8b00d9907d6a1c0bdf6b63b70aaf44aaeac72a4a","kind":"commit","published_at":"2026-03-13T17:14:56.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.13.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.13.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.13.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.13.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.13.0/manifests"},{"name":"v0.13.0","sha":"8b00d9907d6a1c0bdf6b63b70aaf44aaeac72a4a","kind":"tag","published_at":"2026-03-13T17:14:56.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/v0.13.0","html_url":"https://github.com/kepano/defuddle/releases/tag/v0.13.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@v0.13.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/v0.13.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/v0.13.0/manifests"},{"name":"0.12.0","sha":"0f00e4d9a8791bfbb70c4d3ebb6e0620cf4fa970","kind":"commit","published_at":"2026-03-10T20:39:36.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.12.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.12.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.12.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.12.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.12.0/manifests"},{"name":"0.11.0","sha":"a16c779dd9d0c3d2a3f23437b89c1b3553f37e52","kind":"commit","published_at":"2026-03-08T15:01:11.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.11.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.11.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.11.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.11.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.11.0/manifests"},{"name":"0.10.0","sha":"2066d01ab3afe2f96cc49fd7a4d92541243fd1c4","kind":"commit","published_at":"2026-03-06T17:46:55.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.10.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.10.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.10.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.10.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.10.0/manifests"},{"name":"0.9.0","sha":"440f9e8ca92a7be7871aeb07200190328340dbbf","kind":"commit","published_at":"2026-03-05T19:08:38.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.9.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.9.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.9.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.9.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.9.0/manifests"},{"name":"0.8.0","sha":"40947d003c0eeebc27077b8339f3eaabd2be94df","kind":"commit","published_at":"2026-03-02T02:09:55.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.8.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.8.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.8.0/manifests"},{"name":"0.7.0","sha":"9a49b7a30d22ea7e3df754ae63898161693a65c6","kind":"commit","published_at":"2026-02-14T18:43:05.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.7.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.7.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.7.0/manifests"},{"name":"0.6.6","sha":"526cfc66cac94bc674ce44ef6bd843a2518c1e0c","kind":"commit","published_at":"2025-08-14T16:34:39.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.6.6","html_url":"https://github.com/kepano/defuddle/releases/tag/0.6.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.6.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.6/manifests"},{"name":"0.6.5","sha":"2c7ba67082a4622101a0fed7297dd02f34199958","kind":"commit","published_at":"2025-08-14T16:18:49.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.6.5","html_url":"https://github.com/kepano/defuddle/releases/tag/0.6.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.6.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.5/manifests"},{"name":"0.6.4","sha":"e164ec02522f0f7a77f165647fa5b5d255000864","kind":"commit","published_at":"2025-05-19T16:29:43.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.6.4","html_url":"https://github.com/kepano/defuddle/releases/tag/0.6.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.6.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.4/manifests"},{"name":"0.6.3","sha":"0a1806fb23500e469b957912719c8dbebbdd10e0","kind":"commit","published_at":"2025-05-08T20:46:56.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.6.3","html_url":"https://github.com/kepano/defuddle/releases/tag/0.6.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.6.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.3/manifests"},{"name":"0.6.2","sha":"fbe6d9e854a7c2be383c1de18dad077589319488","kind":"commit","published_at":"2025-04-16T20:31:21.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.6.2","html_url":"https://github.com/kepano/defuddle/releases/tag/0.6.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.6.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.2/manifests"},{"name":"0.6.1","sha":"d1138e26ad64b62bb2886381b77b9b7a87b008ac","kind":"commit","published_at":"2025-04-10T19:34:02.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.6.1","html_url":"https://github.com/kepano/defuddle/releases/tag/0.6.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.6.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.1/manifests"},{"name":"0.6.0","sha":"0444eb3906ba335681047ef78da96d1597321933","kind":"commit","published_at":"2025-04-08T20:40:32.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.6.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.6.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.6.0/manifests"},{"name":"0.5.4","sha":"6d3f45051091aeee22a51a2c26cd679293edad12","kind":"commit","published_at":"2025-04-05T21:54:32.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.5.4","html_url":"https://github.com/kepano/defuddle/releases/tag/0.5.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.5.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.4/manifests"},{"name":"0.5.3","sha":"a79236df15fd599b6af92628d0713211550162f8","kind":"commit","published_at":"2025-04-03T13:37:48.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.5.3","html_url":"https://github.com/kepano/defuddle/releases/tag/0.5.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.5.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.3/manifests"},{"name":"0.5.2","sha":"d9f8358d1bbe2797a8549f29b804a1fe35392917","kind":"commit","published_at":"2025-04-02T17:37:58.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.5.2","html_url":"https://github.com/kepano/defuddle/releases/tag/0.5.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.5.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.2/manifests"},{"name":"0.5.1","sha":"0bed2e977b5b7638551a915465f8932bdf540dc1","kind":"commit","published_at":"2025-04-02T16:24:04.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.5.1","html_url":"https://github.com/kepano/defuddle/releases/tag/0.5.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.5.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.1/manifests"},{"name":"0.5.0","sha":"c56619f44dd2d2a3a605142d777fec07efd7b8b7","kind":"commit","published_at":"2025-04-02T16:20:23.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.5.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.5.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.5.0/manifests"},{"name":"0.4.0","sha":"3a3c60ed6cb5c602af2cbfa945ab819f70a29c0d","kind":"commit","published_at":"2025-03-28T19:45:19.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.4.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.4.0/manifests"},{"name":"0.3.8","sha":"69c0ab70413a3058836305e93dba1a5e13ac3a74","kind":"commit","published_at":"2025-03-26T19:34:16.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.3.8","html_url":"https://github.com/kepano/defuddle/releases/tag/0.3.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.3.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.8/manifests"},{"name":"0.3.7","sha":"c7b4fdecda4356dc06772f67e42f336f9fcff46e","kind":"commit","published_at":"2025-03-26T17:45:11.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.3.7","html_url":"https://github.com/kepano/defuddle/releases/tag/0.3.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.3.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.7/manifests"},{"name":"0.3.6","sha":"901d3e6ebe6f367202568c08f3de96f7b6f2cca7","kind":"commit","published_at":"2025-03-25T20:20:29.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.3.6","html_url":"https://github.com/kepano/defuddle/releases/tag/0.3.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.3.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.6/manifests"},{"name":"0.3.4","sha":"07503f5e30c6d71a98a1463734a6628c2aaeb3ce","kind":"commit","published_at":"2025-03-20T23:01:07.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.3.4","html_url":"https://github.com/kepano/defuddle/releases/tag/0.3.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.3.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.4/manifests"},{"name":"0.3.3","sha":"2f370f352201b4aee88784f5694e633251eb91d8","kind":"commit","published_at":"2025-03-19T15:42:32.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.3.3","html_url":"https://github.com/kepano/defuddle/releases/tag/0.3.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.3.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.3/manifests"},{"name":"0.3.2","sha":"5caf0058a9662497fa7047eddbd0e31fe247b9c3","kind":"commit","published_at":"2025-03-19T15:19:09.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.3.2","html_url":"https://github.com/kepano/defuddle/releases/tag/0.3.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.3.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.2/manifests"},{"name":"0.3.1","sha":"771dee724138841064aeb56bb2f0e68dbb1e555b","kind":"commit","published_at":"2025-03-18T16:29:35.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.3.1","html_url":"https://github.com/kepano/defuddle/releases/tag/0.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.3.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.1/manifests"},{"name":"0.3.0","sha":"65ad180ea34599827fd55c1638471aaca25187eb","kind":"commit","published_at":"2025-03-18T15:51:39.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.3.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.3.0/manifests"},{"name":"0.2.4","sha":"60708d0478a253da751bb3a061b221d2ae88271b","kind":"commit","published_at":"2025-03-13T17:47:11.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.2.4","html_url":"https://github.com/kepano/defuddle/releases/tag/0.2.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.2.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.4/manifests"},{"name":"0.2.3","sha":"9b1874e96d6cbb63a0a47dee06857a4d5ddc676a","kind":"commit","published_at":"2025-03-13T16:46:09.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.2.3","html_url":"https://github.com/kepano/defuddle/releases/tag/0.2.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.2.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.3/manifests"},{"name":"0.2.2","sha":"8ea2d6a9f62d7cd0de0b5e76a6885bf4edc42293","kind":"commit","published_at":"2025-03-12T20:57:23.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.2.2","html_url":"https://github.com/kepano/defuddle/releases/tag/0.2.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.2.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.2/manifests"},{"name":"0.2.1","sha":"ffcef35b033476e147c67e4e4f779f9a02581437","kind":"commit","published_at":"2025-03-12T20:34:42.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.2.1","html_url":"https://github.com/kepano/defuddle/releases/tag/0.2.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.2.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.1/manifests"},{"name":"0.2.0","sha":"3b7bfa3a19cc72dc372b2f0786ca6fa08e48c364","kind":"commit","published_at":"2025-03-12T19:49:12.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.2.0","html_url":"https://github.com/kepano/defuddle/releases/tag/0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.2.0/manifests"},{"name":"0.1.1","sha":"da790ae8aafc3479ef1b0bf89dd8a8b9946442fd","kind":"commit","published_at":"2025-03-03T23:28:31.000Z","download_url":"https://codeload.github.com/kepano/defuddle/tar.gz/0.1.1","html_url":"https://github.com/kepano/defuddle/releases/tag/0.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/kepano/defuddle@0.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/tags/0.1.1/manifests"}]},"repo_metadata_updated_at":"2026-05-18T02:21:31.562Z","dependent_packages_count":0,"downloads":186124,"downloads_period":"last-month","dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":24.952067262423157,"dependent_packages_count":36.08729943771251,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":30.519683350067833},"purl":"pkg:npm/defuddle","advisories":[{"uuid":"GSA_kwCzR0hTQS01bXE4LTc4Z20tcGptcc4ABTR8","url":"https://github.com/advisories/GHSA-5mq8-78gm-pjmq","title":"defuddle vulnerable to XSS via unescaped string interpolation in _findContentBySchemaText image tag","description":"### Summary\n\nThe `_findContentBySchemaText` method in `src/defuddle.ts` interpolates image `src` and `alt` attributes directly into an HTML string without escaping:\n\n```typescript\nhtml += `\u003cimg src=\"${imageSrc}\" alt=\"${imageAlt}\"\u003e`;\n```\n\nAn attacker can use a `\"` in the `alt` attribute to break out of the attribute context and inject event handlers. This is a separate vulnerability from the sanitization bypass fixed in f154cb7 — the injection happens during string construction, not in the DOM, so `_stripUnsafeElements` cannot catch it.\n\n### Details\n\nWhen `_findContentBySchemaText` finds a sibling image outside the matched content element, it reads the image's `src` and `alt` attributes via `getAttribute()` and interpolates them into a template literal. `getAttribute('alt')` returns the raw attribute value. If the alt contains `\"`, it terminates the `alt` attribute in the interpolated HTML string, and subsequent content becomes new attributes (including event handlers).\n\nThe recently added `_stripUnsafeElements()` (commit f154cb7) strips `on*` attributes from DOM elements, but the `alt` attribute's name is `alt` (not `on*`), so it is preserved with its full value. The `onload` handler is created by the string interpolation, not present in the original DOM.\n\n### PoC\n\nInput HTML:\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003ctitle\u003ePoC\u003c/title\u003e\n\u003cscript type=\"application/ld+json\"\u003e\n{\"@type\": \"Article\", \"text\": \"Long article text repeated many times to exceed the extracted content word count. Long article text repeated many times to exceed the extracted content word count. Long article text repeated many times to exceed the extracted content word count.\"}\n\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003carticle\u003e\u003cp\u003eShort.\u003c/p\u003e\u003c/article\u003e\n\u003cdiv class=\"post-container\"\u003e\n  \u003cp\u003eExtra text to inflate parent word count padding padding padding.\u003c/p\u003e\n  \u003cdiv class=\"post-body\"\u003e\n    Long article text repeated many times to exceed the extracted content word count. Long article text repeated many times to exceed the extracted content word count. Long article text repeated many times to exceed the extracted content word count.\n  \u003c/div\u003e\n  \u003cimg width=\"800\" height=\"600\" src=\"https://example.com/photo.jpg\" alt='pwned\" onload=\"alert(document.cookie)'\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\nOutput:\n\n```html\n\u003cimg src=\"https://example.com/photo.jpg\" alt=\"pwned\" onload=\"alert(document.cookie)\"\u003e\n```\n\nThe `onload` event handler is injected as a separate HTML attribute.\n\n### Impact\n\nXSS in any application that renders defuddle's HTML output (browser extensions, web clippers, reader modes). The attack requires crafted HTML with schema.org structured data that triggers the `_findContentBySchemaText` fallback, combined with a sibling image whose `alt` attribute contains a quote character followed by an event handler.\n\n### Suggested Fix\n\nUse DOM API instead of string interpolation:\n\n```typescript\nif (imageSrc) {\n    const img = this.doc.createElement('img');\n    img.setAttribute('src', imageSrc);\n    img.setAttribute('alt', imageAlt);\n    html += img.outerHTML;\n}\n```\n\nThis ensures attribute values are properly escaped by the DOM serializer.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2026-03-06T18:39:35.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":2.1,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N/E:P","references":["https://github.com/kepano/defuddle/security/advisories/GHSA-5mq8-78gm-pjmq","https://github.com/kepano/defuddle/commit/f154cb740ee603431b69638273af737a27156df9","https://nvd.nist.gov/vuln/detail/CVE-2026-30830","https://github.com/advisories/GHSA-5mq8-78gm-pjmq"],"source_kind":"github","identifiers":["GHSA-5mq8-78gm-pjmq","CVE-2026-30830"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-03-06T19:00:07.941Z","updated_at":"2026-05-19T02:02:54.208Z","epss_percentage":0.0002,"epss_percentile":0.05563,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01bXE4LTc4Z20tcGptcc4ABTR8","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS01bXE4LTc4Z20tcGptcc4ABTR8","packages":[{"ecosystem":"npm","package_name":"defuddle","versions":[{"first_patched_version":"0.9.0","vulnerable_version_range":"\u003c 0.9.0"}],"purl":"pkg:npm/defuddle"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01bXE4LTc4Z20tcGptcc4ABTR8/related_packages","related_advisories":[]}],"docker_usage_url":"https://docker.ecosyste.ms/usage/npm/defuddle","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/npm/defuddle","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/npm/defuddle/dependencies","status":null,"funding_links":["https://github.com/sponsors/kepano"],"critical":null,"issue_metadata":{"last_synced_at":"2026-05-09T14:01:56.757Z","issues_count":72,"pull_requests_count":87,"avg_time_to_close_issue":1700227.7142857143,"avg_time_to_close_pull_request":253756.5806451613,"issues_closed_count":28,"pull_requests_closed_count":62,"pull_request_authors_count":28,"issue_authors_count":59,"avg_comments_per_issue":0.4305555555555556,"avg_comments_per_pull_request":0.26436781609195403,"merged_pull_requests_count":50,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":54,"past_year_pull_requests_count":37,"past_year_avg_time_to_close_issue":1955781.5,"past_year_avg_time_to_close_pull_request":267638.54545454547,"past_year_issues_closed_count":20,"past_year_pull_requests_closed_count":22,"past_year_pull_request_authors_count":20,"past_year_issue_authors_count":45,"past_year_avg_comments_per_issue":0.25925925925925924,"past_year_avg_comments_per_pull_request":0.3783783783783784,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":14,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/kepano%2Fdefuddle/issues","maintainers":[{"login":"kepano","count":35,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/kepano"},{"login":"plutus-terminal","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/plutus-terminal"}],"active_maintainers":[{"login":"kepano","count":6,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/kepano"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/defuddle/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/defuddle/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/defuddle/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/defuddle/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/defuddle/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/defuddle/codemeta","maintainers":[{"uuid":"kepano","login":"kepano","name":null,"email":"stephan@lumi.com","url":null,"packages_count":3,"html_url":"https://www.npmjs.com/~kepano","role":null,"created_at":"2025-02-27T23:45:54.786Z","updated_at":"2025-02-27T23:45:54.786Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/maintainers/kepano/packages"}]}