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).
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 in as a GitHub Action in your project.
| 📍 NOTE |
|---|
| RubyGems.org was recently compromised in a hostile takeover about which many lies have been told. |
| I'm in the process of adding warnings to some important gems because I don't condone the theft of the bundler and rubygems-update projects. |
| Once publishing to gem.coop is available I will stop publishing to RubyGems.org. |
| Please see here and here for more info on what comes next. |
I maintain the following RubyGems:
- appraisal-rb / appraisal2 -
- Dynamoid / dynamoid -
- galtzo-floss / flag_shih_tzu -
- galtzo-floss / sanitize_email -
- kettle-rb / tree_haver -
- kettle-rb / ast-merge -
- omniauth / omniauth-jwt -
- omniauth / omniauth-identity -
- rdp / os -
- ruby-oauth / oauth -
- ruby-oauth / oauth2 -
- ruby-oauth / version_gem -
- 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)
ast-parsing libraries
The *-merge gem family provides intelligent, AST-based merging for various file formats. At the foundation is tree_haver, which provides a unified cross-Ruby parsing API that works seamlessly across MRI, JRuby, and TruffleRuby.
| Gem | Version | CI | Language / Format |
Parser Backend(s) | Description | |
|---|---|---|---|---|---|---|
| tree_haver | Multi | Supported Backends: MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus, Parslet | Foundation: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) | |||
| ast-merge | Text | internal | Infrastructure: Shared base classes and merge logic for all *-merge gems |
|||
| bash-merge | Bash | tree-sitter-bash (via tree_haver) | Smart merge for Bash scripts | |||
| commonmarker-merge | Markdown | Commonmarker (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) | |||
| dotenv-merge | Dotenv | internal | Smart merge for .env files |
|||
| json-merge | JSON | tree-sitter-json (via tree_haver) | Smart merge for JSON files | |||
| jsonc-merge | JSONC | tree-sitter-jsonc (via tree_haver) | ||||
| markdown-merge | Markdown | Commonmarker / Markly (via tree_haver) | Foundation: Shared base for Markdown mergers with inner code block merging | |||
| markly-merge | Markdown | Markly (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) | |||
| prism-merge | Ruby | Prism (prism std lib gem) |
Smart merge for Ruby source files | |||
| psych-merge | YAML | Psych (psych std lib gem) |
Smart merge for YAML files | |||
| rbs-merge | RBS | tree-sitter-bash (via tree_haver), RBS (rbs std lib gem) |
Smart merge for Ruby type signatures | |||
| toml-merge | TOML | Parslet + toml, Citrus + toml-rb, tree-sitter-toml (all via tree_haver) | Smart merge for TOML files |
tree_haver supports multiple parsing backends, but not all backends work on all Ruby platforms:
| Platform 👉️ TreeHaver Backend 👇️ |
MRI | JRuby | TruffleRuby | Notes |
|---|---|---|---|---|
| MRI (ruby_tree_sitter) | ✅ | ❌ | ❌ | C extension, MRI only |
| Rust (tree_stump) | ✅ | ❌ | ❌ | Rust extension via magnus/rb-sys, MRI only |
| FFI (ffi) | ✅ | ✅ | ❌ | TruffleRuby's FFI doesn't support STRUCT_BY_VALUE |
| Java (jtreesitter) | ❌ | ✅ | ❌ | JRuby only, requires grammar JARs |
| Prism (prism) | ✅ | ✅ | ✅ | Ruby parsing, stdlib in Ruby 3.4+ |
| Psych (psych) | ✅ | ✅ | ✅ | YAML parsing, stdlib |
| Citrus (citrus) | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
| Parslet (parslet) | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
| Commonmarker (commonmarker) | ✅ | ❌ | ❓ | Rust extension for Markdown (via commonmarker-merge) |
| Markly (markly) | ✅ | ❌ | ❓ | C extension for Markdown (via markly-merge) |
Legend: ✅ = Works, ❌ = Does not work, ❓ = Untested
Why some backends don't work on certain platforms:
- JRuby: Runs on the JVM; cannot load native C/Rust extensions (
.sofiles) - TruffleRuby: Has C API emulation via Sulong/LLVM, but it doesn't expose all MRI internals that native extensions require (e.g.,
RBasic.flags,rb_gc_writebarrier) - FFI on TruffleRuby: TruffleRuby's FFI implementation doesn't support returning structs by value, which tree-sitter's C API requires
Example implementations for the gem templating use case:
| Gem | Purpose | Description |
|---|---|---|
| kettle-dev | Gem Development | Gem templating tool using *-merge gems |
| kettle-jem | Gem Templating | Gem template library with smart merge support |
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 -
resque & queue plugins
rspec plugins & testing 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-rb / 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 misundertood 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-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 projects I'm involved in, with their attendant licesnses 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
- 🗓️ 2025-11-08T11:51:49Z | oauth2 (2.0.18) | 🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC)
- 🗓️ 2025-11-07T02:41:43Z | oauth (1.1.3) | 🔑 A Ruby wrapper for the original OAuth 1.0 / 1.0a spec.
- 🗓️ 2025-10-21T07:54:03Z | undrive_google (1.1.2) | 🏴☠️ Liberate files from your Google Drive with transformations
- 🗓️ 2025-10-14T00:33:04Z | omniauth-identity (3.1.5) | 🫵 Traditional username/password based authentication system for OmniAuth
- 🗓️ 2025-09-22T03:02:52Z | oauth (1.1.2) | 🔑 A Ruby wrapper for the original OAuth 1.0 / 1.0a spec.
- 🗓️ 2025-09-22T02:52:36Z | oauth (1.1.1) | 🔑 A Ruby wrapper for the original OAuth 1.0 / 1.0a spec.
- 🗓️ 2025-09-21T11:21:48Z | oauth-tty (1.0.6) | 🖥️ OAuth 1.0 / 1.0a TTY Command Line Interface
- 🗓️ 2025-09-16T03:42:22Z | oauth2 (2.0.17) | 🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC)
- 🗓️ 2025-09-14T21:14:19Z | oauth2 (2.0.16) | 🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC)
- 🗓️ 2025-09-08T08:37:57Z | oauth2 (2.0.15) | 🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC)
- 🗓️ 2025-09-05T07:59:12Z | rspec-pending_for (0.1.19) | ⏳️ 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
- 🗓️ 2025-09-02T13:04:33Z | version_gem (1.1.9) | 🔖 Versions are good. Versions are cool. Versions will win.
- 🗓️ 2025-08-31T11:39:52Z | oauth2 (2.0.14) | 🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC)
- 🗓️ 2025-08-30T22:39:45Z | oauth2 (2.0.13) | 🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC)
- 🗓️ 2025-08-24T21:11:05Z | rspec-pending_for (0.1.18) | ⏳️ 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
- 🗓️ 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
- 🗓️ 2025-09-14T23:07:29Z | 💎 ANN: oauth2 v2.0.16 w/ full E2E example (& Instagram Compat) | 🏷️ docker, security, ruby, instagram
- 🗓️ 2025-09-13T22:27:37Z | 👩🔧 How to Check License Compatibility in GHA | 🏷️ programming, opensource, githubactions, howto
- 🗓️ 2025-09-12T08:18:46Z | 💲ANN: awesome-sponsorships | 🏷️ opensource, webmonetization, sponsorships, programming
- 🗓️ 2025-09-01T03:24:45Z | 💎 ANN: oauth2 v2.0.14 | 🏷️
- 🗓️ 2025-08-30T23:13:42Z | 💎 ANN: oauth2 v2.0.13 | 🏷️ webdev, ruby, oauth, opensource
- 🗓️ 2025-08-27T03:39:03Z | 💎 ANN: stone_checksums v1.0.2 | 🏷️ programming, ruby, rubygems, security
- 🗓️ 2025-08-25T00:18:20Z | 💎 ANN: kettle-dev v1, part 1 | 🏷️ opensource, ruby, tooling, webdev
- 🗓️ 2025-08-22T07:55:13Z | 💎 ANN: kettle-test v1.0.0 | 🏷️ testing, ruby, rails, devtools
- 🦷 I'm putting more of my focus on FLOSS 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









