{"id":13416442,"url":"https://github.com/matestack/matestack-ui-core","last_synced_at":"2025-11-11T18:40:53.520Z","repository":{"id":39004427,"uuid":"149795057","full_name":"matestack/matestack-ui-core","owner":"matestack","description":"Component based web UIs in pure Ruby for Rails. Boost your productivity \u0026 easily create component based web UIs in pure Ruby.","archived":false,"fork":false,"pushed_at":"2023-03-06T00:05:45.000Z","size":20483,"stargazers_count":546,"open_issues_count":36,"forks_count":43,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-10-11T16:36:55.549Z","etag":null,"topics":["components","fullstack","rails","ruby","ruby-gem","ruby-on-rails","rubygem","rubyonrails","server-side-rendering"],"latest_commit_sha":null,"homepage":"https://www.matestack.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/matestack.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"github":["matestack"]}},"created_at":"2018-09-21T17:20:27.000Z","updated_at":"2025-04-28T14:30:03.000Z","dependencies_parsed_at":"2023-07-12T16:22:04.685Z","dependency_job_id":null,"html_url":"https://github.com/matestack/matestack-ui-core","commit_stats":{"total_commits":1389,"total_committers":34,"mean_commits":40.85294117647059,"dds":0.6544276457883369,"last_synced_commit":"aaa4800119a78c9e17687051bffbc99376f4c011"},"previous_names":["basemate/basemate-ui-core","basemate/matestack-ui-core"],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/matestack/matestack-ui-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matestack%2Fmatestack-ui-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matestack%2Fmatestack-ui-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matestack%2Fmatestack-ui-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matestack%2Fmatestack-ui-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matestack","download_url":"https://codeload.github.com/matestack/matestack-ui-core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matestack%2Fmatestack-ui-core/sbom","scorecard":{"id":623804,"data":{"date":"2025-08-11","repo":{"name":"github.com/matestack/matestack-ui-core","commit":"aaa4800119a78c9e17687051bffbc99376f4c011"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"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":"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/dockerpush.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":"Code-Review","score":0,"reason":"Found 0/14 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":"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":"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":"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":"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":-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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 17 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"}},{"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/dockerpush.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerpush.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/matestack/matestack-ui-core/dockerpush.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile.dev:1: pin your Docker image by updating ruby:3.0-alpine3.12 to ruby:3.0-alpine3.12@sha256:b3e8f19adb779fcac36c0d09f244bff026f69ad7f2807646b0475aa63b0c911c","Warn: containerImage not pinned by hash: Dockerfile.test:1: pin your Docker image by updating ruby:3.0-alpine3.12 to ruby:3.0-alpine3.12@sha256:b3e8f19adb779fcac36c0d09f244bff026f69ad7f2807646b0475aa63b0c911c","Warn: containerImage not pinned by hash: ci/Dockerfile.test_5_2_ruby_2_6:1: pin your Docker image by updating ruby:2.6-alpine3.12 to ruby:2.6-alpine3.12@sha256:45e583b8064c14b21e0e6823247c77a6da8b5549e9221565e2c9ebecd4e09d24","Warn: containerImage not pinned by hash: ci/Dockerfile.test_6_0_ruby_2_6:1: pin your Docker image by updating ruby:2.6-alpine3.12 to ruby:2.6-alpine3.12@sha256:45e583b8064c14b21e0e6823247c77a6da8b5549e9221565e2c9ebecd4e09d24","Warn: containerImage not pinned by hash: ci/Dockerfile.test_6_1_ruby_2_7:1: pin your Docker image by updating ruby:2.7-alpine3.12 to ruby:2.7-alpine3.12@sha256:ce31a3a0e2b8692de8a092989bec331de3293a5d0eb6df02d537f53838bafbef","Warn: containerImage not pinned by hash: ci/Dockerfile.test_6_1_ruby_3_0:1: pin your Docker image by updating ruby:3.0-alpine3.12 to ruby:3.0-alpine3.12@sha256:b3e8f19adb779fcac36c0d09f244bff026f69ad7f2807646b0475aa63b0c911c","Warn: containerImage not pinned by hash: ci/Dockerfile.test_7_0_ruby_3_0:1: pin your Docker image by updating ruby:3.0-alpine3.12 to ruby:3.0-alpine3.12@sha256:b3e8f19adb779fcac36c0d09f244bff026f69ad7f2807646b0475aa63b0c911c","Warn: npmCommand not pinned by hash: ci/Dockerfile.test_5_2_ruby_2_6:42","Warn: npmCommand not pinned by hash: ci/Dockerfile.test_6_0_ruby_2_6:42","Warn: npmCommand not pinned by hash: ci/Dockerfile.test_6_1_ruby_2_7:42","Warn: npmCommand not pinned by hash: ci/Dockerfile.test_6_1_ruby_3_0:42","Warn: npmCommand not pinned by hash: ci/Dockerfile.test_7_0_ruby_3_0:42","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 containerImage dependencies pinned","Info:   0 out of   5 npmCommand 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":0,"reason":"135 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h47h-mwp9-c6q6","Warn: Project is vulnerable to: GHSA-4g8v-vg43-wpgf","Warn: Project is vulnerable to: GHSA-8xww-x3g3-6jcv","Warn: Project is vulnerable to: GHSA-9445-4cr6-336r","Warn: Project is vulnerable to: GHSA-9822-6m93-xqf4","Warn: Project is vulnerable to: GHSA-fwhr-88qx-h9g7","Warn: Project is vulnerable to: GHSA-p84v-45xj-wwqj","Warn: Project is vulnerable to: GHSA-vfg9-r3fq-jvx4","Warn: Project is vulnerable to: GHSA-vfm5-rmrh-j26v","Warn: Project is vulnerable to: GHSA-x76w-6vjr-8xgj","Warn: Project is vulnerable to: GHSA-qjqp-xr96-cj99","Warn: Project is vulnerable to: GHSA-wwhv-wxv9-rpgw","Warn: Project is vulnerable to: GHSA-xp5h-f8jf-rc8q","Warn: Project is vulnerable to: GHSA-3hhc-qp5v-9p2j","Warn: Project is vulnerable to: GHSA-579w-22j4-4749","Warn: Project is vulnerable to: GHSA-76r7-hhxj-r776","Warn: Project is vulnerable to: GHSA-hq7p-j377-6v63","Warn: Project is vulnerable to: GHSA-8h22-8cf7-hq6g","Warn: Project is vulnerable to: GHSA-r4mg-4433-c7g3","Warn: Project is vulnerable to: GHSA-cr5q-6q9f-rq6q","Warn: Project is vulnerable to: GHSA-j6gc-792m-qgm2","Warn: Project is vulnerable to: GHSA-pj73-v5mw-pm9j","Warn: Project is vulnerable to: GHSA-jxhc-q857-3j6g","Warn: Project is vulnerable to: GHSA-23c2-gwp5-pxw9","Warn: Project is vulnerable to: GHSA-228g-948r-83gx","Warn: Project is vulnerable to: GHSA-3x8r-x6xp-q4vm","Warn: Project is vulnerable to: GHSA-486f-hjj9-9vhh","Warn: Project is vulnerable to: GHSA-j3g3-5qv5-52mj","Warn: Project is vulnerable to: GHSA-2qc6-mcvw-92cw","Warn: Project is vulnerable to: GHSA-353f-x4gh-cqq8","Warn: Project is vulnerable to: GHSA-5w6v-399v-w3cc","Warn: Project is vulnerable to: GHSA-cgx6-hpwq-fhv5","Warn: Project is vulnerable to: GHSA-mrxw-mxhj-p664","Warn: Project is vulnerable to: GHSA-pxvg-2qj5-37jq","Warn: Project is vulnerable to: GHSA-r95h-9x8f-r3f7","Warn: Project is vulnerable to: GHSA-vvfq-8hwr-qm4m","Warn: Project is vulnerable to: GHSA-xc9x-jj77-9p9j","Warn: Project is vulnerable to: GHSA-xh29-r2w5-wx8m","Warn: Project is vulnerable to: GHSA-48w2-rm65-62xx","Warn: Project is vulnerable to: GHSA-68xg-gqqm-vgj8","Warn: Project is vulnerable to: GHSA-9hf4-67fc-4vf4","Warn: Project is vulnerable to: GHSA-c2f4-cvqm-65w2","Warn: Project is vulnerable to: GHSA-h99w-9q5r-gjq9","Warn: Project is vulnerable to: GHSA-rmj8-8hhh-gv5h","Warn: Project is vulnerable to: GHSA-22f2-v57c-j9cx","Warn: Project is vulnerable to: GHSA-3h57-hmj3-gj3p","Warn: Project is vulnerable to: GHSA-54rr-7fvw-6x8f","Warn: Project is vulnerable to: GHSA-65f5-mfpf-vfhj","Warn: Project is vulnerable to: GHSA-7g2v-jj9q-g3rg","Warn: Project is vulnerable to: GHSA-7wqh-767x-r66v","Warn: Project is vulnerable to: GHSA-8cgq-6mh2-7j6v","Warn: Project is vulnerable to: GHSA-93pm-5p5f-3ghx","Warn: Project is vulnerable to: GHSA-c6qg-cjj8-47qp","Warn: Project is vulnerable to: GHSA-gjh7-p2fx-99vx","Warn: Project is vulnerable to: GHSA-hxqx-xwvh-44m2","Warn: Project is vulnerable to: GHSA-rqv2-275x-2jq5","Warn: Project is vulnerable to: GHSA-vpfw-47h7-xj4g","Warn: Project is vulnerable to: GHSA-wq4h-7r42-5hrr","Warn: Project is vulnerable to: GHSA-xj5v-6v4g-jfw6","Warn: Project is vulnerable to: GHSA-5x79-w82f-gw8w","Warn: Project is vulnerable to: GHSA-9h9g-93gc-623h","Warn: Project is vulnerable to: GHSA-mcvf-2q2m-x72m","Warn: Project is vulnerable to: GHSA-pg8v-g4xq-hww9","Warn: Project is vulnerable to: GHSA-rrfc-7g8p-99q8","Warn: Project is vulnerable to: GHSA-2rxp-v6pw-ch6m","Warn: Project is vulnerable to: GHSA-4xqq-m2hx-25v8","Warn: Project is vulnerable to: GHSA-5866-49gr-22v4","Warn: Project is vulnerable to: GHSA-r55c-59qm-vjw6","Warn: Project is vulnerable to: GHSA-vg3r-rm7w-2xgh","Warn: Project is vulnerable to: GHSA-vmwr-mc7x-5vc3","Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-3wcq-x3mq-6r9p","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-hh27-ffr2-f2jc","Warn: Project is vulnerable to: GHSA-rqff-837h-mm52","Warn: Project is vulnerable to: GHSA-8v38-pw62-9cw2","Warn: Project is vulnerable to: GHSA-hgjh-723h-mx2j","Warn: Project is vulnerable to: GHSA-jf5r-8hm2-f872","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T05:51:42.031Z","repository_id":39004427,"created_at":"2025-08-21T05:51:42.031Z","updated_at":"2025-08-21T05:51:42.031Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":283910127,"owners_count":26915128,"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-11-11T02:00:06.610Z","response_time":65,"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":["components","fullstack","rails","ruby","ruby-gem","ruby-on-rails","rubygem","rubyonrails","server-side-rendering"],"created_at":"2024-07-30T21:00:58.928Z","updated_at":"2025-11-11T18:40:53.497Z","avatar_url":"https://github.com/matestack.png","language":"Ruby","funding_links":["https://github.com/sponsors/matestack"],"categories":["Ruby","Happy Exploring 🤘"],"sub_categories":["Misc"],"readme":"[![Specs](https://github.com/matestack/matestack-ui-core/workflows/specs/badge.svg)](https://github.com/matestack/matestack-ui-core/actions)\n[![Discord](https://img.shields.io/discord/771413294136426496.svg)](https://discord.com/invite/c6tQxFG)\n[![Gem Version](https://badge.fury.io/rb/matestack-ui-core.svg)](https://badge.fury.io/rb/matestack-ui-core)\n[![Docs](https://img.shields.io/badge/docs-matestack-blue.svg)](https://docs.matestack.io)\n[![Twitter Follow](https://img.shields.io/twitter/follow/matestack.svg?style=social)](https://twitter.com/matestack)\n\n![matestack logo](./logo.png)\n\n# matestack-ui-core | Component based web UIs in pure Ruby for Rails\n\nBoost your productivity \u0026 easily create component based web UIs in pure Ruby.\n\n`matestack-ui-core` enables you to craft maintainable web UIs in pure Ruby, skipping ERB and HTML. UI code becomes a native and fun part of your Rails app. `matestack-ui-core` can progressively replace the classic Rails-View-Layer. You are able to use\nit alongside your classic views.\n\n## Compatibility\n\n`matestack-ui-core` is tested against:\n\n- Rails 7.0.1 + Ruby 3.0.0\n- Rails 6.1.1 + Ruby 3.0.0\n- Rails 6.1.1 + Ruby 2.7.2\n- Rails 6.0.3.4 + Ruby 2.6.6\n- Rails 5.2.4.4 + Ruby 2.6.6\n\nRails versions below 5.2 are not supported.\n\n## Documentation/Installation\n\nDocumentation can be found [here](https://docs.matestack.io/matestack-ui-core)\n\n## Getting started\n\nA getting started guide can be found [here](https://docs.matestack.io/matestack-ui-core/getting-started/hello-world)\n\n## Changelog\n\nChangelog can be found [here](./CHANGELOG.md)\n\n## Community\n\nAs a low-barrier feedback channel for our early users, we have set up a Discord server that can be found [here](https://discord.com/invite/c6tQxFG). You are very welcome to ask questions and send us feedback there!\n\n## Contribution\n\nWe are happy to accept contributors of any kind! In order to make it as easy and fun as possible to contribute to `matestack-ui-core`, we would like to onboard contributors personally! Best way to become a contributor: Ping us on Discord! We will schedule a video call with you and show you, how and what to work on :)\n\n## Feature walk-through\n\n### 1. Create UI components in pure Ruby\n\nCraft your UI based on your components written in pure Ruby. Utilizing Ruby's amazing language features, you're able to create a cleaner and more maintainable UI implementation.\n\n#### Implement UI components in pure Ruby\n\nCreate Ruby classes within your Rails project and call matestack's core components through a Ruby DSL in order to craft your UIs.\nThe Ruby method \\\"div\\\" for example calls one of the static core components, responsible for rendering HTML tags. A component can take Strings, Integers Symbols, Arrays or Hashes (...) as optional properties (e.g. \\\"title\\\") or require them (e.g. \\\"body\\\").\n\n`app/matestack/components/card.rb`\n\n```ruby\n\nclass Components::Card \u003c Matestack::Ui::Component\n\n  required :body\n  optional :title\n  optional :image\n\n  def response\n    div class: \"card shadow-sm border-0 bg-light\" do\n      img path: context.image, class: \"w-100\" if context.image.present?\n      div class: \"card-body\" do\n        h5 context.title if context.title.present?\n        paragraph context.body, class: \"card-text\"\n      end\n    end\n  end\n\nend\n\n```\n\n#### Use your Ruby UI components on your existing Rails views\n\nComponents can be then called on Rails views (not only! see below), enabling you to create a reusable card components, abstracting UI complexity in your own components.\n\n`app/views/your_view.html.erb`\n\n```erb\n\n\u003c!-- some other erb markup --\u003e\n\u003c%= Components::Card.call(title: \"hello\", body: \"world\") %\u003e\n\u003c!-- some other erb markup --\u003e\n\n```\n\n\n#### Use Ruby methods as partials\n\nSplit your UI implementation into multiple small chunks helping others (and yourself) to better understand your implementation.\nUsing this approach helps you to create a clean, readable and maintainable codebase.\n\n`app/matestack/components/card.rb`\n\n```ruby\n\nclass Components::Card \u003c Matestack::Ui::Component\n\n  required :body\n  optional :title\n  optional :image\n  optional :footer\n\n  def response\n    div class: \"card shadow-sm border-0 bg-light\" do\n      img path: context.image, class: \"w-100\" if context.image.present?\n      card_content\n      card_footer if context.footer.present?\n    end\n  end\n\n  def card_content\n    div class: \"card-body\" do\n      h5 context.title if context.title.present?\n      paragraph context.body, class: \"card-body\"\n    end\n  end\n\n  def card_footer\n    div class: \"card-footer text-muted\" do\n      plain context.footer\n    end\n  end\n\nend\n\n```\n\n`app/views/your_view.html.erb`\n\n```erb\n\u003c!-- some other erb markup --\u003e\n\u003c%= Components::Card.call(title: \"hello\", body: \"world\", footer: \"foo\") %\u003e\n\u003c!-- some other erb markup --\u003e\n```\n\n\n#### Use class inheritance\n\nBecause it's just a Ruby class, you can use class inheritance in order to further improve the quality of your UI implementation.\nClass inheritance can be used to easily create variants of UI components but still reuse parts of the implementation.\n\n`app/matestack/components/blue_card.rb`\n\n```ruby\n\nclass Components::BlueCard \u003c Components::Card\n\n  def response\n    div class: \"card shadow-sm border-0 bg-primary text-white\" do\n      img path: context.image, class: \"w-100\" if context.image.present?\n      card_content #defined in parent class\n      card_footer if context.footer.present? #defined in parent class\n    end\n  end\n\nend\n\n```\n\n`app/views/your_view.html.erb`\n\n```erb\n\u003c!-- some other erb markup --\u003e\n\u003c%= Components::BlueCard.call(title: \"hello\", body: \"world\") %\u003e\n\u003c!-- some other erb markup --\u003e\n```\n\n#### Use components within components\n\nJust like you used matestack's core components on your own UI component, you can use your own UI components within other custom UI components.\nYou decide when using a Ruby method partial should be replaced by another self contained UI component!\n\n`app/matestack/components/card.rb`\n\n```ruby\n\nclass Components::Card \u003c Matestack::Ui::Component\n\n  required :body\n  optional :title\n  optional :image\n\n  def response\n    div class: \"card shadow-sm border-0 bg-light\" do\n      img path: context.image, class: \"w-100\" if context.image.present?\n      # calling the CardBody component rather than using Ruby method partials\n      Components::CardBody.call(title: context.title, body: context.body)\n    end\n  end\n\nend\n\n```\n`app/matestack/components/card_body.rb`\n\n```ruby\n\nclass Components::CardBody \u003c Matestack::Ui::Component\n\n  required :body\n  optional :title\n\n  def response\n    # Just an example. Would make more sense, if this component had\n    # a more complex structure\n    div class: \"card-body\" do\n      h5 context.title if context.title.present?\n      paragraph context.body, class: \"card-body\"\n    end\n  end\n\nend\n\n```\n\n\n#### Yield components into components\n\nSometimes it's not enough to just pass simple data into a component. No worries! You can just yield a block into your components!\nUsing this approach gives you more flexibility when using your UI components. Ofcourse yielding can be used alongside passing in simple params.\n\n\n`app/matestack/components/card.rb`\n\n```ruby\n\nclass Components::Card \u003c Matestack::Ui::Component\n\n  required :body\n  optional :title\n  optional :image\n\n  def response\n    div class: \"card shadow-sm border-0 bg-light\" do\n      img path: context.image, class: \"w-100\" if context.image.present?\n      Components::CardBody.call() do\n        # yielding a block into the card_body component\n        h5 context.title if context.title.present?\n        paragraph context.body, class: \"card-body\"\n      end\n    end\n  end\n\nend\n\n```\n\n`app/matestack/components/card_body.rb`\n\n```ruby\n\nclass Components::CardBody \u003c Matestack::Ui::Component\n\n  def response\n    # Just an example. Would make more sense, if this component had\n    # a more complex structure\n    div class: \"card-body\" do\n      yield if block_given?\n    end\n  end\n\nend\n\n```\n\n#### Use named slots for advanced content injection\n\nIf you need to inject multiple blocks into your UI component, you can use \\\"slots\\\"!\nSlots help you to build complex UI components with multiple named content placeholders for highest implementation flexibility!\n\n`app/matestack/components/card.rb`\n\n```ruby\n\nclass Components::Card \u003c Matestack::Ui::Component\n\n  required :body\n  optional :title\n  optional :image\n\n  def response\n    div class: \"card shadow-sm border-0 bg-light\" do\n      img path: context.image, class: \"w-100\" if context.image.present?\n      Components::CardBody.call(slots: {\n        heading: method(:heading_slot),\n        body: method(:body_slot)\n      })\n    end\n  end\n\n  def heading_slot\n    h5 context.title if context.title.present?      \n  end\n\n  def body_slot\n    paragraph context.body, class: \"card-body\"\n  end\n\nend\n\n```\n`app/matestack/components/card_body.rb`\n\n```ruby\n\nclass Components::CardBody \u003c Matestack::Ui::Component\n\n  required :slots\n\n  def response\n    # Just an example. Would make more sense, if this component had\n    # a more complex structure\n    div class: \"card-body\" do\n      div class: \"heading-section\" do\n        slot :heading\n      end\n      div class: \"body-section\" do\n        slot :body\n      end\n    end\n  end\n\nend\n\n```\n\n## License\n\n`matestack-ui-core` is an Open Source project licensed under the terms of the [MIT license](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatestack%2Fmatestack-ui-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatestack%2Fmatestack-ui-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatestack%2Fmatestack-ui-core/lists"}