<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Hulk in Public</title>
    <description>The latest articles on Forem by Hulk in Public (@hulkinpublic).</description>
    <link>https://forem.com/hulkinpublic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3936080%2F52f028d8-c445-46da-bec6-82b83097255b.png</url>
      <title>Forem: Hulk in Public</title>
      <link>https://forem.com/hulkinpublic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hulkinpublic"/>
    <language>en</language>
    <item>
      <title>I will continue using Devise with Rails 8!</title>
      <dc:creator>Hulk in Public</dc:creator>
      <pubDate>Tue, 26 May 2026 04:50:54 +0000</pubDate>
      <link>https://forem.com/hulkinpublic/i-will-continue-using-devise-with-rails-8-ice</link>
      <guid>https://forem.com/hulkinpublic/i-will-continue-using-devise-with-rails-8-ice</guid>
      <description>&lt;p&gt;I am developing a boilerplate called SuperRails.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://super-rails.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" height="512" class="m-0" width="512"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://super-rails.com/" rel="noopener noreferrer" class="c-link"&gt;
            Super Rails | Rails Boilerplate for Solopreneurs
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A production-ready Rails boilerplate with Devise, Avo, Stripe, ViewComponent and more. Skip the setup, ship your MVP in days.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" width="512" height="512"&gt;
          super-rails.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It is a collection of gems and pages that aren't in the Rails standard but are definitely convenient to have. I am currently taking on a challenge to release one product a month on YouTube, including marketing, and I can say without a doubt that I am able to continue this challenge because of SuperRails. Most MVPs can be ready to release in an instant by just adding a few models and controller actions to it.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/xk72_rz9S_g"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;For the "&lt;a href="https://lazymusic.cc/" rel="noopener noreferrer"&gt;LazyCafe&lt;/a&gt;" I released this month, I simply used SuperRails as a foundation, added a single model called "Track," and enabled it to be operated by the frontend via a JSON API. It is incredibly easy to build an MVP.&lt;/p&gt;

&lt;p&gt;Now, I use Devise as the authentication method for SuperRails.&lt;br&gt;
&lt;a href="https://www.reddit.com/r/rails/comments/1spgxyj/im_building_rails_boilerplate_with_these/" rel="noopener noreferrer"&gt;When I asked on Reddit which gem I should adopt for my boilerplate&lt;/a&gt;, I was asked why I use Devise instead of the built-in Rails 8 authentication.&lt;/p&gt;

&lt;p&gt;Frankly speaking, I have never had any issues using Devise.&lt;br&gt;
However, it seems there is a strong sentiment within the Rails community that Devise is too complex and that I should be using the standard Rails 8 authentication.&lt;br&gt;
I understand that feeling. The philosophy of Rails is to "ride the rails." In other words, as Web developers, we run like trains along the tracks that the genius DHH has built by adhering abnormally to the principle of "Convention over Configuration."&lt;br&gt;
That is the Rails community.&lt;/p&gt;

&lt;p&gt;As a Rails engineer—or rather, as a businessman—I respect him from the bottom of my heart.&lt;br&gt;
On the other hand, I didn't really see the merit in using the Rails 8 authentication feature.&lt;br&gt;
Sure, as a framework policy, it is important to provide an authentication method by default to demonstrate that "batteries are included."&lt;br&gt;
However, I see no particular reason to abandon Devise, which I have grown accustomed to using.&lt;br&gt;
I have used Devise in every single Rails project I have participated in so far.&lt;/p&gt;

&lt;p&gt;There is a claim that Devise is complex. I don't really understand that.&lt;br&gt;
It is rare that I need to customize authentication features. Moreover, as a small-scale entrepreneur, I don't have time to spend on login methods, which are not the core of my business.&lt;br&gt;
In fact, isn't it more tedious to take the code generated by &lt;code&gt;rails g authentication&lt;/code&gt;, tweak it, and try to configure it to fit your own use case? I'd have nothing to laugh about if I customized it strangely and then got hacked.&lt;/p&gt;

&lt;p&gt;It also has poor compatibility with existing libraries.&lt;br&gt;
For example, I use a fairly niche library called "any_login." This is a very convenient gem that allows you to switch login users instantly.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/igorkasyanchuk" rel="noopener noreferrer"&gt;
        igorkasyanchuk
      &lt;/a&gt; / &lt;a href="https://github.com/igorkasyanchuk/any_login" rel="noopener noreferrer"&gt;
        any_login
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Easy way to login as any user in system
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;AnyLogin Gem&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/igorkasyanchuk/any_login/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/igorkasyanchuk/any_login/actions/workflows/ci.yml/badge.svg" alt="Tests"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/igorkasyanchuk/any_login" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/43ef53e437008e81f2ef2798fd3b48bd75ecbea1d86e9dc2d341345550b77ece/68747470733a2f2f636f6465636c696d6174652e636f6d2f6769746875622f69676f726b617379616e6368756b2f616e795f6c6f67696e2f6261646765732f6770612e737667"&gt;&lt;/a&gt; &lt;a href="http://badge.fury.io/rb/any_login" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3a5803cf46606f998c4d0e15ea13aafd290cceb1634fea60bffca792e208c325/68747470733a2f2f62616467652e667572792e696f2f72622f616e795f6c6f67696e2e737667" alt="Gem Version"&gt;&lt;/a&gt;
&lt;a href="https://www.railsjazz.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Figorkasyanchuk%2Frails_time_travel%2Fraw%2Fmain%2Fdocs%2Fmy_other.svg%3Fraw%3Dtrue" alt="RailsJazz"&gt;&lt;/a&gt;
&lt;a href="https://www.patreon.com/igorkasyanchuk" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Figorkasyanchuk%2Frails_time_travel%2Fraw%2Fmain%2Fdocs%2Fpatron.svg%3Fraw%3Dtrue" alt="https://www.patreon.com/igorkasyanchuk"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://buymeacoffee.com/igorkasyanchuk" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Figorkasyanchuk%2Fget-smart%2Fraw%2Fmain%2Fdocs%2Fsnapshot-bmc-button-small.png%3Fraw%3Dtrue" alt='"Buy Me A Coffee"'&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Description&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt; available on: &lt;a href="https://any-login.herokuapp.com" rel="nofollow noopener noreferrer"&gt;https://any-login.herokuapp.com&lt;/a&gt; (source code for demo
&lt;a href="https://github.com/igorkasyanchuk/any_login_test" rel="noopener noreferrer"&gt;https://github.com/igorkasyanchuk/any_login_test&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Video Demo&lt;/strong&gt;: &lt;a href="https://youtu.be/978DlHvufSY" rel="nofollow noopener noreferrer"&gt;https://youtu.be/978DlHvufSY&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/978DlHvufSY" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/49096a8c864ba66e61921fd2c1b8574cf3ae6ddeebcd92dee7cff8fdb04c96d3/68747470733a2f2f692e7974696d672e636f6d2f76692f393738446c4876756653592f687164656661756c742e6a7067"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;AnyLogin was created to speed up the development process by allowing developers to quickly log in as any user.&lt;/p&gt;
&lt;p&gt;Give it a try; if you like it please share AnyLogin with friends. If you have any suggestions please feel free to contact me.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Requirements&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Ruby: &amp;gt;= 3.0, Rails: &amp;gt;= 6.1. Pre-configured to work with &lt;strong&gt;Devise&lt;/strong&gt;, &lt;strong&gt;Authlogic&lt;/strong&gt;, &lt;strong&gt;Clearance&lt;/strong&gt; or &lt;strong&gt;Sorcery&lt;/strong&gt; gems.&lt;/p&gt;
&lt;p&gt;For Rails &amp;lt; 4.2.7 please use &lt;code&gt;gem 'any_login', '1.3'&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add AnyLogin to your Gemfile:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gem 'any_login'&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute in console:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bundle install&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In application layout (for example &lt;code&gt;app/views/layouts/application.html.erb&lt;/code&gt;) add the following to the bottom of the page:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;= any_login_here if defined?(AnyLogin)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your app and on the bottom left corner you will see semi-transparent user icon. Click on it and now you can select any user to log in…&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/igorkasyanchuk/any_login" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Gems like Pundit and Avo also work.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/varvet" rel="noopener noreferrer"&gt;
        varvet
      &lt;/a&gt; / &lt;a href="https://github.com/varvet/pundit" rel="noopener noreferrer"&gt;
        pundit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Minimal authorization through OO design and pure Ruby classes
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Pundit&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/varvet/pundit/actions/workflows/main.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/varvet/pundit/actions/workflows/main.yml/badge.svg" alt="Main"&gt;&lt;/a&gt;
&lt;a href="https://inch-ci.org/github/varvet/pundit" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bb8a1f98558388997ec7192b761b3c7f63ebde461a44b53980a41c37f4d15cc0/68747470733a2f2f696e63682d63692e6f72672f6769746875622f7661727665742f70756e6469742e7376673f6272616e63683d6d61696e" alt="Inline docs"&gt;&lt;/a&gt;
&lt;a href="https://badge.fury.io/rb/pundit" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/642f0eb905f6779753146c43d246283f7d3429537c2005348fd83620e5a417a9/68747470733a2f2f62616467652e667572792e696f2f72622f70756e6469742e737667" alt="Gem Version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pundit provides a set of helpers which guide you in leveraging regular Ruby
classes and object oriented design patterns to build a straightforward, robust, and
scalable authorization system.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Links:&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rubydoc.info/gems/pundit" rel="nofollow noopener noreferrer"&gt;API documentation for the most recent version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/varvet/pundit" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/varvet/pundit/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/varvet/pundit/blob/main/CODE_OF_CONDUCT.md" rel="noopener noreferrer"&gt;Code of Conduct&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sponsored by:&lt;/strong&gt; &lt;a href="https://www.varvet.com" rel="nofollow noopener noreferrer"&gt;Varvet&lt;br&gt;&lt;br&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F99166%2F317898970-aa9efa0a-6903-4037-abee-1824edc57f1a.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Nzk3NzEzNTIsIm5iZiI6MTc3OTc3MTA1MiwicGF0aCI6Ii85OTE2Ni8zMTc4OTg5NzAtYWE5ZWZhMGEtNjkwMy00MDM3LWFiZWUtMTgyNGVkYzU3ZjFhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA1MjYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNTI2VDA0NTA1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWJhNjZkNzQzZmY3YzhkMjU1ZTZhODY1MGU2YmZiNzIxZTAzNzdmOTY2MTdlMjM0YTU4Njk2MTAxM2Y4ZjdhNzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.XIOGk-eFrqOJFQj3HrBeIzJy4nL47NawmrQgQvimuDM" alt="Varvet logo" height="120"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Please note&lt;/strong&gt; that the README on GitHub is accurate with the &lt;em&gt;latest code on GitHub&lt;/em&gt;. You are most likely using a released version of Pundit, so please refer to the &lt;a href="https://www.rubydoc.info/gems/pundit" rel="nofollow noopener noreferrer"&gt;documentation for the latest released version of Pundit&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;bundle add pundit&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Include &lt;code&gt;Pundit::Authorization&lt;/code&gt; in your application controller:&lt;/p&gt;
&lt;div class="highlight highlight-source-ruby notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;class&lt;/span&gt; &lt;span class="pl-v"&gt;ApplicationController&lt;/span&gt; &amp;lt; &lt;span class="pl-v"&gt;ActionController&lt;/span&gt;::&lt;span class="pl-v"&gt;Base&lt;/span&gt;
  &lt;span class="pl-en"&gt;include&lt;/span&gt; &lt;span class="pl-v"&gt;Pundit&lt;/span&gt;::&lt;span class="pl-v"&gt;Authorization&lt;/span&gt;
&lt;span class="pl-k"&gt;end&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Optionally, you can run the generator, which will set up an application policy
with some useful defaults for you:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;rails g pundit:install&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;After generating your application policy, restart the Rails server so that Rails
can pick up any classes in the new &lt;code&gt;app/policies/&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/varvet/pundit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/avo-hq" rel="noopener noreferrer"&gt;
        avo-hq
      &lt;/a&gt; / &lt;a href="https://github.com/avo-hq/avo" rel="noopener noreferrer"&gt;
        avo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The Essential Toolkit for building Internal Tools and admin panels with Ruby on Rails
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://badge.fury.io/rb/avo" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8589e7d7faf65d0c8dd034363740b589e3800ff6b450eaab3f1e5e650a376d01/68747470733a2f2f62616467652e667572792e696f2f72622f61766f2e737667" alt="Gem Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/avo-hq/avo/actions/workflows/system-tests.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/avo-hq/avo/actions/workflows/system-tests.yml/badge.svg" alt="System Tests"&gt;&lt;/a&gt;
&lt;a href="https://github.com/avo-hq/avo/actions/workflows/feature-tests.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/avo-hq/avo/actions/workflows/feature-tests.yml/badge.svg" alt="Feature Tests"&gt;&lt;/a&gt;
&lt;a href="https://github.com/avo-hq/avo/actions/workflows/lint.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/avo-hq/avo/actions/workflows/lint.yml/badge.svg" alt="Lint"&gt;&lt;/a&gt;
&lt;a href="https://github.com/avo-hq/avo/discussions" rel="noopener noreferrer"&gt;
&lt;img alt="GitHub Discussions" src="https://camo.githubusercontent.com/e1f2d685ee99f9e4031d13fa204156f7dca372289245c340b27911dd456fcf10/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f64697363757373696f6e732f61766f2d68712f61766f3f636f6c6f723d313638414645266c6f676f3d676974687562"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/avo-hq/avo/issues" rel="noopener noreferrer"&gt;
&lt;img alt="GitHub Issues or Pull Requests" src="https://camo.githubusercontent.com/88449f6360758abadb23d762601cb0e8d47a3a7a87344742018e5be9b24a62bd/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d636c6f7365642f61766f2d68712f61766f3f7374796c653d666c6174266c696e6b3d68747470732533412532462532466769746875622e636f6d25324661766f2d687125324661766f253246697373756573266c6f676f3d676974687562"&gt;
&lt;/a&gt;
&lt;a href="https://rubygems.org/gems/avo" rel="nofollow noopener noreferrer"&gt;
&lt;img alt="GEM Downloads" src="https://camo.githubusercontent.com/875ad1d0c95bdbdac4022626381a6284011ab9f25992cdab425f4ef9f97ff9fd/68747470733a2f2f696d672e736869656c64732e696f2f67656d2f64742f61766f3f636f6c6f723d313638414645266c6f676f3d72756279266c6f676f436f6c6f723d464531363136"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/testdouble/standard" rel="noopener noreferrer"&gt;
&lt;img alt="Ruby Style" src="https://camo.githubusercontent.com/c1fd994eda5a222db77988c3d2eb2013ad6f61b95380b68b6526fe7ad77ecf8b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7374796c652d7374616e646172642d3136384146453f6c6f676f3d72756279266c6f676f436f6c6f723d464531363136"&gt;
&lt;/a&gt;
&lt;a href="https://codecov.io/gh/avo-hq/avo" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c79bae0a2053a8973184a40bf39d3d8246cc93ab448566f34000f81d211e00f0/68747470733a2f2f636f6465636f762e696f2f67682f61766f2d68712f61766f2f6272616e63682f6d61737465722f67726170682f62616467652e7376673f746f6b656e3d51324c4d464534393839" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/avo-hq/avo/maintainability" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/60b934e4cd6e564fd81f536e81206a39989c8e1d98c508ea7097c873708e6c72/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f36373661306166613263633739663033616132392f6d61696e7461696e6162696c697479" alt="Maintainability"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/avo-hq/avo/./public/avo-assets/logo-on-white.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Favo-hq%2Favo%2FHEAD%2F.%2Fpublic%2Favo-assets%2Flogo-on-white.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://avohq.io" title="Ruby on Rails Admin Panel Framework" rel="nofollow noopener noreferrer"&gt;Avo - Ruby on Rails Admin Panel Framework&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avo is a very custom Admin Panel Framework, Content Management System, and Internal Tool Builder for Ruby on Rails that saves engineers and teams &lt;strong&gt;months of development time&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Get started&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;⚡️ &lt;strong&gt;Install&lt;/strong&gt;: &lt;a href="https://docs.avohq.io/3.0/installation.html" rel="nofollow noopener noreferrer"&gt;docs.avohq.io/3.0/installation&lt;/a&gt;
&lt;br&gt;
✨ &lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://avohq.io" rel="nofollow noopener noreferrer"&gt;avohq.io&lt;/a&gt;
&lt;br&gt;
📚 &lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://docs.avohq.io" rel="nofollow noopener noreferrer"&gt;docs.avohq.io&lt;/a&gt;
&lt;br&gt;
🗺 &lt;strong&gt;Roadmap&lt;/strong&gt;: &lt;a href="https://github.com/orgs/avo-hq/projects/14" rel="noopener noreferrer"&gt;GitHub Roadmap&lt;/a&gt;
&lt;br&gt;
🎸 &lt;strong&gt;Demo App&lt;/strong&gt;: &lt;a href="https://main.avodemo.com/" rel="nofollow noopener noreferrer"&gt;Avodemo&lt;/a&gt;
&lt;br&gt;
🐤 &lt;strong&gt;Twitter&lt;/strong&gt;: &lt;a href="https://twitter.com/avo_hq" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;avo_hq&lt;/code&gt;&lt;/a&gt;
&lt;br&gt;
🔧 &lt;strong&gt;Issue Tracker&lt;/strong&gt;: &lt;a href="http://github.com/avo-hq/avo/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;
&lt;br&gt;
🎙 &lt;strong&gt;Discussions and Feature Requests&lt;/strong&gt;: &lt;a href="http://github.com/avo-hq/avo/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Powered by Hotwire&lt;/strong&gt; - Rails ❤️  Hotwire&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code driven configuration&lt;/strong&gt; - Configure your Rails dashboard entirely by writing Ruby code. &lt;a href="https://docs.avohq.io/3.0/resources.html#defining-resources" rel="nofollow noopener noreferrer"&gt;docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Management&lt;/strong&gt; - Create a CRUD interface for Active Record from one command. No more copy-pasting view and controller files around.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard widgets and metrics&lt;/strong&gt; - Create metrics, charts, and custom cards amazingly fast. &lt;a href="https://docs.avohq.io/3.0/dashboards.html" rel="nofollow noopener noreferrer"&gt;docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Search&lt;/strong&gt; - Quickly run a search through one or more resources at once…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/avo-hq/avo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;These are implemented on the premise that the &lt;code&gt;current_user&lt;/code&gt; defined by Devise exists.&lt;br&gt;
Even the code output by AI assumes that &lt;code&gt;current_user&lt;/code&gt; exists. Naturally, since the vast majority of apps in the training data were implemented with Devise.&lt;br&gt;
&lt;a href="https://www.reddit.com/r/rails/comments/1tn3ajx/rails_8_auth_vs_devise/" rel="noopener noreferrer"&gt;Someone on Reddit commented like this&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;there is one caveat to that: make sure to use "Device" naming convention so using libraries such Pundit, CanCanCan etc is compatible with your code without addition tweaking.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Does that mean something like this?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ApplicationHelper&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;current_user&lt;/span&gt;
    &lt;span class="no"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I’m sorry, but I don’t want to write code like this.&lt;/p&gt;

