How I built three dry-cli extensions, then the forum's AI bot thought I was a spammer A developer announced three new Ruby gems on the dry-rb forum at about 1 a.m., and the forum's automated spam filter hid the post and silenced the account, mistaking the infrequent poster's pile of links for spam. The gems — dry-cli-help, dry-cli-ui, and a third extension — were extracted over weeks from the developer's own dry-cli command-line tools, including githuh, dss, flowengine-cli, dmez, and tilda, and published on dry-cli.tools. The developer said the filter "made a fairly understandable guess about me," describing the outcome as "not quite the launch I had pictured. // Open Source https://kig.re/categories/Open%20Source How I built three dry-cli extensions, then the forum's AI bot thought I was a spammer NOTE The image above shows the help screen of one of my CLI utilities, which will be the subject of a future post. Here it is shown to demonstrate the difference between what help screen looks like after requiring dry-cli-help gem, versus the default help screen shown below original-help . At about 1 a.m., I announced three new Ruby gems on the dry-rb forum. The forum hid the post and silenced my account. I had spent weeks extracting the gems from a CLI I was building. I had written up examples, recorded demos, and put everything on dry-cli.tools https://dry-cli.tools . Then I posted the announcement where dry-cli users might actually see it. A spam filter saw an infrequent poster with a pile of links and made a fairly understandable guess about me. That was not quite the launch I had pictured. Before I get to how it ended, here’s why I built the gems in the first place. The same chores, one CLI after another I’ve written a lot of command-line tools in Ruby. I like dry-cli https://github.com/dry-rb/dry-cli because a command is a class, options are declared in plain sight, and nested commands are easy to register. Hanami uses it too. I can get on with writing the command instead of negotiating with the framework. I wrote about using dry-cli https://kig.re/2020/09/07/writing-cli-tools-ruby-migrating-github-issues-to-pivotal-tracker.html in githuh https://rubygems.org/gems/githuh back in 2020. That tool can export GitHub issues, and its issue export command has enough options to make a cramped help screen annoying. Here’s what that looks like when the descriptions wrap: My dss command https://rubygems.org/gems/datadog-statsd-schema analyzes metric schemas before they turn into a Datadog bill. flowengine-cli https://rubygems.org/gems/flowengine-cli runs and validates flow definitions. More recently, dmez https://rubygems.org/gems/dnsmadeeasy got an export , plan , and apply workflow for DNS zone files. Different jobs, same pattern: once the command itself worked, I still had to make its help readable, show progress where the work took time, and teach the shell what could come next. By the time I started tilda , copying those pieces into one more project sounded less appealing than finally pulling them out. Then I run the command and look at the help screen. There’s no title or description for the program. Long descriptions run across the terminal on one line. Commands appear in alphabetical order, even when I would explain them in a different order. So I fix the help output for that project. Next comes a command that takes more than a few seconds. I add a spinner or progress bar and make sure it doesn’t print hundreds of carriage returns into a CI log. Then I add shell completion so mycli db