Skip to content
CAI
Software that uses CAICheck a score

jhawthorn/vernier

66.0

Adequate · 20 September 2026

2.7k

lines of production code

Ruby

with C++

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Vernier is a Ruby gem that provides a command-line interface and library for capturing time-based and memory-retention performance profiles. It supports profiling complex concurrency patterns and integrates with frameworks like Rails via instrumentation hooks. The system exports data in multiple formats, including Firefox profiler, Chrome DevTools, and Markdown, for visualization and analysis.

How it got here

2022 — Vernier initial release and feature expansion

7 changes.

This period marks the initial release of Vernier, a next-generation Ruby sampling profiler, introducing core capabilities for time-based and retained-memory profiling with Firefox ecosystem integration. Subsequent work expanded the toolset with heap and memory tracking features, a structured profiling API, and multiple output formats, while simultaneously establishing comprehensive test coverage and refining gem dependencies.

2023–2024 — CLI interface and output expansion

6 changes.

This period focused on establishing a dedicated command-line interface with run and view subcommands, alongside expanding output capabilities to include Chrome DevTools, Markdown, and terminal table formats. It also introduced instrumentation hooks for Rails and memory tracking, supported by comprehensive test coverage and advanced concurrency examples.

Features

Add heap and memory tracking capabilities

The extension now includes a HeapTracker and MemoryTracker, enabling users to profile object allocation, deallocation, and resident set size (RSS). HeapTracker records object lifecycles and stack traces via Ruby tracepoints, while MemoryTracker samples RSS at regular intervals on Linux and macOS. These features are exposed through new C++ source files (heap\_tracker.cc, memory.cc) and supporting infrastructure (stack\_table, periodic\_thread, signal\_safe\_semaphore).

ext · high confidence

Add instrumentation hooks for ActiveSupport notifications and memory usage

This change introduces two new profiling hooks within the \lib/vernier/hooks\ directory. The new \ActiveSupport\ hook subscribes to Rails notification events (excluding internal topics starting with \!\) and maps them to specific Firefox marker schemas for SQL queries, controller actions, cache operations, and view rendering, allowing users to visualize these framework activities in their performance profiles. Additionally, the new \MemoryUsage\ hook integrates with a memory tracker to record memory consumption samples over time, exposing this data as a dedicated counter in the profiler output.

lib/vernier/hooks · high confidence

Add vernier CLI entry point

A new executable script \bin/vernier\ has been added to the project. This script serves as the command-line interface entry point, delegating execution to the main implementation located in \exe/vernier\.

bin · high confidence

Initial release of Vernier, a next-generation Ruby sampling profiler

This change introduces Vernier, a new Ruby gem for profiling that supports Ruby 3.2.1+ on Unix-like systems. It provides command-line tools, Ruby APIs, and Rack middleware to capture time-based and retained-memory profiles, which can be visualized via Flame Graphs or Stack Charts in the Firefox profiler ecosystem. The release includes built-in hooks for ActiveSupport and memory usage, support for custom hooks with Firefox profiler integration, and configuration options for sampling intervals and allocation tracking.

(repo-wide) · high confidence

Introduce vernier CLI for profiling and viewing

Adds a new \vernier\ executable that provides \run\ and \view\ subcommands. The \run\ command profiles a target command with configurable sampling intervals, allocation tracking, signal-based start/stop, and instrumentation hooks (e.g., Rails), outputting profiles in Firefox or cpuprofile formats. The \view\ command displays profiling results as an inverted call tree and file listing, supporting gzip-compressed input files.

exe · high confidence

New output formats: Chrome CPU profile, Markdown, and CLI 'top' table

Vernier now supports generating profiles in the Chrome DevTools CPU profile format (cpuprofile.rb), a Markdown report for AI-friendly consumption (markdown.rb), and a terminal 'top'-style table (top.rb). The Markdown output includes a summary of metrics (mode, duration, samples, threads), user metadata, and tables of top hotspots by self and total time. The Chrome CPU profile output converts the internal multi-threaded profile into the single-threaded format expected by Chrome DevTools, mapping stack tables to nodes and calculating time deltas. The 'top' output provides a quick, limited-row view of the most sampled functions in the CLI. These additions complement the existing Firefox profiler and HTML file listing outputs.

lib/vernier/output · high confidence

New profiling examples for advanced concurrency and framework integration

