Studiosity/grover
63.7
Adequate · 20 September 2026
877
lines of production code
Ruby
with JavaScript
1
measurement over time
What this system is
Grover is a Ruby library that converts HTML content into PDFs, images, or raw HTML strings by wrapping the Puppeteer Node.js driver for Chromium. It manages the lifecycle of external browser processes and provides a configuration system with Rack middleware for automatic format conversion. The system also includes utility extensions for deep object duplication and an interactive console for development.
Features
Add deep\_dup and duplicable? methods to Object, Array, and Hash
The library now provides \deep\_dup\ and \duplicable?\ extensions for core Ruby classes. \Object\#duplicable?\ allows safe checking of whether an object can be duplicated without raising exceptions, specifically handling \Method\ and \UnboundMethod\ objects which are not duplicable. \Object\#deep\_dup\, \Array\#deep\_dup\, and \Hash\#deep\_dup\ enable creating deep copies of these structures, ensuring that nested objects are also duplicated rather than just referenced.
_lib/active\_support\ext · high confidence
Added interactive development console
A new executable script at bin/console has been added to facilitate interactive development. It sets up the Bundler environment, loads the Grover library, and launches an IRB session, allowing developers to experiment with the PDF processor in a REPL environment.
bin · high confidence
Grover v1.2.10: New configuration, middleware, and processing architecture
Grover has been updated to version 1.2.10, introducing a comprehensive configuration system and a new Rack middleware for automatic HTML-to-PDF/PNG/JPEG conversion. Users can now configure options via a central \Grover::Configuration\ class, support meta-tag based options, and enable middleware to intercept requests based on file extensions (.pdf, .png, .jpg). The update adds support for front and back cover pages, local file URIs, local network access, and JavaScript error handling. It also includes an HTML preprocessor to fix relative paths, a DevTools parser for debugging, and removes the Schmooze dependency in favor of built-in forking.
lib/grover · high confidence
Initial release of Grover HTML-to-PDF and screenshot library
This entry introduces the Grover library, providing a Ruby interface to convert HTML content (via URI or file) into PDFs, PNGs, JPEGs, or raw HTML strings. The \Grover\ class exposes methods such as \to\_pdf\, \to\_html\, \screenshot\, \to\_png\, and \to\_jpeg\, and supports configuration options for front and back cover pages, file URIs, local network access, and Puppeteer-specific settings. It also includes a global configuration mechanism (\Grover.configure\) and exposes debug output from the underlying Chromium process.
lib · high confidence
New JavaScript processor with flexible browser connection and configuration
The \lib/grover/js/processor.cjs\ file introduces a new Node.js processor that handles browser automation for document conversion. It supports connecting to an existing browser via a WebSocket endpoint or launching a new local browser instance, with fallback logic to load either \puppeteer\ or \puppeteer-core\ depending on the project's dependencies. The processor allows extensive configuration including custom launch arguments, executable paths, timeouts, user agents, viewports, media emulation, timezone settings, and CSP bypass. It also handles session isolation by creating new browser contexts when connecting via WebSocket, manages cookies and authentication, and cleans up temporary user data directories after use.
lib/grover/js · high confidence
Behavioural changes
Introduces a new Processor class for managing the Puppeteer Node.js worker process
The new \Grover::Processor\ class centralizes the logic for spawning and communicating with the external Puppeteer Node.js process. It handles process lifecycle management (spawning, cleanup), passes configuration options (including environment variables) to the Node.js runtime, and manages the JSON-based protocol for sending conversion requests and receiving results. This implementation also includes robust error handling for missing Node.js modules, parsing of JavaScript errors, and the ability to capture and expose Puppeteer DevTools debug output when enabled.
grover · high confidence
Test coverage
Added comprehensive test suite for Grover
Added RSpec tests covering the Grover configuration, middleware, HTML preprocessor, options builder, options fixer, processor, and utility methods, along with a local Sinatra test server and fixtures to validate PDF, PNG, and JPEG generation and request handling.
spec · high confidence
Dependencies
Initial release of Grover gem with Puppeteer integration
This change introduces the initial version of the Grover gem, a Ruby library that transforms HTML into PDF, PNG, or JPEG formats by wrapping the Google Puppeteer driver for Chromium. The diff establishes the core project structure, including a Gemfile that specifies dependencies such as nokogiri, childprocess, and mini\_magick, and a package.json that pins the Puppeteer development dependency to version 24.35.0. It also sets the required Ruby version to 3.0.0 or newer (below 4.1.0) and includes the gemspec defining the package metadata.
(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 64.
Lenses
- Code Health 92
- Architecture 69
- Maturity 54
- Readiness 65
- Security 92
Changes since last survey
- 227 commits — 195 feature/other, 32 fixes
By area
- (root) — 170 commits
- lib/grover — 32 commits
- spec/grover — 11 commits
- lib/grover.rb — 6 commits
- spec/grover_spec.rb — 4 commits
- .github/workflows — 2 commits
- lib/active_support_ext — 1 commit
- spec/support — 1 commit
Notable commits
- fix: Add fix for weird page width difference between Travis (linux) and Mac ruby platforms (#20)
- fix: Add missing option fixes for screenshot and viewport methods (#48)
- fix: Added basic configuration mechanism for Puppeteer options Moved PDF processor class into Grover class as a private interface Add object normalization for configuration options Fixed up rspec cop lints
- fix: Bump version to v0.2.2 Fixed some refactor bugs in middleware.. argh.. i need to add specs!
- fix: Fix "Run tests with remote browser" action step
- fix: Fix #121: stylesheets/images rendering with puppeteer v10.2.0 (#122)
- fix: Fix Puppeteer API documentation links (#67)
- fix: Fix RSpec test to avoid false error due to external request localisation (#17)
- fix: Fix RSpec/EmptyLineAfterExample issues (#44)
- fix: Fix Rubocop lint in OptionsBuilder (#186)
- fix: Fix Travis build matrix (#124)
- fix: Fix another lint (#191)
- fix: Fix bug in meta-option parsing if content contained any line starting with http (#14)
- fix: Fix bug in middleware where path/URI weren't restored after calling downstream (#79)
- fix: Fix bug masking NodeJS launch failures (#66)
- fix: Fix bugs in handling of meta tag content (inline html templates) (#3)
- fix: Fix error in processor.js when using the vision_deficiency option (#128)
- fix: Fix flake issues with PDF reading in Travis (header text size) (#1)
- fix: Fix issues with default Chromium footer template showing the encoded HTML Added pdf-reader gem to allow testing of PDF response content
- fix: Fix line length lints
- …and 207 more
Architecture
- 0 containers · 1 bounded contexts · 0 dependency edges (baseline)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
Studiosity/grover 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 8778650db0639eea62c60026a84fad7aef796d48 — 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.