jhawthorn/vernier
66.0
Adequate · 20 September 2026
2.7k
lines of production code
Ruby
with C++
1
measurement over time
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.