{"id":13602692,"url":"https://github.com/electron/hubdown","last_synced_at":"2025-10-01T12:31:10.718Z","repository":{"id":25697266,"uuid":"104969250","full_name":"electron/hubdown","owner":"electron","description":"Convert markdown to GitHub-style HTML using a common set of remark plugins","archived":true,"fork":false,"pushed_at":"2023-02-04T06:53:39.000Z","size":510,"stargazers_count":40,"open_issues_count":0,"forks_count":12,"subscribers_count":40,"default_branch":"master","last_synced_at":"2025-08-25T01:44:45.074Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/electron.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":".github/CODEOWNERS","security":null,"support":null}},"created_at":"2017-09-27T03:47:49.000Z","updated_at":"2025-02-11T21:45:10.000Z","dependencies_parsed_at":"2023-02-19T19:35:16.351Z","dependency_job_id":null,"html_url":"https://github.com/electron/hubdown","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/electron/hubdown","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Fhubdown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Fhubdown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Fhubdown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Fhubdown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/electron","download_url":"https://codeload.github.com/electron/hubdown/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Fhubdown/sbom","scorecard":{"id":372011,"data":{"date":"2025-08-11","repo":{"name":"github.com/electron/hubdown","commit":"de958a02f17b46f1e1e2133d7c61af40ce6475b6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"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":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"Code-Review","score":5,"reason":"Found 3/6 approved changesets -- score normalized to 5","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":"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"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":-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":-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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 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":"17 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-4q6p-r6v2-jvc5","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7"],"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-18T13:11:43.426Z","repository_id":25697266,"created_at":"2025-08-18T13:11:43.426Z","updated_at":"2025-08-18T13:11:43.426Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276177254,"owners_count":25598184,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"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"}},"keywords":[],"created_at":"2024-08-01T18:01:33.972Z","updated_at":"2025-10-01T12:31:10.479Z","avatar_url":"https://github.com/electron.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# hubdown\n\n[![CircleCI build status](https://circleci.com/gh/electron/hubdown/tree/master.svg?style=svg)](https://circleci.com/gh/electron/hubdown/tree/master)\n\n\u003e Convert markdown to GitHub-style HTML using a common set of [remark] and [rehype] plugins\n\nUsed by [electron/i18n](https://github.com/electron/i18n)\nand [electronjs.org](https://github.com/electron/electronjs.org).\n\n[unified] processes content with syntax trees and transforms between different formats.\n[remark] and [rehype] are its markdown and HTML ecosystems.\nWe use this because its performant and has a large collection of plugins.\nPrimarily, unlike some other node markdown parsers that provide syntax highlighting\ncapabilities, unified does not have any native C++ dependencies. This makes\nit easier to install and reduces the likelihood of system-dependent installation\nfailures.\n\n## Plugins\n\nThe following [remark] and [rehype] plugins are used by hubdown:\n\n- [remark-parse](http://ghub.io/remark-parse) parses markdown\n- [remark-gemoji-to-emoji](http://ghub.io/remark-gemoji-to-emoji) transforms gemoji shortcodes to emoji\n- [remark-rehype](http://ghub.io/remark-rehype) transforms markdown to HTML\n- [rehype-slug](http://ghub.io/rehype-slug) adds DOM ids to headings\n- [rehype-autolink-headings](http://ghub.io/rehype-autolink-headings) turns headings into links\n- [rehype-highlight.js](http://ghub.io/rehype-highlight) applies syntax highlighting to code blocks using highlight.js (supports the [default languages](https://github.com/highlightjs/highlight.js/blob/master/SUPPORTED_LANGUAGES.md) as well as [GraphQL](https://github.com/dpeek/highlightjs-graphql))\n- [rehype-stringify](http://ghub.io/rehype-stringify) stringifies HTML\n\n## Installation\n\n```sh\nnpm install hubdown --save\n```\n\n## Usage\n\nhubdown exports a single function that returns a promise:\n\n```js\nconst hubdown = require('hubdown')\n\nhubdown('I am markdown').then(doc =\u003e {\n  console.log(doc)\n})\n```\n\nThe resolved promise yields an object with a `content` property\ncontaining the parsed HTML:\n\n```js\n{\n  content: '\u003cp\u003eI am markdown\u003c/p\u003e'\n}\n```\n\n## Usage with Cache\n\nhubdown's `remark` markdown parser is pretty fast, but things can start to slow\ndown when you're processing hundreds or thousands of files. To make life easier\nin these situations you can use hubdown's optional cache, which stores\npreprocessed markdown for fast retrieval on subsequent runs.\n\nTo use the cache, bring your own [level](https://ghub.io/level) instance and\nsupply it as an option to hubdown. This helps keep hubdown lean on (native)\ndependencies for users who don't need the cache.\n\n```js\nconst hubdown = require('hubdown')\nconst cache = require('level')('./my-hubdown-cache')\n\nhubdown('I will be cached.', { cache }).then(doc =\u003e {\n  console.log(doc)\n})\n```\n\n## API\n\n### `hubdown(markdownString[, options])`\n\nArguments:\n\n- `markdownString` String - (required)\n- `options` Object - (optional)\n  - `runBefore` Array of [remark] plugins - Custom plugins to be run before the commonly used plugins listed [above](#plugins).\n  - `frontmatter` Boolean - Whether or not to try to parse [YML frontmatter] in\n    the file. Defaults to `false`.\n  - `cache` [LevelDB](https://ghub.io/level) - An optional `level` instance in which\n    to store preprocessed content. See [Usage with Cache](#usage-with-cache).\n  - `highlight` - Object of [rehype-highlight](https://github.com/rehypejs/rehype-highlighthighlight#options) options.\n\nReturns a promise. The resolved object looks like this:\n\n```js\n{\n  content: 'HTML goes here'\n}\n```\n\nIf [YML frontmatter] is parsed, those properties will be present on the object too:\n\n```js\n{\n  title: 'The Feminine Mystique',\n  author: 'Betty Friedan',\n  content: '\u003cp\u003eThe Feminine Mystique is a book written by Betty Friedan which is widely credited with sparking the  beginning of second-wave feminism in the United States.\u003c/p\u003e'\n}\n```\n\n## Tests\n\n```sh\nnpm install\nnpm test\n```\n\n## License\n\nMIT\n\n[unified]: http://ghub.io/unified\n[remark]: http://ghub.io/remark\n[rehype]: http://ghub.io/rehype\n[YML frontmatter]: https://jekyllrb.com/docs/frontmatter\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felectron%2Fhubdown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felectron%2Fhubdown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felectron%2Fhubdown/lists"}