<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>The Spinel Cooperative Blog</title>
    <link>/</link>
    <description>Blog posts and <code>rv</code> updates from Spinel, the Ruby open source maintainers cooperative</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 22 Jul 2026 20:00:00 +0000</lastBuildDate>
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>rv 0.6.0 is out, with &lt;code&gt;ruby-dev&lt;/code&gt;, &lt;code&gt;rvx @namespaces&lt;/code&gt;, and more</title>
      <link>/blog/rv-0.6.0-released/</link>
      <pubDate>Wed, 22 Jul 2026 20:00:00 +0000</pubDate>
      <guid>/blog/rv-0.6.0-released/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re running a bit behind on announcements, so here&amp;rsquo;s our post about releasing &lt;code&gt;rv&lt;/code&gt; version 0.6.&lt;br&gt;&lt;br&gt;The headline features added to version 0.6 are daily releases of &lt;code&gt;ruby-dev&lt;/code&gt;, adding namespace support to &lt;code&gt;rvx&lt;/code&gt;, and supporting gem servers that require authentication, for projects that use Sidekiq Pro, Avo Pro, and the like. We also added a self-update command.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ruby-dev-daily-releases&#34;&gt;&lt;code&gt;ruby-dev&lt;/code&gt; daily releases&lt;/h2&gt;&#xA;&lt;p&gt;The daily releases of &lt;code&gt;ruby-dev&lt;/code&gt; are especially helpful if you want to test your application against the latest Ruby version that&amp;rsquo;s currently in development — you don&amp;rsquo;t have to download Ruby source code, or compile it, you can simply install a build of Ruby from git that&amp;rsquo;s less than a day old, any time you want, by running &lt;code&gt;rv ruby install dev&lt;/code&gt;. We run nightly builds of Ruby and publish them to GitHub Releases, where anyone using &lt;code&gt;rv&lt;/code&gt; can try them out by spending a second or two installing. No more recompiling Ruby every time you want to try the latest — just try it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;rvx-namespaces&#34;&gt;rvx namespaces&lt;/h2&gt;&#xA;&lt;p&gt;The second change helps anyone trying to use &lt;code&gt;rvx&lt;/code&gt; to run CLI tools from gems. Before, it was possible to run &lt;code&gt;rvx gist&lt;/code&gt; and everything would work as expected. However, gem servers with namespaces, like &lt;a href=&#34;https://gem.coop&#34;&gt;gem.coop&lt;/a&gt;, didn&amp;rsquo;t have a way to instantly run gems from a namespace. Now, it&amp;rsquo;s as easy as &lt;code&gt;rvx @indirect/card&lt;/code&gt; to immediately run the CLI tool from the gem named &lt;code&gt;card&lt;/code&gt; in the &lt;a href=&#34;https://gem.coop&#34;&gt;gem.coop&lt;/a&gt; namespace &lt;code&gt;@indirect&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;server-authentication-support&#34;&gt;server authentication support&lt;/h2&gt;&#xA;&lt;p&gt;On the gem installation side of things, we built support for server authentication. That means &lt;code&gt;rv&lt;/code&gt; can now install Gemfiles that use the private gem servers for Sidekiq Pro and Avo Pro, or any Gemfile that uses an entirely private authenticated gem server.&lt;/p&gt;&#xA;&lt;h2 id=&#34;rv-self-update&#34;&gt;&lt;code&gt;rv self-update&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Finally, we added a self-update command. Many of our users install using Homebrew, and get updates automatically as part of Homebrew&amp;rsquo;s updating system. For everyone else installing &lt;code&gt;rv&lt;/code&gt; directly, the built-in self-update means that you don&amp;rsquo;t have to re-run the installer every time there&amp;rsquo;s a new version. Just run &lt;code&gt;rv selfupdate&lt;/code&gt; to get the latest version, once you&amp;rsquo;ve installed 0.6.0 or higher at least once.&lt;/p&gt;&#xA;&lt;h2 id=&#34;more-version-60-updates&#34;&gt;more version 6.0 updates&lt;/h2&gt;&#xA;&lt;p&gt;This version also includes dozens of bugfixes, and several significant compatibility improvements when working with Bundler configuration and lockfiles. Check out &lt;a href=&#34;https://github.com/spinel-coop/rv/blob/main/CHANGELOG.md#rv-060-15-june-2026&#34;&gt;the changelog&lt;/a&gt; for the full list of all 43 changes.&lt;br&gt;&lt;br&gt;We&amp;rsquo;re continuing our work on installing full &lt;code&gt;Gemfile&lt;/code&gt;s, as well as adding additional features to make &lt;code&gt;rv&lt;/code&gt; the best way to use Ruby and gems. If you&amp;rsquo;d like to help test our changes, give us feedback about how &lt;code&gt;rv&lt;/code&gt; could be better, or even help us implement new features, we&amp;rsquo;d love to have your help. Head over to &lt;a href=&#34;https://rv.dev&#34;&gt;rv.dev&lt;/a&gt; to get started, and we&amp;rsquo;ll see you soon!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Factory Frustrations: Optimized for Isolation</title>
      <link>/blog/factory-frustrations-part-one/</link>
      <pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate>
      <guid>/blog/factory-frustrations-part-one/</guid>
      <description>&lt;p&gt;When Rails developers write tests, part of that process is to arrange test data in a certain shape, in order to make assertions about the database state and domain. For example: does this active account have access to this feature they’re supposed to? Do we correctly ensure a cancelled account does not? And so on.&lt;/p&gt;&#xA;&lt;p&gt;Rails’ default approach to supplying test data is &lt;em&gt;database fixtures&lt;/em&gt; written in YAML. With fixtures, you manually write out data and relationships in N files for N associations. Fixtures prioritize speed of running tests, but many Rails developers, myself included, find the approach cumbersome and clunky to work with. The tradeoff often doesn’t feel worth the cost.&lt;/p&gt;&#xA;&lt;p&gt;A popular alternative to fixtures is &lt;em&gt;factories&lt;/em&gt;, primarily via the FactoryBot gem. With factories you don’t focus so much on relationships but just the object data for each record. Factories are easier to write than fixtures: there’s just less to think about to get started. It’s easier with factories to test your codebase, particularly during the greenfield phase.&lt;/p&gt;&#xA;&lt;p&gt;However, as the app grows and the codebase has hundreds of models, controllers and test files, the benefits of factories can start to hinder you more than help. In my experience, test suites using factories become slow and confusing, with few affordances for developing shared language within teams.&lt;/p&gt;&#xA;&lt;p&gt;In this series, I&amp;rsquo;ll go over issues I&amp;rsquo;ve seen with factory-heavy test suites and what I find difficult about the constraints they impose. It&amp;rsquo;s based on my decade of using factories at jobs and in client codebases.&lt;/p&gt;&#xA;&lt;h3 id=&#34;your-test-setups-topology&#34;&gt;Your Test Setup’s Topology&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img src=&#34;01-factories-chart.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Factories have a local-first approach where each test case is isolated, and any test data scenario is set up from scratch each time. It’s super easy to write &lt;code&gt;user = create(:user)&lt;/code&gt; when you need a user for your test, but now that test has to wait for everything about a user to be created from scratch.&lt;/p&gt;&#xA;&lt;p&gt;On top of the speed issues, this strategy makes your test data setup scattershot and spread across many test files. Within each test file, much of the setup is overall similar but slightly different. This makes it really difficult to spot what’s important or what’s just incidental.&lt;/p&gt;&#xA;&lt;p&gt;That adds cognitive load when you’re trying to update a test file. You have to learn the bespoke setup pretty much from scratch each time you revisit the file. Moreover, what you learn in one file doesn’t apply to another because it has its own slightly different setup.&lt;/p&gt;&#xA;&lt;p&gt;Let’s contrast with the fixtures approach. With fixtures we’d have a base set of test data that’s seeded once ahead of time, while still allowing for local modifications as needed. It’s annoying to visit a separate `users.yml` file every time you need to make an adjustment to the base user, but you can write `user = users(:one)` in your test and have a user without spending any time in the test on creating that user.&lt;/p&gt;&#xA;&lt;p&gt;While fixtures are more difficult at first, over time you recoup that investment because you’re working with named data sets. I have my own issues with fixtures, but we don’t have time to go into that today. I’ll explore more of the ways fixtures can help or hurt you in a later post.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-you-can-do&#34;&gt;What you can do&lt;/h3&gt;&#xA;&lt;p&gt;Rather than trap yourself with a separate factory that has to run for every test, or YAML files that might fail validations or require editing multiple files for every association, you can get the best of both worlds by building fixtures once in regular Ruby code.&lt;/p&gt;&#xA;&lt;p&gt;This strategy has been gaining mindshare lately in the Ruby community, with multiple gems now implementing this pattern. My own gem &lt;a href=&#34;https://gem.coop/@kaspth/oaken&#34;&gt;&lt;em&gt;Oaken&lt;/em&gt;&lt;/a&gt; was born directly from the pains of working with fixtures and factories after they have grown beyond what’s manageable.&lt;/p&gt;&#xA;&lt;p&gt;Using Oaken, you get a factory-like interface for creating your records, but you get fixture-like speed when running your tests, since the records are seeded once ahead of time exactly like fixtures.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# db/seeds/accounts/spinel.rb  &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;account &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; accounts&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create &lt;span style=&#34;color:#e6db74&#34;&gt;:spinel&lt;/span&gt;, name: &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;“&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Spinel&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Cooperative&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;”&lt;/span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;users&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;admin&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create &lt;span style=&#34;color:#e6db74&#34;&gt;:spinel_kasper&lt;/span&gt;, name: &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;“&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Kasper&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;”&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;accounts&lt;/span&gt;: &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;account&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# test/models/user_test.rb  &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;test_user_name&lt;/span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  assert_equal &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;“&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Kasper&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;”&lt;/span&gt;, users&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;spinel_kasper&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All the speed of fixtures, all the ease of factories. Easy.&lt;/p&gt;&#xA;&lt;p&gt;I have a lot more thoughts about both factories and fixtures, based on my work with some of the most famous Rails apps. There wasn’t room to fit everything today, but I’ll be back soon with more.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Meet Spinel</title>
      <link>/blog/meet-spinel/</link>
      <pubDate>Thu, 02 Jul 2026 21:26:13 -0700</pubDate>
      <guid>/blog/meet-spinel/</guid>
      <description>&lt;p&gt;Welcome! This is the blog of the Spinel Cooperative, and after a very busy season of new client work, we’ve finally managed to write the very first blog post we put on our todo list: this post. &lt;em&gt;What is Spinel? Who is Spinel? Why is Spinel?&lt;/em&gt; Read on to finally receive the answers to all these and questions and more.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-spinel&#34;&gt;What is Spinel?&lt;/h2&gt;&#xA;&lt;p&gt;Let’s start with the what (and the who). Spinel is a group of software developers and open source maintainers &amp;ndash; including founders of the Rails and Bundler core teams &amp;ndash; who have created a worker-owned cooperative. When I needed to find new work last year, the idea for Spinel grew from my passion for making software development a good experience for every developer (including myself!).&lt;/p&gt;&#xA;&lt;p&gt;We all deserve to experience &lt;a href=&#34;https://gigamonkeys.com/flowers/&#34;&gt;quality, speed, and joy&lt;/a&gt; both in our tools and on our teams. It&amp;rsquo;s an amazing feeling to work with a fast, reliable test suite and tools that help you instead of getting in your way. It has been an amazing experience to work with other developers that I&amp;rsquo;ve known and looked up to for many years, as we bring these values to life in ways that are as satisfying for us as they are for our clients.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-is-a-worker-owned-cooperative&#34;&gt;What is a worker-owned cooperative?&lt;/h3&gt;&#xA;&lt;p&gt;A cooperative works mostly like a regular company, but adds some rules around decision-making and profits. In a worker-owner cooperative, the people doing the work also run the company, make the decisions, and share the profits. In company decision-making, each member gets one vote. When there are profits, each member gets a share based on how much they contributed to the work.&lt;/p&gt;&#xA;&lt;h4 id=&#34;co-ops-and-open-source-projects-have-a-lot-in-common&#34;&gt;&lt;em&gt;co-ops and open source projects have a lot in common.&lt;/em&gt;&lt;/h4&gt;&#xA;&lt;p&gt;Although cooperatives are very non-traditional in the tech industry, their structure is surprisingly similar to how healthy and successful open source projects work. Most open source projects have a membership system, with some non-member contributors, and a core team of peers making decisions and working together. We may write a post in the future about what working in an OSS-developer-owned co-op has been like so far. Let us know if you’re interested in hearing more!&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-create-spinel&#34;&gt;Why create Spinel?&lt;/h2&gt;&#xA;&lt;p&gt;Across 20 years of &lt;a href=&#34;https://andre.arko.net/resume/&#34;&gt;working with Ruby and Rails professionally&lt;/a&gt;, I&amp;rsquo;ve spent years as a frontend developer, a backend developer, and an infrastructure engineer, but I&amp;rsquo;ve always had the strongest feelings about developer tools. Over and over again, I’ve seen the way developer tools impact the quality of developers’ lives and projects, and exactly how rare it is for devs to find useful, robust tools that help them do their jobs well.&lt;/p&gt;&#xA;&lt;p&gt;It’s the difference between feeling like you have to clear a path through the dense jungle of a clunky, legacy codebase, fighting you every step of the way &amp;ndash; or hiking a prepared trail through your project, with the right equipment. As software developers, we have the skills and ability to make software that is more reliable, more helpful, more useful, and better. We should do that!&lt;/p&gt;&#xA;&lt;h4 id=&#34;the-business-reality-of-open-source-work-led-us-here&#34;&gt;&lt;em&gt;the business reality of open source work led us here.&lt;/em&gt;&lt;/h4&gt;&#xA;&lt;p&gt;My open source work, from helping ship Bundler 1.0 in 2010, to working on RubyGems itself and the RubyGems.org service, has always been motivated by improving the tools we use every day. While well-intentioned, corporate support for maintaining open source is often scattershot and not sustained, leading to cycles of burnout and contributor turnover.&lt;/p&gt;&#xA;&lt;p&gt;When I created Ruby Together in 2015 in an attempt to solve those issues, we aimed to level up from &amp;ldquo;volunteers mostly keep things working&amp;rdquo; to &amp;ldquo;professionals who are giving a boost to every single Ruby developer on earth&amp;rdquo;. Many community members were supportive, but the overall model really only worked while tech companies had tons of cash floating around. Any time budgets tightened, “optional” support for open source was one of the first things to be cut. &lt;em&gt;Other people will keep supporting it, right?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;With that reality in mind, we set out to find a different model, where we can use our combined decades of expertise to offer support, advice and skills—like speeding up your development cycle from ticket to production—to developer teams and the engineers who run them.&lt;/p&gt;&#xA;&lt;p&gt;Kicking off the new, exciting project &lt;a href=&#34;https://rv.dev&#34;&gt;rv&lt;/a&gt; at the same time meant a natural source of inspiration for how we might make this work sustainable was &lt;a href=&#34;https://astral.sh&#34;&gt;Astral&lt;/a&gt;, the company behind uv for Python. Another major inspiration was Filippo Valsorda and his company &lt;a href=&#34;https://geomys.org&#34;&gt;Geomys&lt;/a&gt;. They are a great demonstration of what a company of professional open source maintainers could look like, providing major value to both their clients and the community, at the same time.&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-does-spinel-work&#34;&gt;How does Spinel work?&lt;/h2&gt;&#xA;&lt;p&gt;So, with that background in mind, what does Spinel actually do? Our goal is to make it easier to be a software developer, especially if you use Ruby. Right now, we have two main approaches to that work: we &lt;strong&gt;build open source tools&lt;/strong&gt;, and we &lt;strong&gt;make client teams more productive&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Our open source work is aimed at every Ruby developer, whether they are a student, a startup, or a Fortune 500 company. &lt;strong&gt;Our client work is especially valuable for companies between 50 and 500 engineers&lt;/strong&gt;, where adding developers dedicated to productivity creates a multiplier for the productivity of every other developer at the company.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-tools-were-building&#34;&gt;The tools we’re building&lt;/h3&gt;&#xA;&lt;p&gt;If you&amp;rsquo;ve ever worked on a Rails app in the past, you&amp;rsquo;ve used our work, including many parts of Rails itself, RubyGems, Bundler, Hotwire, Stimulus, Trix, and others. Our current projects are all based on and motivated by that past work, including &lt;a href=&#34;https://rv.dev&#34;&gt;rv&lt;/a&gt; to manage Ruby versions and gems, &lt;a href=&#34;https://github.com/kaspth/oaken&#34;&gt;oaken&lt;/a&gt; to simplify and speed up seed data for tests and development, and &lt;a href=&#34;https://codeberg.org/sstephenson/brat&#34;&gt;brat&lt;/a&gt; for writing tests that can run directly in any POSIX shell without a single dependency. We have tons of ideas about how we could make software development easier, faster, and more productive, and we think the open source model is awesome because those tools become community projects for community benefit.&lt;/p&gt;&#xA;&lt;h3 id=&#34;how-we-can-support-your-team&#34;&gt;How we can support your team&lt;/h3&gt;&#xA;&lt;p&gt;The other major thing we are doing at Spinel is taking on clients and working with them to make their software development teams more productive. The exact form the work takes can vary a lot depending on the client, but the two versions we do the most are &lt;em&gt;retainers&lt;/em&gt; and &lt;em&gt;projects&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;When we&amp;rsquo;re on a retainer&lt;/strong&gt;, we join your company Slack to answer questions, brainstorm solutions, and investigate confusing behavior. Any time you need to architect new features, solve tricky bugs, or hear about the tradeoffs between different options, we&amp;rsquo;ve got you. Over the last 20 years, we&amp;rsquo;ve probably tried most of the options at least once or twice, and we can tell you what went well, what went badly, and why you would choose one option over another.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;When we&amp;rsquo;re on a project&lt;/strong&gt;, we jump in directly to your codebase, and smooth down all the rough edges and snags of a problem that you&amp;rsquo;re having until it&amp;rsquo;s gone. &lt;em&gt;Struggling with a huge, slow test suite?&lt;/em&gt; We have optimized more legacy test suites than you can count. &lt;em&gt;Features taking too long to ship?&lt;/em&gt; We know exactly how to shrink the nested loops of editing, testing, and deploying your codebase until it&amp;rsquo;s a breeze.&lt;/p&gt;&#xA;&lt;p&gt;If your company could use that kind of help, we would love to chat. You can drop us a note or &lt;a href=&#34;https://savvycal.com/spinel/client&#34;&gt;schedule an intro chat&lt;/a&gt; to hear more.&lt;/p&gt;&#xA;&lt;p&gt;If you you&amp;rsquo;re interested in our open source projects, we’d love to have you as a contributor! We’d also be very excited if you recommended us to your boss — our client work helps sustain all the other work we do. Either way, thanks for checking us out!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>&lt;code&gt;rv&lt;/code&gt; 0.5: CLI tools &#43; Windows</title>
      <link>/blog/rv-0.5-cli-tools-windows/</link>
      <pubDate>Wed, 11 Feb 2026 11:41:00 -0800</pubDate>
      <guid>/blog/rv-0.5-cli-tools-windows/</guid>
      <description>&lt;p&gt;For almost 6 months now, &lt;a href=&#34;https://rv.dev/&#34;&gt;&lt;code&gt;rv&lt;/code&gt;&lt;/a&gt; has been installing Ruby versions in under a second, thanks to our precompiled Rubies. Today, we’re releasing &lt;code&gt;rv&lt;/code&gt; 0.5, which brings that same focus on speed to installing Ruby on Windows, running scripts with &lt;code&gt;rv run&lt;/code&gt;, and running and installing all sorts of gems and binaries via &lt;code&gt;rvx&lt;/code&gt; and the &lt;code&gt;rv tool&lt;/code&gt; commands.&lt;/p&gt;&#xA;&lt;p&gt;The new features in &lt;code&gt;rv&lt;/code&gt; version 0.5 are:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Windows support.&lt;/li&gt;&#xA;&lt;li&gt;New subcommand: &lt;code&gt;rv run&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;New command: &lt;code&gt;rvx&lt;/code&gt; (aka &lt;code&gt;rv tool run&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;New subcommand family: &lt;code&gt;rv tool&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;New subcommand: &lt;code&gt;rv selfupdate&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s look at each of these in more detail.&lt;/p&gt;&#xA;&lt;h2 id=&#34;windows-support&#34;&gt;Windows support&lt;/h2&gt;&#xA;&lt;p&gt;Thanks to the solid Windows support in the Rust language, the &lt;code&gt;rv&lt;/code&gt; tool itself has always compiled on Windows, but the &lt;a href=&#34;https://github.com/spinel-coop/rv-ruby&#34;&gt;rv-ruby&lt;/a&gt; project doesn’t create any precompiled Rubies for Windows (at least, not yet!) Without precompiled Windows Rubies, there wasn’t much point in making &lt;code&gt;rv&lt;/code&gt; available on Windows. New contributor &lt;a href=&#34;https://github.com/case&#34;&gt;@case&lt;/a&gt; changed all that, by adding support for the Windows Ruby binaries created by &lt;a href=&#34;https://github.com/oneclick/rubyinstaller2&#34;&gt;the RubyInstaller2 project&lt;/a&gt;. Now that &lt;code&gt;rv&lt;/code&gt; can install Ruby on Windows, it finally makes sense to release &lt;code&gt;rv&lt;/code&gt; for Windows.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;01-windows.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;To make installing &lt;code&gt;rv&lt;/code&gt; on Windows easy, we’ve added a PowerShell one-line installer script to the installation instructions for every release. Check out our 0.5 release for Windows &lt;a href=&#34;https://github.com/spinel-coop/rv/releases/tag/v0.5.0&#34;&gt;right here&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;p&gt;One important caveat: if you use PowerShell, there is already a built-in &lt;code&gt;rv&lt;/code&gt; command for removing environment variables. For anyone who wants to leave the existing PowerShell command in place, we offer two other options: running &lt;code&gt;rv.exe&lt;/code&gt;, or by running our Windows-specific binary, named &lt;code&gt;rvw&lt;/code&gt;. Either command will get you the same fast Ruby and gem tools, without conflicting with the PowerShell alias.&lt;/p&gt;&#xA;&lt;p&gt;Windows support has historically been a tricky situation for Bundler, so if you run into any problems or unexpected behavior, definitely &lt;a href=&#34;https://github.com/spinel-coop/rv/issues/new&#34;&gt;let us know&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;h2 id=&#34;rv-run&#34;&gt;&lt;code&gt;rv run&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;With a big boost from new contributor &lt;a href=&#34;https://github.com/phromo&#34;&gt;phromo&lt;/a&gt;, we now have a top-level &lt;code&gt;rv run&lt;/code&gt; command. What can you run with &lt;code&gt;rv run&lt;/code&gt;? Anything! Well, anything that&amp;rsquo;s in your &lt;code&gt;PATH&lt;/code&gt; or any filename. That opens up a few great new use-cases.&lt;/p&gt;&#xA;&lt;p&gt;You can use &lt;code&gt;rv run irb&lt;/code&gt; to immediately get an interactive Ruby prompt in under a second — even if Ruby wasn&amp;rsquo;t previously installed (installing Ruby via &lt;code&gt;rv&lt;/code&gt; is &lt;em&gt;fast&lt;/em&gt;). If you have a Ruby script, you can use &lt;code&gt;rv run myscript.rb&lt;/code&gt;, and we&amp;rsquo;ll install Ruby and run your script with it.&lt;/p&gt;&#xA;&lt;p&gt;You can even use &lt;code&gt;rv&lt;/code&gt; to make your Ruby scripts executable, whether or not Ruby is already installed! Just put &lt;code&gt;#!/usr/bin/env rv run ruby&lt;/code&gt; as your shebang in any script, and it’ll become executable via an &lt;code&gt;rv&lt;/code&gt;-provided Ruby.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;02-rv-run.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;re excited to see what everyone comes up with, now that it&amp;rsquo;s easier to run Ruby scripts and commands than ever before.&lt;/p&gt;&#xA;&lt;h2 id=&#34;rvx&#34;&gt;&lt;code&gt;rvx&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;We’ve added a new command, &lt;code&gt;rvx&lt;/code&gt;, which runs any command from a Ruby gem (we call these global gem-based CLIs &amp;ldquo;tools&amp;rdquo;, the same name used by &lt;code&gt;uv&lt;/code&gt;). You can run &lt;code&gt;rvx rubocop&lt;/code&gt; to run the latest version of rubocop, or &lt;code&gt;rvx rubocop@1.82&lt;/code&gt; for a specific version. Give it a try — it’s very fast! The first time &lt;code&gt;rvx&lt;/code&gt; runs a tool, it’ll download all required gems (in parallel), install them (in parallel), then run the tool. If you rerun the tool again, it’ll reuse all the cached downloads and installations, so it’ll execute near-instantly. Here’s an example:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;03-rvx-rubocop.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;By default, &lt;code&gt;rvx&lt;/code&gt; looks for an executable and a gem with the same name (e.g. &lt;code&gt;rvx nokogiri&lt;/code&gt; runs the &lt;code&gt;nokogiri&lt;/code&gt; binary provided by the nokogiri gem). If you wanted to instead run the &lt;code&gt;racc&lt;/code&gt; binary that nokogiri provides, just run &lt;code&gt;rvx --from nokogiri racc&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;04-rvx-nokogiri.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;For almost 6 months now, &lt;code&gt;rv&lt;/code&gt; has been using precompiled Rubies to install your Ruby versions in under a second. We hope we can bring that same focus on speed to downloading, installing and running gems via &lt;code&gt;rvx&lt;/code&gt;. We’re very grateful to the Rust ecosystem, which lets us use awesome crates like &lt;code&gt;tokio&lt;/code&gt; and &lt;code&gt;rayon&lt;/code&gt; to download and install gems in parallel. We hope the rest of the Ruby ecosystem embraces parallelization — please talk to us if you’d like to collaborate on speeding up other Ruby workflows!&lt;/p&gt;&#xA;&lt;h2 id=&#34;rv-tool&#34;&gt;&lt;code&gt;rv tool&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Under the hood, &lt;code&gt;rvx&lt;/code&gt; is just an alias for &lt;code&gt;rv tool run&lt;/code&gt;. When you run a tool, it’ll be downloaded and installed if you don’t already have it. You can manually install, uninstall and list your tools with &lt;code&gt;rv tool install&lt;/code&gt;, &lt;code&gt;rv tool list&lt;/code&gt; and &lt;code&gt;rv tool uninstall&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;05-rv-tool.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;rv-selfupdate&#34;&gt;&lt;code&gt;rv selfupdate&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Thanks to new contributor &lt;a href=&#34;https://github.com/duckinator&#34;&gt;duckinator&lt;/a&gt;, you can update &lt;code&gt;rv&lt;/code&gt; using itself: &lt;code&gt;rv selfupdate&lt;/code&gt; should Just Work. This is the first release with an &lt;code&gt;rv selfupdate&lt;/code&gt; command, so to upgrade from 0.4 to 0.5 you’ll have to do it the old-fashioned way, by running the installer command from the releases page. But when we release 0.5.1, you’ll be able to run &lt;code&gt;rv selfupdate&lt;/code&gt; to easily upgrade.&lt;/p&gt;&#xA;&lt;p&gt;In addition to these headlining features, we saw dozens of smaller improvements, fixes, optimizations, and generally making things work better and faster. Thank you to all of our contributors!&lt;/p&gt;&#xA;&lt;p&gt;Try out &lt;code&gt;rv&lt;/code&gt; 0.5 today by running &lt;code&gt;brew install rv&lt;/code&gt;, or using the &lt;a href=&#34;https://github.com/spinel-coop/rv/releases/tag/v0.5.0&#34;&gt;one-line installer script&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Announcing &lt;code&gt;rv clean-install&lt;/code&gt;</title>
      <link>/blog/rv-clean-install/</link>
      <pubDate>Tue, 06 Jan 2026 09:37:00 +0700</pubDate>
      <guid>/blog/rv-clean-install/</guid>
      <description>&lt;p&gt;As part of our &lt;a href=&#34;https://andre.arko.net/2025/08/25/rv-a-new-kind-of-ruby-management-tool/&#34;&gt;quest to build a fast Ruby project tool&lt;/a&gt;, we&amp;rsquo;ve been hard at work on the next step of project management: installing gems. As we&amp;rsquo;ve learned over the last 15 years of working on Bundler and RubyGems, package managers are really complicated! It&amp;rsquo;s too much to try to copy all of rbenv, and ruby-build, and RubyGems, and Bundler, all at the same time.&lt;/p&gt;&#xA;&lt;p&gt;Since we can&amp;rsquo;t ship everything at once, we spent some time discussing the first project management feature we should add after Ruby versions. Inspired by &lt;code&gt;npm&lt;/code&gt; and &lt;code&gt;orogene&lt;/code&gt;, we decided to build &lt;code&gt;clean-install&lt;/code&gt;. Today, we&amp;rsquo;re releasing the &lt;code&gt;rv clean-install&lt;/code&gt; command as part of &lt;a href=&#34;https://github.com/spinel-coop/rv/releases/tag/v0.4.1&#34;&gt;&lt;code&gt;rv&lt;/code&gt; version 0.4.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;So, what is a clean install? In this case, clean means &amp;ldquo;from a clean slate&amp;rdquo;. You can use &lt;code&gt;rv ci&lt;/code&gt; to install the packages your project needs after a fresh checkout, or before running your tests in CI. It&amp;rsquo;s useful by itself, and it&amp;rsquo;s also concrete step towards managing a project and its dependencies.&lt;/p&gt;&#xA;&lt;p&gt;Even better, it lays a lot of the groundwork for future gem management functionality, including downloading, caching, and unpacking gems, compiling native gem extensions, and providing libraries that can be loaded by Bundler at runtime.&lt;/p&gt;&#xA;&lt;p&gt;While we don&amp;rsquo;t (yet!) handle adding, removing, or updating gem versions, we&amp;rsquo;re extremely proud of the progress that we&amp;rsquo;ve made, and we&amp;rsquo;re looking forward to improving &lt;code&gt;rv&lt;/code&gt; based on your feedback.&lt;/p&gt;&#xA;&lt;p&gt;Try running &lt;code&gt;brew install rv; rv clean-install&lt;/code&gt; today, and see how it goes. Is it fast? Slow? Are there errors? What do you want to see next? &lt;a href=&#34;https://github.com/spinel-coop/rv/issues/new&#34;&gt;Let us know what you think&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Why are &lt;code&gt;exec&lt;/code&gt; and &lt;code&gt;run&lt;/code&gt; so confusing?</title>
      <link>/blog/exec-vs-run/</link>
      <pubDate>Wed, 10 Dec 2025 17:34:16 -0800</pubDate>
      <guid>/blog/exec-vs-run/</guid>
      <description>&lt;p&gt;While working on &lt;a href=&#34;https://rv.dev&#34;&gt;rv&lt;/a&gt;, there&amp;rsquo;s a specific question that has come up over and over again, in many different forms. In the simplest possible form, it boils down to:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;What is the difference between &lt;code&gt;rv exec&lt;/code&gt; and &lt;code&gt;rv run&lt;/code&gt;? Why have both?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;We haven&amp;rsquo;t finished implementing either &lt;code&gt;rv exec&lt;/code&gt; or &lt;code&gt;rv run&lt;/code&gt; yet, but every time one or the other comes up in a conversation, everything instantly becomes more confusing.&lt;/p&gt;&#xA;&lt;p&gt;This post will summarize the history of &lt;code&gt;exec&lt;/code&gt; and &lt;code&gt;run&lt;/code&gt; in Bundler, npm, Cargo, and uv. Once we have the history laid out, we can take a look at what we plan to do in rv, and you can &lt;a href=&#34;https://github.com/spinel-coop/rv/discussions/235&#34;&gt;give us your feedback&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;bundler-exec&#34;&gt;Bundler &lt;code&gt;exec&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Bundler manages project-specific packages, but not generally available &amp;ldquo;global&amp;rdquo; commands. Project-specific packages installed with Bundler can include their own commands.&lt;/p&gt;&#xA;&lt;p&gt;While working on Bundler 1.0, we needed a standard way to do something new: run commands completely scoped inside a project, rather than scoped to the entire Ruby installation on the current machine. We tried both a wrapper command (&lt;code&gt;bundle exec COMMAND&lt;/code&gt;) and generating dedicated scripts in the project&amp;rsquo;s &lt;code&gt;bin/&lt;/code&gt; directory. With binstubs, you could run &lt;code&gt;bin/rake&lt;/code&gt; to get the project rake, and &lt;code&gt;rake&lt;/code&gt; to get the global rake.&lt;/p&gt;&#xA;&lt;p&gt;I personally preferred the binstub approach, but it was &lt;code&gt;bundle exec&lt;/code&gt; that ultimately became the popular way to use commands inside your project. My theory is that it won because you can use it to run any command, including &lt;code&gt;ruby&lt;/code&gt;, or &lt;code&gt;bash&lt;/code&gt;, or anything else you want.&lt;/p&gt;&#xA;&lt;h2 id=&#34;rubygems-exec&#34;&gt;RubyGems &lt;code&gt;exec&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Somewhat confusingly (inspired by the &lt;code&gt;npm exec&lt;/code&gt; command explained below) there is a separate &lt;code&gt;gem exec&lt;/code&gt; command that is not related to Bundler and instead installs and runs a command from a package. RubyGems only manages global packages and commands, so &lt;code&gt;gem exec&lt;/code&gt; is more of a convenience to make it easier to globally install and run a package with just one command.&lt;/p&gt;&#xA;&lt;h2 id=&#34;npm-run-and-exec&#34;&gt;npm &lt;code&gt;run&lt;/code&gt; and &lt;code&gt;exec&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;npm manages both project-specific and global packages, and can install any package so its commands are available either only within a project or globally across every project that uses the same version of Node.&lt;/p&gt;&#xA;&lt;p&gt;The project-focused design of npm expects commands from project packages to be run by first adding the command to &lt;code&gt;package.json&lt;/code&gt; in the &lt;code&gt;script&lt;/code&gt; section, and the run via &lt;code&gt;npm run SCRIPT&lt;/code&gt;. This is even more inconvenient than Bundler&amp;rsquo;s binstubs, and so I think there was pent-up demand to be able to &amp;ldquo;just run a command directly&amp;rdquo;. That was eventually provided by &lt;code&gt;npm exec&lt;/code&gt; and its alias &lt;code&gt;npx&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;npx COMMAND&lt;/code&gt; setup makes it very easy to run any command, whether the package is in the local project or not, whether a script is set up or not, and even whether the package is installed at all or not. Simply running the command is enough to install the needed package and run its command.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s especially helpful to have &lt;code&gt;npx&lt;/code&gt; available when you need to create a new project by running an npm package, since it&amp;rsquo;s a huge pain to create a project and install a package and set up a script just so you can run the package to overwrite your project. The most popular example of this I am aware of is &lt;code&gt;npx create-react-app&lt;/code&gt;, but it&amp;rsquo;s a popular idiom for many packages that contain commands.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cargo-run-and-install&#34;&gt;Cargo &lt;code&gt;run&lt;/code&gt; and &lt;code&gt;install&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Cargo is simalarly a package manager, but unlike Ruby and Node, project-level packages do not include commands, and package commands are installed globally. Library packages are added to a project with &lt;code&gt;cargo add&lt;/code&gt;, while command packages are installed globally with &lt;code&gt;cargo install&lt;/code&gt;. Once a package is installed globally, it can simply be available on your &lt;code&gt;$PATH&lt;/code&gt;, and Cargo no longer has to be involved in running it.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;cargo run&lt;/code&gt; command is extremely limited in scope, and only allows you to build and run a binary created by your own project &amp;ndash; it does not work to run commands from packages, either project-local or global.&lt;/p&gt;&#xA;&lt;h2 id=&#34;uv-exec-and-run&#34;&gt;uv &lt;code&gt;exec&lt;/code&gt; and &lt;code&gt;run&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In uv, the &lt;code&gt;exec&lt;/code&gt; command seems to be most strongly inspired by &lt;code&gt;npm exec&lt;/code&gt;, including having its own short alias of &lt;code&gt;uvx&lt;/code&gt;. The &lt;code&gt;uv exec&lt;/code&gt; command is exclusively for running commands directly from packages, automatically installing them if necessary. To give an example, that means you can use &lt;code&gt;uv exec github-backup&lt;/code&gt; to install and run the github-backup command from the Python package named github-backup, whether or not that packge is included in your current project.&lt;/p&gt;&#xA;&lt;p&gt;Conversely, the &lt;code&gt;uv run&lt;/code&gt; command is closer to &lt;code&gt;bundle exec&lt;/code&gt;: it installs and configures Python, installs project packages if inside a project, and then runs a command from &lt;code&gt;$PATH&lt;/code&gt; or runs a file. That means &lt;code&gt;uv run&lt;/code&gt; can be used for both &lt;code&gt;uv run bash&lt;/code&gt; to get a shell with only your project&amp;rsquo;s Python and packages, and can also be used as &lt;code&gt;uv run myscript.py&lt;/code&gt; to run a script file directly.&lt;/p&gt;&#xA;&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;bundle exec&lt;/code&gt; runs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;commands created by your package&lt;/li&gt;&#xA;&lt;li&gt;commands from project packages (like &lt;code&gt;bundle exec rails&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;commands from $PATH (like &lt;code&gt;bundle exec bash&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;scripts from files (like &lt;code&gt;bundle exec ./myscript.rb&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;npm run&lt;/code&gt; runs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;project-defined script commands (like &lt;code&gt;npm run my-project-script&lt;/code&gt;), which can call:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;commands from project packages (like &lt;code&gt;generate_pdf.js&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;commands from $PATH (like &lt;code&gt;bash&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;scripts from files (like &lt;code&gt;./myscript.js&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;npm exec&lt;/code&gt; installs and runs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;non-project commands from any package (like &lt;code&gt;npx create-react app&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;cargo run&lt;/code&gt; builds and runs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;commands created by your package&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;uv run&lt;/code&gt; installs python and any project packages, then runs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;commands from project packages (like &lt;code&gt;uv run datasette&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;commands from $PATH (like &lt;code&gt;uv run python&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;scripts from files (like &lt;code&gt;uv run ./myscript.py&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;project-defined script commands (like &lt;code&gt;uv run my-project-script&lt;/code&gt;), which can call:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;commands from project packages (like &lt;code&gt;github-backup&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;commands from $PATH (like &lt;code&gt;bash&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;scripts from files (like &lt;code&gt;./myscript.py&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;uv exec&lt;/code&gt; installs python and the named package, then runs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;non-project commands from any package (like &lt;code&gt;uv exec github-backup&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;the-question-for-rv&#34;&gt;The question for &lt;code&gt;rv&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;With all of that background now set up, what should &lt;code&gt;rv exec&lt;/code&gt; do? What should &lt;code&gt;rv run&lt;/code&gt; do?&lt;/p&gt;&#xA;&lt;p&gt;To be the most like Bundler, we should use &lt;code&gt;rv exec&lt;/code&gt; to run commands for a project. To be the most like &lt;code&gt;npm&lt;/code&gt; and &lt;code&gt;uv&lt;/code&gt;, we should use &lt;code&gt;rv exec&lt;/code&gt; to install and run a single package with a command.&lt;/p&gt;&#xA;&lt;p&gt;Today, we&amp;rsquo;re leaning towards an option that includes all of the useful functionality from every command above, and aligns Ruby tooling with JS tooling and Python tooling:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;rv run&lt;/code&gt; installs ruby and any project packages, then runs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;commands from project packages (like &lt;code&gt;rv run rspec&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;commands from $PATH (like &lt;code&gt;rv run bash&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;scripts from files (like &lt;code&gt;rv run ./myscript.rb&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;project-defined script commands (like &lt;code&gt;rv run my-project-script&lt;/code&gt;), which can call:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;commands from project packages (like &lt;code&gt;rspec&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;commands from $PATH (like &lt;code&gt;bash&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;scripts from files (like &lt;code&gt;./myscript.rb&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;rv exec&lt;/code&gt; installs ruby and the named package, then runs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;non-project commands from any package (like &lt;code&gt;rv exec rails&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If we try to combine those two commands into one command, we quickly run into the ambiguity that has been so frustrating to handle in Bundler for all of these years: if you &lt;code&gt;rv run rake&lt;/code&gt;, do you want the global rake package? Or do you want the project-local rake package? How can we know which you want?&lt;/p&gt;&#xA;&lt;p&gt;In my opinion, &lt;code&gt;uv&lt;/code&gt; solves this relatively elegantly by having &lt;code&gt;uvx&lt;/code&gt; always run a package globally, and &lt;code&gt;uvr&lt;/code&gt; always run a package locally inside the current project, if one exists.&lt;/p&gt;&#xA;&lt;p&gt;What do you think? &lt;a href=&#34;https://github.com/spinel-coop/rv/discussions/235&#34;&gt;Let us know in the GitHub discussion about this post.&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>rv 0.3.0 released</title>
      <link>/blog/rv-0.3.0-released/</link>
      <pubDate>Mon, 08 Dec 2025 01:24:54 -0800</pubDate>
      <guid>/blog/rv-0.3.0-released/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re excited to announce &lt;code&gt;rv&lt;/code&gt; version 0.3.0 &lt;a href=&#34;https://github.com/spinel-coop/rv/releases/v0.3.0&#34;&gt;has been released&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Highlights include support for Ruby versions 3.2.x, 3.5.0-preview1, and 4.0.0-preview2, as well as automatic Ruby installation during the &lt;code&gt;rv ruby run&lt;/code&gt; command. We also added support for &lt;code&gt;.tool-versions&lt;/code&gt; files, which are also used by the &lt;a href=&#34;https://asdf-vm.com&#34;&gt;asdf&lt;/a&gt; and &lt;a href=&#34;https://mise.jdx.dev&#34;&gt;mise&lt;/a&gt; tools.&lt;/p&gt;&#xA;&lt;p&gt;Just for fun, we also added the oldest version of Ruby that has released source code: 0.49! If you&amp;rsquo;d like to try it, there are some &lt;a href=&#34;https://github.com/sampersand/ruby-0.49?tab=readme-ov-file#sample-program&#34;&gt;example scripts&lt;/a&gt; available in the &lt;a href=&#34;https://github.com/sampersand/ruby-0.49&#34;&gt;repo where @sampersand modernized the code&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Make &lt;code&gt;ruby pin&lt;/code&gt; reject invalid versions (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/223&#34;&gt;https://github.com/spinel-coop/rv/pull/223&lt;/a&gt;, @deivid-rodriguez)&lt;/li&gt;&#xA;&lt;li&gt;Test against Arch Linux (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/193&#34;&gt;https://github.com/spinel-coop/rv/pull/193&lt;/a&gt;, @case)&lt;/li&gt;&#xA;&lt;li&gt;Support Ruby preview releases (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/201&#34;&gt;https://github.com/spinel-coop/rv/pull/201&lt;/a&gt;, @indirect)&lt;/li&gt;&#xA;&lt;li&gt;Support Ruby 0.49 (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/189&#34;&gt;https://github.com/spinel-coop/rv/pull/189&lt;/a&gt;, @indirect)&lt;/li&gt;&#xA;&lt;li&gt;Install Ruby during &lt;code&gt;rv ruby run&lt;/code&gt; (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/182&#34;&gt;https://github.com/spinel-coop/rv/pull/182&lt;/a&gt;, @adamchalmers)&lt;/li&gt;&#xA;&lt;li&gt;Sign macOS binaries (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/179&#34;&gt;https://github.com/spinel-coop/rv/pull/179&lt;/a&gt;, @indirect)&lt;/li&gt;&#xA;&lt;li&gt;Support SOCKS Proxy configuration (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/175&#34;&gt;https://github.com/spinel-coop/rv/pull/175&lt;/a&gt;, @indirect)&lt;/li&gt;&#xA;&lt;li&gt;Support &lt;code&gt;.tool-versions&lt;/code&gt; file for Ruby version (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/172&#34;&gt;https://github.com/spinel-coop/rv/pull/172&lt;/a&gt;, @indirect)&lt;/li&gt;&#xA;&lt;li&gt;Add configuration for Nushell (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/170&#34;&gt;https://github.com/spinel-coop/rv/pull/170&lt;/a&gt;, @indirect)&lt;/li&gt;&#xA;&lt;li&gt;Fix fish auto-switch when shell launches (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/165&#34;&gt;https://github.com/spinel-coop/rv/pull/165&lt;/a&gt;, @Mado13)&lt;/li&gt;&#xA;&lt;li&gt;Add &lt;code&gt;rv cache prune&lt;/code&gt; (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/164&#34;&gt;https://github.com/spinel-coop/rv/pull/164&lt;/a&gt;, @savechina)&lt;/li&gt;&#xA;&lt;li&gt;Add &lt;code&gt;rv ruby uninstall&lt;/code&gt; (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/153&#34;&gt;https://github.com/spinel-coop/rv/pull/153&lt;/a&gt;, @savechina)&lt;/li&gt;&#xA;&lt;li&gt;Add &lt;code&gt;rv ruby dir&lt;/code&gt; (&lt;a href=&#34;https://github.com/spinel-coop/rv/pull/150&#34;&gt;https://github.com/spinel-coop/rv/pull/150&lt;/a&gt;, @savechina)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Special thanks to our new contributors @savechina, @Mado13, @case, and @deivid-rodriguez!&lt;/p&gt;&#xA;&lt;p&gt;Install &lt;code&gt;rv&lt;/code&gt; by running &lt;code&gt;brew install rv&lt;/code&gt;, or directly from &lt;a href=&#34;https://github.com/spinel-coop/rv/releases/&#34;&gt;releases on GitHub&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Rails Performance from Spinel</title>
      <link>/performance/</link>
      <pubDate>Sun, 01 Jan 2023 08:00:00 -0700</pubDate>
      <guid>/performance/</guid>
      <description>&lt;h2 id=&#34;we-make-rails-applications-perform&#34;&gt;We make Rails applications perform.&lt;/h2&gt;&#xA;&lt;h4 id=&#34;faster-ruby--rails-applications&#34;&gt;Faster Ruby &amp;amp; Rails applications&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Optimize application boot times, shrinking the development feedback loop to make everyday work faster&lt;/li&gt;&#xA;&lt;li&gt;Profile and target inefficient database queries, finding optimal indexes, schema adjustments, and other improvements&lt;/li&gt;&#xA;&lt;li&gt;Reduce memory and CPU usage to deliver faster responses, with fewer outliers&lt;/li&gt;&#xA;&lt;li&gt;Scale your app to 10x or 100x by systematically finding and resolving bottlenecks&lt;/li&gt;&#xA;&lt;li&gt;Provide the plugins, extensions, and libraries to solve problems quickly, without rebuilding the world from scratch&lt;/li&gt;&#xA;&lt;li&gt;Work with your team to offer documentation, training, and workshops on performance gotchas and patterns for speed&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;faster-development-cycles&#34;&gt;Faster development cycles&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Speed up CI and testing configuration, to deliver results faster and with higher confidence in what your team has built&lt;/li&gt;&#xA;&lt;li&gt;Build faster CD and deployment automation, to get code into production more frequently, and more reliably&lt;/li&gt;&#xA;&lt;li&gt;Analyze development cycle time, optimizing the entire process from request to PR to going live in production&lt;/li&gt;&#xA;&lt;li&gt;Design partnership on developer tooling, ensuring the tools we create and maintain address the needs of your developers&lt;/li&gt;&#xA;&lt;li&gt;Fully custom development tools, processes, and documentation to multiply your engineering team&amp;rsquo;s work output&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For less than the cost of one fully-loaded engineer, we can start multiplying the output of every engineer on your team. &lt;a href=&#34;mailto:hello@spinel.coop&#34;&gt;Email us&lt;/a&gt; to get started today.&lt;/p&gt;&#xA;&lt;h3 id=&#34;our-background&#34;&gt;Our background&lt;/h3&gt;&#xA;&lt;p&gt;Our team has spent years building the tools you use every day, and either created or has been on the core team of the open source projects behind every Ruby business:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rubyonrails.org&#34;&gt;&lt;code&gt;rails&lt;/code&gt;&lt;/a&gt;, the Ruby web application framework&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://hotwired.dev&#34;&gt;&lt;code&gt;hotwire (turbo + stimulus)&lt;/code&gt;&lt;/a&gt;, the default front-end framework for Rails&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://native.hotwired.dev&#34;&gt;&lt;code&gt;hotwire native&lt;/code&gt;&lt;/a&gt;, a web-first framework for building native mobile apps&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://trix-editor.org&#34;&gt;&lt;code&gt;trix&lt;/code&gt;&lt;/a&gt;, the rich-text WYSIWYG content editor for Rails&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rails/kredis&#34;&gt;&lt;code&gt;kredis&lt;/code&gt;&lt;/a&gt;, higher-level data structures built on redis&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rbenv.org&#34;&gt;&lt;code&gt;rbenv + ruby-build&lt;/code&gt;&lt;/a&gt;, the original Ruby version management tools&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rubygems/rubygems&#34;&gt;&lt;code&gt;rubygems&lt;/code&gt;&lt;/a&gt;, the Ruby standard library package manager&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bundler.io&#34;&gt;&lt;code&gt;bundler&lt;/code&gt;&lt;/a&gt;, the Ruby standard library dependency manager&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rubygems.org&#34;&gt;&lt;code&gt;rubygems.org&lt;/code&gt;&lt;/a&gt;, the Ruby language package registry&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Our newest tool is &lt;a href=&#34;https://github.com/spinel-coop/rv&#34;&gt;&lt;code&gt;rv&lt;/code&gt;&lt;/a&gt;, the next-generation Ruby version and project manager.&lt;/p&gt;&#xA;&lt;h3 id=&#34;our-team&#34;&gt;Our Team&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://arko.net/&#34;&gt;&lt;strong&gt;André Arko&lt;/strong&gt;&lt;/a&gt; helped create the Ruby dependency manager Bundler in 2009 and led the team of maintainers working on Bundler and RubyGems.org from 2014 to 2025. As a fan of the Ruby language, he wrote &lt;em&gt;The Ruby Way, 3rd Edition&lt;/em&gt; for Addison-Wesley. Outside of open source, he has spent the last 15 years consulting on tools and processes to make software teams safer, faster, and more productive.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://kaspth.com&#34;&gt;&lt;strong&gt;Kasper Timm Hansen&lt;/strong&gt;&lt;/a&gt; was on the Rails core team from 2016-2022, is the top 14th contributor, authored major features and reviewed &amp;amp; merged thousands of contributor pull requests. These days Kasper’s focus is on helping teams upskill, as well as Domain Modeling for Rails apps — including inventing the &lt;a href=&#34;https://github.com/kaspth/riffing-on-rails&#34;&gt;riffing technique&lt;/a&gt; to do so. Kasper still pushes Rails forward with gems like &lt;a href=&#34;https://github.com/kaspth/oaken&#34;&gt;Oaken&lt;/a&gt;, &lt;a href=&#34;https://github.com/kaspth/active_record-associated_object&#34;&gt;ActiveRecord::AssociatedObject&lt;/a&gt;, &lt;a href=&#34;https://github.com/kaspth/active_job-performs&#34;&gt;ActiveJob::Performs&lt;/a&gt;, and &lt;a href=&#34;https://github.com/kaspth/action_controller-stashed_redirects&#34;&gt;ActionController::StashedRedirects&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://sls.name&#34;&gt;&lt;strong&gt;Sam Stephenson&lt;/strong&gt;&lt;/a&gt; is a veteran Rubyist and member of the original Rails core team. He created Prototype.js, the Pow development server, and rbenv and ruby-build to manage Ruby versions. Later, he led development of the Trix rich text editor and Stimulus Javascript framework. He also invented the technology behind Turbo and Hotwire Native. In 2024, Sam released &lt;a href=&#34;https://n10.app&#34;&gt;N₁₀&lt;/a&gt;, a Mac app to help people stay focused on short-term goals while they work. He lives in Mexico City where he likes to feed the squirrels.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/deivid-rodriguez&#34;&gt;&lt;strong&gt;David Rodríguez&lt;/strong&gt;&lt;/a&gt; is the number one contributor to Bundler &amp;amp; RubyGems, and was primary maintainer from 2018 to 2025. During this time, he fixed many longstanding bugs, migrated to to a state-of-the-art resolver, and brought a fast release cadence to the projects, managing the release of more than a hundred versions. He has also worked on the Dependabot system at GitHub, helping everyone keep their dependencies secure in dozens of languages. He lives in Madrid, where he is a proud carless but careful person.&lt;/p&gt;&#xA;&#xA;</description>
    </item>
    <item>
      <title></title>
      <link>/rv/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/rv/</guid>
      <description></description>
    </item>
    <item>
      <title>Retainer Prospectus</title>
      <link>/prospectus/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/prospectus/</guid>
      <description>&lt;p&gt;Spinel is a cooperative of Ruby open source maintainers, founded by &lt;a href=&#34;https://arko.net&#34;&gt;André Arko&lt;/a&gt; and &lt;a href=&#34;https://kaspth.com&#34;&gt;Kasper Timm Hansen&lt;/a&gt;, and focused on a portfolio of tools to increase developer productivity with Ruby and Ruby on Rails.&lt;/p&gt;&#xA;&lt;p&gt;André helped create Bundler 1.0 in 2009, and led the joint RubyGems and Bundler team from 2014 to 2025. Kasper was a member of the Rails core team from 2016 to 2022, and is the 14th all-time contributor. They are joined by &lt;a href=&#34;https://sls.name/&#34;&gt;Sam Stephenson&lt;/a&gt;, a member of the original Rails core team and creator of Prototype.js, rbenv &amp;amp; ruby-build, Trix, Turbo, and Stimulus.&lt;/p&gt;&#xA;&lt;p&gt;Our maintainers have either created or been on the core teams of the open source behind every Ruby business:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rubyonrails.org&#34;&gt;&lt;code&gt;rails&lt;/code&gt;&lt;/a&gt;, the Ruby web application framework&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://hotwired.dev&#34;&gt;&lt;code&gt;hotwire (turbo + stimulus)&lt;/code&gt;&lt;/a&gt;, the default front-end framework for Rails&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://native.hotwired.dev&#34;&gt;&lt;code&gt;hotwire native&lt;/code&gt;&lt;/a&gt;, a web-first framework for building native mobile apps&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://trix-editor.org&#34;&gt;&lt;code&gt;trix&lt;/code&gt;&lt;/a&gt;, the rich-text WYSIWYG content editor for Rails&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rails/kredis&#34;&gt;&lt;code&gt;kredis&lt;/code&gt;&lt;/a&gt;, higher-level data structures built on redis&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rbenv.org&#34;&gt;&lt;code&gt;rbenv + ruby-build&lt;/code&gt;&lt;/a&gt;, the original Ruby version management tools&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rubygems/rubygems&#34;&gt;&lt;code&gt;rubygems&lt;/code&gt;&lt;/a&gt;, the Ruby standard library package manager&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bundler.io&#34;&gt;&lt;code&gt;bundler&lt;/code&gt;&lt;/a&gt;, the Ruby standard library dependency manager&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rubygems.org&#34;&gt;&lt;code&gt;rubygems.org&lt;/code&gt;&lt;/a&gt;, the Ruby language package registry&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The Spinel portfolio includes &lt;a href=&#34;https://rv.dev&#34;&gt;rv&lt;/a&gt;, the Ruby version and dependency manager, and Rails extensions &lt;a href=&#34;https://github.com/kaspth/oaken&#34;&gt;Oaken&lt;/a&gt;, &lt;a href=&#34;https://github.com/kaspth/active_record-associated_object&#34;&gt;ActiveRecord::AssociatedObject&lt;/a&gt;, &lt;a href=&#34;https://github.com/kaspth/active_job-performs&#34;&gt;ActiveJob::Performs&lt;/a&gt;, and &lt;a href=&#34;https://github.com/kaspth/action_controller-stashed_redirects&#34;&gt;ActionController::StashedRedirects&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A Spinel &lt;em&gt;retainer&lt;/em&gt; offers organizations direct access to the expertise of our maintainers, which would be prohibitively expensive to acquire and retain directly.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;span style=&#34;background-color: #000; color: #fff;&#34;&gt;&#xA;Retaining us gets your team all the answers they need for a fraction of the cost of a single full-time engineer.&#xA;&lt;/span&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;spinel-platinum-retainer&#34;&gt;Spinel Platinum Retainer&lt;/h2&gt;&#xA;&lt;p&gt;The platinum retainer provides extensive and unlimited access to Spinel maintainers and their expertise.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The Spinel maintainers will be available to your whole team through a dedicated Slack Connect channel. Expertise access is unlimited and can span from project issues, to upstream liaison, to adoption and deployment counseling, strategy and architecture support, Go dependency assessment, to other incident areas of expertise such as cryptography, static analysis, and performance.&lt;/p&gt;&#xA;&lt;p&gt;We encourage engineers at client organizations to think of the Spinel maintainers as another team at the company they can tap for advice.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;We will set up an introductory session for engineers to meet the maintainers, and yearly sync sessions to ensure everyone is aware of us as a resource.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In the event that a new security vulnerability is publicly disclosed in Ruby, Rails, or a portfolio project, we will be available to advise. We guarantee a response within 12h if contacted within 24h of the vulnerability’s disclosure.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;We will hold portfolio projects to the high Spinel standard of care, including timely and confidential vulnerability handling, modern feature support, complexity reduction, systematic testing, performance improvements, and strict security practices.&lt;br&gt;&#xA;We are always open to hear about other areas that could benefit from Spinel maintenance and will consider adopting important OSS projects in the Ruby ecosystem.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Your company logo displayed on spinel.coop, github.com/spinel-coop, and in Spinel talks and presentations. In addition, you can provide custom text (e.g. a hiring pitch, product description, social media link, or event announcement) to include in each Spinel monthly newsletter.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;center&gt;&#xA;&lt;span style=&#34;background-color: #000; color: #fff;&#34;&gt;&#xA;$75,000 / year&#xA;&lt;/span&gt;&#xA;&lt;/center&gt;&#xA;&lt;p&gt;Spinel retainers renew automatically indefinitely, and are meant to be a long-term relationship, but are billed month to month with no lock-in. We have experience working with the procurement processes of companies from startups to Fortune 100.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Work with Spinel</title>
      <link>/work/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/work/</guid>
      <description>&lt;h1 id=&#34;work-with-spinel&#34;&gt;Work with Spinel&lt;/h1&gt;&#xA;&lt;p&gt;At Spinel, our common work breaks down into &lt;a href=&#34;#expert-solutions&#34;&gt;solutions for your problems&lt;/a&gt;, &lt;a href=&#34;#workshops-and-training&#34;&gt;workshops to boost your team&lt;/a&gt;, or &lt;a href=&#34;#an-engineering-efficiency-team&#34;&gt;a full-fledged Engineering Efficiency team&lt;/a&gt; for your organization.&lt;/p&gt;&#xA;&lt;h2 id=&#34;expert-solutions&#34;&gt;Expert solutions&lt;/h2&gt;&#xA;&lt;p&gt;Whatever problem your team is running into, we can offer you meaningful options to resolve it.&lt;/p&gt;&#xA;&lt;p&gt;Deciding between dependencies? Unsure how to architect a new feature? We&amp;rsquo;ll walk you through the tradeoffs we&amp;rsquo;ve experienced, so you can make an informed decision.&lt;/p&gt;&#xA;&lt;p&gt;Bring us into your Slack, where we can hear about the context and work with your team to resolve any place where they are getting bogged down. Satisfaction guaranteed.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;One problem solved: $500&lt;/li&gt;&#xA;&lt;li&gt;A week of unlimited solutions: $2,500&lt;/li&gt;&#xA;&lt;li&gt;Solutions for a month: $7,500&lt;/li&gt;&#xA;&lt;li&gt;A full year of on-demand expertise: $75,000&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;workshops-and-training&#34;&gt;Workshops and training&lt;/h2&gt;&#xA;&lt;p&gt;We can help your entire team develop new skills and expertise that they can use on a daily basis while doing their work.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Riffing on Rails&lt;/strong&gt;: a new strategy for finding the best shape for your data and code, from a former rails-core member&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;It&amp;rsquo;s Your Bundle&lt;/strong&gt;: demystify dependency management and make your gems do what you need, instead of getting stuck&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Beyond Git&lt;/strong&gt;: learn to use &lt;code&gt;jj&lt;/code&gt;, the VCS originally developed at Google. What if the &lt;code&gt;git&lt;/code&gt; CLI was good, instead?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;an-engineering-efficiency-team&#34;&gt;An engineering efficiency team&lt;/h2&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve spent our entire careers chasing the &lt;a href=&#34;https://gigamonkeys.com/flowers/&#34;&gt;speed, quality, and joy&lt;/a&gt; that come from working on software using good tools. We can work with your team to build (or re-build) your tools into a force-multiplier, making everyone on your team faster and better at their jobs.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve done it at 37Signals, Gusto, One Medical, and others. We can do it for your engineering organization, and give your team a boost towards getting ahead of their backlog.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
