{"id":13393188,"url":"https://github.com/kemalcr/kemal","last_synced_at":"2026-04-13T12:02:20.642Z","repository":{"id":37884389,"uuid":"44826364","full_name":"kemalcr/kemal","owner":"kemalcr","description":"Fast, Effective, Simple Web Framework","archived":false,"fork":false,"pushed_at":"2026-04-10T20:11:51.000Z","size":869,"stargazers_count":3843,"open_issues_count":3,"forks_count":194,"subscribers_count":70,"default_branch":"master","last_synced_at":"2026-04-10T20:15:44.607Z","etag":null,"topics":["api","crystal","efficient","fast","json","kemal","rest","simple","web-framework","websocket"],"latest_commit_sha":null,"homepage":"https://kemalcr.com","language":"Crystal","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/kemalcr.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"sdogruyol","patreon":"sdogruyol","open_collective":null,"ko_fi":null,"tidelift":null,"custom":null}},"created_at":"2015-10-23T16:56:29.000Z","updated_at":"2026-04-10T06:15:52.000Z","dependencies_parsed_at":"2024-11-08T22:27:58.726Z","dependency_job_id":"f4501937-c185-4dfb-aeb3-abac744ce9ba","html_url":"https://github.com/kemalcr/kemal","commit_stats":{"total_commits":701,"total_committers":85,"mean_commits":8.247058823529411,"dds":0.3751783166904422,"last_synced_commit":"75d5ef10465f1d42e232d0454ff926cf004e3d4f"},"previous_names":["sdogruyol/kemal"],"tags_count":63,"template":false,"template_full_name":null,"purl":"pkg:github/kemalcr/kemal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kemalcr%2Fkemal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kemalcr%2Fkemal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kemalcr%2Fkemal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kemalcr%2Fkemal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kemalcr","download_url":"https://codeload.github.com/kemalcr/kemal/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kemalcr%2Fkemal/sbom","scorecard":{"id":554604,"data":{"date":"2025-08-11","repo":{"name":"github.com/kemalcr/kemal","commit":"e684d2ec9fac727bf63865c738d6db7529a6924c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.6,"checks":[{"name":"Code-Review","score":3,"reason":"Found 11/30 approved changesets -- score normalized to 3","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":10,"reason":"no dangerous workflow patterns detected","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":9,"reason":"8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"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":"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":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/kemalcr/kemal/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/kemalcr/kemal/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/kemalcr/kemal/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/kemalcr/kemal/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/kemalcr/kemal/ci.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"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":"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":"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":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":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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 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-20T11:59:35.229Z","repository_id":37884389,"created_at":"2025-08-20T11:59:35.229Z","updated_at":"2025-08-20T11:59:35.229Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31751707,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["api","crystal","efficient","fast","json","kemal","rest","simple","web-framework","websocket"],"created_at":"2024-07-30T17:00:45.469Z","updated_at":"2026-04-13T12:02:20.632Z","avatar_url":"https://github.com/kemalcr.png","language":"Crystal","funding_links":["https://github.com/sponsors/sdogruyol","https://patreon.com/sdogruyol"],"categories":["Crystal","Web Frameworks","\u003ca name=\"Crystal\"\u003e\u003c/a\u003eCrystal"],"sub_categories":[],"readme":"[![Kemal](https://avatars3.githubusercontent.com/u/15321198?v=3\u0026s=200)](http://kemalcr.com)\n\n# Kemal\n\nKemal is the Fast, Effective, Simple Web Framework for Crystal. It's perfect for building Web Applications and APIs with minimal code.\n\n[![CI](https://github.com/kemalcr/kemal/actions/workflows/ci.yml/badge.svg)](https://github.com/kemalcr/kemal/actions/workflows/ci.yml)\n\n## Why Kemal?\n\n- 🚀 **Lightning Fast**: Built on Crystal, known for C-like performance\n- 💡 **Super Simple**: Minimal code needed to get started\n- 🛠 **Feature Rich**: Everything you need for modern web development\n- 🔧 **Flexible**: Easy to extend with middleware support\n\n## Quick Start\n\n1. First, make sure you have [Crystal installed](https://crystal-lang.org/install/).\n\n2. Create a new Crystal application and step into it:\n\n```bash\ncrystal init app my-kemal-app\ncd my-kemal-app\n```\n\n3. Add Kemal to your app's `shard.yml`:\n\n```yaml\ndependencies:\n  kemal:\n    github: kemalcr/kemal\n```\n\n4. Replace the contents of `src/my_kemal_app.cr` with your first Kemal app:\n\n```crystal\nrequire \"kemal\"\n\n# Basic route - responds to GET \"http://localhost:3000/\"\nget \"/\" do\n  \"Hello World!\"\nend\n\n# JSON API example\nget \"/api/status\" do |env|\n  env.response.content_type = \"application/json\"\n  {\"status\": \"ok\"}.to_json\nend\n\n# WebSocket support\nws \"/chat\" do |socket|\n  socket.send \"Hello from Kemal WebSocket!\"\nend\n\nKemal.run\n```\n\n5. Install dependencies and run your application:\n\n```bash\nshards install\ncrystal run src/my_kemal_app.cr\n```\n\n6. Visit [http://localhost:3000](http://localhost:3000) - That's it! 🎉\n\n## Key Features\n\n- 🚀 **High-performance by default**: Built on Crystal with a thin abstraction layer so you can serve a large number of requests with low latency and low memory footprint.\n- 🌐 **Full REST \u0026 HTTP support**: Handle all HTTP verbs (GET, POST, PUT, PATCH, DELETE, etc.) with a straightforward routing DSL.\n- 🔌 **WebSocket \u0026 real-time**: First-class WebSocket support for building chats, dashboards and other real-time experiences.\n- 📦 **JSON-first APIs**: Native JSON handling makes building JSON APIs and microservices feel natural.\n- 🗄️ **Static assets made easy**: Serve static files (assets, uploads, SPA bundles) efficiently from the same application.\n- 📝 **Template engine included**: Built-in ECR template engine for server‑rendered HTML when you need it.\n- 🔒 **Composable middleware**: Flexible middleware system to add logging, auth, rate limiting, metrics and more.\n- 🎯 **Ergonomic request/response API**: Simple access to params, headers, cookies and bodies via a clear context object.\n- 🍪 **Session management**: Easy session handling with [kemal-session](https://github.com/kemalcr/kemal-session), suitable for production apps.\n\n## Philosophy\n\nKemal aims to be a simple, fast and reliable foundation for building production-grade web applications and APIs in Crystal.\n\n- **Simple core, powerful building blocks**: The core is intentionally simple and easy to reason about. Most power comes from Crystal itself and from middleware, not from hidden magic.\n- **Performance as a baseline, not a feature**: Crystal's native speed means high performance is the default. Kemal keeps abstractions thin so you stay close to the metal when you need to.\n- **Minimal assumptions, maximum flexibility**: Kemal does not force a specific ORM, template engine, or project layout. You are free to choose the tools that fit your application and your team.\n- **Batteries within reason**: Kemal ships with the essentials (routing, middleware, templates, static files, request/response helpers) while keeping advanced concerns in separate shards you can opt into as your app grows.\n\nKemal is designed to feel familiar if you come from popular web frameworks, while embracing Crystal's strengths and keeping your application code straightforward, maintainable, and ready for production.\n\n## Learning Resources\n\n- 📚 [Official Documentation](http://kemalcr.com)\n- 💻 [Example Applications](https://github.com/kemalcr/kemal/tree/master/examples)\n- 🚀 [Kemal Guide](http://kemalcr.com/guide/)\n- 💻 [Kemal By Example](https://github.com/sdogruyol/kemal-by-example)\n- 💬 [Community Chat](https://discord.gg/prSVAZJEpz)\n\n\n## Contributing\n\nWe love contributions! Please read our [Contributing Guide](CONTRIBUTING.md) to get started.\n\n## Acknowledgments\n\nSpecial thanks to Manas for their work on [Frank](https://github.com/manastech/frank).\n\n## License\n\nKemal is released under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkemalcr%2Fkemal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkemalcr%2Fkemal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkemalcr%2Fkemal/lists"}