&lt;p&gt;Surprisingly, the Devise community remains active even after the implementation of the Rails 8 standard authentication.&lt;br&gt;
As of the time of writing this article, the last merge was two weeks ago.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/heartcombo" rel="noopener noreferrer"&gt;
        heartcombo
      &lt;/a&gt; / &lt;a href="https://github.com/heartcombo/devise" rel="noopener noreferrer"&gt;
        devise
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Flexible authentication solution for Rails with Warden.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/09c96286b9d940cc828c72880a83abcdfd6a688cedf7b3ac1daf68edcafca367/68747470733a2f2f7261772e6769746875622e636f6d2f6865617274636f6d626f2f6465766973652f6d61696e2f6465766973652e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/09c96286b9d940cc828c72880a83abcdfd6a688cedf7b3ac1daf68edcafca367/68747470733a2f2f7261772e6769746875622e636f6d2f6865617274636f6d626f2f6465766973652f6d61696e2f6465766973652e706e67" alt="Devise Logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Devise is a flexible authentication solution for Rails based on Warden. It:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is Rack based;&lt;/li&gt;
&lt;li&gt;Is a complete MVC solution based on Rails engines;&lt;/li&gt;
&lt;li&gt;Allows you to have multiple models signed in at the same time;&lt;/li&gt;
&lt;li&gt;Is based on a modularity concept: use only what you really need.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's composed of 10 modules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.rubydoc.info/gems/devise/Devise/Models/DatabaseAuthenticatable" rel="nofollow noopener noreferrer"&gt;Database Authenticatable&lt;/a&gt;: hashes and stores a password in the database to validate the authenticity of a user while signing in. The authentication can be done both through POST requests or HTTP Basic Authentication.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.rubydoc.info/gems/devise/Devise/Models/Omniauthable" rel="nofollow noopener noreferrer"&gt;Omniauthable&lt;/a&gt;: adds OmniAuth (&lt;a href="https://github.com/omniauth/omniauth" rel="noopener noreferrer"&gt;https://github.com/omniauth/omniauth&lt;/a&gt;) support.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.rubydoc.info/gems/devise/Devise/Models/Confirmable" rel="nofollow noopener noreferrer"&gt;Confirmable&lt;/a&gt;: sends emails with confirmation instructions and verifies whether an account is already confirmed during sign in.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.rubydoc.info/gems/devise/Devise/Models/Recoverable" rel="nofollow noopener noreferrer"&gt;Recoverable&lt;/a&gt;: resets the user password and sends reset instructions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.rubydoc.info/gems/devise/Devise/Models/Registerable" rel="nofollow noopener noreferrer"&gt;Registerable&lt;/a&gt;: handles signing up users through a registration process, also allowing them to edit and destroy their account.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.rubydoc.info/gems/devise/Devise/Models/Rememberable" rel="nofollow noopener noreferrer"&gt;Rememberable&lt;/a&gt;: manages generating and clearing a token…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/heartcombo/devise" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;In a world where many gems are abandoned and disappear, this is encouraging.&lt;br&gt;
It lives up to having over 20,000 stars.&lt;/p&gt;

&lt;p&gt;For these reasons, I have decided to use Devise for SuperRails and my other projects, even with Rails 8.&lt;br&gt;
Since this decision could easily change depending on the evolution of AI and the trends in the community, I intend to just wait and see for about a year and focus on my business.&lt;/p&gt;

&lt;p&gt;As a side note, it’s strange for me to complain, but why is it that the Rails 8 standard authentication has a login page but no sign-up page?&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Don't fall for the Claude Mythos hype</title>
      <dc:creator>Hulk in Public</dc:creator>
      <pubDate>Sun, 24 May 2026 23:39:42 +0000</pubDate>
      <link>https://forem.com/hulkinpublic/dont-fall-for-the-claude-mythos-hype-1lcl</link>
      <guid>https://forem.com/hulkinpublic/dont-fall-for-the-claude-mythos-hype-1lcl</guid>
      <description>&lt;p&gt;It’s just Anthropic’s marketing.&lt;/p&gt;

&lt;p&gt;Claude Mythos is making waves. Initially, the preview was only made available to a very select few Big Tech companies, such as Google and Apple. It seems Anthropic decided it would be too dangerous to release it to the public all at once. The access was gradually expanded, and recently, news broke in my country, Japan, that a major megabank had been granted access. Politicians are also treating it as a risk, and it feels like discussions about how to use AI safely have been increasing lately.&lt;/p&gt;

&lt;p&gt;Even among the general public, especially on X, there are voices expecting that Claude Mythos will change the world or that it might achieve AGI. However, they are missing a crucial perspective: "This includes Anthropic’s marketing."&lt;/p&gt;

&lt;p&gt;When AI companies release a model, they often use the tactic of developing it themselves and then declaring, "It's too dangerous," before rolling it out in stages. This was exactly the case with GPT-3.5 and GPT-5. I was particularly worried that GPT-5 would fundamentally upend the way the world works, and I remember staying up until 3:00 AM (Japan time) watching OpenAI’s announcement with heavy eyes.&lt;/p&gt;

&lt;p&gt;My reaction after watching it? "What is this? It’s not much different from what we already have." My initial impression was wrong. When I actually tried it, the GPT-5 of that time actually felt less capable overall than GPT-4o.&lt;/p&gt;

&lt;p&gt;Before GPT-5 was released to the world, it was already being used internally at OpenAI. It was said that GPT-5 was handling most of the internal operations, and that "once this is released, it’s going to be amazing!"&lt;/p&gt;

&lt;p&gt;Certainly, there are impressive models in the GPT-5 series. I currently use version 5.5 for AI agents. It is far more efficient than previous models, but it didn't result in a situation that fundamentally overturned the structure of society. Today, I am still here writing code, writing tests, and submitting pull requests.&lt;/p&gt;

&lt;p&gt;Getting back to the topic of Mythos—this time it’s about Claude, or rather, Anthropic. Until now, Anthropic often released features and new models smoothly without resorting to this kind of hype. But this time, it seems they’ve resorted to hype-based marketing. "We found a vulnerability that no human has found in 27 years!" Seriously? Please tell us how significant the impact of this vulnerability actually was.&lt;/p&gt;

&lt;p&gt;In Japan, it is said that the systems connecting most financial institutions' networks are still written in COBOL. It would be unnatural if they didn’t have vulnerabilities. (I do welcome it if this actually helps those systems.)&lt;/p&gt;

&lt;p&gt;Anthropic is preparing for an IPO. Their valuation changes in an instant based on their hype. There is no reason for us, as general developers or business people, to be swayed by Anthropic’s marketing.&lt;/p&gt;

&lt;p&gt;Going slightly off-topic, I’m annoyed by Anthropic’s "entitled" business practices. For example, not allowing users to use their regular subscription plans with third-party tools like OpenCode. Or how they took Bun—a tool developed by a subsidiary—and completely changed the language via something close to vibe-coding without a single review in less than a week.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
    </item>
    <item>
      <title>Thanks to AI, non-engineers have unfortunately become able to use Git</title>
      <dc:creator>Hulk in Public</dc:creator>
      <pubDate>Sun, 24 May 2026 02:46:07 +0000</pubDate>
      <link>https://forem.com/hulkinpublic/thanks-to-ai-non-engineers-have-unfortunately-become-able-to-use-git-e2j</link>
      <guid>https://forem.com/hulkinpublic/thanks-to-ai-non-engineers-have-unfortunately-become-able-to-use-git-e2j</guid>
      <description>&lt;p&gt;I heard this from my girlfriend yesterday.&lt;/p&gt;

&lt;p&gt;At her workplace, a non-engineer has been using Claude Code to edit files directly on GitHub. Her office is in web production, and it seems the business-side staff are using Claude Code to make quick tweaks to static files.&lt;/p&gt;

&lt;p&gt;Apparently, the AI accidentally pushed changes without them realizing it, causing some issues. When they couldn't even read the terminal to investigate, they ended up asking my girlfriend to look into it. I’m stunned that someone doesn't even know how to check a terminal for Claude Code's operation history, but I’m even more shocked that the company decided to let people of that skill level use Claude Code via the CLI.&lt;/p&gt;

&lt;p&gt;Naturally, they have no knowledge of Git. They might be experts in marketing, sales, or user support, but they aren't engineers. Unless they take the time to learn, they have no way of knowing the basics of Git. They don't understand concepts like merging, pull requests, commits, conflicts, squashing, or branching.&lt;/p&gt;

&lt;p&gt;Listen, do not let people who don't know Git touch Git. This isn't discrimination. No matter how convenient AI becomes, nothing will ever go well if you don't study; in fact, nothing will go well at all.&lt;/p&gt;

&lt;p&gt;Learning Git takes a week, tops. You don't even need a full week—a single day is enough. Just put in the effort to consciously absorb knowledge. That knowledge will absolutely pay off with compound interest. Without it, that lack of knowledge becomes a literal liability, costing you time and money in the form of things like damages and compensation.&lt;/p&gt;

&lt;p&gt;Think of AI as a kitchen knife. Knives are useful—you can use them to cut meat, fillet fish, or kill someone. I’m not denying the convenience of AI; if anything, non-engineers should be using it proactively since they already have so much to learn about IT.&lt;/p&gt;

&lt;p&gt;But when you first held a knife, didn't you learn how to use it from your parents or a teacher at school? Or did you at least read a book or watch a video to understand it before picking it up? Don’t disregard the need for input. In other words, don't try to use AI while skipping the process of actually understanding what you're doing.&lt;/p&gt;

&lt;p&gt;If you run around outside waving a knife, you’ll end up in prison. What’s terrifying is that, at this stage, we are seeing idiots who misunderstand AI as a sign that engineers’ technical value is dropping or that they no longer need to learn engineering.&lt;/p&gt;

&lt;p&gt;The products they openly operate are, to me, the perfect targets for attack. If it weren't for laws like Japan's Act on Prohibition of Unauthorized Computer Access, I might be stealing customer data from them, rewriting their databases, or encrypting their data and demanding a ransom. And there are plenty of people out there with even less ethics than I have.&lt;/p&gt;

&lt;p&gt;AI is not an omniscient, omnipotent god. It is a knife—a cyborg extension that expands your abilities in both positive and negative directions.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>claude</category>
    </item>
    <item>
      <title>Never Use Service Classes in Rails</title>
      <dc:creator>Hulk in Public</dc:creator>
      <pubDate>Thu, 21 May 2026 03:03:56 +0000</pubDate>
      <link>https://forem.com/hulkinpublic/never-use-service-classes-in-rails-4f75</link>
      <guid>https://forem.com/hulkinpublic/never-use-service-classes-in-rails-4f75</guid>
      <description>&lt;p&gt;Service classes are one of the most representative anti-patterns in Rails.&lt;br&gt;
That is because they deviate from Rails' MVC principles.&lt;/p&gt;

&lt;p&gt;You have probably heard of the Single Responsibility Principle.&lt;br&gt;
In MVC, each component has its own role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model: storing, managing, processing, and relating data&lt;/li&gt;
&lt;li&gt;View: display, templates, and user interface&lt;/li&gt;
&lt;li&gt;Controller: handling HTTP requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, if we introduce a service class, what is its responsibility?&lt;br&gt;
I do not know.&lt;/p&gt;

&lt;p&gt;The name "service" creates the illusion that you can write some impressive-sounding business logic there.&lt;br&gt;
However, the name "service" has no meaning or definition.&lt;br&gt;
Why are so many people strict about meaningless variable names like &lt;code&gt;tmp&lt;/code&gt; or &lt;code&gt;x&lt;/code&gt;, yet willing to accept a meaningless class called a "service class"?&lt;/p&gt;

&lt;p&gt;In my more than five years of experience with Ruby on Rails, service classes had unfortunately already been created in several projects.&lt;br&gt;
In many of those cases, complex data-processing logic had been written in controllers, and service classes were used simply to clean up fat controllers.&lt;/p&gt;

&lt;p&gt;That premise is wrong.&lt;br&gt;
If you write business logic in models—especially logic related to retrieving and processing data—and keep controllers focused solely on calling that logic, controllers will never become complex.&lt;/p&gt;

&lt;p&gt;"Do you accept fat models?"&lt;br&gt;
Yes, of course.&lt;br&gt;
In real companies, "business logic" is, in other words, a discussion about "how to handle data," which is precisely the role of the model.&lt;br&gt;
When business requirements are large, it is inevitable that models become complex and grow in size.&lt;/p&gt;

&lt;p&gt;Implementing readable code within models is where we engineers show our skill.&lt;br&gt;
There is never any place for service classes.&lt;/p&gt;

&lt;p&gt;"What should you do if a model grows so large that a single file exceeds 1,000 lines?"&lt;br&gt;
Please refer to the OSS code published by DHH and 37signals.&lt;br&gt;
Even when we talk about fat models, that does not mean you should cram all logic into a single class.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/basecamp" rel="noopener noreferrer"&gt;
        basecamp
      &lt;/a&gt; / &lt;a href="https://github.com/basecamp/once-campfire" rel="noopener noreferrer"&gt;
        once-campfire
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Super simple group chat, without a subscription
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Campfire&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Campfire is a web-based chat application. It supports many of the features you'd
expect, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple rooms, with access controls&lt;/li&gt;
&lt;li&gt;Direct messages&lt;/li&gt;
&lt;li&gt;File attachments with previews&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Notifications (via Web Push)&lt;/li&gt;
&lt;li&gt;@mentions&lt;/li&gt;
&lt;li&gt;API, with support for bot integrations&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Deploying with Docker&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Campfire's Docker image contains everything needed for a fully-functional
single-machine deployment. This includes the web app, background jobs, caching,
file serving, and SSL.&lt;/p&gt;
&lt;p&gt;To persist storage of the database and file attachments, map a volume to &lt;code&gt;/rails/storage&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To configure additional features, you can set the following environment variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SSL_DOMAIN&lt;/code&gt; - enable automatic SSL via Let's Encrypt for the given domain name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DISABLE_SSL&lt;/code&gt; - alternatively, set &lt;code&gt;DISABLE_SSL&lt;/code&gt; to serve over plain HTTP&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VAPID_PUBLIC_KEY&lt;/code&gt;/&lt;code&gt;VAPID_PRIVATE_KEY&lt;/code&gt; - set these to a valid keypair to
allow sending Web Push notifications. You can generate a new keypair by running
&lt;code&gt;/script/admin/create-vapid-key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SENTRY_DSN&lt;/code&gt; - to enable error reporting to sentry in production, supply…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/basecamp/once-campfire" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;For example, &lt;code&gt;once-campfire&lt;/code&gt; defines the following files related to the User model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;models/user.rb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;models/user/avatar.rb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;models/user/bannable.rb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;models/user/bot.rb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;models/user/mentionalbe.rb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;models/user/role.rb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;models/user/transferable.rb&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first file, &lt;code&gt;models/user.rb&lt;/code&gt;, is the one you are familiar with—the file created by &lt;code&gt;rails g model User&lt;/code&gt;.&lt;br&gt;
The others are modules that includes &lt;code&gt;extend ActiveSupport::Concern&lt;/code&gt;. In other words, they are simply &lt;code&gt;concerns&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Even if something is not shared with other models, it should be extracted into a &lt;code&gt;concern&lt;/code&gt; and split out.&lt;br&gt;
That way, the main &lt;code&gt;models/user.rb&lt;/code&gt; can remain simple.&lt;/p&gt;




