Skip to content
CAI
Software that uses CAICheck a score

sj26/mailcatcher

51.1

Adequate · 26 September 2026

10.9k

lines of production code

JavaScript

with Ruby

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

MailCatcher is a Ruby-based tool that intercepts SMTP traffic for local development and testing, storing received emails in an in-memory SQLite database. It provides a web interface built with Sinatra and Faye WebSockets to view, search, and inspect message content in real-time. The system includes CLI utilities for sending test emails and comprehensive test suites to ensure reliability across its HTTP API and message handling features.

Features

Add catchmail CLI and refactor mailcatcher startup

A new \catchmail\ command-line tool is introduced, providing a sendmail-like interface that reads email from stdin and forwards it to the MailCatcher SMTP server, supporting options for the sender address (\-f\), SMTP host/port, and ignoring standard sendmail flags (\-oi\, \-t\, \-q\). The existing \mailcatcher\ binary is refactored to use \MailCatcher.run!\ instead of the previous explicit run sequence, and the startup banner messages are removed.

bin · high confidence

Added sample email files for testing various MIME types and edge cases

The examples directory now includes a comprehensive set of sample email files covering plain text, HTML, XHTML, multipart (alternative and mixed), quoted-printable encoding, inline images, attachments, UTF-8 content, and specific edge cases like SMTP dot-stuffing and unknown content types. These files serve as test data for validating mail parsing and display capabilities.

examples · high confidence

Added setup and resume scripts for the Amp orb environment

New executable scripts have been added to the .agents directory to prepare the environment for the Amp orb. The setup script installs required system packages (including Chromium, Ruby, and Node.js) and Ruby dependencies via Bundler, while the resume script verifies that these prerequisites are present and reports readiness.

.agents · high confidence

Serve frontend assets directly

The application now serves its frontend assets directly from the public directory, including the main application script (mailcatcher.js), styles (mailcatcher.css), and several third-party libraries such as jQuery v3.4.1, Date.js, favcount.js, keymaster.js, Modernizr v2.7.1, and a URL polyfill. This change ensures that the web interface loads its necessary client-side resources for rendering the message list, handling keyboard shortcuts, updating the favicon count, and formatting dates.

public · high confidence

Behavioural changes

Added placeholder for temporary directory

A .gitkeep file was added to the tmp directory to ensure the folder is tracked by version control, allowing test artifacts to be placed there without the directory being ignored.

tmp · low confidence

MailCatcher UI migrated from HAML to ERB with enhanced navigation and error handling

The MailCatcher web interface has been rebuilt using ERB templates instead of HAML, introducing a dedicated 404 error page for missing messages and a redesigned main dashboard. The new UI features a search input in the navigation bar, a noscript overlay to inform users when JavaScript is disabled, and explicit format tabs (HTML, Plain Text, Source) that can be opened in new tabs. This change also includes the integration of modernizr, jQuery, and other client-side assets to support these interactive features.

views · high confidence

MailCatcher library refactored with modular architecture and daemon support

The core library has been significantly restructured to improve maintainability and runtime behavior. The monolithic codebase is now split into autoloaded modules (Bus, Mail, Smtp, Web), replacing the previous inline class definitions. The application now supports running as a background daemon by default using Process.daemon, removing the dependency on the external 'daemons' gem. Additionally, the SMTP server implementation has been updated to handle message reception more robustly, and the web interface logic has been separated into its own module. Platform-specific logic for Windows and browser launching has also been consolidated.

lib · high confidence

MailCatcher v0.11.0: EventMachine-based architecture with configurable HTTP path

MailCatcher has been updated to version 0.11.0, introducing a complete architectural shift to an EventMachine-based server model. The SMTP service now runs asynchronously, allowing multiple MAIL FROM commands per connection and supporting the advertised size extension. Message storage and retrieval are handled via an in-memory SQLite3 database with foreign key constraints, ensuring data integrity for message parts. The web interface is now served through a Rack application that respects a configurable \http\_path\ option, allowing the UI to be mounted at a custom URL while redirecting the root path. Real-time updates are powered by an EventMachine channel bus, pushing add, remove, and clear events to the frontend.

_lib/mail\catcher · high confidence

