{"id":19614314,"url":"https://github.com/fpapado/metalsmith-inline-critical-css","last_synced_at":"2026-05-04T12:33:02.669Z","repository":{"id":33273730,"uuid":"157190103","full_name":"fpapado/metalsmith-inline-critical-css","owner":"fpapado","description":"      A Metalsmith plugin to inspect HTML files, inline used selectors from specified CSS, and load the rest asynchronously.","archived":false,"fork":false,"pushed_at":"2023-01-04T21:38:37.000Z","size":1074,"stargazers_count":1,"open_issues_count":13,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-04T19:53:05.624Z","etag":null,"topics":["critical","css","inline","loadcss","metalsmith","preload"],"latest_commit_sha":null,"homepage":"http://npm.im/metalsmith-inline-critical-css","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fpapado.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-11-12T09:41:47.000Z","updated_at":"2020-02-19T14:31:12.000Z","dependencies_parsed_at":"2023-01-15T00:16:41.322Z","dependency_job_id":null,"html_url":"https://github.com/fpapado/metalsmith-inline-critical-css","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/fpapado/metalsmith-inline-critical-css","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fpapado%2Fmetalsmith-inline-critical-css","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fpapado%2Fmetalsmith-inline-critical-css/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fpapado%2Fmetalsmith-inline-critical-css/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fpapado%2Fmetalsmith-inline-critical-css/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fpapado","download_url":"https://codeload.github.com/fpapado/metalsmith-inline-critical-css/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fpapado%2Fmetalsmith-inline-critical-css/sbom","scorecard":{"id":408409,"data":{"date":"2025-08-11","repo":{"name":"github.com/fpapado/metalsmith-inline-critical-css","commit":"3e81b50f0e24390953164f57b3c63fdcf260864a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.3,"checks":[{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"Code-Review","score":0,"reason":"Found 0/18 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":"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":"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":-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":"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":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"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":"Vulnerabilities","score":0,"reason":"42 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-6chw-6frg-f759","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","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-p28h-cc7q-c4fg","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"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-18T21:58:56.505Z","repository_id":33273730,"created_at":"2025-08-18T21:58:56.505Z","updated_at":"2025-08-18T21:58:56.505Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32607512,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: 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":["critical","css","inline","loadcss","metalsmith","preload"],"created_at":"2024-11-11T10:51:04.217Z","updated_at":"2026-05-04T12:33:02.652Z","avatar_url":"https://github.com/fpapado.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# metalsmith-inline-critical-css\n\n\u003e A Metalsmith plugin to inspect HTML files, inline used selectors from specified CSS, and load the rest asynchronously.\n\n[![npm](https://badgen.net/npm/v/metalsmith-inline-critical-css)](https://www.npmjs.com/package/metalsmith-inline-critical-css)\n[![npm downloads](https://badgen.net/npm/dm/metalsmith-inline-critical-css)](https://www.npmjs.com/package/metalsmith-inline-critical-css)\n[![dependencies](https://badgen.net/david/dep/fpapado/metalsmith-inline-critical-css)](https://david-dm.org/fpapado/metalsmith-inline-critical-css)\n\n## Motivation\n\nWhen the browser encounters a `\u003clink rel=\"stylesheet\"\u003e` in the `\u003chead\u003e`, it pauses, goes to the network, fetches the file, and only then continues.\nThis is called \"render blocking\".\nIf it sounds bad for performance, it's because it is!\nThis is especially true for slower networks where the latency alone can add seconds to the request.\n\nTo combat this, you can \"inline\" the used or critical CSS for a page as a `\u003cstyle\u003e` tag.\nYou then load the rest asynchronously.\nTo do that, you link the stylesheet as `\u003clink rel=\"preload\"\u003e`, which decouples downloading from execution, and allows the browser to continue.\nOnce the stylesheet has loaded, it is \"swapped in\".\nTo account for browsers that do not support `rel=\"preload\"`, we use the excellent [LoadCSS relpreload.js](https://github.com/filamentgroup/loadcss).\n\nInlining the critical CSS for a page is one of the most important optimisations you can do to make your site paint faster!\n\n## Quick start\n\nThis package is distributed via [npm](https://www.npmjs.com/get-npm).\n\n```shell\n$ npm install --save metalsmith-inline-critical-css\n# or\n$ yarn add metalsmith-inline-critical-css\n```\n\nThen you can use the plugin in your metalsmith pipeline:\n\n```js\nconst fs = require('fs');\nconst path = require('path');\nconst metalsmith = require('metalsmith');\nconst criticalCss = require('metalsmith-inline-critical-css');\n\n// Set these as you want for your application\nconst INPUT_DIR = '_site/';\nconst OUTPUT_DIR = '_site/';\n\nfunction main() {\n  // Run metalsmith pipeline\n  metalsmith(process.cwd())\n    .source(INPUT_DIR) // source directory\n    .destination(OUTPUT_DIR) // destination directory\n    .clean(false) // clean destination before\n    .use(\n      criticalCss({\n        // Files to run against\n        pattern: '**/*.html',\n        // The CSS file whose selectors will be matched against the html\n        cssFile: path.join(INPUT_DIR, hashedCssFilename),\n        // The path under which the css is included in the template files\n        cssPublicPath: hashedCssFilename,\n      })\n    )\n    .build(function(err) {\n      if (err) {\n        console.log('Error running the metalsmith pipeline: ' + err);\n        throw err;\n      }\n      console.log('Done!');\n    });\n}\n\nmain();\n```\n\n## Options\n\n```ts\ninterface IOptions {\n  /** A multimatch pattern of files to run on. */\n  pattern: string;\n\n  /** The name of the css file in the metalsmith data. */\n  cssFile: string;\n\n  /**\n   * The path under which the css is included in the template.\n   * Important for knowing which \u003clink\u003e tag to replace.\n   */\n  cssPublicPath: string;\n}\n```\n\n## Credits, Thanks, Inspiration\n\nThanks to Filament Group for their work on Load CSS!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffpapado%2Fmetalsmith-inline-critical-css","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffpapado%2Fmetalsmith-inline-critical-css","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffpapado%2Fmetalsmith-inline-critical-css/lists"}