&lt;p&gt;By the way, who was it that started advocating for service classes in the first place?&lt;br&gt;
DHH was loudly criticizing service classes, wasn't he?&lt;/p&gt;

&lt;p&gt;When I ask AI for advice on Rails refactoring, it forcibly suggests services even though I never asked for them.&lt;/p&gt;

&lt;p&gt;It is extremely irritating.&lt;br&gt;
It makes me realize that the expectation that AI will replace real engineers is nothing more than nonsense.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>GPT image 2.0 Is the Reason I Can Run My Business</title>
      <dc:creator>Hulk in Public</dc:creator>
      <pubDate>Wed, 20 May 2026 14:02:32 +0000</pubDate>
      <link>https://forem.com/hulkinpublic/gpt-image-20-is-the-reason-i-can-run-my-business-5c3p</link>
      <guid>https://forem.com/hulkinpublic/gpt-image-20-is-the-reason-i-can-run-my-business-5c3p</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://openai.com/ja-JP/index/introducing-chatgpt-images-2-0/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;openai.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It has been one month since &lt;code&gt;gpt-image-2.0&lt;/code&gt; was released.&lt;/p&gt;

&lt;p&gt;For me, it was even more shocking than the arrival of &lt;code&gt;gpt-3.5&lt;/code&gt; or &lt;code&gt;claude code&lt;/code&gt;.&lt;br&gt;
It is, quite literally, a revolution.&lt;/p&gt;

&lt;p&gt;Design has always been genuinely painful for me.&lt;br&gt;
However, since I chose the path of being a solopreneur, I cannot run away from design.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;YouTube thumbnails&lt;/li&gt;
&lt;li&gt;UI/UX for websites and apps&lt;/li&gt;
&lt;li&gt;Brochures that explain what my business does&lt;/li&gt;
&lt;li&gt;Logos for companies and services&lt;/li&gt;
&lt;li&gt;Article thumbnails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Until now, I had been doing my best using Canva templates, but I was shocked when my girlfriend told me, “You have absolutely no sense of design. A chimpanzee would do better.”&lt;/p&gt;

&lt;p&gt;Over the past month, I have experienced my business moving forward at a speed I had never seen before thanks to &lt;code&gt;gpt-image-2&lt;/code&gt;.&lt;br&gt;
Because of it, I have been able to continue building my business without outsourcing design work to a designer—at least for now.&lt;br&gt;
In the future, I may ask someone with design expertise for consulting in order to get feedback, but I am confident that I can now create work that is definitely better than a chimpanzee’s.&lt;/p&gt;

&lt;p&gt;Here are some of the works created with &lt;code&gt;gpt-image-2&lt;/code&gt; that I used in my business over the past month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy726kmba3qfsqo8gh62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy726kmba3qfsqo8gh62.png" alt="Building startup with solo" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5i9ogcsvggq5d2kmumf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5i9ogcsvggq5d2kmumf.png" alt="lazycafe logo" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3446axwjjfzvnaea04r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3446axwjjfzvnaea04r.png" alt="kyoto&amp;amp;osaka vlog" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwddk59hbskq2w65i4n9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwddk59hbskq2w65i4n9.png" alt="code with me thumbnail" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://super-rails.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" height="512" class="m-0" width="512"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://super-rails.com/" rel="noopener noreferrer" class="c-link"&gt;
            Super Rails | Rails Boilerplate for Solopreneurs
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A production-ready Rails boilerplate with Devise, Avo, Stripe, ViewComponent and more. Skip the setup, ship your MVP in days.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" width="512" height="512"&gt;
          super-rails.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://lazymusic.cc/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flazymusic.cc%2Fassets%2Flogo-1518ee26.jpg" height="394" class="m-0" width="515"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://lazymusic.cc/" rel="noopener noreferrer" class="c-link"&gt;
            LazyMusic | 音楽をもっと気軽に
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            LazyMusicは、音楽をもっと気軽に楽しむためのミュージックコミュニティです。
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flazymusic.cc%2Fassets%2Flogo-1518ee26.jpg" width="515" height="394"&gt;
          lazymusic.cc
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/bbJrKp-7C1M"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Can You Launch a New Business in Just One Month with Rails and AI?</title>
      <dc:creator>Hulk in Public</dc:creator>
      <pubDate>Mon, 18 May 2026 13:27:05 +0000</pubDate>
      <link>https://forem.com/hulkinpublic/can-you-launch-a-new-business-in-just-one-month-with-rails-and-ai-32op</link>
      <guid>https://forem.com/hulkinpublic/can-you-launch-a-new-business-in-just-one-month-with-rails-and-ai-32op</guid>
      <description>&lt;h2&gt;
  
  
  The Solopreneur Lifestyle
&lt;/h2&gt;

&lt;p&gt;I'm Haruhisa Maniwa (Hulk), CEO of Laicos Inc.&lt;br&gt;
I live what people call the solopreneur lifestyle.&lt;/p&gt;

&lt;p&gt;Last month, this article I wrote on Zenn went viral in a weird way.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://zenn.dev/higakijin/articles/730a734b6b9009" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fzenn%2Fimage%2Fupload%2Fs--DelN3TyV--%2Fc_fit%252Cg_north_west%252Cl_text%3Anotosansjp-medium.otf_55%3AAI%2525E6%252599%252582%2525E4%2525BB%2525A3%2525E3%252581%2525AB%2525E3%252582%25258F%2525E3%252581%252596%2525E3%252582%25258F%2525E3%252581%252596Ruby%252520on%252520Rails%2525E3%252582%252592%2525E4%2525BD%2525BF%2525E3%252581%252586%2525E7%252590%252586%2525E7%252594%2525B1%252Cw_1010%252Cx_90%252Cy_100%2Fg_south_west%252Cl_text%3Anotosansjp-medium.otf_37%3A%2525E3%252583%25258F%2525E3%252583%2525AB%2525E3%252582%2525AF%252Cx_203%252Cy_121%2Fg_south_west%252Ch_90%252Cl_fetch%3AaHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzQwYzY4NmM3ZTkuanBlZw%3D%3D%252Cr_max%252Cw_90%252Cx_87%252Cy_95%2Fv1627283836%2Fdefault%2Fog-base-w1200-v2.png%3F_a%3DBACAGSGT" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://zenn.dev/higakijin/articles/730a734b6b9009" rel="noopener noreferrer" class="c-link"&gt;
            AI時代にわざわざRuby on Railsを使う理由
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.zenn.studio%2Fimages%2Flogo-transparent.png" width="315" height="315"&gt;
          zenn.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://zenn.dev/higakijin/scraps/d2d4b301047fdb" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.zenn.studio%2Fuser-upload%2Favatar%2F40c686c7e9.jpeg" height="260" class="m-0" width="260"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://zenn.dev/higakijin/scraps/d2d4b301047fdb" rel="noopener noreferrer" class="c-link"&gt;
            【コメント返信】AI時代にわざわざRuby on Railsを使う理由
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            ハルクさんのスクラップ
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.zenn.studio%2Fimages%2Flogo-transparent.png" width="315" height="315"&gt;
          zenn.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I've made my living almost entirely with Rails, so I'm a dyed-in-the-wool Rails lover.&lt;br&gt;
If someone asks me, "Who do you respect the most?" I immediately answer, "DHH."&lt;/p&gt;

&lt;p&gt;I truly believe, from the bottom of my heart, that Rails' simplicity and track record are still weapons in the AI era. Unfortunately, it's also true that many people disagree.&lt;br&gt;
So when I praise Rails, it catches fire.&lt;/p&gt;

&lt;p&gt;That's right. This month, we're setting things on fire again.&lt;/p&gt;

&lt;p&gt;This time, my company actually developed and is operating two products with Rails, so I'd like to explain how I launched them.&lt;/p&gt;

&lt;p&gt;I hope this will be useful for anyone wondering, "What kind of business do indie developers actually run?"&lt;/p&gt;
&lt;h3&gt;
  
  
  Rails Is Not Dead
&lt;/h3&gt;

&lt;p&gt;Over the past five years since I entered the programming world, the industry has been tossed around by trends like NoSQL, BaaS, GraphQL, and the MEAN stack.&lt;br&gt;
Those technologies have, in the true sense, "died out."&lt;/p&gt;

&lt;p&gt;Meanwhile, Rails, despite everyone saying it would disappear, has barely changed for 20 years.&lt;/p&gt;

&lt;p&gt;If a Rails engineer from 20 years ago time-traveled to 2026 and was assigned a Rails 8 task, they would probably spend about three days in despair and then reluctantly start writing code.&lt;/p&gt;

&lt;p&gt;There is no other web framework with this level of consistency.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Gzj723LkRJY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  The Lifespan of a Framework Is the Lifespan of a Business
&lt;/h3&gt;

&lt;p&gt;For me, someone who wants to build businesses that survive long term, the lifespan of a framework directly means the lifespan of the business.&lt;/p&gt;

&lt;p&gt;I'm challenging myself to "release one product per month."&lt;/p&gt;

&lt;p&gt;This directly imitates the &lt;code&gt;Build in Public&lt;/code&gt; approach practiced by the original indie developer, Pieter Levels.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/4Y2OgnHCt6Y"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;However, there is one difference: AI.&lt;/p&gt;

&lt;p&gt;As you all know, AI agents have overturned the very concept of coding.&lt;br&gt;
And not just coding. Marketing, design, sales—everything.&lt;/p&gt;

&lt;p&gt;However, even when many indie developers use AI to release products, they often fail to generate any meaningful revenue afterward.&lt;br&gt;
On top of that, they become unable to untangle the spaghetti code produced by vibe coding, and six months later, they quietly shut everything down where nobody is watching.&lt;/p&gt;

&lt;p&gt;I've had similar experiences myself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6stymj9xjlklrflliap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6stymj9xjlklrflliap.png" alt="alda" width="800" height="577"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshbyi20m467pu0jn5tnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshbyi20m467pu0jn5tnv.png" alt="indietimes" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a reflection on that, I decided to impose the following constraints on myself when releasing products from now on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Implement only the absolute minimum necessary features&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not spend more time on development than on marketing (promotion and announcements)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not care about technology trends&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not cling to a single product&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"If I want to spin the flywheel of rapid market feedback and build a business that survives the turbulent AI era, isn't Rails the best fit?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is my hypothesis. I want to prove it.&lt;/p&gt;

&lt;p&gt;By the way, this month is the second month and the second product in this challenge.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Idea I Came Up With
&lt;/h3&gt;

&lt;p&gt;The keyword is "a cafe inside the terminal."&lt;/p&gt;

&lt;p&gt;When I work remotely, I often listen to music.&lt;/p&gt;

&lt;p&gt;Recently, however, I found myself always streaming the same artists and the same YouTube channels, and my brain started rejecting it.&lt;/p&gt;

&lt;p&gt;There was no freshness at all, and I couldn't concentrate!&lt;/p&gt;

&lt;p&gt;I thought, "If my home felt like a stylish cafe, I could concentrate more."&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/jfKfPfyJRdk"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Then, while using &lt;code&gt;lazygit&lt;/code&gt; and &lt;code&gt;lazydocker&lt;/code&gt;, an idea suddenly occurred to me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not make a cafe in the terminal?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyfwdzuvnhaki1w39dqu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyfwdzuvnhaki1w39dqu.gif" alt="lazygit demo" width="600" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2av1pzp6d5powis4tiys.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2av1pzp6d5powis4tiys.gif" alt="lazydocker demo" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jesseduffield" rel="noopener noreferrer"&gt;
        jesseduffield
      &lt;/a&gt; / &lt;a href="https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"&gt;
        lazygit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      simple terminal UI for git commands
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;sup&gt;Special thanks to:&lt;/sup&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="https://www.warp.dev/?utm_source=github&amp;amp;utm_medium=referral&amp;amp;utm_campaign=lazygit_20231023" rel="nofollow noopener noreferrer"&gt;
  &lt;div&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fwarpdotdev%2Fbrand-assets%2Fraw%2Fmain%2FGithub%2FSponsor%2FWarp-Github-LG-02.png%3Fraw%3Dtrue" width="400" alt="Warp"&gt;
  &lt;/div&gt;
  &lt;b&gt;Warp, the intelligent terminal&lt;/b&gt;
  &lt;br&gt;
  &lt;b&gt;Available for macOS and Linux&lt;/b&gt;
  &lt;br&gt;
  &lt;div&gt;
    &lt;sup&gt;Visit warp.dev to learn more.&lt;/sup&gt;
  &lt;/div&gt;
&lt;/a&gt;
&lt;br&gt;

&lt;a href="https://tuple.app/lazygit" rel="nofollow noopener noreferrer"&gt;
  &lt;div&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjesseduffield%2Flazygit%2FHEAD%2F..%2Fassets%2Ftuple.png" width="400" alt="Tuple"&gt;
  &lt;/div&gt;
  &lt;b&gt;Tuple, the premier screen sharing app for developers on macOS and Windows.&lt;/b&gt;
&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;
&lt;a href="https://www.subble.com" rel="nofollow noopener noreferrer"&gt;
  &lt;div&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjesseduffield%2Flazygit%2FHEAD%2F..%2Fassets%2Fsubble.webp" width="400" alt="Subble"&gt;
  &lt;/div&gt;
  &lt;b&gt;I (Jesse) co-founded Subble to save your company time and money by finding unused and over-provisioned SaaS licences. Check it out!&lt;/b&gt;
&lt;/a&gt;
&lt;br&gt;

