Hi, I'm Peter 👋
I have authored and/or currently maintain hundreds of open source libraries, including many you might use (as a developer or a consumer of the internet). Around half a percent of the RubyGems downloaded every day are ones I maintain.
GitHub's dependabot-core test runner has been migrated to use my re-architected turbo_tests2. If you use rspec you owe it to yourself to try it out! Parallelized tests with buffered, clean, safe, configurable test output.
🍁 I recently worked on the Go project for dependency license scanning Apache SkyWalking Eyes, where I integrated Bundler and gemspec (Ruby) compatibility, added ASF Category A and B license checks, FSF Free/Libre checks, and OSI Approved checks (all configurable). Learn how to use it as a GitHub Action in your project.
Most of my open source work happens in these organizations:
👣 How will my projects approach the September 2025 hostile takeover of RubyGems? 🚑️
I've summarized my thoughts in this blog post.
I maintain the following RubyGems:
- appraisal-rb / appraisal2 -
- Dynamoid / dynamoid -
- galtzo-floss / flag_shih_tzu -
- galtzo-floss / sanitize_email -
- galtzo-floss / turbo_tests2 -
- kettle-dev / kettle-dev -
- structuredmerge / ruby / tree_haver -
- structuredmerge / ruby / ast-merge -
- omniauth / omniauth-jwt -
- omniauth / omniauth-jwt2 -
- omniauth / omniauth-identity -
- omniauth / omniauth-ldap -
- rdp / os -
- ruby-oauth / anonymous_loader -
- ruby-oauth / auth-sanitizer -
- ruby-oauth / oauth -
- ruby-oauth / oauth2 -
- ruby-oauth / oauth2-mcp -
- ruby-oauth / oauth-tty -
- ruby-oauth / snaky_hash -
- ruby-oauth / version_gem -
- ruby-oauth / warden_oauth -
- ruby-openid / omniauth-openid -
- ruby-openid / rack-openid -
- ruby-openid / ruby-openid -
- many ast-parsing, benchmarking, rails, resque, rspec, rubocop plugins & more... (in details below)
StructuredMerge Ruby
StructuredMerge Ruby is the Ruby implementation of the StructuredMerge contract. The actively maintained package family is developed and released from that monorepo; its package inventory and backend notes are the authoritative source for supported formats and runtimes.
- Foundation: tree_haver, ast-merge, and ast-crispr.
- Format families: Ruby, Markdown, YAML, TOML, JSON, and RBS.
- Source-language formats: Bash, Go, Rust, and TypeScript.
- Parser providers: Prism, Psych, and the Markdown/TOML provider gems.
- Workflow tooling: ast-merge-git, smorg-rb, and kettle-jem.
benchmarking libraries
rails plugins
- galtzo-floss / active_security -
- galtzo-floss / activerecord-transactionable -
- galtzo-floss / activesupport-broadcast_logger -
- galtzo-floss / activesupport-logger -
- galtzo-floss / activesupport-tagged_logging -
- galtzo-floss / debug_logging -
- galtzo-floss / destination_errors -
- galtzo-floss / include_with_respect -
- galtzo-floss / seed_migration -
- galtzo-floss / shiftable -
- galtzo-floss / simple_column-scopes -
- galtzo-floss / spyke-connection_lambda -
- galtzo-floss / status_tag -
gem-development tooling
- appraisal-rb / appraisal2-rubocop -
- appraisal-rb / kettle-jem-appraisals -
- galtzo-floss / gitmoji-regex -
- galtzo-floss / stone_checksums -
- kettle-dev / kettle-dev -
- kettle-dev / kettle-family -
- kettle-dev / kettle-test -
- kettle-dev / kettle-changelog -
- kettle-dev / kettle-drift -
- kettle-dev / kettle-gha-pins -
- kettle-dev / kettle-ndjson -
- kettle-dev / kettle-rb -
- kettle-dev / kettle-wash -
- kettle-dev / nomono -
- kettle-dev / token-resolver -
documentation and YAML tools
resque & queue plugins
testing and development tools
- galtzo-floss / activerecord-tablefree -
- galtzo-floss / anonymous_active_record -
- galtzo-floss / json_schemer-fuzz -
- galtzo-floss / rspec-block_is_expected -
- galtzo-floss / rspec-pending_for -
- galtzo-floss / rspec-stubbed_env -
- galtzo-floss / silent_stream -
- galtzo-floss / timecop-rspec -
- kettle-dev / kettle-soup-cover -
rubocop plugins
Want RuboCop to have its rules explicitly configured for compatibility with the oldest version of Ruby that your library officially supports in two lines of code?
inherit_gem:
rubocop-lts: rubocop-lts.yml # for ruby + rspecMore examples for rails-specific, or non-rspec projects are at rubocop-lts.gitlab.io
If you think this is whatTargetRubyVersiondoes, you've misunderstood its purpose, which is to turn off rules that are incompatible with older versions of Ruby, not to make your rules configuration compatible with a specific version of Ruby, nor to turn on rules that would help with compatibility.
- rubocop-lts / rubocop-lts -
- rubocop-lts / rubocop-lts-rspec -
- rubocop-lts / rubocop-lts-ruby -
- rubocop-lts / rubocop-ruby1_8 -
- rubocop-lts / rubocop-ruby1_9 -
- rubocop-lts / rubocop-ruby2_0 -
- rubocop-lts / rubocop-ruby2_1 -
- rubocop-lts / rubocop-ruby2_2 -
- rubocop-lts / rubocop-ruby2_3 -
- rubocop-lts / rubocop-ruby2_4 -
- rubocop-lts / rubocop-ruby2_5 -
- rubocop-lts / rubocop-ruby2_6 -
- rubocop-lts / rubocop-ruby2_7 -
- rubocop-lts / rubocop-ruby3_0 -
- rubocop-lts / rubocop-ruby3_1 -
- rubocop-lts / rubocop-ruby3_2 -
- rubocop-lts / standard-rubocop-lts -
I'm attempting to document all of the logos for the FLOSS/FOSS/OSS projects I'm either involved in, or have need to render somewhere, with their attendant licenses and copyrights, here: logos.galtzo.com. It has been a multi-year effort hunting down the original creators for some of these logos, and documenting the conditions under which they can be used. I'd love to hear if this is useful in your projects!
I was laid off in a March 2025 RIF, and am looking for my next sponsor and my next role.
Want to chat about open source, or any of my projects? Join my FLOSS discord.
Or join the Ruby Friends Squad on Daily.dev
Want to pay me for work? I'm available!
Thanks to all my sponsors across any of the donation platforms! Special thanks to my biggest sponsor HealthSherpa!
- List is updated frequently by my pet robot: @autobolt
- 🗓️ 2026-08-27T23:34:23Z | resque-unique_by_arity (3.0.3) | 💎 Configure resque-unique_in_queue and resque-unique_at_runtime uniqueness by arity of perform method, with automated cleanup tools
- 🗓️ 2026-08-27T22:34:39Z | resque-unique_in_queue (2.0.2) | 💎 A resque plugin that ensures job uniqueness at enqueue time.
- 🗓️ 2026-08-27T17:52:40Z | resque-unique_at_runtime (4.0.2) | 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
- 🗓️ 2026-08-27T17:50:18Z | resque-lonely_job (1.1.4) | 💎 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
-
🗓️ 2026-08-14T03:07:51Z | debug_logging (4.1.3) | 🪲 Unobtrusive debug logging for Ruby. NO LITTERING. Automatically log selected methods and their arguments as they are called at runtime!
-
🗓️ 2026-08-14T03:05:11Z | rspec-pending_for (0.1.27) | ⏳️ 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
-
🗓️ 2026-08-13T02:38:25Z | gitmoji-regex (2.0.12) | 🏁 A regular expression matching Gitmoji (a subset of Unicode Emoji) symbolsFund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev
-
🗓️ 2026-08-13T02:37:16Z | rspec-stubbed_env (1.0.13) | 🫥 Stub or hide environment variables in a scoped context for testing stub_env('REDIS_URL' => 'redis://localhost:6379/') hide_env('SESSION_SECRET')
-
🗓️ 2026-08-12T19:15:18Z | rspec-pending_for (0.1.26) | ⏳️ 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
-
🗓️ 2026-08-07T02:16:37Z | month-serializer (1.0.2) | 🗓️ Serialize Month objects to Integer
-
🗓️ 2026-08-01T20:49:57Z | version_gem (1.1.15) | 🍲 Versions are good. Versions are cool. Versions will win.
-
🗓️ 2026-07-31T21:04:46Z | sanitize_email (2.0.14) | 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.
-
🗓️ 2026-07-31T20:14:35Z | flag_shih_tzu (1.0.5) | 🏁 Single and Multi-Bit Fields for ActiveRecord: This gem lets you use a single integer column in an ActiveRecord model to store a collection of boolean attributes (flags). Each flag can be used almost in the same way you would use any boolean attribute on an ActiveRecord object. Support for multi-bit fields, like tri-state or enums.
-
🗓️ 2026-07-31T16:17:00Z | debug_logging (4.1.2) | 🪲 Unobtrusive debug logging for Ruby. NO LITTERING. Automatically log selected methods and their arguments as they are called at runtime!
-
🗓️ 2026-07-31T14:33:39Z | rspec-pending_for (0.1.25) | ⏳️ 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
- List is updated frequently by my pet robot: @autobolt
- 🗓️ 2026-05-26T22:22:00Z | Why flag_shih_tzu is changing its default SQL for bit flags | 🏷️ ruby, rails, activerecord, bitfield
- 🗓️ 2026-05-25T04:24:26Z | yard-yaml 0.1.1: safer UTF-8 handling for YAML documentation | 🏷️ ruby, rubygems, yard, yaml
- 🗓️ 2026-05-24T06:29:36Z | yard-fence 0.9.0: cleaner YARD docs when Markdown braces get in the way | 🏷️ ruby, rubygems, yard, opensource
- 🗓️ 2026-05-24T00:35:28Z | yard-timekeeper: Stop YARD Timestamp Churn in Checked-In Docs | 🏷️ ruby, rubygem, yard, opensource
- 🗓️ 2026-04-01T05:59:42Z | 💎REL: oauth2 v2.0.18 | 🏷️ ruby, oauth, security, github
- 🗓️ 2026-02-18T06:20:33Z | 🐠 ANN: appraisal2 v3.0.6 - support frozen appraisal lockfiles | 🏷️ news, ruby, testing, tooling
- 🗓️ 2026-02-06T01:00:32Z | Hostile Takeover of RubyGems: My Thoughts | 🏷️ opensource, ruby, rails, governance
- 🗓️ 2026-01-19T03:03:27Z | ⚡️ setup-ruby-flash | 🏷️ ruby, gha, ore, rv
- 🗓️ 2025-11-06T23:39:10Z | 💲FLOSS Funding | 🏷️ career, discuss, opensource
- 🗓️ 2025-10-14T00:49:55Z | 💎 ANN: omniauth-identity v3.1.5 (Hanami/ROM Support) | 🏷️ webdev, ruby, rom, authentication
- 🗓️ 2025-09-18T06:30:38Z | 💎 ANN: oauth2 v2.0.17 | 🏷️ ruby, oauth, webdev, instagram
- 🗓️ 2025-09-15T11:53:14Z | 💎 ANN: kettle-dev v1.1.20 w/ improved CHANGELOG handling | 🏷️ devtools, ruby, packaging, automation
- 🦷 I'm putting more of my focus on FLOSS/FOSS/OSS efforts (of myself and others)!
and
from
- 👷 I build big things and small things out of tiny bits.
- ✨ Recently created
rubocop-ltsfor library maintainer happiness 👩❤️👩. - 🔭 I’m working on finishing the migration away from TravisCI to modern CI tools.
- 🌱 I’m learning Svelte & SvelteKit, with Lucia, Drizzle, Zod, Inlang Paraglide, Skeleton, Tailwind, Typescript, and so many more cool tools.
- 👯 Preparing next release of
seed_migrationsandoauthgems! - 🤔 I’ve moved my suite of Resque plugins to the Resque org!
- 📫 How to reach me
- 😄 Pronouns: He/Him
- 🗨️ I speak 3 languages fluently, and for a 4th I'm learning Bahasa Indonesia!
- 👷♂️ I help refugees and ex-refugees in Ghana🇬🇭 and Liberia🇱🇷, respectively, through Hope For Tomorrow, a Liberian NGO. DM me if interested in knowing more.
- The list is long, even in summary, see my LinkedIn.
- Open Source Contributor, OWASP | 🌪️ OWASP CycloneDX
- Open Source Contributor, ASF | 👀 Apache SkyWalking Eyes
- FLOSS Blogger | RailsBling
- FLOSS Author | RubyGems
- FLOSS Maintainer | Tidelift Enterprise OSS
- Researcher | WordTree Foundation









