Loading...
Loading...
50 new projects with 12 stars.
68 day streak.
Coding for 18 years.
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:
*-merge Gem FamilyThe *-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) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
| 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:
.so files)RBasic.flags, rb_gc_writebarrier)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 |
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 + rspec
More examples for rails-specific, or non-rspec projects are at rubocop-lts.gitlab.io
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!
rubocop-lts for library maintainer happiness 👩❤️👩.seed_migrations and oauth gems!Contribution Graph
Activity Timeline
Commits and contributions grouped by day, week, or month.
IssueCommentEvent on ustaxes/UsTaxes
February 2nd, 2026 6:24 PM
Pushed to main at kettle-rb/.github
February 2nd, 2026 6:20 PM
Pushed to main at kettle-rb/markly-merge
February 2nd, 2026 6:18 PM
Pushed to main at kettle-rb/markly-merge
February 2nd, 2026 6:45 AM
Pushed to main at kettle-rb/markly-merge
February 2nd, 2026 6:44 AM
DeleteEvent on kettle-rb/bash-merge
February 2nd, 2026 6:28 AM
Pushed to main at kettle-rb/bash-merge
February 2nd, 2026 6:28 AM
ReleaseEvent on kettle-rb/commonmarker-merge
February 2nd, 2026 2:31 AM
Pushed to main at kettle-rb/commonmarker-merge
February 2nd, 2026 2:31 AM
DeleteEvent on kettle-rb/markly-merge
February 2nd, 2026 2:29 AM