&lt;/div&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/8456633/174470852-339b5011-5800-4bb9-a628-ff230aa8cd4e.png"&gt;&lt;img width="536" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8456633%2F174470852-339b5011-5800-4bb9-a628-ff230aa8cd4e.png"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div&gt;
&lt;p&gt;A simple terminal UI for git commands
&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jesseduffield/lazygit/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a4686f430de3bd09c88ab405ead41a5f959d7333360f907cff528f4ec4b67978/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f6a657373656475666669656c642f6c617a796769742f746f74616c" alt="GitHub Releases"&gt;&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/jesseduffield/lazygit" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f5688d461ff11246865c7aa702c1c01fd86251973267e63de452d821ce677bd2/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f6a657373656475666669656c642f6c617a79676974" alt="Go Report Card"&gt;&lt;/a&gt; &lt;a href="https://app.codacy.com/gh/jesseduffield/lazygit/dashboard?utm_source=gh&amp;amp;utm_medium=referral&amp;amp;utm_content=&amp;amp;utm_campaign=Badge_grade" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f38cc9072dc21c6ee6701981976ed1ad6f670b7303c1424ffa1b9c1887bc28bb/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f6634363431366237313564373436323238393536353739333566636164613231" alt="Codacy Badge"&gt;&lt;/a&gt; &lt;a href="https://app.codacy.com/gh/jesseduffield/lazygit/dashboard?utm_source=gh&amp;amp;utm_medium=referral&amp;amp;utm_content=&amp;amp;utm_campaign=Badge_coverage" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1e01c77e9a16a22919135253ca9461d06e43e70686828e0d43a44dc08cbc9f37/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f436f7665726167652f6634363431366237313564373436323238393536353739333566636164613231" alt="Codacy Badge"&gt;&lt;/a&gt; &lt;a href="https://golangci-lint.run/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3a55ef41780899aa057131ad780d9a02b81ade9172106dc95472a02a952ab7d8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c696e74656425323062792d676f6c616e6763692d2d6c696e742d627269676874677265656e" alt="golangci-lint"&gt;&lt;/a&gt; &lt;a href="https://github.com/jesseduffield/lazygit/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/01f997aac8028f54c3108b882d65539956ed140a362c1cbcf1c151645654ff9d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f7461672f6a657373656475666669656c642f6c617a796769743f636f6c6f723d626c7565" alt="GitHub tag"&gt;&lt;/a&gt; &lt;a href="https://formulae.brew.sh/formula/lazygit" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e733446022438b9d2c1573d334f4c58a3cffc99f4d06f4f28e381c3d386cea24/68747470733a2f2f696d672e736869656c64732e696f2f686f6d65627265772f762f6c617a796769743f636f6c6f723d626c7565" alt="homebrew"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jesseduffield/lazygit/../assets/demo/commit_and_push-compressed.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjesseduffield%2Flazygit%2FHEAD%2F..%2Fassets%2Fdemo%2Fcommit_and_push-compressed.gif" alt="commit_and_push"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Sponsors&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;
 Maintenance of this project is made possible by all the &lt;a href="https://github.com/jesseduffield/lazygit/graphs/contributors" rel="noopener noreferrer"&gt;contributors&lt;/a&gt; and &lt;a href="https://github.com/sponsors/jesseduffield" rel="noopener noreferrer"&gt;sponsors&lt;/a&gt;. If you'd like to sponsor this project and have your avatar or company logo appear below &lt;a href="https://github.com/sponsors/jesseduffield" rel="noopener noreferrer"&gt;click here&lt;/a&gt;. 💙
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/intabulas" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fintabulas.png" width="60px" alt="User avatar: Mark Lussier"&gt;&lt;/a&gt;&lt;a href="https://github.com/peppy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpeppy.png" width="60px" alt="User avatar: Dean Herbert"&gt;&lt;/a&gt;&lt;a href="https://github.com/piot" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpiot.png" width="60px" alt="User avatar: Peter Bjorklund"&gt;&lt;/a&gt;&lt;a href="https://github.com/oliverguenther" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Foliverguenther.png" width="60px" alt="User avatar: Oliver Günther"&gt;&lt;/a&gt;&lt;a href="https://github.com/pawanjay176" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpawanjay176.png" width="60px" alt="User avatar: Pawan Dhananjay"&gt;&lt;/a&gt;&lt;a href="https://github.com/naoey" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnaoey.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/carstengehling" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcarstengehling.png" width="60px" alt="User avatar: Carsten Gehling"&gt;&lt;/a&gt;&lt;a href="https://github.com/Xetera" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FXetera.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/nartc" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnartc.png" width="60px" alt="User avatar: Chau Tran"&gt;&lt;/a&gt;&lt;a href="https://github.com/matejcik" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmatejcik.png" width="60px" alt="User avatar: matejcik"&gt;&lt;/a&gt;&lt;a href="https://github.com/lucatume" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flucatume.png" width="60px" alt="User avatar: theAverageDev (Luca Tumedei)"&gt;&lt;/a&gt;&lt;a href="https://github.com/IvanZuy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FIvanZuy.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/ava1ar" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fava1ar.png" width="60px" alt="User avatar: Aliaksandr Stelmachonak"&gt;&lt;/a&gt;&lt;a href="https://github.com/pedropombeiro" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpedropombeiro.png" width="60px" alt="User avatar: Pedro Pombeiro"&gt;&lt;/a&gt;&lt;a href="https://github.com/bburgy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbburgy.png" width="60px" alt="User avatar: Burgy Benjamin"&gt;&lt;/a&gt;&lt;a href="https://github.com/JoeKlemmer" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FJoeKlemmer.png" width="60px" alt="User avatar: Joe Klemmer"&gt;&lt;/a&gt;&lt;a href="https://github.com/tobi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftobi.png" width="60px" alt="User avatar: Tobias Lütke"&gt;&lt;/a&gt;&lt;a href="https://github.com/benbfortis" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbenbfortis.png" width="60px" alt="User avatar: Ben Beaumont"&gt;&lt;/a&gt;&lt;a href="https://github.com/jakewarren" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjakewarren.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/tgpholly" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftgpholly.png" width="60px" alt="User avatar: Holly"&gt;&lt;/a&gt;&lt;a href="https://github.com/Tommylans" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FTommylans.png" width="60px" alt="User avatar: Tom Lanser"&gt;&lt;/a&gt;&lt;a href="https://github.com/socketbox" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsocketbox.png" width="60px" alt="User avatar: Casey Boettcher"&gt;&lt;/a&gt;&lt;a href="https://github.com/bitprophet" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbitprophet.png" width="60px" alt="User avatar: Jeff Forcier"&gt;&lt;/a&gt;&lt;a href="https://github.com/tayleighr" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftayleighr.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/Novakov" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FNovakov.png" width="60px" alt="User avatar: Maciej T. Nowak"&gt;&lt;/a&gt;&lt;a href="https://github.com/jhillyerd" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjhillyerd.png" width="60px" alt="User avatar: James Hillyerd"&gt;&lt;/a&gt;&lt;a href="https://github.com/nekhaevskiy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnekhaevskiy.png" width="60px" alt="User avatar: Yury"&gt;&lt;/a&gt;&lt;a href="https://github.com/reivilibre" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Freivilibre.png" width="60px" alt="User avatar: Olivier reivilibre"&gt;&lt;/a&gt;&lt;a href="https://github.com/BSteffaniak" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBSteffaniak.png" width="60px" alt="User avatar: Braden Steffaniak"&gt;&lt;/a&gt;&lt;a href="https://github.com/jordan-gillard" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjordan-gillard.png" width="60px" alt="User avatar: Jordan Gillard"&gt;&lt;/a&gt;&lt;a href="https://github.com/smangels" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsmangels.png" width="60px" alt="User avatar: Sebastian"&gt;&lt;/a&gt;&lt;a href="https://github.com/amslezak" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Famslezak.png" width="60px" alt="User avatar: Andy Slezak"&gt;&lt;/a&gt;&lt;a href="https://github.com/mkock" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmkock.png" width="60px" alt="User avatar: Martin Kock"&gt;&lt;/a&gt;&lt;a href="https://github.com/danielkokott" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdanielkokott.png" width="60px" alt="User avatar: Daniel Kokott"&gt;&lt;/a&gt;&lt;a href="https://github.com/heijmans" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fheijmans.png" width="60px" alt="User avatar: Jan Heijmans"&gt;&lt;/a&gt;&lt;a href="https://github.com/knowald" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fknowald.png" width="60px" alt="User avatar: Kevin Nowald"&gt;&lt;/a&gt;&lt;a href="https://github.com/ethanjli" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fethanjli.png" width="60px" alt="User avatar: Ethan Li"&gt;&lt;/a&gt;&lt;a href="https://github.com/phubaba" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fphubaba.png" width="60px" alt="User avatar: Robert Forler"&gt;&lt;/a&gt;&lt;a href="https://github.com/neunkasulle" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fneunkasulle.png" width="60px" alt="User avatar: Jan Zenkner"&gt;&lt;/a&gt;&lt;a href="https://github.com/RVxLab" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FRVxLab.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/FrederickGeek8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrederickGeek8.png" width="60px" alt="User avatar: Frederick Morlock"&gt;&lt;/a&gt;&lt;a href="https://github.com/ezdac" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fezdac.png" width="60px" alt="User avatar: Maximilian Langenfeld"&gt;&lt;/a&gt;&lt;a href="https://github.com/lppassos" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flppassos.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/neilcode" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fneilcode.png" width="60px" alt="User avatar: Neil Lambert"&gt;&lt;/a&gt;&lt;a href="https://github.com/dhh" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdhh.png" width="60px" alt="User avatar: David Heinemeier Hansson"&gt;&lt;/a&gt;&lt;a href="https://github.com/ethanfischer" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fethanfischer.png" width="60px" alt="User avatar: Ethan Fischer"&gt;&lt;/a&gt;&lt;a href="https://github.com/poshboytl" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fposhboytl.png" width="60px" alt="User avatar: Terry Tai"&gt;&lt;/a&gt;&lt;a href="https://github.com/roesnera" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Froesnera.png" width="60px" alt="User avatar: Adam Roesner"&gt;&lt;/a&gt;&lt;a href="https://github.com/seven1m" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fseven1m.png" width="60px" alt="User avatar: Tim Morgan"&gt;&lt;/a&gt;&lt;a href="https://github.com/sgoridotla1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsgoridotla1.png" width="60px" alt="User avatar: Maksym Shypulniak"&gt;&lt;/a&gt;&lt;a href="https://github.com/ADIX7" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FADIX7.png" width="60px" alt="User avatar: Kovács Ádám"&gt;&lt;/a&gt;&lt;a href="https://github.com/slowdub" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fslowdub.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/serranomorante" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fserranomorante.png" width="60px" alt="User avatar: Patricio Serrano"&gt;&lt;/a&gt;&lt;a href="https://github.com/kiriDevs" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FkiriDevs.png" width="60px" alt="User avatar: Kiri"&gt;&lt;/a&gt;&lt;a href="https://github.com/StevenMasini" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FStevenMasini.png" width="60px" alt="User avatar: Steven Masini"&gt;&lt;/a&gt;&lt;a href="https://github.com/bjornevik" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbjornevik.png" width="60px" alt="User avatar: John Even Bjørnevik"&gt;&lt;/a&gt;&lt;a href="https://github.com/moberst" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmoberst.png" width="60px" alt="User avatar: Michael Oberst"&gt;&lt;/a&gt;&lt;a href="https://github.com/adam-e-trepanier" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fadam-e-trepanier.png" width="60px" alt="User avatar: Adam Trepanier"&gt;&lt;/a&gt;&lt;a href="https://github.com/arkalon76" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Farkalon76.png" width="60px" alt="User avatar: Kenth Fagerlund"&gt;&lt;/a&gt;&lt;a href="https://github.com/Djuuu" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FDjuuu.png" width="60px" alt="User avatar: Julien Tardot"&gt;&lt;/a&gt;&lt;a href="https://github.com/ellord" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fellord.png" width="60px" alt="User avatar: Ellord Tayag"&gt;&lt;/a&gt;&lt;a href="https://github.com/EdgarPost" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FEdgarPost.png" width="60px" alt="User avatar: Edgar Post-Buijs"&gt;&lt;/a&gt;&lt;a href="https://github.com/caillou" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcaillou.png" width="60px" alt="User avatar: Pierre Spring"&gt;&lt;/a&gt;&lt;a href="https://github.com/mebezac" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmebezac.png" width="60px" alt="User avatar: Zac Clay"&gt;&lt;/a&gt;&lt;a href="https://github.com/Tom94" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FTom94.png" width="60px" alt="User avatar: Thomas Müller"&gt;&lt;/a&gt;&lt;a href="https://github.com/ccssmnn" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fccssmnn.png" width="60px" alt="User avatar: Carl Assmann"&gt;&lt;/a&gt;&lt;a href="https://github.com/ognevsd" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fognevsd.png" width="60px" alt="User avatar: Sergey Ognev"&gt;&lt;/a&gt;&lt;a href="https://github.com/moodyhunter" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmoodyhunter.png" width="60px" alt="User avatar: Moody Liu"&gt;&lt;/a&gt;&lt;a href="https://github.com/elithper" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Felithper.png" width="60px" alt="User avatar: Michael Howard"&gt;&lt;/a&gt;&lt;a href="https://github.com/LasseBloch" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FLasseBloch.png" width="60px" alt="User avatar: Lasse Bloch Lauritsen"&gt;&lt;/a&gt;&lt;a href="https://github.com/dbrockman" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdbrockman.png" width="60px" alt="User avatar: David Brockman"&gt;&lt;/a&gt;&lt;a href="https://github.com/slavshik" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fslavshik.png" width="60px" alt="User avatar: Alexander Slavschik"&gt;&lt;/a&gt;&lt;a href="https://github.com/aidalgol" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Faidalgol.png" width="60px" alt="User avatar: Aidan Gauland"&gt;&lt;/a&gt;&lt;a href="https://github.com/mbienkowsk" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmbienkowsk.png" width="60px" alt="User avatar: Maksym Bieńkowski"&gt;&lt;/a&gt;&lt;a href="https://github.com/joshuawootonn" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjoshuawootonn.png" width="60px" alt="User avatar: Joshua Wootonn"&gt;&lt;/a&gt;&lt;a href="https://github.com/I4nJ" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FI4nJ.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/sandviklee" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsandviklee.png" width="60px" alt="User avatar: Simon Sandvik Lee"&gt;&lt;/a&gt;&lt;a href="https://github.com/glagnar" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fglagnar.png" width="60px" alt="User avatar: Thomas Gilbert"&gt;&lt;/a&gt;&lt;a href="https://github.com/skrzepto" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fskrzepto.png" width="60px" alt="User avatar: Szymon Mucha"&gt;&lt;/a&gt;&lt;a href="https://github.com/unnawut" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Funnawut.png" width="60px" alt="User avatar: Unnawut Leepaisalsuwanna"&gt;&lt;/a&gt;&lt;a href="https://github.com/wortmanb" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fwortmanb.png" width="60px" alt="User avatar: Bret Wortman"&gt;&lt;/a&gt;&lt;a href="https://github.com/simoncdna" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsimoncdna.png" width="60px" alt="User avatar: Simon Cardona"&gt;&lt;/a&gt;&lt;a href="https://github.com/andre-lameirinhas" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fandre-lameirinhas.png" width="60px" alt="User avatar: André Lameirinhas"&gt;&lt;/a&gt;&lt;a href="https://github.com/SVappsLAB" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FSVappsLAB.png" width="60px" alt="User avatar: Scott Velez"&gt;&lt;/a&gt;&lt;a href="https://github.com/ooojustin" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fooojustin.png" width="60px" alt="User avatar: justin"&gt;&lt;/a&gt;&lt;a href="https://github.com/mayfieldiv" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmayfieldiv.png" width="60px" alt="User avatar: Mayfield"&gt;&lt;/a&gt;&lt;a href="https://github.com/somaholiday" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsomaholiday.png" width="60px" alt="User avatar: Soma Holiday"&gt;&lt;/a&gt;&lt;a href="https://github.com/bizmythy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbizmythy.png" width="60px" alt="User avatar: bizmyth"&gt;&lt;/a&gt;&lt;a href="https://github.com/dessalines" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdessalines.png" width="60px" alt="User avatar: Dessalines"&gt;&lt;/a&gt;&lt;a href="https://github.com/KKodiac" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FKKodiac.png" width="60px" alt="User avatar: Sean Hong(홍성민)"&gt;&lt;/a&gt;&lt;a href="https://github.com/RADreymann" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FRADreymann.png" width="60px" alt="User avatar: Alex Dreymann"&gt;&lt;/a&gt;&lt;a href="https://github.com/felipeospina21" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffelipeospina21.png" width="60px" alt="User avatar: Felipe Ospina"&gt;&lt;/a&gt;&lt;a href="https://github.com/riccardoNovaglia" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FriccardoNovaglia.png" width="60px" alt="User avatar: Riccardo Novaglia"&gt;&lt;/a&gt;&lt;a href="https://github.com/nitipon-apaisri" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnitipon-apaisri.png" width="60px" alt="User avatar: rxz"&gt;&lt;/a&gt;&lt;a href="https://github.com/rbuchberger" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Frbuchberger.png" width="60px" alt="User avatar: Robert Buchberger"&gt;&lt;/a&gt;&lt;a href="https://github.com/tyamori" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftyamori.png" width="60px" alt="User avatar: housekeeper"&gt;&lt;/a&gt;&lt;a href="https://github.com/fogrye" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffogrye.png" width="60px" alt="User avatar: Yurii"&gt;&lt;/a&gt;&lt;a href="https://github.com/paalss" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpaalss.png" width="60px" alt="User avatar: Pål Syvertsen Stakvik"&gt;&lt;/a&gt;&lt;a href="https://github.com/SaucePackets" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FSaucePackets.png" width="60px" alt="User avatar: "&gt;&lt;/a&gt;&lt;a href="https://github.com/zakelfassi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fzakelfassi.png" width="60px" alt="User avatar: Zak El Fassi"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Elevator Pitch&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Rant time: You've heard it before, git is &lt;em&gt;powerful&lt;/em&gt;, but what good is that power when everything is so damn hard to do? Interactive rebasing requires you to edit a goddamn TODO file in your editor? &lt;em&gt;Are you kidding me?&lt;/em&gt; To stage part of a file you need to use a command line program to…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jesseduffield" rel="noopener noreferrer"&gt;
        jesseduffield
      &lt;/a&gt; / &lt;a href="https://github.com/jesseduffield/lazydocker" rel="noopener noreferrer"&gt;
        lazydocker
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The lazier way to manage everything docker
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;sup&gt;Special thanks to:&lt;/sup&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="https://www.warp.dev/?utm_source=github&amp;amp;utm_medium=referral&amp;amp;utm_campaign=lazydocker_20231023" rel="nofollow noopener noreferrer"&gt;
  &lt;div&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fwarpdotdev%2Fbrand-assets%2Fraw%2Fmain%2FGithub%2FSponsor%2FWarp-Github-LG-02.png%3Fraw%3Dtrue" width="400" alt="Warp"&gt;
  &lt;/div&gt;
  &lt;b&gt;Warp, the intelligent terminal&lt;/b&gt;
  &lt;br&gt;
  &lt;b&gt;Available for MacOS and Linux&lt;/b&gt;
  &lt;br&gt;
  &lt;div&gt;
    &lt;sup&gt;Visit warp.dev to learn more.&lt;/sup&gt;
  &lt;/div&gt;
&lt;/a&gt;
&lt;br&gt;

&lt;a href="https://tuple.app/lazydocker" rel="nofollow noopener noreferrer"&gt;
  &lt;div&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjesseduffield%2Flazydocker%2FHEAD%2Fassets%2Ftuple.png" width="400" alt="Tuple"&gt;
  &lt;/div&gt;
  &lt;b&gt;Tuple, the premier screen sharing app for developers on macOS and Windows.&lt;/b&gt;
&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;
&lt;a href="https://www.subble.com/jobs/engineer" rel="nofollow noopener noreferrer"&gt;
  &lt;div&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjesseduffield%2Flazydocker%2FHEAD%2Fassets%2Fsubble-job-ad.jpg" width="400" alt="Subble"&gt;
  &lt;/div&gt;
  &lt;b&gt;Click here to learn more&lt;/b&gt;
&lt;/a&gt;
&lt;br&gt;

