fatfreecrm/fat_free_crm
Ruby on Rails CRM platform
Single-maintainer risk — review before adopting
worst of 4 axesnon-standard license (Other); no tests detected
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 2w ago
- ✓3 active contributors
- ✓Other licensed
Show 5 more →Show less
- ✓CI configured
- ⚠Small team — 3 contributors active in recent commits
- ⚠Single-maintainer risk — top contributor 89% of recent commits
- ⚠Non-standard license (Other) — review terms
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: clarify license terms
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/fatfreecrm/fat_free_crm)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/fatfreecrm/fat_free_crm on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: fatfreecrm/fat_free_crm
Generated by RepoPilot · 2026-05-10 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/fatfreecrm/fat_free_crm shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Single-maintainer risk — review before adopting
- Last commit 2w ago
- 3 active contributors
- Other licensed
- CI configured
- ⚠ Small team — 3 contributors active in recent commits
- ⚠ Single-maintainer risk — top contributor 89% of recent commits
- ⚠ Non-standard license (Other) — review terms
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live fatfreecrm/fat_free_crm
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/fatfreecrm/fat_free_crm.
What it runs against: a local clone of fatfreecrm/fat_free_crm — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in fatfreecrm/fat_free_crm | Confirms the artifact applies here, not a fork |
| 2 | License is still Other | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 44 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of fatfreecrm/fat_free_crm. If you don't
# have one yet, run these first:
#
# git clone https://github.com/fatfreecrm/fat_free_crm.git
# cd fat_free_crm
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of fatfreecrm/fat_free_crm and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "fatfreecrm/fat_free_crm(\\.git)?\\b" \\
&& ok "origin remote is fatfreecrm/fat_free_crm" \\
|| miss "origin remote is not fatfreecrm/fat_free_crm (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
&& ok "license is Other" \\
|| miss "license drift — was Other at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "app/controllers/application_controller.rb" \\
&& ok "app/controllers/application_controller.rb" \\
|| miss "missing critical file: app/controllers/application_controller.rb"
test -f "app/controllers/entities_controller.rb" \\
&& ok "app/controllers/entities_controller.rb" \\
|| miss "missing critical file: app/controllers/entities_controller.rb"
test -f "Gemfile" \\
&& ok "Gemfile" \\
|| miss "missing critical file: Gemfile"
test -f "config/routes.rb" \\
&& ok "config/routes.rb" \\
|| miss "missing critical file: config/routes.rb"
test -f "app/assets/javascripts/application.js.erb" \\
&& ok "app/assets/javascripts/application.js.erb" \\
|| miss "missing critical file: app/assets/javascripts/application.js.erb"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 44 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~14d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/fatfreecrm/fat_free_crm"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Fat Free CRM is an open-source Ruby on Rails customer relationship management platform that provides out-of-the-box features for group collaboration, lead and campaign management, contact lists, opportunity tracking, and task management. It allows organizations to build custom fields, organize data with tags, and model teams and groups while remaining extensible through plugins for webhooks, record merging, and time tracking. Monolithic Rails application under app/ with standard Rails structure: app/controllers, app/models, app/views (mostly Haml templates in 226K lines), app/assets/javascripts (CoffeeScript), app/assets/stylesheets (SCSS). Core features (contacts, leads, accounts, opportunities, tasks) are baked into the main application with a plugin architecture (referenced in README) for extensibility. DevContainer and Docker support (Dockerfile, .docker/nginx/) enable containerized local development and deployment.
👥Who it's for
Small to mid-market businesses and their development teams who need a customizable, self-hosted CRM alternative to Salesforce or Pipedrive. Ruby on Rails developers who want to contribute to or extend an active open-source CRM rather than building from scratch. Organizations valuing data privacy and control over cloud-hosted solutions.
🌱Maturity & risk
Production-ready: the project has been active for years with structured CI/CD via GitHub Actions (brakeman security analysis, CodeQL, RuboCop linting, full Ruby test suite in .github/workflows/ruby.yml), dependency management via Dependabot, and clear versioning in CHANGELOG.md. However, commit frequency should be verified; the presence of .teatro.yml config and organized DevContainer setup suggests active maintenance, though the last significant update timing is not visible in provided metadata.
Moderate risk: the single-language focus (1.28M lines of Ruby) and monolithic Rails structure mean breaking changes in Rails or gem dependencies can cascade broadly. The Gemfile.lock presence mitigates some risk, but no visible npm audit / bundle audit automation in CI suggests potential dependency vulnerabilities. Long-term sustainability depends on the volunteer community; check CONTRIBUTORS.md and GitHub issues/PR response times for current health.
Active areas of work
Active maintenance evident from Dependabot configuration (.github/dependabot.yml), recent GitHub Actions workflows for security scanning (brakeman-analysis.yml, codeql.yml, ghcr-publish.yml for container registry publishing), and RuboCop linting enforcement. The presence of .rubocop_todo.yml suggests ongoing code quality improvements. Without access to recent commits or PRs, check the GitHub Issues board and Releases tab for current focus areas.
🚀Get running
git clone https://github.com/fatfreecrm/fat_free_crm.git && cd fat_free_crm && bundle install && bundle exec rake db:create db:migrate && bundle exec rails server
Daily commands: bundle exec rails server (starts on default :3000); for Docker: docker build -t ffcrm . && docker run -p 3000:3000 ffcrm; for DevContainer: open in VS Code with .devcontainer/devcontainer.json. Check Procfile for additional service definitions (likely background job queue, etc.). Run migrations first: bundle exec rake db:migrate.
🗺️Map of the codebase
app/controllers/application_controller.rb— Base controller that all others inherit from; defines authentication, authorization, and request lifecycle hooks.app/controllers/entities_controller.rb— Core router for all entity types (contacts, leads, accounts, opportunities); essential for understanding the request dispatch pattern.Gemfile— Declares all dependencies including Rails, authentication, admin panels, and plugins; required reading to understand external integrations.config/routes.rb— Defines the application's URL schema and entity routing; necessary to navigate the codebase and understand entry points.app/assets/javascripts/application.js.erb— Main JavaScript manifest and initialization; controls client-side behavior for the entire CRM interface.app/assets/stylesheets/application.css.erb— Primary stylesheet manifest; orchestrates Bootstrap customizations and layout for the entire UI..rubocop.yml— Code quality configuration that enforces Rails and Ruby conventions; required context for any code review.
🧩Components & responsibilities
- ApplicationController (Rails, Devise) — Base HTTP request handler; enforces authentication, sets current_user, handles before/after filters, renders responses.
- Failure mode: Authentication bypass if not properly inherited; CSRF protection gaps if filters are disabled.
- Entity Models (Contact, Account, Opportunity, Lead) (ActiveRecord) — Business logic layer; validates attributes, manages associations (belongs_to, has_many), performs calculations.
- Failure mode: N+1 queries, missing eager loading; stale cached associations; unvalidated user input persists to database.
- ER — undefined
🛠️How to make changes
Add a new entity type (e.g., custom CRM object)
- Create an ActiveRecord model at app/models/your_entity.rb with associations and validations (
app/models/your_entity.rb) - Generate a migration file for the database table schema (
db/migrate/[timestamp]_create_your_entities.rb) - Create a controller at app/controllers/entities/your_entities_controller.rb inheriting from EntitiesController (
app/controllers/entities/your_entities_controller.rb) - Add routes in config/routes.rb within the entities namespace (
config/routes.rb) - Create index/show/edit/new view templates in app/views/your_entities/ directory (
app/views/your_entities/index.html.erb) - Add JavaScript event handlers in app/assets/javascripts/your_entity.js.coffee following crm.js.coffee patterns (
app/assets/javascripts/your_entity.js.coffee)
Add a custom admin setting or field configuration
- Create or modify the setting model at app/models/setting.rb or similar (
app/models/setting.rb) - Add a controller action in app/controllers/admin/settings_controller.rb (
app/controllers/admin/settings_controller.rb) - Create a view template at app/views/admin/settings/your_setting.html.erb (
app/views/admin/settings/your_setting.html.erb) - Add route in config/routes.rb under admin namespace (
config/routes.rb)
Add a new UI component or JavaScript feature
- Create a CoffeeScript module at app/assets/javascripts/crm_your_feature.js.coffee following module pattern in crm.js.coffee (
app/assets/javascripts/crm_your_feature.js.coffee) - Include the new file in app/assets/javascripts/application.js.erb require statements (
app/assets/javascripts/application.js.erb) - Add corresponding styles at app/assets/stylesheets/your_feature.scss following base.scss conventions (
app/assets/stylesheets/your_feature.scss) - Modify relevant controller actions to pass data to views for feature integration (
app/controllers/application_controller.rb)
🔧Why these technologies
- Ruby on Rails — Rapid development of database-backed web applications with built-in ORM, routing, and scaffolding; mature ecosystem for CRM-style CRUD operations.
- PostgreSQL (inferred from Dockerfile/config) — Robust relational database for structured CRM data (contacts, accounts, opportunities); supports complex queries and data integrity constraints.
- CoffeeScript & jQuery (legacy) — Reduced boilerplate for DOM manipulation and AJAX; lightweight client-side enhancements without heavy framework overhead (pre-modern SPA era).
- Bootstrap (custom SCSS) — CSS framework for responsive UI and consistent component styling; customizations allow brand-specific theming.
- Devise (authentication gem, inferred) — Industry-standard Rails authentication with user sessions, password reset, and role-based access control.
⚖️Trade-offs already made
-
Server-side rendering (ERB templates) instead of decoupled API + SPA
- Why: Simpler initial deployment, faster time-to-market for a CRM with many entity types; no frontend build complexity.
- Consequence: Page reloads for navigation; harder to build real-time features; client state scattered between server sessions and JavaScript.
-
CoffeeScript instead of modern JavaScript/TypeScript
- Why: Cleaner syntax for Rails developers circa 2012–2018; reduced boilerplate in event handlers and AJAX calls.
- Consequence: Harder to onboard developers familiar only with ES6+; potential maintenance burden as CoffeeScript ecosystem shrinks.
-
Monolithic Rails application (no API extraction)
- Why: Single codebase simpler to deploy and maintain for a small-to-medium CRM; reduced operational complexity.
- Consequence: Difficult to build mobile or third-party integrations without exposing internal implementation; scaling horizontal compute requires careful session/cache management.
🚫Non-goals (don't propose these)
- Real-time collaboration (no WebSocket infrastructure for live updates)
- Mobile native applications (web-only, responsive design assumes desktop/tablet)
- Headless/API-first architecture (views tightly coupled to controllers)
- Microservices or distributed processing (single-process Rails application)
🪤Traps & gotchas
Rails database migrations must be run after pulling: bundle exec rake db:migrate. ImageMagick must be installed if avatar support is desired (not enforced, will fail silently). Haml templating requires familiarity with indentation-based syntax; CoffeeScript requires knowledge of that language or willingness to learn. Check .ruby-version for the required Ruby version (likely 3.1+); version mismatch will cause bundle install failures. The plugin system likely requires specific hook points to be discovered by examining existing plugins on GitHub; undocumented extension points may require reading Railties internals.
🏗️Architecture
💡Concepts to learn
- ActiveRecord ORM — The entire CRM data model (Contact, Lead, Account, Opportunity, Task) is built on Rails ActiveRecord; understanding associations, scopes, validations, and callbacks is essential to modifying any model.
- Rails Asset Pipeline — JavaScript (CoffeeScript), CSS (SCSS), and images are managed via the asset pipeline in app/assets/; understanding fingerprinting, concatenation, and manifest.js is needed to modify frontend resources.
- Haml Templating — 226K lines of view code use Haml (indentation-based HTML) instead of ERB; familiarity with Haml syntax is mandatory for modifying any UI or adding new forms.
- Polymorphic Associations — Custom fields (likely polymorphic_belongs_to) attach to multiple CRM entity types (Contact, Lead, Account); understanding Rails polymorphism is critical for extending the custom field system.
- ActionMailer + Background Jobs — The Procfile suggests background job processing (e.g., Sidekiq, Delayed Job) for sending task reminders, notifications, and campaign emails; understanding async patterns is needed for reliability.
- Rails Engines and Plugin Architecture — AGENTS.md and the plugin system (webhooks, record merging) are built via Rails Engines; understanding how plugins load, hook into the core app, and persist data is necessary to extend the CRM.
- Docker Multi-Stage Builds and Nginx Reverse Proxy — Dockerfile and .docker/nginx/sites-enabled/ffcrm.conf orchestrate containerized deployment; understanding image layers, Nginx configuration, and environment variable injection is essential for DevOps and production debugging.
🔗Related repos
erpal/erpal— Drupal-based CRM alternative with similar group collaboration and custom fields; useful for comparison of feature parity across ecosystems.odoo/odoo— Python/JavaScript ERP/CRM with self-hosted option; industry-standard comparison point for custom fields, plugins, and multi-module architecture.twentycrm/twenty— Modern Node.js/PostgreSQL open-source CRM explicitly inspired by Salesforce; active community and fresher tech stack; good migration/comparison point.crater-invoice/crater— Ruby on Rails open-source invoicing/business management; shares Rails stack and single-language architecture; useful for learning Rails patterns in business domain.fatfreecrm/fat_free_crm_plugins— Official plugin repository for webhooks, merging, time tracking, and other extensions; essential for understanding the plugin architecture and published extensions.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Migrate CoffeeScript assets to modern JavaScript/ES6
The repository contains multiple .js.coffee files (crm.js.coffee, crm_classes.js.coffee, crm_comments.js.coffee, etc.) in app/assets/javascripts/. CoffeeScript is unmaintained and most Rails projects have migrated to ES6+. This modernization would improve code readability, enable better tooling support, and make contributions easier for new developers unfamiliar with CoffeeScript syntax.
- [ ] Convert app/assets/javascripts/crm.js.coffee to crm.js with ES6 syntax
- [ ] Convert app/assets/javascripts/crm_classes.js.coffee to modern class syntax
- [ ] Convert remaining .coffee files (crm_comments, crm_select2, crm_sortable, crm_tags, etc.)
- [ ] Verify all functionality via existing tests or add integration tests for critical JavaScript features
- [ ] Update application.js.erb if needed to ensure proper asset pipeline loading
- [ ] Remove coffeescript from Gemfile if no longer needed
Add comprehensive security-focused integration tests for authentication/authorization flows
The repo has security scanning workflows (brakeman-analysis.yml, codeql.yml) and a SECURITY.md file, indicating security is important. However, there's no visible test coverage for authentication flows (login/logout in crm_loginout.js.coffee), role-based access control, or session management. Adding integration tests would catch regressions in critical security paths.
- [ ] Create spec/integration/authentication_spec.rb covering login, logout, session timeout scenarios
- [ ] Create spec/integration/authorization_spec.rb testing role-based access to leads, contacts, and opportunities
- [ ] Test CSRF protection on state-changing operations (create, update, delete)
- [ ] Verify API authentication if applicable (check for app/controllers/api/ or similar)
- [ ] Add these tests to the ruby.yml GitHub Actions workflow to run on every PR
Add comprehensive CSS test coverage for responsive design and create a living styleguide
The stylesheet directory (app/assets/stylesheets/) contains multiple .scss files but there's likely no visual regression testing or documented component styles. Given Fat Free CRM is a UI-heavy Rails application with forms, dashboards, and list views, adding visual tests and a styleguide would prevent CSS regressions and improve contributor onboarding.
- [ ] Set up Percy, BackstopJS, or Playwright for visual regression testing in CI (add to github/workflows/)
- [ ] Create spec/visual/ directory with baseline screenshots for key pages (dashboard, contact_create, lists)
- [ ] Document color palette, typography, and common component classes in a STYLEGUIDE.md or /docs/styleguide.html
- [ ] Add visual test workflow to .github/workflows/visual-regression.yml
- [ ] Test responsive breakpoints (mobile, tablet, desktop) for at least 3 critical views
🌿Good first issues
- Add RSpec test coverage for app/models/custom_field.rb: the 1.28M lines of Ruby likely have untested model methods. Start by running bundle exec rspec spec/models/custom_field_spec.rb to see missing tests, then implement specs for validation and persistence logic.
- Improve Haml template accessibility in app/views/: add ARIA labels and semantic HTML to contact/lead form templates (e.g., app/views/contacts/_form.html.haml). This addresses WCAG compliance without requiring backend changes and is highly visible.
- Add Swagger/OpenAPI documentation for the REST API (likely in app/controllers/api/ if it exists, or create it): the README mentions the project is extensible but does not document API endpoints. Use swagger-rails gem to auto-generate docs from controller annotations.
⭐Top contributors
Click to expand
Top contributors
- @CloCkWeRX — 89 commits
- @google-labs-jules[bot] — 7 commits
- @dependabot[bot] — 4 commits
📝Recent commits
Click to expand
Recent commits
418ec1b— Merge pull request #1738 from fatfreecrm/rearrange-deps (CloCkWeRX)5431802— Swap to validations automatically from DB (CloCkWeRX)f32fcca— Add validation (CloCkWeRX)a414b65— List addressable (CloCkWeRX)cd5fc2a— Apply suggestion from @CloCkWeRX (CloCkWeRX)28800cd— Move devise-security to gemspec (CloCkWeRX)8ef9100— Move rack-attack to gemspec (CloCkWeRX)71d660a— Merge pull request #1733 from fatfreecrm/dependabot/github_actions/docker/build-push-action-7 (CloCkWeRX)478b701— Merge pull request #1736 from fatfreecrm/offcanvas-navigation-14941319826117617195 (CloCkWeRX)3d647c9— Swap mobile navigation to use Bootstrap offcanvas plugin (google-labs-jules[bot])
🔒Security observations
- High · Dockerfile Base Image without Version Pin —
Dockerfile (line 6). The Dockerfile uses 'FROM ruby:3.4' without specifying an exact version or digest. This could lead to building with different patch versions containing security vulnerabilities, defeating reproducible builds and security patching. Fix: Pin the base image to a specific digest or full version tag: 'FROM ruby:3.4.0-alpine' or use image digest verification. - High · Missing Security Headers Configuration —
.docker/nginx/sites-enabled/ffcrm.conf (configuration missing). No evidence of security headers (HSTS, X-Frame-Options, X-Content-Type-Options, CSP) configuration in the visible nginx/Rails configuration. This exposes the application to clickjacking, MIME-type sniffing, and other browser-based attacks. Fix: Add security headers to nginx config or Rails middleware: HSTS, X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Content-Security-Policy headers. - Medium · Exposed Docker Port without Restriction —
Dockerfile (line 30, EXPOSE 3000). The Dockerfile exposes port 3000 without specifying it should only be accessible internally. In production, the Rails application (development mode on port 3000) should be behind a reverse proxy and not directly exposed. Fix: Use Docker networking to restrict port access. Only expose nginx port 80/443 externally. Keep Rails on internal network. - Medium · Missing HTTPS/TLS Configuration —
.docker/nginx/sites-enabled/ffcrm.conf (missing SSL directives). No evidence of HTTPS/TLS configuration in the provided nginx or Docker setup. Communication between client and server is unencrypted by default. Fix: Configure SSL/TLS with valid certificates. Enforce HTTPS redirects. Use Let's Encrypt for automation. Add ssl_protocols, ssl_ciphers, and HSTS headers. - Medium · Database Credentials in Configuration Copy —
Dockerfile (line 17). The Dockerfile copies a database configuration file from the repository: 'RUN cp config/database.postgres.docker.yml config/database.yml'. If this file contains hardcoded credentials, they will be baked into the image. Fix: Use environment variables or Docker secrets for database credentials instead of hardcoded config files. Never commit credentials to the repository. - Medium · Insufficient CoffeeScript Input Validation —
app/assets/javascripts/ (multiple files). The presence of multiple JavaScript/CoffeeScript files handling user input (crm_classes.js.coffee, crm_comments.js.coffee, crm_textarea_autocomplete.js.coffee) without visible sanitization patterns suggests potential XSS vulnerabilities. Fix: Ensure all user input is properly sanitized and HTML-escaped. Use Rails helpers like 'sanitize' and 'h' for output encoding. Implement Content Security Policy. - Medium · Rails Assets without Subresource Integrity —
app/assets/config/manifest.js. The asset pipeline configuration doesn't show Subresource Integrity (SRI) hashes for JavaScript/CSS assets, which could allow attackers to inject malicious assets if the CDN or asset serving is compromised. Fix: Enable SRI hashing for all assets in Rails configuration. Useintegrity: truein asset_tag helpers. - Low · Ruby Version Management —
.ruby-version, Gemfile. The .ruby-version file controls the Ruby version, but no explicit Ruby version requirement in Gemfile provides defense-in-depth if .ruby-version is not respected. Fix: Specify ruby version in Gemfile with: 'ruby "3.4.0"' to ensure consistency across all environments. - Low · Missing Dependency Audit in CI/CD —
.github/workflows/ (missing bundler-audit.yml). While GitHub Actions workflows exist (brakeman-analysis.yml, codeql.yml), there's no visible 'bundler-audit' or 'dependency-check' workflow to scan for known vulnerable gems. Fix: Add a
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.