{"id":13879782,"url":"https://github.com/boazsegev/plezi","last_synced_at":"2026-03-17T22:04:18.461Z","repository":{"id":21503958,"uuid":"24822943","full_name":"boazsegev/plezi","owner":"boazsegev","description":"Plezi - the Ruby framework for realtime web-apps, websockets and RESTful HTTP","archived":false,"fork":false,"pushed_at":"2020-10-09T20:23:14.000Z","size":1895,"stargazers_count":242,"open_issues_count":3,"forks_count":8,"subscribers_count":8,"default_branch":"master","last_synced_at":"2026-01-02T09:26:20.908Z","etag":null,"topics":["framework","rack","real-time","rest-api","ruby","scale","websockets"],"latest_commit_sha":null,"homepage":"www.plezi.io","language":"Ruby","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/boazsegev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-10-05T18:35:38.000Z","updated_at":"2025-12-03T07:26:17.000Z","dependencies_parsed_at":"2022-08-21T00:50:52.720Z","dependency_job_id":null,"html_url":"https://github.com/boazsegev/plezi","commit_stats":null,"previous_names":["boazsegev/anorexic"],"tags_count":115,"template":false,"template_full_name":null,"purl":"pkg:github/boazsegev/plezi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boazsegev%2Fplezi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boazsegev%2Fplezi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boazsegev%2Fplezi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boazsegev%2Fplezi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/boazsegev","download_url":"https://codeload.github.com/boazsegev/plezi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boazsegev%2Fplezi/sbom","scorecard":{"id":246209,"data":{"date":"2025-08-11","repo":{"name":"github.com/boazsegev/plezi","commit":"a40459d4af0f83172d5bdeda0a9c05cf46792435"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":"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":"Code-Review","score":0,"reason":"Found 1/21 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":"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":"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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt: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 11 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-17T07:39:22.182Z","repository_id":21503958,"created_at":"2025-08-17T07:39:22.183Z","updated_at":"2025-08-17T07:39:22.183Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30633240,"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":["framework","rack","real-time","rest-api","ruby","scale","websockets"],"created_at":"2024-08-06T08:02:32.989Z","updated_at":"2026-03-17T22:04:18.445Z","avatar_url":"https://github.com/boazsegev.png","language":"Ruby","funding_links":[],"categories":["Ruby","Frameworks"],"sub_categories":[],"readme":"# Plezi - a real-time web application framework for Ruby\n\n[![Gem Version](https://badge.fury.io/rb/plezi.svg)](https://badge.fury.io/rb/plezi)\n[![Inline docs](http://inch-ci.org/github/boazsegev/plezi.svg?branch=master)](http://www.rubydoc.info/github/boazsegev/plezi/master/frames)\n[![GitHub](https://img.shields.io/badge/GitHub-Open%20Source-blue.svg)](https://github.com/boazsegev/plezi)\n\n\u003e **Note**: at this point, [plezi.io](http://www.plezi.io) is mostly a wrapper around the [iodine Ruby server](https://github.com/boazsegev/iodine). Use iodine directly if possible.\n\nAre microservices on your mind? Do you dream of a an SPA that's easy to scale? Did you wonder if you could write a whole Websockets, RESTful AJAX back-end with just a few lines of code (business logic not included)?\n\nWelcome to your new home with [plezi.io](http://www.plezi.io), the Ruby real-time framework that assumes the business logic is *seperate* from the web service logic.\n\n## Short and Sweet\n\nWhat if your next Pub/Sub application could be as easy as:\n\n```ruby\nrequire 'plezi'\nclass MyChatroom\n  # HTTP\n  def index\n    render :index\n  end\n  def on_open\n    subscribe channel: :chat\n    @name = ::ERB::Util.h(params[:nickname] || \"anonymous\")\n    publish channel: :chat, message: \"#{@name} joined the chat.\"\n  end\n  def on_message data\n    publish channel: :chat, message: \"#{@name}: #{::ERB::Util.h data}\"\n  end\n  def on_shutdown\n    write \"Server is going away. Come back again some other time, #{@name}.\"\n  end\nend\n\nPlezi.route '/(:nickname)', MyChatroom\n```\n\n## What does Plezi have to offer?\n\nPlezi is a Rack based framework with support for native (server side implemented) Websockets.\n\nPlezi will provide the following features over plain Rack:\n\n* Object Oriented (M)VC design, BYO (Bring Your Own) models.\n\n* A case sensitive RESTful router to map HTTP requests to your Controllers.\n\n    Non-RESTful public Controller methods will be automatically published as valid HTTP routes, allowing the Controller to feel like an intuitive \"virtual folder\" with RESTful features.\n\n* Raw Websocket connections.\n\n    Websocket connections are now route specific, routing the websocket callbacks to the Controller that \"owns\" the route.\n\n* Auto-Dispatch (optional) to automatically map JSON websocket \"events\" to Controller functions (handlers).\n\n* Native Pub/Sub provided by [Iodine](https://github.com/boazsegev/iodine).\n\n* Automatic (optional) scaling using Redis.\n\n* An extensible template rendering abstraction engine, supports Slim, Markdown (using RedCarpet) and ERB out of the box.\n\n* Belated, extensible, asset baking (optional fallback for when the application's assets weren't baked before deployment).\n\n    It's possible to define an asset route (this isn't the default) to bake assets on the fly.\n\n    In production mode, assets will be baked directly to the public folder supplied to Iodine (the web server) with a matching path. This allows the static file server to serve future requests.\n\n    However, during development, baking will save the files to the asset's folder, so that the Ruby layer will be the one serving the content and dynamic updates could be supported.\n\nThings Plezi **doesn't** do (anymore / ever):\n\n* No DSL. Plezi won't clutter the global namespace.\n\n* No application logic inside.\n\n    Conneting your application logic to Plezi is easy, however, application logic should really be *independent*, **reusable** and secure. There are plenty of gems that support independent application logic authoring.\n\n* No native session support. If you *must* have session support, Rack middleware gems provide a lot of options. Pick one... However...\n\n    Session have been proved over and over to be insecure and resource draining.\n\n    Why use a session when you can save server resources and add security by using a persistent connection, i.e. a Websocket? If you really feel like storing unimportant stuff, why not use javascript's `local storage` on the *client's* machine? (if you need to save important stuff, you probably shouldn't be using sessions anyway).\n\n* No code refresh / development mode. If you want to restart the application automatically whenever you update the code, there are probably plenty of gems that will take care of that.\n\nDo notice, Websockets require Iodine (the server), since (currently) it's the only Ruby server known to support native Websockets using a Websocket Callback Object.\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'plezi'\n```\n\nAnd then execute:\n\n    $ bundle\n\nOr install it yourself as:\n\n    $ gem install plezi\n\n## Usage\n\nA new application (default applications include a simple chatroom demo):\n\n     $  plezi new app_name\n\nA simple hello world from `irb`:\n\n```ruby\nrequire 'plezi'\n\nclass HelloWorld\n  def index\n    \"Hello World!\"\n  end\nend\n\nPlezi.route '*', HelloWorld\n\nexit # \u003c= if running from terminal, this will start the server\n```\n\n## Documentation\n\nPlezi is fairly well documented.\n\nDocumentation is available both in the forms of tutorials and explanations available on the [plezi.io website](http://www.plezi.io) as well as through [the YARD documentation](http://www.rubydoc.info/gems/plezi).\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/boazsegev/plezi.\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboazsegev%2Fplezi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fboazsegev%2Fplezi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboazsegev%2Fplezi/lists"}