Refactored web application to use Sinatra and Faye WebSockets

The web interface has been rewritten to use the Sinatra framework instead of the previous implementation, providing a cleaner structure for HTTP routes and WebSocket handling. This change introduces Faye for WebSocket connections to deliver real-time message updates, with improved lifecycle management to ensure connections close cleanly when the server stops. The new application also supports configurable HTTP paths via the \http\_path\ option and handles encoding issues more robustly by explicitly setting content types and character sets for HTML, plain text, and source views.

_lib/mail\catcher/web · high confidence

Test coverage

Comprehensive test coverage for MailCatcher features

Added extensive RSpec test suites covering the HTTP API, CLI commands, message delivery, inbox management, configuration options, and Docker integration to ensure reliability across all user-facing capabilities.

spec · high confidence

Dependencies

MailCatcher now requires Ruby 3.3+ and updates core dependencies

MailCatcher has been updated to require Ruby 3.3 or higher, dropping support for older Ruby versions. The gem's dependency stack has been modernized: it now uses Sinatra 4.2, Rack 3.2, Thin 2.0, and SQLite3 2.0, while switching from the legacy EventMachine to Faye-WebSocket for WebSocket support. Development dependencies have also been updated to use RSpec and Capybara for testing.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 47 → 51 (+4.2)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 61 (-39.1)
  • Architecture 69 → 99 (+30.1)
  • Maturity 57 → 57 (+0.0)
  • Readiness 25 → 52 (+26.8)
  • Security 73 → 79 (+6.7)
  • Accessibility 42 (new)

Resolved (14)

  • Coverage not measured — test suite did not build
  • Dimension evaluation failed
  • High IaC: DS-0022 (Dockerfile)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No exposed public API
  • No tests found
  • Test reliability not included

New (53)

  • (anonymous)::dispatch (cognitive 50) (public/assets/keymaster.js)
  • (anonymous)::dispatch (cyclomatic 27) (public/assets/keymaster.js)
  • (anonymous)::parse (cognitive 256) (public/assets/url.js)
  • (anonymous)::parse (cyclomatic 166) (public/assets/url.js)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • FileTooLong: assets/jquery.js (public/assets/jquery.js)
  • FunctionTooLong: url.parse (public/assets/url.js)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Medium IaC: WD-DOCKER-0003 (Dockerfile)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • No SBOM
  • No artifact signing
  • …and 33 more

Changes since last survey

  • 52 commits — 49 feature/other, 3 fixes

By area

  • (root) — 17 commits
  • (repo) — 16 commits
  • .github/workflows — 8 commits
  • assets/stylesheets — 2 commits
  • lib/mail_catcher — 2 commits
  • .agents/resume — 1 commit
  • assets/javascripts — 1 commit
  • bin/catchmail — 1 commit
  • examples/inlinemail — 1 commit
  • public/assets — 1 commit
  • spec/api_spec.rb — 1 commit
  • spec/spec_helper.rb — 1 commit

Notable commits

  • fix: Fix and cover command-line workflows
  • fix: Merge pull request #578 from paulwfield/fix/update-vulnerable-gem-dependencies
  • fix: Merge pull request #594 from sj26/fix-docker-authors-label
  • change: Add project title and documentation to image metadata
  • change: Automate releases across package registries
  • change: Bump v0.11.0
  • change: Check RubyGems versions through API
  • change: Convert browser client to modern JavaScript
  • change: Convert stylesheet to modern CSS
  • change: Cover configured application behavior
  • change: Cover the documented HTTP API
  • change: Expand browser and SMTP feature coverage
  • change: Inline Compass stylesheet behavior
  • change: Keep Docker CI on the published gem
  • change: Merge pull request #564 from Envek/patch-1
  • change: Merge pull request #567 from joshRpowell/bump-ruby-3-4
  • change: Merge pull request #581 from sj26/amp
  • change: Merge pull request #582 from sj26/amp-modernize-ci
  • change: Merge pull request #584 from sj26/expand-feature-coverage
  • change: Merge pull request #585 from sj26/ruby-3-4-support
  • …and 32 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

sj26/mailcatcher was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 26 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit eaf7c8288754947e419814cbbbd98f07b3365a4d — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-d0929f7ac71f.