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