&lt;/div&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/8456633/59972109-8e9c8480-95cc-11e9-8350-38f7f86ba76d.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8456633%2F59972109-8e9c8480-95cc-11e9-8350-38f7f86ba76d.png"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A simple terminal UI for both docker and docker-compose, written in Go with the &lt;a href="https://github.com/jroimartin/gocui" title="gocui" rel="noopener noreferrer"&gt;gocui&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jesseduffield/lazygit/workflows/Continuous%20Integration/badge.svg"&gt;&lt;img src="https://github.com/jesseduffield/lazygit/workflows/Continuous%20Integration/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/jesseduffield/lazydocker" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3646b6234305f50b675e4eb299a9336252b9007a3644dca449b038d1e2055786/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f6a657373656475666669656c642f6c617a79646f636b6572" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://golangci.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/12d35b3c5aade814c4f71d31e8d811423295653af7e90c742ac52e9d3a7cd6c0/68747470733a2f2f676f6c616e6763692e636f6d2f6261646765732f6769746875622e636f6d2f6a657373656475666669656c642f6c617a79646f636b65722e737667" alt="GolangCI"&gt;&lt;/a&gt;
&lt;a href="http://godoc.org/github.com/jesseduffield/lazydocker" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8f54b8bdbc121d04880e0051e6053cbe764867448ae932f44041e66b2a21c2bd/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f6a657373656475666669656c642f6c617a79646f636b65723f7374617475732e737667" alt="GoDoc"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/735cb4291852a0b3bdb4fe793c3d1b559bb8aab8d66336badf1bb6c2c8919c26/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7265706f2d73697a652f6a657373656475666669656c642f6c617a79646f636b6572"&gt;&lt;img src="https://camo.githubusercontent.com/735cb4291852a0b3bdb4fe793c3d1b559bb8aab8d66336badf1bb6c2c8919c26/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7265706f2d73697a652f6a657373656475666669656c642f6c617a79646f636b6572" alt="GitHub repo size"&gt;&lt;/a&gt;
&lt;a href="https://github.com/jesseduffield/lazydocker/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ed1821d26ff513d689e745434ff4b0010616d11c902ec9c3378ceab1be52aaaf/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f6a657373656475666669656c642f6c617a79646f636b65722f746f74616c" alt="GitHub Releases"&gt;&lt;/a&gt;
&lt;a href="https://github.com/jesseduffield/lazydocker/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4c995adc171494c3940c46b2320544fbd2a3fc974fd649a7a6f9ecce0e1533cc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6a657373656475666669656c642f6c617a79646f636b65722e737667" alt="GitHub tag"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Homebrew/homebrew-core/blob/master/Formula/lazydocker.rb" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/277a7650808ba941db8f1ceece287b0bcdcb45369994178da996b456cff61f51/68747470733a2f2f696d672e736869656c64732e696f2f686f6d65627265772f762f6c617a79646f636b6572" alt="homebrew"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/docs/resources/demo3.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdocs%2Fresources%2Fdemo3.gif" alt="Gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/NICqQPxwJWw" rel="nofollow noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Sponsors&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;
 Maintenance of this project is made possible by all the &lt;a href="https://github.com/jesseduffield/lazydocker/graphs/contributors" rel="noopener noreferrer"&gt;contributors&lt;/a&gt; and &lt;a href="https://github.com/sponsors/jesseduffield" rel="noopener noreferrer"&gt;sponsors&lt;/a&gt;. If you'd like to sponsor this project and have your avatar or company logo appear below &lt;a href="https://github.com/sponsors/jesseduffield" rel="noopener noreferrer"&gt;click here&lt;/a&gt;. 💙
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/intabulas" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fintabulas.png" width="60px" alt="Mark Lussier"&gt;&lt;/a&gt;&lt;a href="https://github.com/peppy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpeppy.png" width="60px" alt="Dean Herbert"&gt;&lt;/a&gt;&lt;a href="https://github.com/piot" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpiot.png" width="60px" alt="Peter Bjorklund"&gt;&lt;/a&gt;&lt;a href="https://github.com/rgwood" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Frgwood.png" width="60px" alt="Reilly Wood"&gt;&lt;/a&gt;&lt;a href="https://github.com/oliverguenther" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Foliverguenther.png" width="60px" alt="Oliver Günther"&gt;&lt;/a&gt;&lt;a href="https://github.com/pawanjay176" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpawanjay176.png" width="60px" alt="Pawan Dhananjay"&gt;&lt;/a&gt;&lt;a href="https://github.com/bdach" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbdach.png" width="60px" alt="Bartłomiej Dach"&gt;&lt;/a&gt;&lt;a href="https://github.com/davidklsn" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdavidklsn.png" width="60px" alt="David Karlsson"&gt;&lt;/a&gt;&lt;a href="https://github.com/carstengehling" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcarstengehling.png" width="60px" alt="Carsten Gehling"&gt;&lt;/a&gt;&lt;a href="https://github.com/ceuk" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fceuk.png" width="60px" alt="CEUK"&gt;&lt;/a&gt;&lt;a href="https://github.com/akospwc" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fakospwc.png" width="60px" alt="Akos Putz"&gt;&lt;/a&gt;&lt;a href="https://github.com/Xetera" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FXetera.png" width="60px" alt="Xetera"&gt;&lt;/a&gt;&lt;a href="https://github.com/HoldenLucas" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FHoldenLucas.png" width="60px" alt="Holden Lucas"&gt;&lt;/a&gt;&lt;a href="https://github.com/nartc" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnartc.png" width="60px" alt="Chau Tran"&gt;&lt;/a&gt;&lt;a href="https://github.com/matejcik" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmatejcik.png" width="60px" alt="matejcik"&gt;&lt;/a&gt;&lt;a href="https://github.com/lucatume" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flucatume.png" width="60px" alt="theAverageDev (Luca Tumedei)"&gt;&lt;/a&gt;&lt;a href="https://github.com/IvanZuy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FIvanZuy.png" width="60px" alt="Ivan Zaitsev"&gt;&lt;/a&gt;&lt;a href="https://github.com/nicholascloud" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnicholascloud.png" width="60px" alt="Nicholas Cloud"&gt;&lt;/a&gt;&lt;a href="https://github.com/PhotonQuantum" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FPhotonQuantum.png" width="60px" alt="LightQuantum"&gt;&lt;/a&gt;&lt;a href="https://github.com/GitSquared" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FGitSquared.png" width="60px" alt="Gabriel Saillard"&gt;&lt;/a&gt;&lt;a href="https://github.com/ava1ar" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fava1ar.png" width="60px" alt="Aliaksandr Stelmachonak"&gt;&lt;/a&gt;&lt;a href="https://github.com/minidfx" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fminidfx.png" width="60px" alt="Burgy Benjamin"&gt;&lt;/a&gt;&lt;a href="https://github.com/JoeKlemmer" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FJoeKlemmer.png" width="60px" alt="Joe Klemmer"&gt;&lt;/a&gt;&lt;a href="https://github.com/tobi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftobi.png" width="60px" alt="Tobias Lütke"&gt;&lt;/a&gt;&lt;a href="https://github.com/benbfortis" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbenbfortis.png" width="60px" alt="Ben Beaumont"&gt;&lt;/a&gt;&lt;a href="https://github.com/jakewarren" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjakewarren.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/tgpholly" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftgpholly.png" width="60px" alt="Holly"&gt;&lt;/a&gt;&lt;a href="https://github.com/jisantuc" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjisantuc.png" width="60px" alt="James Santucci"&gt;&lt;/a&gt;&lt;a href="https://github.com/bitprophet" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbitprophet.png" width="60px" alt="Jeff Forcier"&gt;&lt;/a&gt;&lt;a href="https://github.com/tayleighr" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftayleighr.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/Novakov" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FNovakov.png" width="60px" alt="Maciej T. Nowak"&gt;&lt;/a&gt;&lt;a href="https://github.com/farzadmf" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffarzadmf.png" width="60px" alt="Farzad Majidfayyaz"&gt;&lt;/a&gt;&lt;a href="https://github.com/nekhaevskiy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnekhaevskiy.png" width="60px" alt="Yury"&gt;&lt;/a&gt;&lt;a href="https://github.com/reivilibre" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Freivilibre.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/andreaskurth" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fandreaskurth.png" width="60px" alt="Andreas Kurth"&gt;&lt;/a&gt;&lt;a href="https://github.com/BSteffaniak" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBSteffaniak.png" width="60px" alt="Braden Steffaniak"&gt;&lt;/a&gt;&lt;a href="https://github.com/jordan-gillard" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjordan-gillard.png" width="60px" alt="Jordan Gillard"&gt;&lt;/a&gt;&lt;a href="https://github.com/smangels" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsmangels.png" width="60px" alt="Sebastian"&gt;&lt;/a&gt;&lt;a href="https://github.com/George-Spanos" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FGeorge-Spanos.png" width="60px" alt="George Spanos"&gt;&lt;/a&gt;&lt;a href="https://github.com/frantisekstanko" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffrantisekstanko.png" width="60px" alt="Frantisek Stanko"&gt;&lt;/a&gt;&lt;a href="https://github.com/amslezak" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Famslezak.png" width="60px" alt="Andy Slezak"&gt;&lt;/a&gt;&lt;a href="https://github.com/mkock" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmkock.png" width="60px" alt="Martin Kock"&gt;&lt;/a&gt;&lt;a href="https://github.com/illarionvk" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fillarionvk.png" width="60px" alt="Illarion Koperski"&gt;&lt;/a&gt;&lt;a href="https://github.com/WhiteBlackGoose" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FWhiteBlackGoose.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/jessealama" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjessealama.png" width="60px" alt="Jesse Alama"&gt;&lt;/a&gt;&lt;a href="https://github.com/codacy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcodacy.png" width="60px" alt="Codacy"&gt;&lt;/a&gt;&lt;a href="https://github.com/colbr" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcolbr.png" width="60px" alt="Brett"&gt;&lt;/a&gt;&lt;a href="https://github.com/heijmans" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fheijmans.png" width="60px" alt="Jan Heijmans"&gt;&lt;/a&gt;&lt;a href="https://github.com/Vesther" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FVesther.png" width="60px" alt="Kevin Nowald"&gt;&lt;/a&gt;&lt;a href="https://github.com/sempruijs" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsempruijs.png" width="60px" alt="sem pruijs"&gt;&lt;/a&gt;&lt;a href="https://github.com/omarluq" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fomarluq.png" width="60px" alt="Omar Luq "&gt;&lt;/a&gt;&lt;a href="https://github.com/ethanjli" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fethanjli.png" width="60px" alt="Ethan Li"&gt;&lt;/a&gt;&lt;a href="https://github.com/phubaba" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fphubaba.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/fomrat" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffomrat.png" width="60px" alt="Brian MacAskill"&gt;&lt;/a&gt;&lt;a href="https://github.com/canhazcodez" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcanhazcodez.png" width="60px" alt="Maxi"&gt;&lt;/a&gt;&lt;a href="https://github.com/nikbrunner" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnikbrunner.png" width="60px" alt="nbr"&gt;&lt;/a&gt;&lt;a href="https://github.com/neunkasulle" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fneunkasulle.png" width="60px" alt="Jan Zenkner"&gt;&lt;/a&gt;&lt;a href="https://github.com/ahkohd" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fahkohd.png" width="60px" alt="Victor Aremu"&gt;&lt;/a&gt;&lt;a href="https://github.com/RVxLab" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FRVxLab.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/igor-ramazanov" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Figor-ramazanov.png" width="60px" alt="Igor Ramazanov"&gt;&lt;/a&gt;&lt;a href="https://github.com/glotchimo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fglotchimo.png" width="60px" alt="Elliott Maguire"&gt;&lt;/a&gt;&lt;a href="https://github.com/n8nio" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fn8nio.png" width="60px" alt="n8n - Workflow Automation"&gt;&lt;/a&gt;&lt;a href="https://github.com/kaleballmon" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fkaleballmon.png" width="60px" alt="kaleb allmon"&gt;&lt;/a&gt;&lt;a href="https://github.com/joshuadavidthomas" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjoshuadavidthomas.png" width="60px" alt="Josh Thomas"&gt;&lt;/a&gt;&lt;a href="https://github.com/josephjacks" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjosephjacks.png" width="60px" alt="JJ"&gt;&lt;/a&gt;&lt;a href="https://github.com/FrederickGeek8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrederickGeek8.png" width="60px" alt="Frederick Morlock"&gt;&lt;/a&gt;&lt;a href="https://github.com/agrippanux" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fagrippanux.png" width="60px" alt="Darren Craine"&gt;&lt;/a&gt;&lt;a href="https://github.com/ezdac" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fezdac.png" width="60px" alt="Maximilian Langenfeld"&gt;&lt;/a&gt;&lt;a href="https://github.com/sarzhann" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsarzhann.png" width="60px" alt="Nurzhan"&gt;&lt;/a&gt;&lt;a href="https://github.com/dbuls" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdbuls.png" width="60px" alt="Davis Buls"&gt;&lt;/a&gt;&lt;a href="https://github.com/MGreek" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FMGreek.png" width="60px" alt="Grec Marc"&gt;&lt;/a&gt;&lt;a href="https://github.com/sainu" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsainu.png" width="60px" alt="sainu"&gt;&lt;/a&gt;&lt;a href="https://github.com/mguellsegarra" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmguellsegarra.png" width="60px" alt="Marc Güell Segarra"&gt;&lt;/a&gt;&lt;a href="https://github.com/lppassos" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flppassos.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/chrisolsen" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchrisolsen.png" width="60px" alt="Chris Olsen"&gt;&lt;/a&gt;&lt;a href="https://github.com/vladimir-popov" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fvladimir-popov.png" width="60px" alt="Vladimir Popov"&gt;&lt;/a&gt;&lt;a href="https://github.com/neilcode" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fneilcode.png" width="60px" alt="Neil Lambert"&gt;&lt;/a&gt;&lt;a href="https://github.com/shaungarwood" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fshaungarwood.png" width="60px" alt="Shaun Garwood"&gt;&lt;/a&gt;&lt;a href="https://github.com/dhh" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdhh.png" width="60px" alt="David Heinemeier Hansson"&gt;&lt;/a&gt;&lt;a href="https://github.com/wayanjimmy" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fwayanjimmy.png" width="60px" alt="Wayan jimmy"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Elevator Pitch&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Minor rant incoming: Something's not working? Maybe a service is down. &lt;code&gt;docker-compose ps&lt;/code&gt;. Yep, it's that microservice that's still buggy. No issue, I'll just restart it: &lt;code&gt;docker-compose restart&lt;/code&gt;. Okay now let's try again. Oh wait the issue is still there. Hmm. &lt;code&gt;docker-compose ps&lt;/code&gt;. Right so the service must have just stopped immediately after starting. I probably would have known…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jesseduffield/lazydocker" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;I asked &lt;code&gt;Gemini&lt;/code&gt;, "I want to create a cafe-like space in the terminal and play cafe-inspired music endlessly. Is that possible?" It replied, "Totally possible."&lt;/p&gt;

&lt;p&gt;That was the moment my next project was decided.&lt;/p&gt;

&lt;p&gt;I also had Gemini make the mockup.&lt;/p&gt;

&lt;p&gt;The project name is &lt;strong&gt;LazyCafe&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i9vi3qjrl62lbdvcf1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i9vi3qjrl62lbdvcf1v.png" alt="LazyCafe mockup photo" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By the way, some of you may be thinking, "Couldn't you just search for cafe music on YouTube and play that?"&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;YouTube has too much noise: weird animations, related videos, and so on.&lt;br&gt;
The same goes for other music streaming apps.&lt;/p&gt;

&lt;p&gt;It has to be completed entirely inside the terminal, or it has no meaning.&lt;br&gt;
I think all you Vimmers understand this feeling. Am I wrong? You there, Vimmer!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Tools Used
&lt;/h2&gt;

&lt;p&gt;My selection criterion was whether the tool could help build a business that survives 10 years from now.&lt;br&gt;
I excluded all pointless trends.&lt;/p&gt;

&lt;p&gt;My company has only one person, and of course we don't yet have enough revenue to hire outsourced engineers.&lt;/p&gt;

