{"id":13825119,"url":"https://github.com/mojolicious/mojo","last_synced_at":"2026-03-17T16:08:48.840Z","repository":{"id":443353,"uuid":"65646","full_name":"mojolicious/mojo","owner":"mojolicious","description":":sparkles: Mojolicious - Perl real-time web framework","archived":false,"fork":false,"pushed_at":"2025-12-09T10:30:10.000Z","size":30363,"stargazers_count":2720,"open_issues_count":114,"forks_count":587,"subscribers_count":211,"default_branch":"main","last_synced_at":"2025-12-20T11:06:32.701Z","etag":null,"topics":["cloud-native","event-loop","html","http","json","mojolicious","mvc","perl","user-agent","web-framework","web-server","websocket"],"latest_commit_sha":null,"homepage":"https://mojolicious.org","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"artistic-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mojolicious.png","metadata":{"files":{"readme":"README.md","changelog":"Changes","contributing":".github/CONTRIBUTING.md","funding":null,"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":"Please read the guide for [contributing to Mojolicious](http://mojolicious.org/perldoc/Mojolicious/Guides/Contributing)."},"created_at":"2008-10-21T07:50:26.000Z","updated_at":"2025-12-19T18:47:29.000Z","dependencies_parsed_at":"2023-11-29T00:35:29.059Z","dependency_job_id":"a4b2abd3-115a-4d13-be54-23d58836bf47","html_url":"https://github.com/mojolicious/mojo","commit_stats":{"total_commits":12520,"total_committers":194,"mean_commits":64.5360824742268,"dds":0.2916932907348243,"last_synced_commit":"dde462b8525815276ca7bd7831e73ebbd92c0316"},"previous_names":["kraih/mojo"],"tags_count":751,"template":false,"template_full_name":null,"purl":"pkg:github/mojolicious/mojo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mojolicious%2Fmojo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mojolicious%2Fmojo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mojolicious%2Fmojo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mojolicious%2Fmojo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mojolicious","download_url":"https://codeload.github.com/mojolicious/mojo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mojolicious%2Fmojo/sbom","scorecard":{"id":657324,"data":{"date":"2025-08-11","repo":{"name":"github.com/mojolicious/mojo","commit":"990d344ef855b3a6c2e9449ae54bba2a85bf4fb0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.2,"checks":[{"name":"Maintained","score":10,"reason":"16 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":4,"reason":"Found 9/19 approved changesets -- score normalized to 4","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":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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/linux.yml:1","Warn: no topLevel permission defined: .github/workflows/macos.yml:1","Warn: no topLevel permission defined: .github/workflows/perltidy.yml:1","Warn: no topLevel permission defined: .github/workflows/rebuild-website.yml:1","Warn: no topLevel permission defined: .github/workflows/windows.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":"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":"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: Artistic License 2.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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linux.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/mojolicious/mojo/linux.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/macos.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/mojolicious/mojo/macos.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/perltidy.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/mojolicious/mojo/perltidy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/windows.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mojolicious/mojo/windows.yml/main?enable=pin","Warn: containerImage not pinned by hash: lib/Mojolicious/Command/Author/generate/dockerfile.pm:82: pin your Docker image by updating perl to perl@sha256:c2bcbd898224ce99d8094006e78ad11e118c739f2cec2233b2d89692fe491aac","Warn: downloadThenRun not pinned by hash: .github/workflows/macos.yml:20","Warn: downloadThenRun not pinned by hash: .github/workflows/macos.yml:21","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   2 downloadThenRun 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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 23 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-21T15:03:49.534Z","repository_id":443353,"created_at":"2025-08-21T15:03:49.534Z","updated_at":"2025-08-21T15:03:49.534Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30626919,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T14:16:03.965Z","status":"ssl_error","status_checked_at":"2026-03-17T14:16:03.380Z","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":["cloud-native","event-loop","html","http","json","mojolicious","mvc","perl","user-agent","web-framework","web-server","websocket"],"created_at":"2024-08-04T09:01:14.965Z","updated_at":"2026-03-17T16:08:48.834Z","avatar_url":"https://github.com/mojolicious.png","language":"Perl","funding_links":[],"categories":["Perl"],"sub_categories":[],"readme":"\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://mojolicious.org\"\u003e\n    \u003cimg src=\"https://raw.github.com/mojolicious/mojo/main/lib/Mojolicious/resources/public/mojo/logo.png?raw=true\" style=\"margin: 0 auto;\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n [![](https://github.com/mojolicious/mojo/workflows/linux/badge.svg)](https://github.com/mojolicious/mojo/actions) [![](https://github.com/mojolicious/mojo/workflows/macos/badge.svg)](https://github.com/mojolicious/mojo/actions) [![](https://github.com/mojolicious/mojo/workflows/windows/badge.svg)](https://github.com/mojolicious/mojo/actions)\n\n  Mojolicious is a fresh take on **Perl** web development, based on years of experience developing the Catalyst\n  framework, and utilizing the latest web standards and technologies. You can get started with your project quickly,\n  with a framework that grows with your needs.\n\n  The Mojo stack provides a consistent set of components that can be used in any project. The guides cover most aspects\n  of using the framework and the components have comprehensive reference documentation. Mojolicious is a real-time web\n  framework, which allows a new class of web applications using WebSockets and having long-running requests without\n  blocking.\n\n  Join us now, and be a part of a friendly and knowledgeable community of developers!\n\n## Features\n\n  * Most [popular](https://metacpan.org/favorite/leaderboard) distribution on **CPAN**.\n  * An amazing **real-time web framework**, allowing you to easily grow single file prototypes into well-structured MVC\n    web applications.\n    * Everything you need to build cloud-native web applications for state of the art container environments.\n    * Powerful out of the box with RESTful routes, plugins, commands, Perl-ish templates, content negotiation, session\n      management, form validation, testing framework, static file server, CGI/[PSGI](http://plackperl.org) detection,\n      first class Unicode support and much more for you to discover.\n  * A powerful **web development toolkit**, that you can use for all kinds of applications, independently of the web\n    framework.\n    * Full stack HTTP and WebSocket client/server implementation with IPv6, TLS, SNI, IDNA, HTTP/SOCKS5 proxy, UNIX\n      domain socket, Comet (long polling), Server-Sent Events (SSE), Promises/A+, async/await, keep-alive, connection\n      pooling, timeout, cookie, multipart, and gzip compression support.\n    * Built-in non-blocking I/O web server, supporting multiple event loops as well as optional pre-forking and hot\n      deployment, perfect for building highly scalable web services.\n    * JSON and HTML/XML parser with CSS selector support.\n  * Very clean, portable and object-oriented pure-Perl API with no hidden magic and no requirements besides Perl 5.26.0\n    (versions as old as 5.16.0 can be used too, but may require additional CPAN modules to be installed)\n  * Also available for [JavaScript](https://mojojs.org).\n  * Fresh code based upon years of experience developing [Catalyst](http://catalyst.perl.org), free and open source.\n  * Hundreds of 3rd party [extensions](https://metacpan.org/requires/distribution/Mojolicious) and high quality spin-off\n    projects like the [Minion](https://metacpan.org/pod/Minion) job queue.\n\n## Installation\n\n  All you need is a one-liner, it takes less than a minute.\n\n    $ curl -L https://cpanmin.us | perl - -M https://cpan.metacpan.org -n Mojolicious\n\n  We recommend the use of a [Perlbrew](http://perlbrew.pl) environment.\n\n## Getting Started\n\n  These three lines are a whole web application.\n\n```perl\nuse Mojolicious::Lite;\n\nget '/' =\u003e {text =\u003e 'I ♥ Mojolicious!'};\n\napp-\u003estart;\n```\n\n  To run the example with the built-in development web server, just put the code into a file and start it with `morbo`.\n\n    $ morbo hello.pl\n    Web application available at http://127.0.0.1:3000\n\n  Test it with any HTTP client you prefer.\n\n    $ curl http://127.0.0.1:3000/\n    I ♥ Mojolicious!\n\n## Duct tape for the HTML5 web\n\n  Use all the latest Perl and HTML features in beautiful single file prototypes like this one, and\n  [grow](https://docs.mojolicious.org/Mojolicious/Guides/Growing#Differences) them easily into well-structured\n  **Model-View-Controller** web applications.\n\n```perl\nuse Mojolicious::Lite -signatures;\n\n# Render template \"index.html.ep\" from the DATA section\nget '/' =\u003e sub ($c) {\n  $c-\u003erender(template =\u003e 'index');\n};\n\n# WebSocket service used by the template to extract the title from a website\nwebsocket '/title' =\u003e sub ($c) {\n  $c-\u003eon(message =\u003e sub ($c, $msg) {\n    my $title = $c-\u003eua-\u003eget($msg)-\u003eresult-\u003edom-\u003eat('title')-\u003etext;\n    $c-\u003esend($title);\n  });\n};\n\napp-\u003estart;\n__DATA__\n\n@@ index.html.ep\n% my $url = url_for 'title';\n\u003cscript\u003e\n  const ws = new WebSocket('\u003c%= $url-\u003eto_abs %\u003e');\n  ws.onmessage = function (event) { document.body.innerHTML += event.data };\n  ws.onopen    = function (event) { ws.send('https://mojolicious.org') };\n\u003c/script\u003e\n```\n\n## Want to know more?\n\n  Take a look at our excellent [documentation](https://docs.mojolicious.org)!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmojolicious%2Fmojo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmojolicious%2Fmojo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmojolicious%2Fmojo/lists"}