{"id":13520302,"url":"https://github.com/grego/blades","last_synced_at":"2026-03-17T21:36:24.374Z","repository":{"id":44760236,"uuid":"303202456","full_name":"grego/blades","owner":"grego","description":"Blazing fast dead simple static site generator","archived":false,"fork":false,"pushed_at":"2025-01-14T10:42:02.000Z","size":134,"stargazers_count":344,"open_issues_count":5,"forks_count":17,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-12-01T18:58:14.903Z","etag":null,"topics":["generator","site"],"latest_commit_sha":null,"homepage":"https://www.getblades.org","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grego.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":["grego"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2020-10-11T20:02:05.000Z","updated_at":"2025-10-21T04:42:06.000Z","dependencies_parsed_at":"2023-12-28T10:45:12.551Z","dependency_job_id":"43828405-895e-49af-8db1-5d6f8e6e645d","html_url":"https://github.com/grego/blades","commit_stats":{"total_commits":56,"total_committers":2,"mean_commits":28.0,"dds":0.0714285714285714,"last_synced_commit":"0b092543399ad5a6a5faa01c4164698d51fb9d75"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/grego/blades","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grego%2Fblades","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grego%2Fblades/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grego%2Fblades/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grego%2Fblades/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grego","download_url":"https://codeload.github.com/grego/blades/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grego%2Fblades/sbom","scorecard":{"id":444993,"data":{"date":"2025-08-11","repo":{"name":"github.com/grego/blades","commit":"e5541822639f6ab43ce15e9ff198b4132fdd364c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 2/28 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":"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":-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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU 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":"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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.5.0 not signed: https://api.github.com/repos/grego/blades/releases/85662498","Warn: release artifact v0.4.1 not signed: https://api.github.com/repos/grego/blades/releases/79509513","Warn: release artifact v0.4.0 not signed: https://api.github.com/repos/grego/blades/releases/74295097","Warn: release artifact v0.3.1 not signed: https://api.github.com/repos/grego/blades/releases/68909394","Warn: release artifact v0.5.0 does not have provenance: https://api.github.com/repos/grego/blades/releases/85662498","Warn: release artifact v0.4.1 does not have provenance: https://api.github.com/repos/grego/blades/releases/79509513","Warn: release artifact v0.4.0 does not have provenance: https://api.github.com/repos/grego/blades/releases/74295097","Warn: release artifact v0.3.1 does not have provenance: https://api.github.com/repos/grego/blades/releases/68909394"],"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":10,"reason":"0 existing vulnerabilities detected","details":null,"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 4 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-19T06:29:41.293Z","repository_id":44760236,"created_at":"2025-08-19T06:29:41.293Z","updated_at":"2025-08-19T06:29:41.293Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30632060,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T17:32:55.572Z","status":"ssl_error","status_checked_at":"2026-03-17T17:32:38.732Z","response_time":56,"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":["generator","site"],"created_at":"2024-08-01T05:02:17.134Z","updated_at":"2026-03-17T21:36:24.325Z","avatar_url":"https://github.com/grego.png","language":"Rust","readme":"\u003cimg src=\"https://raw.githubusercontent.com/grego/blades/master/examples/assets/logo.svg?sanitize=true\" alt=\"Blades logo\" width=\"250\" align=\"right\"\u003e\n\n# Blades\n\n[![Crates.io status](https://badgen.net/crates/v/blades)](https://crates.io/crates/blades)\n[![Docs](https://docs.rs/blades/badge.svg)](https://docs.rs/blades)\n\n```\nblazing fast\n dead simple\n  static site generator\n```\n\n[User manual](http://www.getblades.org)\n\nBlades is made to do one job and do it well - generate HTML files from the provided\ncontent using the provided templates.  \nThanks to [zero-copy](https://serde.rs/lifetimes.html#borrowing-data-in-a-derived-impl) deserialization\nand the [Ramhorns](https://github.com/maciejhirsz/ramhorns) templating engine,\nit renders the whole site in milliseconds, possibly more than\n[20 times](https://github.com/grego/ssg-bench) faster than other generators like Hugo.\n\nIt's made for easy setup and use. A static site generator should be a no brainer.\nIt uses [mustache](https://mustache.github.io/mustache.5.html) templates with extremely minimal\nand obvious syntax (like 7 rules!), providing the necessary building blocks\nto let you focus on your content.\n\n## Features\n* Powerful plugin system\n* Themes\n* Image gallery generation\n* [CommonMark](https://commonmark.org) markdown with tables and footnotes for content\n* Rendering of LaTeX formulas into [MathML](https://developer.mozilla.org/docs/Web/MathML),\n  (supported by [all major browsers](https://caniuse.com/mathml)), with content between\n  `$` rendered in inline mode and content between `$$` rendered in display mode.\n* Syntax highlighting using [cmark-syntax](https://github.com/grego/cmark-syntax)\n* Customizable taxonomies (like categories or tags)\n* Pagination\n* Breadcrumbs\n* Asset colocation\n* Table of contents with access to all of the site data\n* Automatic sitemap, Atom and RSS feed generation\n\n## Why not _`blades`_?\nUnlike other monolithic generators, Blades is modest in scope. All it does is to generate a site.\nIt doesn't do any fancy stuff like transpiling Haskell to minified Javascript, or ever\nwatching the site for changes. For that, you can use a dedicated tool like\n[caretaker](https://github.com/grego/caretaker).\n\nNevertheless, if you have a feature request or ran into some issue using Blades, please submit an\n[issue](https://github.com/grego/blades). Any contribution is welcome! `:)`\n\n## Why _`blades`_?\nThey shave the [mustache](https://mustache.github.io/mustache.5.html) off.\n\n## Installing\nWith the Rust toolchain installed, you can install Blades from [crates.io](https://crates.io/crates/blades)\n```bash\ncargo install blades\n```\n\nOr from its repository\n```bash\ngit clone https://github.com/grego/blades\ncd blades\ncargo install --path .\n```\n\n## macOS\nUsing the package manager [Homebrew](https://www.brew.sh)\n```bash\nbrew install blades\n```\n\nUsing the package manager [MacPorts](https://www.macports.org)\n```bash\nsudo port install blades\n```\n\n## Running\nThen, you can run the executable `blades` with the following subcommands:\n* `init`: Initialize the site in the current directory, creating the basic files and folders\n* `build`: Build the site according to config, content, templates and themes in the current directory\n* `colocate`: Move the assets from the \"assets\" directory and from the theme, if one is used, into the output directory\n* `all`: Build the site and colocate the assets\n* `lazy`: Build the site and (colocate assets only if the theme was switched) [default]\n* `new`: Create a new page\n\n## Plugins\nThere are 4 types of plugins that can be used with Blades.\n* **input** - they put a JSON-serialised list of [pages](https://www.getblades.org/pages.html) on the standard output, can be used\n  to get pages from different sources\n* **output** - they receive a JSON-serialised list of [pages](https://www.getblades.org/pages.html) on the standard input and can be\n  used to generate further page data, such as processing images\n* **transform** - they receive a JSON-serialised list of [pages](https://www.getblades.org/pages.html) on the standard output and output\n  another such list on the standard output, can transform anything on the pages\n* **content** - they receive a markdown content of one page on standard input and output markdown on the standard output; they are enabled\n  on per-page basis\n\nAny code in any language can be used, as only using the standard input and output is assumed. For Rust, Blades also provides a\n[library](https://docs.rs/blades) for automatic serialisation and deserialisation pages.\n\n### Example\nExample plugin configuration can be found in [examples](examples/Blades.toml), as well as an\nexample toy [transform plugin](examples/transform_plugin.rs).\nTo try it, first build the plugin:\n```bash\ncargo build --release transform_plugin\n```\nThen run Blades in the `examples` directory:\n```bash\ncargo run --release\n```\n\nFor more on plugins, check their [documentation](https://www.getblades.org/making-plugins.html) and\n[existing plugins](https://www.getblades.org/plugins/)\n\n## Themes\nWhen you specify a theme in the [config](https://www.getblades.org/config.html), templates and assets from the theme are used.\nEvery site that doesn't use a theme can be used as a theme for another site.\nTherefore, the easiest way to use a theme is to just clone the corresponding theme's repository\ninto the `themes` directory. A list of available themes can be found [here](https://www.getblades.org/themes/).\n\nTo overwrite the theme, simply use the files in the `templates`, resp. `assets` subdirectories of the\npage root directory.\n\nWhen initializing a Blades project with `blades init`, it provides an option to start with\na minimal working template to allow you to quickly start working on your content.\n\n## Assets\nAll the files from the `assets` directory (and from the theme) are moved into the directory\nspecified in the [config](https://www.getblades.org/config.html), which is emptied before. This is a subdirectory of the\noutput directory (defaults to `assets`).\n\nBlades takes of the pages it rendered before and if some of them is deleted, the corresponding\nfiles in the output directory will be deleted, too. The other files in the output directory\nare left intact. This way, you can place anything in the output directory and (as long as its name\ndiffers from all the page names and it's not in the assets subdirectory), Blades won't touch it.\n\n## Meta\nBlades renders [sitemap](https://www.sitemaps.org) (into `sitemap.xml`), [Atom](https://en.wikipedia.org/wiki/Atom_(Web_standard)) (into `atom.xml`)\nand [RSS](https://en.wikipedia.org/wiki/RSS) (into `rss.xml`) feeds, unless explicitly disabled in the [config](https://www.getblades.org/config.html).\n\n## Using Blades as a library\nMain components of Blades are also exported as a library. They are parser agnostic, so they can be used\nto generate a website using any format that implements `serde::Deserialize`.\nCurrently, Cargo doesn't support binary-only dependencies. As such, these dependencies are behind\nthe `bin` feature gate, which is enabled by default. When using Blades as a library, they are not\nnecessary, so it is recommended to import blades with `default_features = false`.\n\n## Contribution\nIf you found a bug or would like to see some feature in Blades, you are the most welcome to submit an issue\nor a pull request! Likewise if you found something in this documentation not clear or imprecise.\n\n## License\nBlades is free software, and is released under the terms of the GNU General Public\nLicense version 3. See [LICENSE](LICENSE).\n","funding_links":["https://github.com/sponsors/grego"],"categories":["Rust","Libraries","库 Libraries"],"sub_categories":["Web programming","网络编程 Web programming"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrego%2Fblades","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrego%2Fblades","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrego%2Fblades/lists"}