&lt;p&gt;On top of that, I also do contract development as a sole proprietor, so I only have about three days a week to work on &lt;code&gt;LazyCafe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Therefore, in order to complete and release the product within one month while simultaneously handling marketing, I had to strictly follow these three rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automate development work with programs and AI as much as possible&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add absolutely no unnecessary features&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;(Looking back, I feel like the chat feature may not have been necessary.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never do the same task twice&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  AI Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://gemini.google.com/" rel="noopener noreferrer"&gt;&lt;code&gt;Gemini&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://chatgpt.com/" rel="noopener noreferrer"&gt;&lt;code&gt;ChatGPT&lt;/code&gt;&lt;/a&gt; (Pro plan)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;&lt;code&gt;GitHub Copilot&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://pi.dev" rel="noopener noreferrer"&gt;&lt;code&gt;Pi&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://opencode.ai/" rel="noopener noreferrer"&gt;&lt;code&gt;Opencode&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Most Development Is Done with GitHub Copilot
&lt;/h4&gt;

&lt;p&gt;When I assign tasks to &lt;code&gt;GitHub Copilot&lt;/code&gt; as if I were assigning issues to a subordinate, it creates pull requests with far better results than I expected.&lt;/p&gt;

&lt;p&gt;We can review each other on PRs and discuss implementation details.&lt;/p&gt;

&lt;p&gt;It feels like working with a remote employee.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fim209y5j27t8zzsiwqq4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fim209y5j27t8zzsiwqq4.png" alt="Discussing with GitHub Copilot on a PR" width="800" height="851"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For concrete instructions like "do this in that file," I leave everything to &lt;code&gt;GitHub Copilot&lt;/code&gt;.&lt;br&gt;
After carefully reviewing it, I release it.&lt;/p&gt;
&lt;h4&gt;
  
  
  Business Logic Is Implemented with Pi and Opencode
&lt;/h4&gt;

&lt;p&gt;Sometimes there are areas I absolutely cannot entrust to AI, such as business-specific logic or parts related to payments and authentication that could cause customer damage. I cannot simply dump those onto GitHub Copilot, so I implement them myself.&lt;/p&gt;

&lt;p&gt;Since I use Neovim as my main editor, I need AI agents that work well with the CLI.&lt;/p&gt;

&lt;p&gt;That's why I mainly use &lt;code&gt;Opencode&lt;/code&gt; and &lt;code&gt;Pi&lt;/code&gt;.&lt;br&gt;
You can think of them as open-source versions of Claude Code CLI.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://opencode.ai/ja" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;opencode.ai&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://pi.dev/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpi.dev%2Fsocial.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://pi.dev/" rel="noopener noreferrer" class="c-link"&gt;
            Pi Coding Agent
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A terminal-based coding agent
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpi.dev%2Ffavicon.svg" width="800" height="800"&gt;
          pi.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I learned about &lt;code&gt;Pi&lt;/code&gt; from a tweet by DHH. For now, I like it because it seems easier to use than &lt;code&gt;Opencode&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2052969528137560550-452" src="https://platform.twitter.com/embed/Tweet.html?id=2052969528137560550"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2052969528137560550-452');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2052969528137560550&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;For the model, I use &lt;code&gt;gpt-5.5&lt;/code&gt; through the premium requests bundled with &lt;code&gt;GitHub Copilot&lt;/code&gt; and my &lt;code&gt;ChatGPT&lt;/code&gt; subscription.&lt;/p&gt;

&lt;h4&gt;
  
  
  ChatGPT's Chat Feels Childish
&lt;/h4&gt;

&lt;p&gt;For brainstorming and research via chat, I use Gemini.&lt;br&gt;
ChatGPT lies normally, uses too many bullet points, and is hard to read.&lt;br&gt;
It's basically a yes-man, and it somehow feels like I'm being treated like a child, which irritates me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Previously, I asked ChatGPT how much tax-saving effect there would be from using both a micro-corporation and sole proprietorship.&lt;br&gt;
It calculated only the taxes on the micro-corporation side with low executive compensation and replied, "It's cheaper than being a sole proprietor."&lt;br&gt;
I flipped out because, if you're comparing them, you obviously have to look at the taxes and social insurance premiums on the sole proprietor side too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My basic strategy is to use APIs at fixed rates through external tools.&lt;/p&gt;
&lt;h4&gt;
  
  
  ChatGPT's &lt;code&gt;image-2.0&lt;/code&gt; Is Insane
&lt;/h4&gt;

&lt;p&gt;Image2 is seriously powerful.&lt;br&gt;
For someone like me, whose girlfriend rated my design sense as "on the level of a chimpanzee," it is more than enough.&lt;/p&gt;

&lt;p&gt;It can output app mockups and YouTube thumbnails at a level I'm satisfied with in one shot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pd82a5ejer27akf4vut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pd82a5ejer27akf4vut.png" alt="LazyCafe logo" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The LazyCafe logo.&lt;br&gt;
It put the terminal "&amp;gt;_" on the cup and combined "zzz" with both laziness and coffee steam. Amazing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tso5ysf3v8uxkhlb52m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tso5ysf3v8uxkhlb52m.png" alt="YouTube thumbnail" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A YouTube video thumbnail for English-speaking users.&lt;br&gt;
I uploaded an image I took myself to GPT and said, "Make a thumbnail with this."&lt;br&gt;
The surrounding icons feel AI-ish, but the typography and photo processing are much higher quality than what I could do myself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Until now, at our company, the only employee besides me was &lt;code&gt;GitHub Copilot&lt;/code&gt;, but &lt;code&gt;GPT Image2&lt;/code&gt; has now been promoted to employee status as well.&lt;/p&gt;
&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://rubyonrails.org/" rel="noopener noreferrer"&gt;&lt;code&gt;Ruby on Rails 8&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://hotwired.dev/" rel="noopener noreferrer"&gt;&lt;code&gt;Hotwire&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://kamal-deploy.org/" rel="noopener noreferrer"&gt;&lt;code&gt;Kamal 2&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.sqlite.org/" rel="noopener noreferrer"&gt;&lt;code&gt;SQLite&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.hetzner.com/" rel="noopener noreferrer"&gt;&lt;code&gt;Hetzner&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ffmpeg.org/" rel="noopener noreferrer"&gt;&lt;code&gt;ffmpeg&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(&lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;&lt;code&gt;Tailwind&lt;/code&gt;&lt;/a&gt; / &lt;a href="https://daisyui.com/" rel="noopener noreferrer"&gt;&lt;code&gt;DaisyUI&lt;/code&gt;&lt;/a&gt;)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Using a Boilerplate
&lt;/h4&gt;

&lt;p&gt;In order to release reliably within limited time, I had actually developed a boilerplate as my first project last month.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://super-rails.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" height="512" class="m-0" width="512"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://super-rails.com/" rel="noopener noreferrer" class="c-link"&gt;
            Super Rails | Rails Boilerplate for Solopreneurs
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A production-ready Rails boilerplate with Devise, Avo, Stripe, ViewComponent and more. Skip the setup, ship your MVP in days.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" width="512" height="512"&gt;
          super-rails.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I have run &lt;code&gt;rails new&lt;/code&gt; more than 500 times so far.&lt;/p&gt;

&lt;p&gt;Based on that experience, I created a boilerplate preloaded with the libraries and features I know I absolutely need, and I also sold it.&lt;/p&gt;

&lt;p&gt;For example: authentication, social login, authorization, notifications, admin screens, user profile pages, and user information editing.&lt;br&gt;
These are not included in Rails by default, but I knew from my own cases that I would definitely need them, so I added them last month.&lt;/p&gt;

&lt;p&gt;GitHub repositories have a feature that lets you register them as a "Template repository."&lt;br&gt;
When you turn this on, you can smoothly rocket-start the next project from the template.&lt;/p&gt;

&lt;p&gt;Currently, "SuperRails" has 158 commits.&lt;br&gt;
That means if I use this boilerplate going forward, I can expect to save that much time.&lt;/p&gt;

&lt;p&gt;Incidentally, the sales site for the boilerplate, &lt;code&gt;super-rails.com&lt;/code&gt; itself, was also developed using the &lt;code&gt;SuperRails&lt;/code&gt; boilerplate.&lt;/p&gt;
&lt;h4&gt;
  
  
  Rails Is Evolving Toward Less Is More
&lt;/h4&gt;

&lt;p&gt;Rails has evolved with each version toward being "simpler and easier to understand."&lt;/p&gt;

&lt;p&gt;Thanks to Hotwire, the frontend is also completed within the Rails codebase. There is no need to deliberately use modern JS.&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://hotwired.dev/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;hotwired.dev&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Kamal 2 is a Docker deployment tool included by default in Rails.&lt;br&gt;
Once you have contracted a VPS and can connect via SSH, you can publish your product to the entire world just by running &lt;code&gt;kamal/setup&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://kamal-deploy.org/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkamal-deploy.org%2Fassets%2Fimages%2Fopengraph.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://kamal-deploy.org/" rel="noopener noreferrer" class="c-link"&gt;
            Kamal — Deploy web apps anywhere
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            From bare metal to cloud VMs using Docker, deploy web apps anywhere with zero downtime.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkamal-deploy.org%2Fassets%2Fimages%2Ffavicon.svg" width="16" height="16"&gt;
          kamal-deploy.org
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;For VPS, I often use &lt;code&gt;Hetzner&lt;/code&gt;, a European rental server service.&lt;br&gt;
It is also introduced in the Rails Guides.&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://www.hetzner.com/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;hetzner.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://railsguides.jp/getting_started.html?phpMyAdmin=cfc2644bd9c947213a0141747c2608b0#kamal%E3%81%A7production%E7%92%B0%E5%A2%83%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frailsguides.jp%2Fimages%2Fcover_for_facebook.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://railsguides.jp/getting_started.html?phpMyAdmin=cfc2644bd9c947213a0141747c2608b0#kamal%E3%81%A7production%E7%92%B0%E5%A2%83%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B" rel="noopener noreferrer" class="c-link"&gt;
            
  Rails をはじめよう - Railsガイド

          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Railsのインストール方法と最初のRailsアプリケーションの作成に必要なすべてを解説します。
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frailsguides.jp%2Frailsguides%2Fimages%2Ffavicon.ico" width="96" height="96"&gt;
          railsguides.jp
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Since Rails 8, SQLite has become production-ready, so there is no need to prepare a separate DB server.&lt;br&gt;
For files, we use the VPS's local storage, so there is no need to prepare an external file storage service like S3 either.&lt;/p&gt;

&lt;p&gt;Redis for jobs has also become unnecessary thanks to the &lt;code&gt;Solid stack&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The architecture becomes simple, and above all, infrastructure costs are low because external dependencies are reduced!!!&lt;br&gt;
DHH is truly a god.&lt;/p&gt;

&lt;p&gt;I learned about &lt;code&gt;ffmpeg&lt;/code&gt; for the first time this time, but apparently it can be used for music playback.&lt;/p&gt;
&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/vadimdemedes/ink" rel="noopener noreferrer"&gt;&lt;code&gt;Ink&lt;/code&gt;&lt;/a&gt; / &lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;&lt;code&gt;React&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Ink&lt;/code&gt; is a React framework for implementing CLIs.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vadimdemedes" rel="noopener noreferrer"&gt;
        vadimdemedes
      &lt;/a&gt; / &lt;a href="https://github.com/vadimdemedes/ink" rel="noopener noreferrer"&gt;
        ink
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🌈 React for interactive command-line apps
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fvshymanskyy%2FStandWithUkraine%2Fmain%2Fbanner2-direct.svg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div&gt;
    &lt;br&gt;
    &lt;br&gt;
    &lt;a rel="noopener noreferrer" href="https://github.com/vadimdemedes/ink/media/logo.png"&gt;&lt;img width="240" alt="Ink" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fvadimdemedes%2Fink%2FHEAD%2Fmedia%2Flogo.png"&gt;&lt;/a&gt;
    &lt;br&gt;
    &lt;br&gt;
    &lt;br&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;React for CLIs. Build and test your CLI output using components.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/vadimdemedes/ink/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/vadimdemedes/ink/workflows/test/badge.svg" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://npmjs.com/package/ink" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9a0e729e8adf95828d18975d4c40527816733cc007058342d101f9bd920803cd/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f696e6b3f6c6f676f3d6e706d" alt="npm"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ink provides the same component-based UI building experience that React offers in the browser, but for command-line apps
It uses &lt;a href="https://github.com/facebook/yoga" rel="noopener noreferrer"&gt;Yoga&lt;/a&gt; to build Flexbox layouts in the terminal, so most CSS-like properties are available in Ink as well
If you are already familiar with React, you already know Ink.&lt;/p&gt;
&lt;p&gt;Since Ink is a React renderer, all features of React are supported
Head over to the &lt;a href="https://reactjs.org" rel="nofollow noopener noreferrer"&gt;React&lt;/a&gt; website for documentation on how to use it.
Only Ink's methods are documented in this readme.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fully AI-generated pull requests are not accepted. You can use AI, but should be verified and cleaned up by a human. Only Opus 4.6+ (high-effort) and Codex 5.4+ (extra high) are accepted models. Preferably created with Opus and verified by Codex.&lt;/strong&gt;&lt;/p&gt;

&lt;div&gt;
    
&lt;p&gt;
            &lt;sup&gt;
                &lt;a href="https://opencollective.com/vadimdemedes" rel="nofollow noopener noreferrer"&gt;My open source work is supported by the community ❤️&lt;/a&gt;
            &lt;/sup&gt;
        &lt;/p&gt;
    
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install ink react&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-alert markdown-alert-note"&gt;
&lt;p class="markdown-alert-title"&gt;Note&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vadimdemedes/ink" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  Code Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ink&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;green&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;black&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;backgroundColor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;black&lt;/span&gt; &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;white&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#ffffff&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;white&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;bold&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;bold&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;italic&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;italic&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;underline&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;underline&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;strikethrough&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;strikethrough&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;inverse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;inversed&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It feels like bringing a concept similar to &lt;code&gt;React Native&lt;/code&gt; to CLI tools—does that make sense?&lt;/p&gt;
&lt;h4&gt;
  
  
  Rust and Go Were Also Options, But...
&lt;/h4&gt;

&lt;p&gt;When considering maintainability and safety, including psychological safety, Rust and Go were also possible options, but I passed on them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;I have written Rust before, but I cannot implement things as easily as I can with React (my personal issue)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I don't know Go&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From that perspective, I chose React because I had used it on the web before and prioritized "being able to release."&lt;/p&gt;
&lt;h4&gt;
  
  
  How I Deal with Vibe Coding
&lt;/h4&gt;

&lt;p&gt;I think blindly throwing coding tasks at AI without looking at the code is evil, because there are security risks and so on.&lt;/p&gt;

&lt;p&gt;For the Rails backend, I release only after thoroughly testing and carefully reviewing it.&lt;br&gt;
So I thought it wouldn't be a major problem even if I cut corners on the frontend (React), and I ended up delegating it to AI in a way very close to vibe coding. Sorry.&lt;/p&gt;

&lt;p&gt;It will probably continue to crash or behave unexpectedly in the future (in fact, it already sometimes happens in my environment, which is scary), but I don't have time to refactor, so I'll just keep whack-a-mole fixing issues as they come up.&lt;br&gt;
I also have to catch up on Ink-specific knowledge, so it's tough...&lt;/p&gt;

&lt;p&gt;Takuya, the developer of Inkdrop, also says not to refactor until users gather.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Things built for the shortest possible release and expanded with speed as the priority inevitably become redundant or wasteful in many places. But once PMF is achieved and you know it works as a business, then you can start refactoring and trimming things down. &lt;strong&gt;I do not recommend spending a long time refactoring before PMF. The fundamental problem is not there.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://blog.craftz.dog/596e71b483ce/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Awm2bdOtsXvvjXDBs.png" height="480" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://blog.craftz.dog/596e71b483ce/" rel="noopener noreferrer" class="c-link"&gt;
            個人開発を7年以上続けて分かった技術選択のコツ
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F74%2F1c%2F741ce06b-d2c7-43b3-affc-fd93bcefc5be%2Fcontent%2Fimages%2Fsize%2Fw256h256%2F2025%2F08%2Flibraries_and_frameworks-copy-1.png" width="256" height="256"&gt;
          blog.craftz.dog
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  How the Application Works
&lt;/h3&gt;

&lt;p&gt;Basically, the structure is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web (authentication, payments, token issuance, admin screens, etc.): Rails&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI: Ink/React&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Music is stored as MP3 files inside Rails' &lt;code&gt;Active Storage&lt;/code&gt;, saved locally on the server deployed with &lt;code&gt;Kamal&lt;/code&gt;, and URLs are returned as JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Example&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;returning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;music&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;There&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;nothing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;particularly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;complex;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;React/Ink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;simply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;downloads&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MP&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;based&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;URLs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;caches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;them.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Path of Sunlit Leaves"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;156.72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-08T06:49:35.281Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-13T07:50:37.370Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://lazymusic.cc/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcsInB1ciI6ImJsb2JfaWQifX0=--8d03037bec4f54b548c3263458f4fa4e77ff9d0b/Morning%20Loop.mp3"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Birds at the Café Terrace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;153.72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-08T06:50:31.461Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-13T07:50:37.492Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://lazymusic.cc/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MiwicHVyIjoiYmxvYl9pZCJ9fQ==--a471fa6a93a60ae2ce14756d61d9d68fc57f3ef1/Morning%20Loop%20(1).mp3"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Through the Misty Forest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;104.904&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-08T06:52:08.453Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-13T07:50:37.625Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://lazymusic.cc/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MywicHVyIjoiYmxvYl9pZCJ9fQ==--1f5e201c9ea64933443c8560920f15461bb80a71/Forest%20Morning.mp3"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pagination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The plan is to delete the entire cache when the command exits.&lt;/p&gt;

&lt;p&gt;The admin screens and payment screens on the web are completely Rails.&lt;br&gt;
I implemented them extremely quickly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pcglevrmotkhcysg2nm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pcglevrmotkhcysg2nm.png" alt="Avo admin screen" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The admin screen uses a gem called Avo.&lt;br&gt;
When the Track model was generated, it created the admin functionality, so the time newly spent building the admin screen was 0 seconds.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As a little bonus, &lt;code&gt;LazyCafe&lt;/code&gt; includes a chat space.&lt;br&gt;
If there are other &lt;code&gt;LazyCafe&lt;/code&gt; users, you can interact with them in real time.&lt;/p&gt;

&lt;p&gt;This real-time communication is implemented with Rails' &lt;code&gt;Action Cable&lt;/code&gt; using socket communication.&lt;br&gt;
There is absolutely nothing special about the implementation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Don't Do Wasteful Things
&lt;/h3&gt;

&lt;p&gt;I don't do wasteful things.&lt;/p&gt;

&lt;p&gt;This is a CLI tool, so obsessing over the landing page is meaningless.&lt;br&gt;
Therefore, I will release the first version with this design that AI casually implemented.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcemrow2o91jrf79xb2md.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcemrow2o91jrf79xb2md.png" alt="Home#index photo" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is embarrassing.&lt;br&gt;
But there aren't enough people yet for me to be embarrassed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Finished Version
&lt;/h3&gt;

&lt;p&gt;Somehow, I managed to get it into shape in half a month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhc5ofn3iq0sj9pfsz514.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhc5ofn3iq0sj9pfsz514.png" alt="LazyCafe finished demo" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/uiOg36cQFMM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I've also been using it while working, and I've grown quite attached to it.&lt;br&gt;
This is already the phase where it should be released.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Collected the Music
&lt;/h2&gt;

&lt;p&gt;To create a cafe-like atmosphere, I needed to prepare a lot of music.&lt;br&gt;
The kind of music I especially like is a genre called &lt;code&gt;Lofi Hip-Hop&lt;/code&gt;, so I needed to collect a lot of it.&lt;/p&gt;

&lt;p&gt;Naturally, I cannot compose music, so I had to get it from somewhere.&lt;/p&gt;

&lt;p&gt;I considered the following options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public-domain music&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Free asset sites like &lt;code&gt;Pixabay&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Lyria3&lt;/code&gt; (Gemini's music generation model)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SunoAI&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Public-Domain Music
&lt;/h3&gt;

&lt;p&gt;I thought, "If I collect and line up music whose copyright has expired or been waived, it should take shape," but that was the beginning of hell.&lt;br&gt;
Lofi Hip-Hop seems to be a genre that only recently became popular, and I just couldn't find anything.&lt;/p&gt;

&lt;p&gt;When I searched, all I found were obscure classical pieces and low-quality jazz.&lt;br&gt;
So I gave up on public-domain music right there.&lt;/p&gt;
&lt;h3&gt;
  
  
  Free Asset Sites Like Pixabay
&lt;/h3&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://pixabay.com/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;pixabay.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;I thought free asset sites would be fine because they are permissive about copyright.&lt;br&gt;
Indeed, they say commercial use is allowed, and if used only as a minor part, it should be fine even without credit.&lt;/p&gt;

&lt;p&gt;However, the phrase "minor part" bothered me.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://pixabay.com/service/license-summary/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;pixabay.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;You cannot sell or distribute Content (either in digital or physical form) on a Standalone basis. Standalone means where no creative effort has been applied to the Content and it remains in substantially the same form as it exists on our website.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Standalone basis"?&lt;/p&gt;

&lt;p&gt;Hmm. Since the music would simply play in the user's terminal, would that be considered "standalone," or would the CLI functionality be seen as added value?&lt;/p&gt;

&lt;p&gt;When I consulted AI, &lt;code&gt;Claude&lt;/code&gt;, &lt;code&gt;ChatGPT&lt;/code&gt;, and &lt;code&gt;Gemini&lt;/code&gt; all said it was not allowed and that I should stop.&lt;br&gt;
(I tried changing the prompt in various ways, including asking, "Of course it's okay, right?" but it still said no. &lt;del&gt;What an annoying thing with more ethics than humans.&lt;/del&gt;)&lt;/p&gt;

&lt;p&gt;I won't explain the reasons in detail, but apparently the act of "redistribution" itself is a copyright problem, even if credit is given.&lt;/p&gt;

&lt;p&gt;Moreover, in my case, I would not be streaming; I would be downloading the files and storing the music heavily on my Rails server, which would apparently be judged as "possessing the music without permission."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Another reason may be that it competes with Pixabay's business model of "freely borrowing free assets."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Honestly, I don't think anyone would notice even if I did it, but since this is a business where I receive money from customers, I must respect rules and manners as much as possible.&lt;/p&gt;

&lt;p&gt;When I looked at other free asset sites that allow commercial use, they were all in a similar situation.&lt;br&gt;
This was a problem.&lt;/p&gt;
&lt;h3&gt;
  
  
  Lyria3
&lt;/h3&gt;

&lt;p&gt;I gave up and decided to try generating music with AI.&lt;br&gt;
Although AI-generated music does not become completely owned by me, I can publish it as mine within the scope of "ownership rights."&lt;br&gt;
There should be no problem with presenting music I made through a CLI tool.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I interpreted it as a problem to claim that music created by AI was "created by myself without using AI."&lt;br&gt;
I really don't know about this area, so if anyone knowledgeable is reading this, please comment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I tried using &lt;code&gt;Lyria3&lt;/code&gt;, released by Google, to generate music.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://gemini.google/jp/overview/music-generation/?hl=ja" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh3.googleusercontent.com%2F1E500rkSh8Gqkz2l12tkrKkMgsDmbQot0h3afeiRukXNficphb2zEE8o6J3dSKkiDGOOCcQ8WtRYzEYudgiYK9FkoQeYg_SP92-C%3De365-pa-nu-w1200-rj" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://gemini.google/jp/overview/music-generation/?hl=ja" rel="noopener noreferrer" class="c-link"&gt;
            Lyria — Gemini AI 音楽＆歌ジェネレーター
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            どんな瞬間にもぴったりのカスタム サウンドトラックを作成Lyria 3 は、テキストや写真をボーカルと歌詞付きの音声トラックに変換します。
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgemini.google%2Fimages%2Fspark_4c.png" width="128" height="128"&gt;
          gemini.google
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;But the quality was... underwhelming.&lt;br&gt;
It still had that unmistakable AI feeling. On top of that, it only supported generation up to three minutes.&lt;br&gt;
If the songs change too frequently, users cannot concentrate.&lt;/p&gt;

&lt;p&gt;Rejected.&lt;/p&gt;
&lt;h3&gt;
  
  
  SunoAI
&lt;/h3&gt;

&lt;p&gt;The final landing point was SunoAI.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://suno.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-o.suno.com%2Fmeta-preview.jpg" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://suno.com/" rel="noopener noreferrer" class="c-link"&gt;
            Suno | AI Music Generator
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Create stunning original music for free in seconds using our AI generator. Make your own masterpieces, share with friends, and discover music from artists worldwide.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-o.suno.com%2Ffavicon.ico" width="48" height="48"&gt;
          suno.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;As expected from such a famous service, the quality is outstanding.&lt;/p&gt;

&lt;p&gt;However, while I had heard that the latest model, &lt;code&gt;v5.5&lt;/code&gt;, could generate music up to eight minutes long, it mostly generated songs shorter than two minutes.&lt;/p&gt;

&lt;p&gt;If the music changes too frequently, concentration breaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hey, how can something that only generates music just over one minute long claim it can "generate up to eight minutes"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No matter how I changed the prompts, it didn't work, so I gave up, generated a large amount of music, and uploaded only decent tracks longer than two and a half minutes to &lt;code&gt;LazyCafe&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Of course, if you listen carefully, there are strange AI-generated artifacts, but I decided to embrace that as part of the flavor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I generated over 300 songs through sheer effort (all manually...), and selected 50 carefully chosen tracks for &lt;code&gt;LazyCafe&lt;/code&gt;.&lt;br&gt;
I am proud to say it has become a pretty good playlist.&lt;/p&gt;

&lt;p&gt;SunoAI itself is a wonderful service!&lt;br&gt;
I often use it for my YouTube channel too, so I will keep using it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To freely use music generated by SunoAI, you need to be a paid user at the time of generation. Please check SunoAI's latest information for details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Speeding Through the "Just Release It" Phase
&lt;/h2&gt;

&lt;p&gt;In any case, you cannot get results unless you release.&lt;br&gt;
The reason I am challenging myself, like Pieter Levels, to "release a product in one month" is that most products decay without ever achieving PMF.&lt;br&gt;
However, if the success rate of making a living through indie development is 10%, then releasing 10 products means one will surely hit.&lt;br&gt;
That's why I have to keep swinging the bat until I connect.&lt;/p&gt;

&lt;p&gt;In an era where most people in the world simply ignore AI by saying, "AI? It chats with you? That's cool," I want to leave my mark on society in the field of product development.&lt;/p&gt;
&lt;h3&gt;
  
  
  Costs Incurred
&lt;/h3&gt;

&lt;p&gt;I summarized the costs related to developing &lt;code&gt;LazyCafe&lt;/code&gt; from the beginning of May to the 15th.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT Pro plan&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;The first month is free thanks to a trial of ¥3,000. I plan to start paying next month.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;$28.65&lt;/td&gt;
&lt;td&gt;Pay-as-you-go. Caused by using too many Premium Requests. Since I found out that the &lt;code&gt;ChatGPT Pro&lt;/code&gt; subscription can be used with &lt;code&gt;Pi&lt;/code&gt;, this should decrease next month. GitHub Actions usage time also accounts for a fair portion of the charges, but assigning issues is convenient, so I accept it as the cost of convenience.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;$8.80&lt;/td&gt;
&lt;td&gt;Purchased via &lt;code&gt;Cloudflare Register&lt;/code&gt;. This is probably the cheapest.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner&lt;/td&gt;
&lt;td&gt;$9.49/month&lt;/td&gt;
&lt;td&gt;Rental server fee. Since it's postpaid, I haven't paid yet. LazyCafe's server is located in Falkenstein, Germany, prioritizing low cost. Even so, it reaches me in Osaka without stress.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even with a generous estimate, I expect it will not exceed 10,000 yen by the end of the month.&lt;br&gt;
That said, AI-related tools are also heavily used in other service development and contract development for my sole proprietorship, so if limited to &lt;code&gt;LazyCafe&lt;/code&gt;, it should be even cheaper.&lt;/p&gt;

&lt;p&gt;It doesn't even compare to about a year ago when I was subscribed to the &lt;code&gt;Claude Max&lt;/code&gt; plan ($200/mo)...&lt;br&gt;
The price destruction caused by technological progress is terrifying.&lt;/p&gt;

&lt;p&gt;Incidentally, last month's project, &lt;a href="https://super-rails.com" rel="noopener noreferrer"&gt;SuperRails&lt;/a&gt;, somehow got a VPS contract at the bargain price of $4.99/mo, so its running cost is practically nothing.&lt;br&gt;
Thanks to Kamal, I could eliminate the DB server, which is usually the most expensive part of infrastructure, and keep costs very low.&lt;br&gt;
Redis has also become unnecessary thanks to Rails 8's default features, so that cost is gone too.&lt;/p&gt;

&lt;p&gt;Seriously, all hail DHH 🙏&lt;/p&gt;
&lt;h3&gt;
  
  
  Marketing Strategy for Awareness
&lt;/h3&gt;

&lt;p&gt;Code that nobody uses is, in other words, garbage.&lt;br&gt;
You must not make excuses like, "I made it as a hobby, so it's fine if it doesn't sell."&lt;/p&gt;

&lt;p&gt;LazyCafe's beta has reached a level where it can be used for now, so although it is only about 30% complete, I want to release it to get feedback and dedicate the remaining half of the month entirely to marketing.&lt;/p&gt;

&lt;p&gt;Installation is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; lazycafe@latest
&lt;span class="nv"&gt;$ &lt;/span&gt;lazycafe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;I want to provide users with the excitement of transforming their terminal into a cafe with just these commands.&lt;/p&gt;

&lt;p&gt;People doing indie development have probably begun to realize this: marketing is more than 100 times harder than development.&lt;br&gt;
So I will first expose it to the world, improve it based on faint feedback, then get more feedback, and repeat that process.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The first version of the credit card payment platform Stripe was very rough, and Mailchimp v1.0 was also extremely simple. That's fine. The early version of Inkdrop was a note app, but it didn't even have a proper settings screen. Because I wanted to release quickly, I postponed payment implementation and posted on Hacker News as a closed beta to recruit testers and see the reaction.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://blog.craftz.dog/596e71b483ce/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Awm2bdOtsXvvjXDBs.png" height="480" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://blog.craftz.dog/596e71b483ce/" rel="noopener noreferrer" class="c-link"&gt;
            個人開発を7年以上続けて分かった技術選択のコツ
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F74%2F1c%2F741ce06b-d2c7-43b3-affc-fd93bcefc5be%2Fcontent%2Fimages%2Fsize%2Fw256h256%2F2025%2F08%2Flibraries_and_frameworks-copy-1.png" width="256" height="256"&gt;
          blog.craftz.dog
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;I will keep swinging the bat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Was It Good to Use Rails?
&lt;/h2&gt;

&lt;p&gt;The topic drifted a bit, so I want to close with Rails.&lt;/p&gt;

&lt;p&gt;A few years ago, DHH named Rails "The One Person Framework."&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://world.hey.com/dhh/the-one-person-framework-711e6318" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fworld.hey.com%2Fdhh%2F711e6318%2Frepresentations%2FeyJfcmFpbHMiOnsiZGF0YSI6NjQzNzExNDMxLCJwdXIiOiJibG9iX2lkIn19--1991b7fb47fbb5103e8745f368fada4781a8cc28ac072c0e996131a9c6d76306%2FeyJfcmFpbHMiOnsiZGF0YSI6eyJyZXNpemVfdG9fZmlsbCI6WzEyMDAsNjMwXSwicXVhbGl0eSI6NDAsInN0cmlwIjp0cnVlfSwicHVyIjoidmFyaWF0aW9uIn19--850460abb6619f326eb585ef63fdb0b416ee8bffff0b16dfc60dcb6699d89ebd%2Fthe%2520oregon%2520trail%2520game.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://world.hey.com/dhh/the-one-person-framework-711e6318" rel="noopener noreferrer" class="c-link"&gt;
            The One Person Framework
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fworld.hey.com%2Fdhh%2Favatar-fb368b1ee9b185dc2a09b03eabdb61678dd55244" width="300" height="300"&gt;
          world.hey.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It is exactly the right framework for me, developing alone (+ two AIs).&lt;/p&gt;

&lt;p&gt;This time, I shared how I am launching a new business using Rails.&lt;/p&gt;

&lt;p&gt;However, as you probably noticed, most of the content was about business.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How to release quickly and get feedback&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to operate cheaply&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to prepare music within the rules&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to avoid wasteful work&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to automate routine work or delegate it to AI&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fact that I can make these kinds of "upstream" decisions one after another without having to sort out countless small development concerns is, I think, a perfect embodiment of the benefits of Rails.&lt;/p&gt;

&lt;p&gt;Part of it is because I am used to Rails, but more than that, the major advantages of using Rails are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Because of "convention over configuration," both AI and humans can more easily follow best practices&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The core structure has not changed for over 20 years&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thanks to a community with strong opinions, you can rarely go wrong by using well-known gems&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It continues to evolve in a simpler direction&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Its creator himself describes it as "The One Person Framework" for the AI era&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think it would be impossible to move this smoothly with other frameworks.&lt;br&gt;
Things like whether to cache this or that, whether something belongs on the server or client, what to do about the ORM, or needing to add your own test library because one is not included.&lt;br&gt;
I don't want such trivial things getting in the way of my business.&lt;/p&gt;

&lt;p&gt;I truly love Rails.&lt;/p&gt;

&lt;p&gt;I plan to publish an update soon on the progress of &lt;code&gt;LazyCafe&lt;/code&gt; during the remaining half month.&lt;/p&gt;

&lt;p&gt;Everyone, let's build startups with Rails!&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>startup</category>
    </item>
    <item>
      <title>I’ve Given Up on Bun.</title>
      <dc:creator>Hulk in Public</dc:creator>
      <pubDate>Mon, 18 May 2026 03:10:29 +0000</pubDate>
      <link>https://forem.com/hulkinpublic/ive-given-up-on-bun-im-removing-it-from-superrails-1pg4</link>
      <guid>https://forem.com/hulkinpublic/ive-given-up-on-bun-im-removing-it-from-superrails-1pg4</guid>
      <description>&lt;p&gt;Bun’s implementation language has been migrated from Zig to Rust.&lt;/p&gt;

&lt;p&gt;I have no intention of criticizing either Zig or Rust. I think both are excellent languages.&lt;br&gt;
What I want to criticize is Bun’s development process.&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/oven-sh/bun/pull/30412" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Rewrite Bun in Rust
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#30412&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/Jarred-Sumner" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F709451%3Fv%3D4" alt="Jarred-Sumner avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/Jarred-Sumner" rel="noopener noreferrer"&gt;Jarred-Sumner&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/oven-sh/bun/pull/30412" rel="noopener noreferrer"&gt;&lt;time&gt;May 08, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Blog post with details coming soon.&lt;/p&gt;
&lt;p&gt;It passes Bun's pre-existing test suite on all platforms (and fixes several memory leaks and flaky tests), the binary size shrinks by 3 MB - 8 MB, the benchmarks are between neutral and faster - and most importantly, we now have compiler-assisted tools for catching &amp;amp; preventing memory bugs, which have costed the team an enormous amount of development &amp;amp; debugging time over the years.&lt;/p&gt;
&lt;p&gt;The codebase is otherwise largely the same. The same architecture, the same data structures. Bun still uses few 3rd party libraries. No async rust.&lt;/p&gt;
&lt;p&gt;To try this, run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bun upgrade --canary
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please do file issues if you run into any. If this thread gets crazy I will lock it.&lt;/p&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Still some optimization work to do before this lands in non-canary version.&lt;/li&gt;
&lt;li&gt;Still some cleanup work to do (which will come in a series of follow-up PRs)&lt;/li&gt;
&lt;/ul&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/oven-sh/bun/pull/30412" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa70a7z25kwt5zdd406hw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa70a7z25kwt5zdd406hw.png" alt="github pr rows" width="550" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have never seen a diff this large before.&lt;br&gt;
What is even more surprising is that, using Claude Code, they reportedly went from implementation to review and merge in less than a week.&lt;/p&gt;

&lt;p&gt;Anthropic, which owns Bun’s developer Oven, will likely use this “success story” to further market Claude models and tools.&lt;/p&gt;

&lt;p&gt;Even if the migration to Rust has solved the memory leak issues, and even if AI implemented excellent code at incredible speed, I am dismayed by a development process that can release code almost instantly without much review.&lt;/p&gt;

&lt;p&gt;To be clear, I am not claiming that AI-generated code is evil. AI can produce useful code, and I also rely on vibe coding in areas where the security risk is low.&lt;/p&gt;

&lt;p&gt;But I still review the generated code again and again before I trust it.&lt;/p&gt;

&lt;p&gt;My criticism is directed at the act of releasing code without taking full responsibility for it — that is, shipping a massive change without carefully reading and understanding every part of the diff.&lt;/p&gt;

&lt;p&gt;Given the sheer size of this change, I do not believe it was physically possible for the Bun development team to thoroughly review all of it in less than a week. That, not the use of AI itself, is what I find unacceptable.&lt;/p&gt;

&lt;p&gt;Some people say, “This is the first step in a gradual experiment. It will get better from here, and the Rust code will become more refined as unsafe code is eliminated.”&lt;br&gt;
Don’t be ridiculous. My products—&lt;a href="https://super-rails.com/" rel="noopener noreferrer"&gt;SuperRails&lt;/a&gt; and &lt;a href="https://lazymusic.cc/" rel="noopener noreferrer"&gt;LazyCafe&lt;/a&gt; —use Bun. Are my products Anthropic’s sandbox?&lt;/p&gt;

&lt;p&gt;In the near future, I plan to migrate SuperRails from Bun to a pnpm-based esbuild setup. I will consxider similar changes for other products, including LazyCafe.&lt;/p&gt;

&lt;p&gt;Anthropic and the Bun development team are so focused on short-term problems—how to go public as quickly as possible, and how to resolve memory leak issues as quickly as possible—that they lack the perspective of keeping these tools and products in society for the long term.&lt;/p&gt;

&lt;p&gt;This way of doing things does not align with my development philosophy: quietly running businesses that can survive for decades.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://super-rails.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" height="512" class="m-0" width="512"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://super-rails.com/" rel="noopener noreferrer" class="c-link"&gt;
            Super Rails | Rails Boilerplate for Solopreneurs
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A production-ready Rails boilerplate with Devise, Avo, Stripe, ViewComponent and more. Skip the setup, ship your MVP in days.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" width="512" height="512"&gt;
          super-rails.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>bunjs</category>
      <category>claude</category>
      <category>rust</category>
      <category>zig</category>
    </item>
    <item>
      <title>Why I Still Choose Ruby on Rails in the Age of AI</title>
      <dc:creator>Hulk in Public</dc:creator>
      <pubDate>Sun, 17 May 2026 12:11:07 +0000</pubDate>
      <link>https://forem.com/hulkinpublic/why-i-still-choose-ruby-on-rails-in-the-age-of-ai-m3h</link>
      <guid>https://forem.com/hulkinpublic/why-i-still-choose-ruby-on-rails-in-the-age-of-ai-m3h</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25tznzwmv9hw47ikn59v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25tznzwmv9hw47ikn59v.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hello, I’m Haruku, a freelance developer.&lt;br&gt;
After recently starting my own company, I’ve found myself thinking more about what kind of web framework fits the age of AI.&lt;/p&gt;

&lt;p&gt;I entered the world of computer science through Ruby, and since then I’ve launched side projects using popular technologies such as TypeScript (Next.js, Nuxt.js), Go, and Rust.&lt;br&gt;
But in the end, I realized that Ruby and Ruby on Rails fit my use case best.&lt;/p&gt;

&lt;p&gt;And that judgment has not changed even in 2026, when AI coding has become far more advanced.&lt;/p&gt;

&lt;p&gt;In this article, I’d like to explain &lt;strong&gt;why I decided to keep using Ruby in the age of AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For context, I plan to use Rails for every business I start through my company going forward. Please read this as one perspective from someone who is, in a sense, a “Rails believer.”&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I Use Rails
&lt;/h2&gt;
&lt;h3&gt;
  
  
  A Strongly Opinionated Community
&lt;/h3&gt;

&lt;p&gt;Many of you have probably heard the term CoC. Yes, “Convention over Configuration.”&lt;br&gt;
When starting a new Rails project, the framework forces many decisions that developers would otherwise have to make from scratch. Developers simply follow those conventions.&lt;br&gt;
Developers who use Rails always code with this concept of CoC in mind.&lt;/p&gt;

&lt;p&gt;For example, if you want to create a new model tied to a database, you only need to type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;rails&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="ss"&gt;:string&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="ss"&gt;:text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;in your terminal, and Rails will automatically create the table, the model layer, and the related tests.&lt;/p&gt;

&lt;p&gt;When I first learned programming and touched Rails, I wasn’t particularly impressed by this.&lt;br&gt;
But when I later tried Next.js and Nuxt.js, I was shocked to realize that this was not the norm.&lt;/p&gt;

&lt;p&gt;In many other frameworks, even the ORM for connecting to the database and the testing library are things you have to introduce yourself.&lt;/p&gt;

&lt;p&gt;I genuinely wondered why so few other languages had truly “batteries-included” frameworks.&lt;/p&gt;

&lt;p&gt;Even worse is that there is often no correct answer for “architecture,” including file structure.&lt;/p&gt;

&lt;p&gt;Where would you place the file that defines a User model?&lt;/p&gt;

&lt;p&gt;In Rails, of course, it goes in &lt;code&gt;/app/models/user.rb&lt;/code&gt;.&lt;br&gt;
But in TypeScript, Go, or Rust? Where do you put it? Do you just create your favorite location???&lt;/p&gt;

&lt;p&gt;When hundreds of these decisions pile up, developers feel stressed even just reading the code.&lt;/p&gt;

&lt;p&gt;Eventually, they set off on a journey to discover “what good architecture is,” spending time and mental energy on things like Clean Architecture or Onion Architecture that produce no profit at all. (Yes, that was me in the past. lol)&lt;/p&gt;

&lt;p&gt;Rails’ strong philosophy is sometimes criticized as “inflexible” or “not suitable for certain cases.”&lt;/p&gt;

&lt;p&gt;But unless you are planning a very large-scale project from the beginning, it probably won’t be a problem.&lt;/p&gt;

&lt;p&gt;DHH, the creator of Rails, has pointed out that most modern web development is CRUD—that is, applications of simple database reads and writes—and has openly stated that Rails is fully capable within that scope.&lt;/p&gt;

&lt;p&gt;This is highly compatible with AI coding.&lt;/p&gt;

&lt;p&gt;For example, suppose an AI goes off the rails and writes logic inside the User model that sends an HTTP request. (They do this often.)&lt;/p&gt;

&lt;p&gt;In terms of whether it runs or not, it probably will.&lt;/p&gt;

&lt;p&gt;But sending HTTP requests is clearly not the responsibility of the model layer. The role of the model layer is to handle database reads/writes and relationships.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz4ibjws4xdn2sqqct26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz4ibjws4xdn2sqqct26.png" alt="MVC image wiki" width="500" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The more rotten code increases, the harder it becomes for both humans and AI to maintain the code or add new features.&lt;br&gt;
And AI takes zero responsibility for the code it generates.&lt;/p&gt;

&lt;p&gt;That is why, in the age of AI, &lt;strong&gt;a strongly opinionated Ruby on Rails becomes a strength&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Specialized for Small-Scale Development
&lt;/h3&gt;

&lt;p&gt;You may have heard people say, “Large companies like GitHub and Shopify use Rails! That’s why you should use Rails!”&lt;/p&gt;

&lt;p&gt;That is true, but I’d rather argue that Rails’ real strength shines in smaller, elite teams—say, one to five people.&lt;/p&gt;

&lt;p&gt;DHH wrote a book called &lt;em&gt;Rework&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.co.jp/Rework-English-Jason-Fried-ebook/dp/B002MUAJ2A" rel="noopener noreferrer"&gt;&lt;em&gt;Rework&lt;/em&gt; on Amazon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It argues that you can make enough profit with a small team without raising huge amounts of VC funding or hiring employees at scale.&lt;br&gt;
This book influenced my life more than any other.&lt;/p&gt;

&lt;p&gt;And I believe this approach of pursuing profit with a small team &lt;strong&gt;fits perfectly in the AI age&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Since LLMs became widespread, people have started saying that “a one-person unicorn company will emerge within a few years.”&lt;/p&gt;

&lt;p&gt;Going forward, I believe engineering teams will continue to shrink, and the default competition will be about how quickly and how many products you can build and launch until you find PMF.&lt;/p&gt;

&lt;p&gt;In other words, we are entering an era where small teams launch many products.&lt;/p&gt;

&lt;p&gt;Rails is a framework DHH created for himself.&lt;/p&gt;

&lt;p&gt;It is specialized for quickly launching from a business perspective, adding features, getting market feedback, and rapidly repeating that cycle.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;rails g scaffold&lt;/code&gt; command is the clearest example of this.&lt;/p&gt;

&lt;p&gt;About three weeks have passed since I started my company, and by using only two free days per week—roughly ten days total—I was able to build a product and now have a realistic path to release it next week.&lt;/p&gt;

&lt;p&gt;This is possible precisely because of Rails’ strong philosophy based on CoC and the community that supports it.&lt;/p&gt;

&lt;p&gt;I don’t think it would have gone that way with something like Next.js. (I can imagine days spent fighting server components and caching.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As a framework for a small elite team using AI to run the PDCA cycle, I don’t think there is anything more suitable.&lt;/strong&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://bramjetten.dev/articles/the-one-person-framework-in-practice" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;bramjetten.dev&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;And as shown by the large companies mentioned earlier, Rails can also scale properly when used appropriately.&lt;/p&gt;

&lt;h3&gt;
  
  
  More Than 20 Years of History
&lt;/h3&gt;

&lt;p&gt;Ruby on Rails was released in July 2004. It already has more than 20 years of history!&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Gzj723LkRJY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;As you know, for generative AI to produce more accurate results, the quality and quantity of the training data are prerequisites.&lt;/p&gt;

&lt;p&gt;As an engineer, I fully understand the desire to build products with “modern” technologies.&lt;br&gt;
But &lt;strong&gt;from the perspective of getting a business off the ground, you should absolutely avoid that&lt;/strong&gt;. The reason is that the probability of failure increases.&lt;/p&gt;

&lt;p&gt;When reviewing AI-generated code, haven’t you ever replied, “That was true for an old version, but the latest version is different”?&lt;/p&gt;

&lt;p&gt;Rails has been used with consistent rules for more than 20 years, so &lt;strong&gt;it almost never outputs wildly incorrect code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This high level of trust is one of the reasons I love Ruby.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://blog.arkency.com/rails-when-nothing-changed-is-the-best-feature/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;blog.arkency.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Simple and Easy to Understand
&lt;/h3&gt;

&lt;p&gt;Take a look at recent release notes from well-known frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Server Components added?” Weren’t you the ones generating HTML only on the client side?&lt;/li&gt;
&lt;li&gt;“Caching is now easier to handle?” Why do I have to think about caching in addition to what I’m eating tomorrow?&lt;/li&gt;
&lt;li&gt;“We fixed a vulnerability!” Oh no, my company’s server was used for Bitcoin mining.&lt;/li&gt;
&lt;li&gt;“This rendering feature is only supported on ◯ercel!” What a wonderful challenge to the open-source culture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, I think many people are tired of recent web trends.&lt;/p&gt;

&lt;p&gt;If that sounds like you, please come to the Ruby and Rails community. It’s quiet here.&lt;/p&gt;

&lt;p&gt;For those who know nothing about Rails, here’s a quick summary of recent Rails trends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hotwire (Stimulus and Turbo) becoming the default: You can implement SPA-like UI experiences with the familiar Rails development style, while writing almost no JavaScript.&lt;/li&gt;
&lt;li&gt;Hotwire Native: By applying WebView technology, you can build native-like iOS and Android apps simply by writing normal Rails.&lt;/li&gt;
&lt;li&gt;Kamal: If you can prepare your own computer, such as a VPS, you can deploy in just a few steps. (It’s very easy and cheaper to operate than AWS or GCP!)&lt;/li&gt;
&lt;li&gt;Production-ready SQLite and Solid Stack: Rails has moved closer to a setup that can be operated without relying on external infrastructure like PostgreSQL or Redis. (Of course, not relying on external services also makes it cheaper!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These trends are extremely consistent: &lt;strong&gt;“Less is more.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Despite its overwhelming history, I truly love &lt;strong&gt;Ruby on Rails as a framework that continues to evolve in a simpler and smarter direction&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Responses to Common Criticisms of Rails
&lt;/h2&gt;

&lt;p&gt;I’ve talked about my love for Rails so far, but finally, I’d like to summarize my own responses to common criticisms of Rails.&lt;/p&gt;

&lt;h3&gt;
  
  
  It’s not a statically typed language. The lack of type completion is painful.
&lt;/h3&gt;

&lt;p&gt;→ Whether a language is static or dynamic does not change the value delivered to users. Of course, each has its pros and cons.&lt;br&gt;
But I believe Ruby’s flexibility supports Rails’ “OMAKASE for now” culture.&lt;br&gt;
As for type completion, I don’t think you need to place too much importance on it. The existing ruby-lsp works well enough, and DHH himself apparently doesn’t use editor completion in the first place.&lt;br&gt;
Today we also have completion through GitHub Copilot, so from the perspective of “starting a new business,” I don’t think this is a problem.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ruby code tends to get messy.
&lt;/h3&gt;

&lt;p&gt;→ This can be said of any language. Engineers with low development ability can write messy code in Ruby, TypeScript, Rust, or anything else.&lt;br&gt;
The reason people often claim that “Ruby code gets messy” may be because Ruby is one of the relatively beginner-friendly languages.&lt;br&gt;
Rather than turning it into a language issue, I think we should focus on how to write readable code, how to design databases appropriately, and how to name variables properly.&lt;/p&gt;

&lt;p&gt;Also, based on my experience, senior engineers actually tend to write more verbose and harder-to-read code.&lt;br&gt;
I don’t know why, but one hypothesis is that executives and managers throw unnecessarily complex requirements at “reliable senior engineers,” and the code that satisfies those requirements becomes messy as a result.&lt;/p&gt;

&lt;p&gt;So rather than Ruby code itself being dirty, I think the unnecessary complexity and ambiguity of business requirements creates the impression that “Ruby/Rails code is somehow hard to read.”&lt;/p&gt;
&lt;h3&gt;
  
  
  But it’s not popular these days, right?
&lt;/h3&gt;

&lt;p&gt;→ That is a painfully valid point. Ruby’s popularity is steadily declining.&lt;br&gt;
If your goal is to “learn a programming language and increase your salary,” TypeScript is probably the safer choice.&lt;br&gt;
I hope Ruby will be reevaluated.&lt;br&gt;
Because &lt;strong&gt;from a business perspective, it is the best language and framework&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ruby’s poor performance is terrible!
&lt;/h3&gt;

&lt;p&gt;→ Do you want to drive an F1 sports car to the nearest supermarket?&lt;br&gt;
I’m fine with a used compact car.&lt;/p&gt;
&lt;h3&gt;
  
  
  Twitter escaped from Rails!
&lt;/h3&gt;

&lt;p&gt;→ And then it became Elon Musk’s toy!&lt;/p&gt;
&lt;h2&gt;
  
  
  I’m Developing a Rails Boilerplate for Solopreneurs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Because I love Rails, want to succeed with my own business using Rails, and want to launch as many products as possible&lt;/strong&gt;, I’m developing a Rails boilerplate for solopreneurs that specializes in MVP development.&lt;br&gt;
It will be released soon.&lt;br&gt;
&lt;del&gt;If you’re interested, I’ll distribute it for free to testers, so please send an email to &lt;code&gt;haruku.maniwa@laicos.tech&lt;/code&gt; with the subject “Template Request.”&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;(Update)&lt;br&gt;
The beta version is no longer available!&lt;br&gt;
The official version can still be purchased at &lt;a href="https://super-rails.com" rel="noopener noreferrer"&gt;super-rails.com&lt;/a&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://super-rails.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" height="512" class="m-0" width="512"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://super-rails.com/" rel="noopener noreferrer" class="c-link"&gt;
            Super Rails | Rails Boilerplate for Solopreneurs
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A production-ready Rails boilerplate with Devise, Avo, Stripe, ViewComponent and more. Skip the setup, ship your MVP in days.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuper-rails.com%2Ficon.png" width="512" height="512"&gt;
          super-rails.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Have a great development life!&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>ai</category>
      <category>solopreneur</category>
    </item>
  </channel>
</rss>
