{"id":20114670,"url":"https://github.com/sebastienrousseau/staticdatagen","last_synced_at":"2026-02-27T17:45:48.011Z","repository":{"id":259742369,"uuid":"879040390","full_name":"sebastienrousseau/staticdatagen","owner":"sebastienrousseau","description":"A Rust library for generating structured data files and metadata for static sites, including HTML, RSS feeds, sitemaps, and SEO-optimized meta tags.","archived":false,"fork":false,"pushed_at":"2025-05-05T00:29:14.000Z","size":2286,"stargazers_count":1,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-17T18:57:18.275Z","etag":null,"topics":["content-generation","static-site","staticdatagen","structured-data"],"latest_commit_sha":null,"homepage":"http://doc.staticdatagen.com/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sebastienrousseau.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/funding.yml","license":"LICENSE-APACHE","code_of_conduct":".github/CODE-OF-CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"sebastienrousseau","custom":"https://paypal.me/wwdseb"}},"created_at":"2024-10-26T19:53:41.000Z","updated_at":"2025-01-24T07:01:56.000Z","dependencies_parsed_at":"2024-11-13T08:21:56.801Z","dependency_job_id":"fdd59550-ab39-4499-95ff-4ad407633ba2","html_url":"https://github.com/sebastienrousseau/staticdatagen","commit_stats":null,"previous_names":["sebastienrousseau/staticdatagen"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/sebastienrousseau/staticdatagen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fstaticdatagen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fstaticdatagen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fstaticdatagen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fstaticdatagen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sebastienrousseau","download_url":"https://codeload.github.com/sebastienrousseau/staticdatagen/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fstaticdatagen/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272165137,"owners_count":24884649,"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-08-26T02:00:07.904Z","response_time":60,"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":["content-generation","static-site","staticdatagen","structured-data"],"created_at":"2024-11-13T18:31:12.648Z","updated_at":"2026-02-27T17:45:48.003Z","avatar_url":"https://github.com/sebastienrousseau.png","language":"Rust","funding_links":["https://github.com/sponsors/sebastienrousseau","https://paypal.me/wwdseb"],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable MD033 MD041 --\u003e\n\u003cimg src=\"https://kura.pro/staticdatagen/images/logos/staticdatagen.svg\"\nalt=\"StaticDataGen logo\" height=\"66\" align=\"right\" /\u003e\n\u003c!-- markdownlint-enable MD033 MD041 --\u003e\n\n# Static Data Gen\n\nA fast, secure, and comprehensive static site structured data generator library written in Rust.\n\n\u003c!-- markdownlint-disable MD033 MD041 --\u003e\n\u003ccenter\u003e\n\u003c!-- markdownlint-enable MD033 MD041 --\u003e\n\n[![Made With Love][made-with-rust]][08] [![MSRV][msrv-badge]][08] [![Crates.io][crates-badge]][03] [![lib.rs][libs-badge]][01] [![Docs.rs][docs-badge]][04] [![Codecov][codecov-badge]][06] [![Build Status][build-badge]][07] [![GitHub][github-badge]][09]\n\n• [Website][00] • [Documentation][04] • [Report Bug][02] • [Request Feature][02] • [Contributing Guidelines][05]\n\n\u003c!-- markdownlint-disable MD033 MD041 --\u003e\n\u003c/center\u003e\n\u003c!-- markdownlint-enable MD033 MD041 --\u003e\n\n## Overview 🚀\n\n`staticdatagen` is a robust Rust library that streamlines the generation of structured data and metadata for static sites. It provides a comprehensive suite of tools for creating HTML files, RSS feeds, sitemaps, and SEO-friendly metadata, with built-in security features and multi-language support.\n\n## Features ✨\n\n### Content Generation \u0026 Processing\n\n- **Markdown to HTML Conversion**\n  - Clean, semantic HTML output\n  - Syntax highlighting support\n  - Custom template integration\n  - Content minification\n\n- **Metadata Generation**\n  - OpenGraph and Twitter Card meta tags\n  - JSON-LD support for rich snippets\n  - Automatic metadata extraction\n  - SEO optimization\n\n### Site Structure \u0026 Navigation\n\n- **Navigation System**\n  - Automatic menu generation\n  - Hierarchical structure support\n  - Accessibility-compliant markup\n  - Customizable formatting\n\n- **Multi-language Support**\n  - Built-in support for English, French, and German\n  - Extensible translation system\n  - Language-specific templates\n  - i18n content management\n\n### Data Format Support\n\n- **Sitemaps**\n  - Standard XML sitemaps\n  - Google News sitemaps\n  - Automatic URL generation\n  - Change frequency tracking\n\n- **Feed Generation**\n  - RSS 2.0 support\n  - Atom feed generation\n  - Custom feed templates\n  - Auto-updating timestamps\n\n### Security \u0026 Validation\n\n- **Security Features**\n  - Path traversal prevention\n  - Input sanitization\n  - URL validation\n  - Security.txt generation (RFC 9116)\n\n- **Data Validation**\n  - Metadata verification\n  - URL structure checking\n  - Language code validation\n  - Content integrity checks\n\n### Developer Experience\n\n- **Error Handling**\n  - Comprehensive error types\n  - Detailed error messages\n  - Context-aware failures\n  - Recovery suggestions\n\n- **Performance**\n  - Efficient file processing\n  - HTML minification\n  - Parallel processing where possible\n  - Memory-efficient operations\n\n## Installation 📦\n\nAdd `staticdatagen` to your `Cargo.toml`:\n\n```toml\n[dependencies]\nstaticdatagen = \"0.0.6\"\n```\n\n## Directory Structure 📁\n\nCreate the following directory structure for your project:\n\n```bash\nyour-project/\n├── content/         # Your Markdown content\n├── templates/       # HTML templates\n├── build/          # Temporary build directory\n└── site/           # Final output directory\n```\n\n## Usage 💻\n\n### Basic Example\n\n```rust\nuse staticdatagen::compiler::service::compile;\nuse std::path::Path;\n\nfn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    // Define paths for your static site\n    let build_dir = Path::new(\"examples/build\");            // Temporary build directory\n    let content_dir = Path::new(\"examples/content\");        // Source content directory\n    let site_dir = Path::new(\"examples/site\");              // Output directory\n    let template_dir = Path::new(\"examples/templates\");     // HTML templates directory\n\n    // Compile the static site\n    compile(\n        build_dir,\n        content_dir,\n        site_dir,\n        template_dir,\n    )?;\n\n    Ok(())\n}\n```\n\n## Generated Files 📄\n\nThe library generates the following files:\n\n- **HTML Files**\n  - Minified and optimized\n  - Accessibility-compliant\n  - SEO-friendly structure\n\n- **Metadata Files**\n  - `security.txt` - Security policy (RFC 9116)\n  - `humans.txt` - Site credits and information\n  - `robots.txt` - Crawler instructions\n  - `manifest.json` - PWA manifest\n\n- **SEO Files**\n  - `sitemap.xml` - Standard sitemap\n  - `news-sitemap.xml` - Google News sitemap\n  - `rss.xml` - Content syndication feed\n\n## Error Handling 🛠️\n\nThe library uses the `anyhow` crate for error handling, providing detailed error messages and context. All public functions return `Result` types with comprehensive error information:\n\n```rust\nuse anyhow::Result;\n\nfn main() -\u003e Result\u003c()\u003e {\n    // Your code here\n    Ok(())\n}\n```\n\n## Performance 🚀\n\n- **File Processing**: Efficient streaming for large files\n- **Minification**: Optimized HTML output\n- **Caching**: Template and content caching\n- **Memory Usage**: Minimal memory footprint\n\n## Documentation 📚\n\nFor full API documentation, please visit [docs.rs/staticdatagen][04].\n\n## Examples 🎯\n\nTo explore more examples, clone the repository and run the following command:\n\n```shell\ncargo run --example example_name\n```\n\n## Contributing 🤝\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License 📜\n\nThis project is licensed under either of\n\n- [Apache License, Version 2.0][10]\n- [MIT license][11]\n\nat your option.\n\n## Acknowledgements 💝\n\nSpecial thanks to all contributors who have helped build the `staticdatagen` library.\n\n[00]: https://staticdatagen.com\n[01]: https://lib.rs/crates/staticdatagen\n[02]: https://github.com/sebastienrousseau/staticdatagen/issues\n[03]: https://crates.io/crates/staticdatagen\n[04]: https://docs.rs/staticdatagen\n[05]: https://github.com/sebastienrousseau/staticdatagen/blob/main/CONTRIBUTING.md\n[06]: https://codecov.io/gh/sebastienrousseau/staticdatagen\n[07]: https://github.com/sebastienrousseau/staticdatagen/actions?query=branch%3Amain\n[08]: https://www.rust-lang.org/\n[09]: https://github.com/sebastienrousseau/staticdatagen\n[10]: https://www.apache.org/licenses/LICENSE-2.0\n[11]: https://opensource.org/licenses/MIT\n\n[build-badge]: https://img.shields.io/github/actions/workflow/status/sebastienrousseau/staticdatagen/release.yml?branch=main\u0026style=for-the-badge\u0026logo=github\n[codecov-badge]: https://img.shields.io/codecov/c/github/sebastienrousseau/staticdatagen?style=for-the-badge\u0026token=yGOBUANPm3\u0026logo=codecov\n[crates-badge]: https://img.shields.io/crates/v/staticdatagen.svg?style=for-the-badge\u0026color=fc8d62\u0026logo=rust\n[docs-badge]: https://img.shields.io/badge/docs.rs-staticdatagen-66c2a5?style=for-the-badge\u0026labelColor=555555\u0026logo=docs.rs\n[github-badge]: https://img.shields.io/badge/github-sebastienrousseau/staticdatagen-8da0cb?style=for-the-badge\u0026labelColor=555555\u0026logo=github\n[libs-badge]: https://img.shields.io/badge/lib.rs-v0.0.6-orange.svg?style=for-the-badge\n[made-with-rust]: https://img.shields.io/badge/rust-f04041?style=for-the-badge\u0026labelColor=c0282d\u0026logo=rust\n[msrv-badge]: https://img.shields.io/badge/MSRV-1.58.0-blue.svg?style=for-the-badge\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebastienrousseau%2Fstaticdatagen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsebastienrousseau%2Fstaticdatagen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebastienrousseau%2Fstaticdatagen/lists"}