Added a suite of new example scripts demonstrating Vernier's capabilities with complex Ruby concurrency patterns and frameworks. These include \custom\_hook.rb\ for integrating custom event markers, \fiber\_stalls.rb\ and \gvl\_sleep.rb\ for analyzing GVL and fiber scheduling behavior, \rails.rb\ for tracing Rails applications with configurable versions and allocation sampling, \ractor.rb\ for Ractor-based concurrency, \minitest.rb\ for parallel test profiling, and \threaded\_http\_requests.rb\ for multi-threaded network I/O. Additionally, \measure\_overhead.rb\ provides a benchmarking tool to compare profiler overhead against baseline performance.

examples · high confidence

Vernier profiler v1.11.0: New memory retention analysis and output formats

Vernier now includes a RetainedCollector and MemoryLeakDetector to profile retained memory usage, allowing users to identify objects preventing garbage collection. The profiler supports writing results in Firefox, cpuprofile, and Markdown formats, with gzip compression enabled by default for JSON output. A new Rack middleware allows on-demand profiling via URL parameters, and the autorun mode now supports toggling the profiler via a configurable signal.

lib/vernier · high confidence

Removals

Removal of Vernier RBS signature file

The RBS signature file for the Vernier module (sig/vernier.rbs) has been deleted, removing the type definition for the VERSION constant and associated documentation comments.

sig · high confidence

Behavioural changes

New profiling API with start/stop and multiple output formats

Vernier now exposes a structured profiling API via \Vernier.profile\ (aliased as \trace\ and \run\) and a stateful \Vernier.start\_profile\/\stop\_profile\ pair for long-running applications. The library has been refactored to support multiple output formats including Firefox profiler, cpuprofile, Markdown, and top, alongside new capabilities like heap tracking via \HeapTracker\ and memory leak detection. Users can now configure collector options such as allocation sample rates and benefit from improved thread handling and marker recording.

lib · high confidence

Test coverage

Added test coverage for Vernier output formats; Expanded test coverage for profiling features and output formats.

Dependencies

Update gem metadata and add development dependencies

The gemspec now includes a proper summary, description, and homepage URL, replacing the previous TODO placeholders. The required Ruby version has been raised to 3.2.1 (with an environment variable override available) to align with the project's focus on next-generation profiling. Additionally, development dependencies for activesupport, gvltest, and rack have been added, while the Gemfile now explicitly includes the cgi, benchmark-ips, and zlib (\>= 3.2.1) gems to support testing and CI stability.

(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

Baseline

  • First survey — no prior run to compare against. CAI 66.

Lenses

  • Code Health 98
  • Architecture 100
  • Maturity 58
  • Readiness 53
  • Security 91
  • Domain Modelling 100

Changes since last survey

  • 300 commits — 268 feature/other, 32 fixes

By area

  • lib/vernier — 90 commits
  • ext/vernier — 61 commits
  • (repo) — 57 commits
  • (root) — 27 commits
  • .github/workflows — 18 commits
  • exe/vernier — 16 commits
  • test/test_retained_memory.rb — 10 commits
  • test/test_allocation_tracer.rb — 3 commits
  • test/test_helper.rb — 3 commits
  • test/test_memory_tracker.rb — 3 commits
  • test/integration_test.rb — 2 commits
  • test/output — 2 commits
  • test/test_allocations.rb — 2 commits
  • examples/fiber_stalls.rb — 1 commit
  • examples/gvl_sleep.rb — 1 commit
  • lib/vernier.rb — 1 commit
  • test/cpuprofile_test_helpers.rb — 1 commit
  • test/test_rack_middleware.rb — 1 commit
  • test/test_stack_table.rb — 1 commit

Notable commits

  • fix: Add user metadata to 'extra' metadata, fix integration tests
  • fix: Fix ParsedProfile func_first_lineno for markdown output
  • fix: Fix a bug where markers referenced invalid stack
  • fix: Fix allocation samples
  • fix: Fix allocation_tracer tests
  • fix: Fix backtrace test regex for <internal: entries
  • fix: Fix calling untraced object with allocation tracer
  • fix: Fix compile error on older GCC
  • fix: Fix failing retained memory test on head
  • fix: Fix flaky test
  • fix: Fix function lines
  • fix: Fix heap_tracker assertion failure on Ruby 4.1dev
  • fix: Fix idle/stalled stack nodes using wrong frame category for Firefox profiler
  • fix: Fix order in rb_data_type_t
  • fix: Fix output of vernier --version (#87)
  • fix: Fix ruby head test failures due to Class#new inlining caller changes
  • fix: Fix test, improve label
  • fix: Fix the row limit in the CLI profile output
  • fix: Fix undefined method Vernier::Result#frame_line_idx (#88)
  • fix: Fix warnings
  • …and 280 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

jhawthorn/vernier 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 20 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 d56bc846db395a14405b66b45839bf630f0e9333 — 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-b51f968c9b10.