Projects
Open source projects I maintain across various platforms. For an interactive presentation of this list with useful filters, head over to galtzo.com.
*-merge Gem Family
tree_haver
ðī TreeHaver is a cross-Ruby adapter for many AST parsing libraries; supporting MRI Ruby, JRuby, & TruffleRuby. Provides unified parsing API & AST when using ruby_tree_sitter, parslet, citrus, ffi, tree_stump (Rust), JRuby JARs, etc. As Faraday is to HTTP clients, this is for ASTs: 'Learn once & write once & run anywhere'
View tree_haver blog âtoken-resolver
ðŠ Token::Resolver provides configurable PEG-based (parslet) parsing and resolution of structured tokens (e.g., {KJ|GEM_NAME}) in arbitrary text. Useful for template ETL pipelines where tokens in template files must be resolved before format-specific merging.
View token-resolver blog âast-merge
âŊïļ Ast::Merge provides base classes, modules, and RSpec shared examples for building intelligent file mergers using AST analysis. It powers prism-merge, psych-merge, json-merge, and other format-specific merge gems.
View ast-merge blog âbash-merge
âŊïļ Bash::Merge provides smart Bash script merging that preserves comments, understands shell structure, and supports freeze blocks for protecting destination content. Perfect for merging configuration scripts and shell templates with customized destination files.
View bash-merge blog âcommonmarker-merge
âŊïļ Commonmarker::Merge provides smart Markdown file merging using Comrak (Rust) via Commonmarker. It understands document structure including headings, lists, code blocks, and tables. Perfect for merging documentation templates with customized files.
View commonmarker-merge blog âdotenv-merge
âŊïļ Dotenv::Merge provides smart .env file merging that preserves comments, understands variable assignments, and supports freeze blocks for protecting sensitive configuration. Perfect for merging environment templates with local overrides.
View dotenv-merge blog âjson-merge
âŊïļ Json::Merge provides smart JSON file merging that understands JSON structure. Perfect for merging strict JSON configuration files like package.json, tsconfig.json (without comments), and other standard JSON files. For JSON with Comments (JSONC) files like devcontainer.json and VS Code settings, use jsonc-merge instead.
View json-merge blog âjsonc-merge
âŊïļ Jsonc::Merge provides smart JSONC (JSON with Comments) file merging that preserves comments, understands JSON structure, and supports freeze blocks for protecting destination content. Perfect for merging configuration files like devcontainer.json, tsconfig.json, package.json, and VS Code settings.
View jsonc-merge blog âmarkdown-merge
âŊïļ Ast::Merge-based structure for merging Markdown files with tools like markly-merge and commonmarker-merge
View markdown-merge blog âmarkly-merge
âŊïļ Markly::Merge provides smart Markdown file merging using libcmark-gfm via Markly. It understands document structure including headings, lists, code blocks, and tables. Perfect for merging documentation templates with customized files.
View markly-merge blog âprism-merge
âŊïļ Intelligently merge two versions of a Ruby file using Prism AST analysis, similar to a smart 'git merge' specifically designed for Ruby code.
View prism-merge blog âpsych-merge
âŊïļ Psych::Merge provides smart YAML file merging that preserves comments, anchors/aliases, and supports freeze blocks for protecting destination content. Perfect for merging configuration templates with customized destination files.
View psych-merge blog ârbs-merge
âŊïļ Intelligently merge RBS type signature files by parsing and comparing AST structures. Supports freeze blocks to protect customizations, signature-based matching, and configurable merge strategies.
View rbs-merge blog âtoml-merge
âŊïļ Intelligently merges TOML files by analyzing their AST structure with tree-sitter, preserving key organization and resolving conflicts based on structural similarity.
View toml-merge blog âtree_stump
Ruby bindings for Tree-sitter written in Rust using rb_sys and magnus.
View tree_stump blog âmagnus
High level Ruby bindings. Write Ruby extension gems in Rust, or call Ruby code from a Rust binary.
View magnus blog âActiveRecord Plugins
flag_shih_tzu
Bit fields for ActiveRecord - store multiple boolean flags in a single integer column
View flag_shih_tzu blog âactiverecord-tablefree
ActiveRecord Tablefree Models provides a simple mixin for creating models that are not bound to the database. Take advantage of ActiveRecord features like validation, relationships, and nested_attributes.
View activerecord-tablefree blog âactiverecord-transactionable
Getting transactions right is hard, and this gem makes it easier.
View activerecord-transactionable blog âanonymous_active_record
Replacement for broken Class.new(ActiveRecord::Base)
View anonymous_active_record blog âcsv_pirate
CsvPirate is the easy way to create a CSV of essentially anything in Ruby, in full pirate regalia. It works better if you are wearing a tricorne!
View csv_pirate blog âshiftable
Move single records (has_one) or collections (has_many) from one parent (belongs_to) to another
View shiftable blog âsimple_column-scopes
Dynamic modules which define dynamic methods for scopes based on a dynamic array of column names
View simple_column-scopes blog âspyke-connection_lambda
Dynamic Spyke API connection plugin for the Enterprise Cloud
View spyke-connection_lambda blog âdestination_errors
Useful when a presenter deals with multiple objects that may enter into error states, and the errors need to be collected at a single point.
View destination_errors blog âLogging Tools
debug_logging
Unobtrusive debug logging for Ruby. NO LITTERING. Automatically log selected methods and their arguments as they are called at runtime!
View debug_logging blog ârequire_bench
Ruby app loading slowly, or never? Discover bootstrapping issues in Ruby by logging/benchmarking/timing-out/rescuing 'Kernel.require' & 'load'
View require_bench blog âactivesupport-logger
Rails v8 ActiveSupport::Logger backported to Rails v5.2+ & Ruby 2.7+
View activesupport-logger blog âactivesupport-broadcast_logger
Rails v8 ActiveSupport::BroadcastLogger, fixed & backported to Rails v5.2+ & Ruby 2.7+
View activesupport-broadcast_logger blog âactivesupport-tagged_logging
Rails v8 ActiveSupport::TaggedLogging, fixed & backported to Rails v5.2+ & Ruby 2.7+
View activesupport-tagged_logging blog âpretty_feed
PrettyFeed provides a modulizer you can include in a job, worker, class, rake task, etc, which allows for simple pass/fail logging colorization. Defaults are `truthy: 'green'` and `falsey: 'red'`.
View pretty_feed blog âreact-rails-benchmark_renderer
Concern::Instrumentation Plugin for React::Rails Render Benchmarking with a reference implementation
View react-rails-benchmark_renderer blog âhumorous_log_formatter
Humorous Log Levels and Color For Rails. Customizable!
View humorous_log_formatter blog âRSpec Plugins
appraisal2
Appraisal2 integrates with bundler and rake to test your library against different versions of dependencies in repeatable scenarios called "appraisals."
View appraisal2 blog ârspec-stubbed_env
Stub or hide environment variables in a scoped context for testing stub_env('REDIS_URL' => 'redis://localhost:6379/') hide_env('SESSION_SECRET')
View rspec-stubbed_env blog âtimecop-rspec
âïļ Timecop::Rspec provides Timecop time-machines for RSpec that allow youto time-travel test examples, context/describes, and/or your entire test suite. Find out how your code will behave... in the future! Fund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev
View timecop-rspec blog ârspec-block_is_expected
subject { Integer(nil) }; it('raises') { block_is_expected.to raise_error(TypeError) }
View rspec-block_is_expected blog ârspec-pending_for
âģïļ Mark specs pending or skipped for specific Ruby engine (e.g. MRI or JRuby) & versions, or version ranges. Fund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev
View rspec-pending_for blog âsilent_stream
ð (formerly) ActiveSupport Kernel Reporting Detritus with a few enhancementsFund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev
View silent_stream blog âLooking for Maintainers!
rack-insight
Debugging toolbar for Rack applications implemented as middleware. Based on logical-insight and rack-bug.
View rack-insight blog ârack-toolbar
Provides an easy way to create Rack Middleware that injects things into the response body. Extracted from rack-insight.
View rack-toolbar blog âcapistrano_mailer
Capistrano Deployment Email Notification. Keep the whole team informed of each release!
View capistrano_mailer blog âcelluloid-io-pg-listener
Asynchronously LISTEN for Postgresql NOTIFY messages with payloads and Do Something
View celluloid-io-pg-listener blog âletter_group
Organize data results from raw sql queries (as with PGresult, or Dossier) intelligently.
View letter_group blog âinclude_with_respect
Find out if your Module include/extend hooks are misbehaving!
View include_with_respect blog âstrict_states
Safely access state machine states with guarantee that there are no typos. Compatible with all Ruby state machine libraries.
View strict_states blog âThanks for the Memories!
cacheable_flash
Allows caching of pages with flash messages by rendering flash messages from a cookie using JavaScript, instead of statically in your Rails view template. Flash contents are converted to JSON and placed in a cookie by an after_filter (default) or a Rack Middleware (option).
View cacheable_flash blog âstackable_flash
Allows flashes to stack intelligently, while preserving existing behavior of the Rails FlashHash
View stackable_flash blog âRails Plugins
dynamoid
Dynamoid is an ORM for Amazon's DynamoDB that supports offline development, associations, querying, and everything else you'd expect from an ActiveRecord-style replacement.
View dynamoid blog âsanitize_email
Email Condom for your Ruby Server. In Rails, Sinatra, et al, or simply the mail gem: Aids in development, testing, qa, and production troubleshooting of email issues without worrying that emails will get sent to actual live addresses.
View sanitize_email blog ârails
Ruby on Rails is a full-stack web framework optimized for programmer happiness and sustainable productivity. It encourages beautiful code by favoring convention over configuration.
View rails blog âdry_views
Provides extensions to ActionView::Helpers::CaptureHelper: content_for_with_default, no_content_for, and an enhanced content_for that plays nice with friends
View dry_views blog âstatus_tag
Provides content_tag_for method signature to create customizable and logic-gated labels from objects. Also includes a presenter base class to allow any Ruby web framework to create logic around HTML tags
View status_tag blog âcontroller_validator
Use the familiar ActiveModel::Errors pattern for controller validations
View controller_validator blog ârails_env_local
If existing infrastructure for deployed environments has names that conflict with Rails' default non-deployed environments, e.g., "development" and "test", this gem allows renaming them locally. You can rename "development" to "localdev", for example, to prevent confusion. But before using this gem, consider whether renaming your existing environments to remove the conflict might be a better long-term solution.
View rails_env_local blog âsuper_exception_notifier
In the Rails v2 era, this was a popular fork of exception_notification, with many extra features. It is now deprecated in favor of the original gem.
View super_exception_notifier blog âRubyGems/Bundler Plugins
cyclonedx-ruby
Creates CycloneDX Software Bill of Materials (SBOM) from Ruby projects
View cyclonedx-ruby blog âstone_checksums
ðŋ Generate both SHA256 & SHA512 checksums into the checksums directory, and git commit them. gem install stone_checksums Then, use the rake task or the script: rake build:generate_checksums gem_checksums Control options with ENV variables! Fund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev
View stone_checksums blog âbundler
Bundler manages an application's dependencies through its entire life, across many machines, systematically and repeatably
View bundler blog âgem_bench
* Benchmark different versions of same or similar gems * Copy & Re-namespace any gem to benchmark side-by-side with `benchmarks-ips` * Enforce Gemfile version constraints * Regex search across all installed gem's source code to find issues quickly * Trim down app load times by keeping your worst players on the bench (useful for beating Heroku slug load time cutoff)
View gem_bench blog âfloss_funding
Help overlooked open source projects - the ones at the bottom of the stack, and the dev dependencies - by funding them.
View floss_funding blog âsetup-ruby-flash
GHA: âĄïļFast Setup of Ruby & Gems via rv & ore (alternative to setup-ruby, with fallback to setup-ruby)
View setup-ruby-flash blog âskywalking-eyes
A full-featured license tool to check and fix license headers and resolve dependencies' licenses. I added compatibility with rubygems and bundler. Enhanced the license checker dataset to include all licenses on spdx.org. Added configurations for ASF Category A and B licenses. Enabled specification of FSF Free/Libre and OSI Approved requirements. Learn how to add it to your project!
View skywalking-eyes blog âKettle-RB Family
kettle-dev
ðē Kettle::Dev is a meta tool from kettle-rb to streamline development and testing. Acts as a shim dependency, pulling in many other dependencies, to give you OOTB productivity with a RubyGem, or Ruby app project. Configures a complete set of Rake tasks, for all the libraries is brings in, so they arrive ready to go. Fund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev
View kettle-dev blog âkettle-test
ðē Kettle::Test is a meta tool from kettle-rb to streamline testing. Acts as a shim dependency, pulling in many other dependencies, to give you OOTB productivity with a RubyGem, or Ruby app project. Configures RSpec w/ syntactic sugar to make writing tests, and testing more scenarios, easier.Configures each dependency library for proper use in the test suite, so they arrive ready to go. Fund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev
View kettle-test blog âkettle-soup-cover
A Covered Kettle of Test Coverage SOUP (Software of Unknown Provenance) Four-line SimpleCov config, w/ curated, opinionated, pre-configured, dependencies for every CI platform, batteries included.
View kettle-soup-cover blog âRuby OpenID Family
open_id_authentication
Provides a thin wrapper around the excellent rack-openid2 gem.
View open_id_authentication blog âmasq
Masq supports OpenID 2.0 and supports SReg, AX (fetch and store requests) and PAPE as well as some custom additions like multi-factor authentication using a yubikey
View masq blog ârots
Ruby OpenID Test Server (ROTS) provides a basic OpenID server made in top of the Rack gem. With this small server, you can make dummy OpenID request for testing purposes, the success of the response will depend on a parameter given on the URL of the authentication request.
View rots blog âruby-openid2
Originally a fork. Has been merged back to the original gem.
View ruby-openid2 blog ârack-openid2
Originally a fork. Has been merged back to the original gem.
View rack-openid2 blog âRuby OAuth Family
warden_oauth
warden_oauth will help you create oauth authentication strategies using the oauth helper method on the Warden::Manager config setup
View warden_oauth blog âOmniAuth Family
omniauth-identity
Traditional username/password based authentication system for OmniAuth
View omniauth-identity blog âomniauth-jwt2
Originally a fork. Has been merged back to the original gem.
View omniauth-jwt2 blog âResque Family
resque
Resque is a Redis-backed Ruby library for creating background jobs, placing them on multiple queues, and processing them later.
View resque blog âresque-unique_in_queue
A resque plugin that ensures job uniqueness at enqueue time.
View resque-unique_in_queue blog âresque-unique_at_runtime
Ensures that for a given queue, only one worker is working on a job at any given time. Example: require 'resque/plugins/unique_at_runtime' class StrictlySerialJob include Resque::Plugins::UniqueAtRuntime @queue = :serial_work def self.perform # only one at a time in this block, no parallelism allowed for this # particular queue end end
View resque-unique_at_runtime blog âresque-unique_by_arity
Configure resque-unique_in_queue and resque-unique_at_runtime uniqueness by arity of perform method, with automated cleanup tools
View resque-unique_by_arity blog âresque-lonely_job
Ensures that for a given queue, only one worker is working on a job at any given time. Example: require 'resque/plugins/lonely_job' class StrictlySerialJob extend Resque::Plugins::LonelyJob @queue = :serial_work def self.perform # only one at a time in this block, no parallelism allowed for this # particular queue end end
View resque-lonely_job blog âRuboCop-LTS Family
rubocop-lts
Configure RuboCop + a bevy of friends to gradually lint Ruby code
View rubocop-lts blog ârubocop-ruby1_8
Configure RuboCop + a bevy of friends to gradually lint Ruby 1.8 code
View rubocop-ruby1_8 blog ârubocop-ruby1_9
Configure RuboCop + a bevy of friends to gradually lint Ruby 1.9 code
View rubocop-ruby1_9 blog ârubocop-ruby2_0
Configure RuboCop + a bevy of friends to gradually lint Ruby 2.0 code
View rubocop-ruby2_0 blog ârubocop-ruby2_1
Configure RuboCop + a bevy of friends to gradually lint Ruby 2.1 code
View rubocop-ruby2_1 blog ârubocop-ruby2_2
Configure RuboCop + a bevy of friends to gradually lint Ruby 2.2 code
View rubocop-ruby2_2 blog ârubocop-ruby2_3
Configure RuboCop + a bevy of friends to gradually lint Ruby 2.3 code
View rubocop-ruby2_3 blog ârubocop-ruby2_4
Configure RuboCop + a bevy of friends to gradually lint Ruby 2.4 code
View rubocop-ruby2_4 blog ârubocop-ruby2_5
Configure RuboCop + a bevy of friends to gradually lint Ruby 2.5 code
View rubocop-ruby2_5 blog ârubocop-ruby2_6
Configure RuboCop + a bevy of friends to gradually lint Ruby 2.6 code
View rubocop-ruby2_6 blog ârubocop-ruby2_7
Configure RuboCop + a bevy of friends to gradually lint Ruby 2.7 code
View rubocop-ruby2_7 blog ârubocop-ruby3_0
Configure RuboCop + a bevy of friends to gradually lint Ruby 3.0 code
View rubocop-ruby3_0 blog ârubocop-ruby3_1
Configure RuboCop + a bevy of friends to gradually lint Ruby 3.1 code
View rubocop-ruby3_1 blog ârubocop-ruby3_2
Configure RuboCop + a bevy of friends to gradually lint Ruby 3.2 code
View rubocop-ruby3_2 blog âstandard-rubocop-lts
Enables Ruby projects to more confidently support even the most finely-aged Rubies. Part of the rubocop-lts family.
View standard-rubocop-lts blog âMiscellanous
archivist-client
archivist-client queries archive.org for book data and downloads some things.
View archivist-client blog âawesome-sponsorships
ð An Open Source Funding How To Awesome List: checklist and inspiration to earn more as a FLOSS developer
View awesome-sponsorships blog âgitmoji-regex
ð A regular expression matching Gitmoji (a subset of Unicode Emoji) symbolsFund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev
View gitmoji-regex blog âhashie
Hashie is a collection of classes and mixins that make hashes more powerful.
View hashie blog âlibrary_tree
Builds a tree of module inclusion of a target module into other modules
View library_tree blog âlogos
ðŠĩ A resource for logos, with proper attribution information, including license and copyright, for open source projects I care about.
View logos blog âservice_actor-promptable
TTY Prompt plugin for your service objects for your application logic
View service_actor-promptable blog âshields-badge
Shields::Badge.gem_total_downloads(path_parameters: {gem: 'rails'}) => "[](https://rubygems.org/gems/rails)"
View shields-badge blog âundrive_google
ðī Liberate files from your Google Drive with transformations
View undrive_google blog âyaml-converter
ðĨĻ yaml-converter parses YAML files (with inline #note: annotations and validation markers) and emits polished Markdown, HTML, and PDF/DOCX (via pandoc) outputs including a validation status line, fenced YAML blocks, and extracted notes.
View yaml-converter blog âyard-fence
ðĪš Convert ASCII braces ('{}') to full-width braces ('{}') within code fences (triple-or-single backticks) during YARD processing, and back to ASCII braces afterward
View yard-fence blog â