<?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>DEV Community: Vídeos de Ti</title>
    <description>The latest articles on DEV Community by Vídeos de Ti (@videosdeti).</description>
    <link>https://dev.to/videosdeti</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%2Forganization%2Fprofile_image%2F10245%2F086a6967-7b78-4358-be63-378ccede525a.png</url>
      <title>DEV Community: Vídeos de Ti</title>
      <link>https://dev.to/videosdeti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/videosdeti"/>
    <language>en</language>
    <item>
      <title>🇺🇸 3 Essential Gems to Eliminate Friction in Your Rails Workflow</title>
      <dc:creator>Jackson Pires</dc:creator>
      <pubDate>Thu, 04 Jun 2026 21:48:37 +0000</pubDate>
      <link>https://dev.to/videosdeti/3-essential-gems-to-eliminate-friction-in-your-rails-workflow-3fap</link>
      <guid>https://dev.to/videosdeti/3-essential-gems-to-eliminate-friction-in-your-rails-workflow-3fap</guid>
      <description>&lt;p&gt;Anyone who works with Ruby on Rails knows that, despite the framework being incredible for productivity, there are some classic workflow deficiencies that haunt almost every project. &lt;/p&gt;

&lt;p&gt;You are focused on writing code, but suddenly you need to open an external tool like Postman to test a route. Then, you run a complex script to generate a static database diagram. And at the end of the day, you still need to manually update the API documentation, which will inevitably become outdated in the next sprint.&lt;/p&gt;

&lt;p&gt;This constant context switching and manual maintenance generates enormous friction. To cover these deficiencies, I developed three gems that bring these tools &lt;strong&gt;inside&lt;/strong&gt; your application. They are so practical that they quickly become indispensable in any Rails project. Meet each one of them:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;rails-api-docs&lt;/code&gt;: The End of Outdated Documentation]
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/jacksonpires/rails-api-docs" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-api-docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The deficiency:&lt;/strong&gt; API documentation always starts with good intentions, but as the system evolves—new routes, parameters, and response fields—it quickly stops representing reality. Keeping this updated manually is repetitive and frustrating work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; The &lt;code&gt;rails-api-docs&lt;/code&gt; gem solves this by leveraging what Rails already knows. It inspects your routes, controllers (via AST analysis using Prism), and the ActiveRecord schema to automatically generate the first draft of your documentation. Everything is saved in a single YAML file (&lt;code&gt;config/rails-api-docs.yml&lt;/code&gt;), which serves as the single source of truth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it is indispensable:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Append-only strategy:&lt;/strong&gt; When adding new routes and running the generator, the gem only appends what's new. Your descriptions, custom examples, and tags are never modified or deleted, making the documentation a living document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero development friction:&lt;/strong&gt; You edit the YAML in one window and view the updated documentation in the browser at &lt;code&gt;localhost:3000/rails/api-docs&lt;/code&gt; instantly, with no build step required. For production, it exports a single static HTML file without any external dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;rails-http-lab&lt;/code&gt;: Your HTTP Client Right in the App
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/jacksonpires/rails-http-lab" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-http-lab&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The deficiency:&lt;/strong&gt; Testing HTTP endpoints usually requires switching to external tools (like Postman or Insomnia) or creating temporary scripts. Besides the loss of focus, these tools live outside your repository and frequently suffer from CORS issues when trying to access internal services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; The &lt;code&gt;rails-http-lab&lt;/code&gt; is a Rails Engine that couples an HTTP request lab inside your own application. By accessing &lt;code&gt;/rails/http-lab&lt;/code&gt;, you have a lightweight interface to test methods, headers, and payloads while visualizing the responses directly in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it is indispensable:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stays in the Repository:&lt;/strong&gt; Your requests are saved in &lt;code&gt;.bru&lt;/code&gt; format (interchangeable with the Bruno desktop app) inside the project's &lt;code&gt;docs/http-lab/&lt;/code&gt; folder. This means your API tests are version-controlled in Git and can be easily reviewed in Pull Requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No CORS limits:&lt;/strong&gt; Since the requests are executed by the Rails server itself, you don't have CORS problems and can reach internal services transparently.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;rails-realtime-erd&lt;/code&gt;: Database Diagrams Always in Sync
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/jacksonpires/rails-realtime-erd" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-realtime-erd&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The deficiency:&lt;/strong&gt; Understanding database relationships in a growing project is difficult. Traditional tools generate static diagrams (ERD) that require manual tasks and quickly become outdated as soon as a new migration is executed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; The &lt;code&gt;rails-realtime-erd&lt;/code&gt; gem mounts a route at &lt;code&gt;/rails/erd&lt;/code&gt; that renders your schema diagram in real-time using Mermaid, all processed by Hotwire (Stimulus), without relying on complex JavaScript frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it is indispensable:&lt;/strong&gt; &lt;br&gt;
You will never again need to run a rake step to generate a static image file. The introspection is done on the fly: if you run a migration, just refresh the page to see the new tables and relationships reflected in the diagram immediately. It is excellent for onboarding new developers and keeping a live documentation of your architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;These three tools share the same philosophy: &lt;strong&gt;your code already has the necessary knowledge, and the support tools should live as close to it as possible&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Adopting &lt;code&gt;rails-api-docs&lt;/code&gt;, &lt;code&gt;rails-http-lab&lt;/code&gt;, and &lt;code&gt;rails-realtime-erd&lt;/code&gt; drastically reduces daily friction, eliminating external dependencies and manual rework. With simple installation steps, your development environment will become much more productive, robust, and integrated.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>rails</category>
      <category>ruby</category>
      <category>tooling</category>
    </item>
    <item>
      <title>🇧🇷 3 Gems Indispensáveis para Eliminar as Deficiências do seu Fluxo de Trabalho no Rails</title>
      <dc:creator>Jackson Pires</dc:creator>
      <pubDate>Thu, 04 Jun 2026 21:47:50 +0000</pubDate>
      <link>https://dev.to/videosdeti/3-gems-indispensaveis-para-eliminar-as-deficiencias-do-seu-fluxo-de-trabalho-no-rails-32mg</link>
      <guid>https://dev.to/videosdeti/3-gems-indispensaveis-para-eliminar-as-deficiencias-do-seu-fluxo-de-trabalho-no-rails-32mg</guid>
      <description>&lt;p&gt;Quem trabalha com Ruby on Rails sabe que, embora o framework seja incrível para a produtividade, existem algumas deficiências clássicas no fluxo de desenvolvimento que assombram quase todo projeto. &lt;/p&gt;

&lt;p&gt;Você está focado escrevendo código, mas de repente precisa abrir uma ferramenta externa como o Postman para testar uma rota. Depois, roda um script complexo para gerar um diagrama estático do banco de dados. E, no fim do dia, ainda precisa atualizar manualmente a documentação da API, que fatalmente ficará defasada na próxima sprint. &lt;/p&gt;

&lt;p&gt;Essa constante alternância de contexto e manutenção manual geram um enorme atrito. Para cobrir essas deficiências, eu desenvolvi três gems que trazem essas ferramentas para &lt;strong&gt;dentro&lt;/strong&gt; da sua aplicação. Elas são tão práticas que rapidamente se tornam indispensáveis em qualquer projeto Rails. Conheça cada uma delas:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;rails-api-docs&lt;/code&gt;: O Fim da Documentação Desatualizada
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/jacksonpires/rails-api-docs" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-api-docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;A deficiência:&lt;/strong&gt; A documentação de API sempre começa com boas intenções, mas conforme o sistema evolui — novas rotas, parâmetros e campos na resposta —, ela rapidamente deixa de representar a realidade. Manter isso atualizado manualmente é um trabalho repetitivo e frustrante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A solução:&lt;/strong&gt; A gem &lt;code&gt;rails-api-docs&lt;/code&gt; resolve isso aproveitando o que o Rails já sabe. Ela inspeciona suas rotas, controllers (via análise AST usando Prism) e o schema do ActiveRecord para gerar automaticamente o primeiro rascunho da sua documentação. Tudo é salvo em um único arquivo YAML (&lt;code&gt;config/rails-api-docs.yml&lt;/code&gt;), que serve como fonte da verdade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por que é indispensável:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Estratégia &lt;em&gt;Append-only&lt;/em&gt;:&lt;/strong&gt; Ao adicionar novas rotas e rodar o gerador, a gem apenas adiciona o que é novo. Suas descrições, exemplos customizados e tags não são apagados, tornando a documentação um documento vivo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero atrito no desenvolvimento:&lt;/strong&gt; Você edita o YAML de um lado e visualiza a documentação atualizada no navegador em &lt;code&gt;localhost:3000/rails/api-docs&lt;/code&gt; instantaneamente, sem etapa de build. Para produção, ela exporta um único arquivo HTML estático, sem dependências externas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;rails-http-lab&lt;/code&gt;: Seu Client HTTP Direto na Aplicação
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/jacksonpires/rails-http-lab" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-http-lab&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;A deficiência:&lt;/strong&gt; Testar endpoints HTTP geralmente exige alternar para ferramentas externas (como Postman ou Insomnia) ou criar scripts temporários. Além da perda de foco, essas ferramentas vivem fora do seu repositório e frequentemente sofrem com problemas de CORS ao tentar acessar serviços internos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A solução:&lt;/strong&gt; O &lt;code&gt;rails-http-lab&lt;/code&gt; é uma Rails Engine que acopla um laboratório de requisições HTTP dentro da sua própria aplicação. Ao acessar &lt;code&gt;/rails/http-lab&lt;/code&gt;, você tem uma interface leve para testar métodos, headers e payloads visualizando as respostas diretamente no navegador.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por que é indispensável:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fica no Repositório:&lt;/strong&gt; As suas requisições são salvas no formato &lt;code&gt;.bru&lt;/code&gt; (compatível com o aplicativo desktop Bruno) dentro da pasta &lt;code&gt;docs/http-lab/&lt;/code&gt; do projeto. Isso significa que os testes da sua API são versionados no Git e podem ser revisados nos Pull Requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sem limites de CORS:&lt;/strong&gt; Como as requisições são executadas pelo próprio servidor Rails, você não tem problemas de CORS e pode alcançar serviços internos de forma transparente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;rails-realtime-erd&lt;/code&gt;: Diagramas de Banco de Dados Sempre Sincronizados
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/jacksonpires/rails-realtime-erd" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-realtime-erd&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;A deficiência:&lt;/strong&gt; Entender os relacionamentos do banco de dados em um projeto que está crescendo é difícil. As ferramentas tradicionais geram diagramas estáticos (ERD) que exigem tarefas manuais e rapidamente ficam defasados assim que uma nova migration é executada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A solução:&lt;/strong&gt; A gem &lt;code&gt;rails-realtime-erd&lt;/code&gt; monta uma rota em &lt;code&gt;/rails/erd&lt;/code&gt; que renderiza o diagrama do seu schema em tempo real usando o Mermaid, tudo processado pelo Hotwire (Stimulus), sem depender de frameworks JavaScript complexos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por que é indispensável:&lt;/strong&gt; &lt;br&gt;
Você nunca mais precisará rodar um passo de rake para gerar um arquivo de imagem estático. A introspecção é feita sob demanda: se você rodar uma migration, basta atualizar a página para ver as tabelas e relacionamentos novos refletidos no diagrama imediatamente. É excelente para o onboarding de novos desenvolvedores e documentação viva da arquitetura.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Essas três ferramentas compartilham a mesma filosofia: &lt;strong&gt;o seu código já possui o conhecimento necessário, e as ferramentas de apoio devem viver o mais próximo possível dele&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Adotar o &lt;code&gt;rails-api-docs&lt;/code&gt;, o &lt;code&gt;rails-http-lab&lt;/code&gt; e o &lt;code&gt;rails-realtime-erd&lt;/code&gt; reduz drasticamente o atrito no dia a dia, eliminando dependências externas e o retrabalho manual. Com passos simples de instalação (basta adicionar ao &lt;code&gt;Gemfile&lt;/code&gt; e rodar um comando), seu ambiente de desenvolvimento se tornará muito mais produtivo, robusto e integrado.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🇺🇸 I Got Tired of Stale API Documentation in Rails — So I Built `rails-api-docs`</title>
      <dc:creator>Jackson Pires</dc:creator>
      <pubDate>Wed, 03 Jun 2026 12:25:33 +0000</pubDate>
      <link>https://dev.to/videosdeti/i-got-tired-of-stale-api-documentation-in-rails-so-i-built-rails-api-docs-2362</link>
      <guid>https://dev.to/videosdeti/i-got-tired-of-stale-api-documentation-in-rails-so-i-built-rails-api-docs-2362</guid>
      <description>&lt;p&gt;API documentation always starts with good intentions.&lt;/p&gt;

&lt;p&gt;At the beginning of a project, everything is in sync.&lt;/p&gt;

&lt;p&gt;Routes match reality.&lt;/p&gt;

&lt;p&gt;Examples are accurate.&lt;/p&gt;

&lt;p&gt;Parameters make sense.&lt;/p&gt;

&lt;p&gt;Responses reflect exactly what the API returns.&lt;/p&gt;

&lt;p&gt;But as the system evolves, documentation starts falling behind.&lt;/p&gt;

&lt;p&gt;A new route gets added.&lt;/p&gt;

&lt;p&gt;A parameter changes.&lt;/p&gt;

&lt;p&gt;An endpoint gains authentication.&lt;/p&gt;

&lt;p&gt;A response receives new fields.&lt;/p&gt;

&lt;p&gt;And before you realize it, the documentation no longer represents reality.&lt;/p&gt;

&lt;p&gt;If you've worked with Rails APIs for long enough, you've probably experienced this.&lt;/p&gt;

&lt;p&gt;I certainly have.&lt;/p&gt;

&lt;p&gt;And it was exactly that frustration that led me to create &lt;strong&gt;rails-api-docs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/jacksonpires/rails-api-docs" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-api-docs&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%2Fei63b0nvza955aesy8fa.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%2Fei63b0nvza955aesy8fa.png" alt="Rails API Docs" width="799" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea started with a simple question
&lt;/h2&gt;

&lt;p&gt;Your Rails application already knows a lot.&lt;/p&gt;

&lt;p&gt;It knows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your routes&lt;/li&gt;
&lt;li&gt;your controllers&lt;/li&gt;
&lt;li&gt;your parameters&lt;/li&gt;
&lt;li&gt;your models&lt;/li&gt;
&lt;li&gt;your database schema&lt;/li&gt;
&lt;li&gt;your HTTP verbs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So why should documentation always start from scratch?&lt;/p&gt;

&lt;p&gt;Why do we need to manually rewrite information that already exists inside the application?&lt;/p&gt;

&lt;p&gt;The idea behind &lt;code&gt;rails-api-docs&lt;/code&gt; was to leverage the knowledge Rails already has to generate the first draft of the documentation automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow I wanted didn't exist
&lt;/h2&gt;

&lt;p&gt;I didn't want another tool where the workflow looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;edit documentation
→ generate artifacts
→ rebuild
→ restart server
→ validate changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wanted something closer to the typical Rails development experience:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;edit
→ refresh browser
→ keep working
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's where the core concept of the gem came from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A single editable YAML file that powers both development-time documentation and production-ready documentation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A single source of truth
&lt;/h2&gt;

&lt;p&gt;The entire workflow revolves around a single file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config/rails-api-docs.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file becomes the source of truth for your documentation.&lt;/p&gt;

&lt;p&gt;From it, the gem generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;live documentation during development&lt;/li&gt;
&lt;li&gt;request examples&lt;/li&gt;
&lt;li&gt;response examples&lt;/li&gt;
&lt;li&gt;documented schemas&lt;/li&gt;
&lt;li&gt;static HTML documentation for production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You update one file.&lt;/p&gt;

&lt;p&gt;Everything else updates automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;First, generate the initial YAML file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails g rails-api-docs:init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gem automatically inspects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Rails.application.routes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;controllers (via Prism AST analysis)&lt;/li&gt;
&lt;li&gt;ActiveRecord schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And creates an initial documentation structure.&lt;/p&gt;

&lt;p&gt;Then start your application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And visit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/rails/api-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever you modify the YAML file, simply refresh the page.&lt;/p&gt;

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

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

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

&lt;h2&gt;
  
  
  Let the code write the first draft
&lt;/h2&gt;

&lt;p&gt;One of the most interesting parts of this project was using Prism to analyze controllers.&lt;/p&gt;

&lt;p&gt;For example:&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;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:role&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gem can automatically identify these fields and use them to build the initial documentation structure.&lt;/p&gt;

&lt;p&gt;Combined with ActiveRecord schema information, it can also infer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;field types&lt;/li&gt;
&lt;li&gt;required attributes&lt;/li&gt;
&lt;li&gt;initial examples&lt;/li&gt;
&lt;li&gt;schema metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was never to replace developers.&lt;/p&gt;

&lt;p&gt;The goal was to eliminate repetitive work.&lt;/p&gt;

&lt;p&gt;Let the machine handle what it can already discover.&lt;/p&gt;

&lt;p&gt;And let humans focus on the important part: explaining the API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation updates shouldn't destroy your work
&lt;/h2&gt;

&lt;p&gt;This is probably the feature that frustrated me most in existing approaches.&lt;/p&gt;

&lt;p&gt;You generate documentation.&lt;/p&gt;

&lt;p&gt;Spend time writing descriptions.&lt;/p&gt;

&lt;p&gt;Add examples.&lt;/p&gt;

&lt;p&gt;Organize sections.&lt;/p&gt;

&lt;p&gt;Customize schemas.&lt;/p&gt;

&lt;p&gt;Then you run the generator again.&lt;/p&gt;

&lt;p&gt;And hope nothing gets overwritten.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rails-api-docs&lt;/code&gt; follows an &lt;em&gt;append-only&lt;/em&gt; strategy.&lt;/p&gt;

&lt;p&gt;When you add new routes to your application, simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails g rails-api-docs:update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gem appends only new endpoints.&lt;/p&gt;

&lt;p&gt;Everything you've written remains untouched.&lt;/p&gt;

&lt;p&gt;That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;descriptions&lt;/li&gt;
&lt;li&gt;examples&lt;/li&gt;
&lt;li&gt;tags&lt;/li&gt;
&lt;li&gt;authentication details&lt;/li&gt;
&lt;li&gt;schemas&lt;/li&gt;
&lt;li&gt;section organization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, the documentation becomes a living document rather than a disposable artifact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organizing larger APIs with tags
&lt;/h2&gt;

&lt;p&gt;As APIs grow, navigation becomes increasingly important.&lt;/p&gt;

&lt;p&gt;That's why the gem supports tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;auth&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These tags aren't just labels.&lt;/p&gt;

&lt;p&gt;They also become interactive filters in the generated documentation.&lt;/p&gt;

&lt;p&gt;Clicking a tag instantly filters the navigation to show only endpoints associated with that category.&lt;/p&gt;

&lt;p&gt;This makes large APIs significantly easier to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production should be simple
&lt;/h2&gt;

&lt;p&gt;Another important goal was making deployment boring.&lt;/p&gt;

&lt;p&gt;When you're ready to publish the documentation, simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rake rails-api-docs:build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public/api-docs.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single HTML file.&lt;/p&gt;

&lt;p&gt;Everything embedded.&lt;/p&gt;

&lt;p&gt;Inline CSS.&lt;/p&gt;

&lt;p&gt;Inline JavaScript.&lt;/p&gt;

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

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

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

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

&lt;p&gt;Just a static file that can be hosted almost anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm not trying to replace OpenAPI
&lt;/h2&gt;

&lt;p&gt;There are excellent OpenAPI and Swagger-based tools available today.&lt;/p&gt;

&lt;p&gt;They solve many problems extremely well.&lt;/p&gt;

&lt;p&gt;The goal of &lt;code&gt;rails-api-docs&lt;/code&gt; is not to replace that ecosystem.&lt;/p&gt;

&lt;p&gt;The idea is different.&lt;/p&gt;

&lt;p&gt;I wanted a solution that allows developers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generate documentation from an existing Rails application&lt;/li&gt;
&lt;li&gt;edit everything in YAML&lt;/li&gt;
&lt;li&gt;preview changes instantly&lt;/li&gt;
&lt;li&gt;export a static HTML file&lt;/li&gt;
&lt;li&gt;keep documentation synchronized with minimal effort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the workflow I was looking for.&lt;/p&gt;

&lt;p&gt;And since I couldn't find exactly what I wanted, I decided to build it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;API documentation should be easy to create and easy to maintain.&lt;/p&gt;

&lt;p&gt;In my experience, generating the first version isn't the hard part.&lt;/p&gt;

&lt;p&gt;Keeping it updated over time is.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rails-api-docs&lt;/code&gt; was created to reduce that friction.&lt;/p&gt;

&lt;p&gt;By inspecting the application to generate a starting point.&lt;/p&gt;

&lt;p&gt;By preserving your customizations over time.&lt;/p&gt;

&lt;p&gt;And by providing an extremely fast feedback loop during development.&lt;/p&gt;

&lt;p&gt;If you'd like to try it out:&lt;/p&gt;

&lt;p&gt;⭐ &lt;a href="https://github.com/jacksonpires/rails-api-docs" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-api-docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, suggestions, and contributions are always welcome.&lt;/p&gt;

</description>
      <category>api</category>
      <category>opensource</category>
      <category>rails</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🇧🇷 Eu Cansei de Documentação de API Desatualizada no Rails — Então Criei a Gem `rails-api-docs`</title>
      <dc:creator>Jackson Pires</dc:creator>
      <pubDate>Wed, 03 Jun 2026 12:24:43 +0000</pubDate>
      <link>https://dev.to/videosdeti/eu-cansei-de-documentacao-de-api-desatualizada-no-rails-entao-criei-a-gem-rails-api-docs-jho</link>
      <guid>https://dev.to/videosdeti/eu-cansei-de-documentacao-de-api-desatualizada-no-rails-entao-criei-a-gem-rails-api-docs-jho</guid>
      <description>&lt;p&gt;Documentação de API sempre começa com boas intenções.&lt;/p&gt;

&lt;p&gt;No início do projeto, tudo está sincronizado.&lt;/p&gt;

&lt;p&gt;As rotas batem com a aplicação.&lt;/p&gt;

&lt;p&gt;Os exemplos estão corretos.&lt;/p&gt;

&lt;p&gt;Os parâmetros fazem sentido.&lt;/p&gt;

&lt;p&gt;As respostas refletem exatamente o que a API retorna.&lt;/p&gt;

&lt;p&gt;Mas conforme o sistema evolui, a documentação começa a ficar para trás.&lt;/p&gt;

&lt;p&gt;Uma nova rota é criada.&lt;/p&gt;

&lt;p&gt;Um parâmetro muda.&lt;/p&gt;

&lt;p&gt;Um endpoint ganha autenticação.&lt;/p&gt;

&lt;p&gt;Uma resposta recebe novos campos.&lt;/p&gt;

&lt;p&gt;E, sem perceber, a documentação deixa de representar a realidade.&lt;/p&gt;

&lt;p&gt;Se você trabalha com APIs em Rails há algum tempo, provavelmente já passou por isso.&lt;/p&gt;

&lt;p&gt;Eu certamente já passei.&lt;/p&gt;

&lt;p&gt;E foi justamente essa frustração que me levou a criar o &lt;strong&gt;rails-api-docs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/jacksonpires/rails-api-docs" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-api-docs&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%2Fei63b0nvza955aesy8fa.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%2Fei63b0nvza955aesy8fa.png" alt="Rails API Docs" width="799" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A ideia surgiu de uma pergunta simples
&lt;/h2&gt;

&lt;p&gt;Sua aplicação Rails já sabe muita coisa.&lt;/p&gt;

&lt;p&gt;Ela conhece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;suas rotas&lt;/li&gt;
&lt;li&gt;seus controllers&lt;/li&gt;
&lt;li&gt;seus parâmetros&lt;/li&gt;
&lt;li&gt;seus modelos&lt;/li&gt;
&lt;li&gt;seu schema do banco&lt;/li&gt;
&lt;li&gt;seus verbos HTTP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então por que a documentação precisa começar sempre do zero?&lt;/p&gt;

&lt;p&gt;Por que precisamos reescrever manualmente informações que já existem dentro da aplicação?&lt;/p&gt;

&lt;p&gt;A ideia por trás do &lt;code&gt;rails-api-docs&lt;/code&gt; foi justamente aproveitar esse conhecimento que o Rails já possui para gerar um primeiro rascunho da documentação automaticamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  O workflow que eu queria não existia
&lt;/h2&gt;

&lt;p&gt;Eu não queria mais uma ferramenta onde o fluxo fosse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;editar documentação
→ gerar artefatos
→ rebuild
→ reiniciar servidor
→ validar alterações
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eu queria algo mais próximo do desenvolvimento Rails tradicional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;editar
→ atualizar navegador
→ continuar trabalhando
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Foi daí que surgiu o conceito central da gem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um único arquivo YAML editável que gera tanto a documentação em desenvolvimento quanto a documentação de produção.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Uma única fonte da verdade
&lt;/h2&gt;

&lt;p&gt;O fluxo da gem gira em torno de apenas um arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config/rails-api-docs.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse arquivo é a fonte da verdade para toda a documentação.&lt;/p&gt;

&lt;p&gt;A partir dele a gem gera:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;visualização em tempo real durante o desenvolvimento&lt;/li&gt;
&lt;li&gt;exemplos de requisição&lt;/li&gt;
&lt;li&gt;exemplos de resposta&lt;/li&gt;
&lt;li&gt;schemas documentados&lt;/li&gt;
&lt;li&gt;documentação HTML estática para produção&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você altera um único lugar.&lt;/p&gt;

&lt;p&gt;Todo o resto é atualizado automaticamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona
&lt;/h2&gt;

&lt;p&gt;Primeiro você gera o YAML inicial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails g rails-api-docs:init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A gem inspeciona automaticamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Rails.application.routes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;controllers (via análise AST usando Prism)&lt;/li&gt;
&lt;li&gt;schema do ActiveRecord&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E cria uma estrutura inicial de documentação.&lt;/p&gt;

&lt;p&gt;Depois basta subir a aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E acessar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/rails/api-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sempre que você alterar o YAML, basta atualizar a página.&lt;/p&gt;

&lt;p&gt;Não existe etapa de build durante o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Não existe pipeline frontend.&lt;/p&gt;

&lt;p&gt;Não existe processo intermediário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deixe o código escrever o primeiro rascunho
&lt;/h2&gt;

&lt;p&gt;Uma das partes mais interessantes do projeto foi utilizar o Prism para analisar controllers.&lt;/p&gt;

&lt;p&gt;Por exemplo:&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;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:role&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A gem consegue identificar automaticamente esses campos e utilizá-los para montar a estrutura inicial da documentação.&lt;/p&gt;

&lt;p&gt;Quando combinamos isso com as informações do ActiveRecord, também é possível inferir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tipos dos campos&lt;/li&gt;
&lt;li&gt;obrigatoriedade&lt;/li&gt;
&lt;li&gt;exemplos iniciais&lt;/li&gt;
&lt;li&gt;informações do schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O objetivo nunca foi substituir o trabalho do desenvolvedor.&lt;/p&gt;

&lt;p&gt;O objetivo foi eliminar tarefas repetitivas.&lt;/p&gt;

&lt;p&gt;Deixar a máquina fazer aquilo que ela consegue descobrir sozinha.&lt;/p&gt;

&lt;p&gt;E deixar os humanos cuidarem da parte importante: explicar a API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atualizações não deveriam apagar seu trabalho
&lt;/h2&gt;

&lt;p&gt;Essa talvez seja a característica que mais me incomodava em algumas abordagens existentes.&lt;/p&gt;

&lt;p&gt;Você gera documentação.&lt;/p&gt;

&lt;p&gt;Investe tempo escrevendo descrições.&lt;/p&gt;

&lt;p&gt;Adiciona exemplos.&lt;/p&gt;

&lt;p&gt;Organiza seções.&lt;/p&gt;

&lt;p&gt;Personaliza schemas.&lt;/p&gt;

&lt;p&gt;Então roda novamente o gerador.&lt;/p&gt;

&lt;p&gt;E precisa rezar para não perder nada.&lt;/p&gt;

&lt;p&gt;No &lt;code&gt;rails-api-docs&lt;/code&gt; o YAML segue uma estratégia &lt;em&gt;append-only&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Quando você adiciona novas rotas à aplicação basta executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails g rails-api-docs:update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A gem adiciona apenas os endpoints novos.&lt;/p&gt;

&lt;p&gt;Todo o conteúdo que você escreveu continua intacto.&lt;/p&gt;

&lt;p&gt;Isso inclui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;descrições&lt;/li&gt;
&lt;li&gt;exemplos&lt;/li&gt;
&lt;li&gt;tags&lt;/li&gt;
&lt;li&gt;autenticação&lt;/li&gt;
&lt;li&gt;schemas&lt;/li&gt;
&lt;li&gt;organização das seções&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na prática, a documentação deixa de ser um artefato descartável e passa a ser um documento vivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organizando APIs maiores com Tags
&lt;/h2&gt;

&lt;p&gt;Conforme uma API cresce, navegar pela documentação pode ficar mais difícil.&lt;/p&gt;

&lt;p&gt;Por isso a gem possui suporte a tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;auth&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essas tags não são apenas informativas.&lt;/p&gt;

&lt;p&gt;Elas também funcionam como filtros interativos na documentação gerada.&lt;/p&gt;

&lt;p&gt;Ao clicar em uma tag, a navegação passa a exibir apenas os endpoints relacionados àquela categoria.&lt;/p&gt;

&lt;p&gt;Isso facilita bastante a exploração de APIs maiores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Produção deveria ser simples
&lt;/h2&gt;

&lt;p&gt;Outro objetivo importante era simplificar o deploy da documentação.&lt;/p&gt;

&lt;p&gt;Quando chega o momento de publicar, basta executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rake rails-api-docs:build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public/api-docs.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um único arquivo HTML.&lt;/p&gt;

&lt;p&gt;Tudo embutido.&lt;/p&gt;

&lt;p&gt;CSS inline.&lt;/p&gt;

&lt;p&gt;JavaScript inline.&lt;/p&gt;

&lt;p&gt;Sem dependências externas.&lt;/p&gt;

&lt;p&gt;Sem CDN.&lt;/p&gt;

&lt;p&gt;Sem Asset Pipeline.&lt;/p&gt;

&lt;p&gt;Sem runtime JavaScript.&lt;/p&gt;

&lt;p&gt;Apenas um arquivo estático que pode ser hospedado praticamente em qualquer lugar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Não estou tentando substituir OpenAPI
&lt;/h2&gt;

&lt;p&gt;Existem excelentes ferramentas baseadas em OpenAPI e Swagger.&lt;/p&gt;

&lt;p&gt;Elas resolvem muito bem diversos cenários.&lt;/p&gt;

&lt;p&gt;O objetivo do &lt;code&gt;rails-api-docs&lt;/code&gt; não é substituir esse ecossistema.&lt;/p&gt;

&lt;p&gt;A proposta é diferente.&lt;/p&gt;

&lt;p&gt;Eu queria uma solução que permitisse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gerar documentação a partir de uma aplicação Rails existente&lt;/li&gt;
&lt;li&gt;editar tudo em YAML&lt;/li&gt;
&lt;li&gt;visualizar mudanças instantaneamente&lt;/li&gt;
&lt;li&gt;exportar um HTML estático&lt;/li&gt;
&lt;li&gt;manter a documentação sincronizada com pouco esforço&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Era esse workflow que eu procurava.&lt;/p&gt;

&lt;p&gt;E como não encontrei exatamente dessa forma, resolvi construir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;Documentação de API deveria ser simples de criar e simples de manter.&lt;/p&gt;

&lt;p&gt;Na minha experiência, o maior problema não é gerar a primeira versão.&lt;/p&gt;

&lt;p&gt;O desafio é mantê-la atualizada ao longo do tempo.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;rails-api-docs&lt;/code&gt; nasceu justamente para reduzir esse atrito.&lt;/p&gt;

&lt;p&gt;Inspecionando a aplicação para gerar um ponto de partida.&lt;/p&gt;

&lt;p&gt;Preservando suas customizações ao longo do tempo.&lt;/p&gt;

&lt;p&gt;E oferecendo um ciclo de feedback extremamente rápido durante o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Se quiser experimentar:&lt;/p&gt;

&lt;p&gt;⭐ &lt;a href="https://github.com/jacksonpires/rails-api-docs" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-api-docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedbacks, sugestões e contribuições são muito bem-vindos.&lt;/p&gt;

</description>
      <category>api</category>
      <category>rails</category>
      <category>ruby</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🇺🇸 Introducing Rails HTTP Lab: Test Your Rails Routes Directly Inside Your Application</title>
      <dc:creator>Jackson Pires</dc:creator>
      <pubDate>Fri, 29 May 2026 17:57:35 +0000</pubDate>
      <link>https://dev.to/videosdeti/introducing-rails-http-lab-test-your-rails-routes-directly-inside-your-application-1c5</link>
      <guid>https://dev.to/videosdeti/introducing-rails-http-lab-test-your-rails-routes-directly-inside-your-application-1c5</guid>
      <description>&lt;p&gt;When working with &lt;strong&gt;Ruby on Rails&lt;/strong&gt;, testing HTTP endpoints is part of everyday development.&lt;/p&gt;

&lt;p&gt;Most of the time, we rely on tools like Postman, Insomnia, curl, or even temporary scripts just to validate requests, headers, payloads, and responses.&lt;/p&gt;

&lt;p&gt;But during development, I found myself asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I could test my Rails routes directly from inside the application itself?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That idea led me to create &lt;strong&gt;Rails HTTP Lab&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%2Fjhnqah4ca30mzkmbfa8z.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%2Fjhnqah4ca30mzkmbfa8z.png" alt="Rails HTTP Lab" width="799" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Rails HTTP Lab?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rails-http-lab&lt;/code&gt; is a Rails Engine that provides an embedded interface inside your Rails application to test HTTP requests against your own routes.&lt;/p&gt;

&lt;p&gt;Think of it as a lightweight HTTP client focused on your Rails app.&lt;/p&gt;

&lt;p&gt;With it, you can experiment with your endpoints without constantly switching between your editor, terminal, browser, and external API tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;Current capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support for common HTTP verbs&lt;/li&gt;
&lt;li&gt;Send request parameters and payloads&lt;/li&gt;
&lt;li&gt;Inspect responses directly in the browser&lt;/li&gt;
&lt;li&gt;Mountable Rails Engine&lt;/li&gt;
&lt;li&gt;Seamless integration with your Rails development workflow&lt;/li&gt;
&lt;li&gt;Simple setup&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the gem to your Gemfile:&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;gem&lt;/span&gt; &lt;span class="s2"&gt;"rails-http-lab"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now start your Rails server and access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/rails/http-lab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you're ready to start testing your routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build this?
&lt;/h2&gt;

&lt;p&gt;I wanted something that felt more integrated with the Rails developer experience.&lt;/p&gt;

&lt;p&gt;External API clients are great, but sometimes you simply want a quick way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;test an endpoint&lt;/li&gt;
&lt;li&gt;tweak parameters&lt;/li&gt;
&lt;li&gt;inspect responses&lt;/li&gt;
&lt;li&gt;validate controller behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…without leaving your application context.&lt;/p&gt;

&lt;p&gt;Rails HTTP Lab was created to reduce that friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source &amp;amp; Feedback Welcome
&lt;/h2&gt;

&lt;p&gt;The project is open source and still evolving.&lt;/p&gt;

&lt;p&gt;If you like the idea, have suggestions, or want to contribute, feel free to check out the repository:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/jacksonpires/rails-http-lab" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-http-lab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, issues, PRs, and ideas are very welcome.&lt;/p&gt;

&lt;p&gt;Happy hacking 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Special thanks to Vini (&lt;a href="https://github.com/viniwenz" rel="noopener noreferrer"&gt;https://github.com/viniwenz&lt;/a&gt;) and Karine (&lt;a href="https://github.com/karinevieira" rel="noopener noreferrer"&gt;https://github.com/karinevieira&lt;/a&gt;) for helping me with testing!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>testing</category>
    </item>
    <item>
      <title>🇧🇷 Apresentando Rails HTTP Lab: teste rotas Rails diretamente dentro da sua aplicação</title>
      <dc:creator>Jackson Pires</dc:creator>
      <pubDate>Fri, 29 May 2026 17:55:55 +0000</pubDate>
      <link>https://dev.to/videosdeti/apresentando-rails-http-lab-teste-rotas-rails-diretamente-dentro-da-sua-aplicacao-3lbe</link>
      <guid>https://dev.to/videosdeti/apresentando-rails-http-lab-teste-rotas-rails-diretamente-dentro-da-sua-aplicacao-3lbe</guid>
      <description>&lt;p&gt;Quem trabalha com &lt;strong&gt;Ruby on Rails&lt;/strong&gt; sabe que testar endpoints HTTP faz parte da rotina de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Na maioria das vezes usamos ferramentas como Postman, Insomnia, curl ou até scripts temporários apenas para validar requests, headers, payloads e responses.&lt;/p&gt;

&lt;p&gt;Mas durante o desenvolvimento eu comecei a me perguntar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;E se fosse possível testar as rotas da própria aplicação Rails diretamente de dentro dela?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Foi dessa ideia que nasceu o &lt;strong&gt;Rails HTTP Lab&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%2F34h6pygscuiqathwuz6e.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%2F34h6pygscuiqathwuz6e.png" alt="Rails HTTP Lab" width="799" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Rails HTTP Lab?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rails-http-lab&lt;/code&gt; é uma Rails Engine que adiciona uma interface integrada à sua aplicação para testar requisições HTTP contra as próprias rotas da aplicação.&lt;/p&gt;

&lt;p&gt;Pense nele como um cliente HTTP leve, mas focado no seu ambiente Rails.&lt;/p&gt;

&lt;p&gt;Com ele você pode experimentar endpoints sem precisar alternar constantemente entre editor, terminal, navegador e ferramentas externas de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funcionalidades
&lt;/h2&gt;

&lt;p&gt;Atualmente a gem oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suporte aos principais verbos HTTP&lt;/li&gt;
&lt;li&gt;Envio de parâmetros e payloads&lt;/li&gt;
&lt;li&gt;Visualização das responses diretamente no navegador&lt;/li&gt;
&lt;li&gt;Rails Engine mountável&lt;/li&gt;
&lt;li&gt;Integração natural com o fluxo de desenvolvimento Rails&lt;/li&gt;
&lt;li&gt;Configuração simples&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Adicione a gem ao seu Gemfile:&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;gem&lt;/span&gt; &lt;span class="s2"&gt;"rails-http-lab"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois instale:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora basta iniciar o servidor Rails e acessar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/rails/http-lab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto. Você já pode começar a testar suas rotas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que criar isso?
&lt;/h2&gt;

&lt;p&gt;Eu queria algo mais integrado à experiência de desenvolvimento com Rails.&lt;/p&gt;

&lt;p&gt;Ferramentas externas de API são excelentes, mas às vezes você só precisa de uma forma rápida de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;testar um endpoint&lt;/li&gt;
&lt;li&gt;ajustar parâmetros&lt;/li&gt;
&lt;li&gt;inspecionar responses&lt;/li&gt;
&lt;li&gt;validar o comportamento do controller&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…sem sair do contexto da própria aplicação.&lt;/p&gt;

&lt;p&gt;O Rails HTTP Lab surgiu justamente para reduzir esse atrito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source e feedback são bem-vindos
&lt;/h2&gt;

&lt;p&gt;O projeto é open source e ainda está evoluindo.&lt;/p&gt;

&lt;p&gt;Se a ideia parece interessante, você tem sugestões ou quer contribuir, confira o repositório:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/jacksonpires/rails-http-lab" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-http-lab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Issues, PRs, feedbacks e ideias são muito bem-vindos.&lt;/p&gt;

&lt;p&gt;Happy coding 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agradecimento especial a Vini (&lt;a href="https://github.com/viniwenz" rel="noopener noreferrer"&gt;https://github.com/viniwenz&lt;/a&gt;) e Karine (&lt;a href="https://github.com/karinevieira" rel="noopener noreferrer"&gt;https://github.com/karinevieira&lt;/a&gt;) que me ajudaram nos testes!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>testing</category>
    </item>
    <item>
      <title>🇺🇸 Glancer — Ask your Rails database questions in plain language</title>
      <dc:creator>Ernane Ferreira</dc:creator>
      <pubDate>Wed, 27 May 2026 17:11:10 +0000</pubDate>
      <link>https://dev.to/videosdeti/glancer-ask-your-rails-database-questions-in-plain-language-f8o</link>
      <guid>https://dev.to/videosdeti/glancer-ask-your-rails-database-questions-in-plain-language-f8o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A Rails engine that allows you to query the database using natural language, with RAG and LLMs. No need to write any code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every Rails project reaches a point where someone on the team (product, support, management) needs data, but no one has time to write a quick query for them. You know the drill: a Slack message, a GitHub issue titled "how many users signed up last week?", or a CSV request that ends up in someone's backlog.&lt;/p&gt;

&lt;p&gt;So, I think about &lt;strong&gt;Glancer&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%2Fraw.githubusercontent.com%2FErnaneJ%2Fglancer%2Fmain%2F.github%2Fassets%2Fdemo.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%2Fraw.githubusercontent.com%2FErnaneJ%2Fglancer%2Fmain%2F.github%2Fassets%2Fdemo.gif" alt="Demo" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;Glancer is a Ruby on Rails engine that mounts a full chat interface at &lt;code&gt;/glancer&lt;/code&gt; inside your app. You type a question in plain language, it retrieves the relevant schema context, generates a &lt;code&gt;SELECT&lt;/code&gt; query (or an ActiveRecord expression), validates and executes it safely, then returns the result with a human-readable explanation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"How many orders were placed in the last 30 days, grouped by status?"
→ SELECT executed, results shown, answer written in plain language.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is inspired by &lt;a href="https://github.com/ankane/blazer" rel="noopener noreferrer"&gt;Blazer&lt;/a&gt;, but instead of writing SQL yourself, you just ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Add it to your &lt;code&gt;Gemfile&lt;/code&gt;:&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;gem&lt;/span&gt; &lt;span class="s2"&gt;"glancer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the generator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails generate glancer:install
rails db:migrate
rails glancer:index:all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then visit &lt;code&gt;/glancer&lt;/code&gt; and start asking questions.&lt;/p&gt;

&lt;p&gt;The generator creates an initializer where you configure your LLM provider. A minimal setup with Gemini looks 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="no"&gt;Glancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;llm_provider&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:gemini&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;llm_model&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"gemini-2.0-flash"&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gemini_api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GEMINI_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;schema_permission&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenAI and OpenRouter are also supported. It runs on top of &lt;a href="https://rubyllm.com/" rel="noopener noreferrer"&gt;RubyLLM&lt;/a&gt;, so any model it supports works here too. You can assign different models per role: a smarter model for query generation, a cheaper one for writing the response.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it can do
&lt;/h2&gt;

&lt;p&gt;A few things worth knowing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safety is not optional.&lt;/strong&gt; Every query runs inside a transaction that always rolls back. The keyword blocklist rejects &lt;code&gt;DELETE&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;DROP&lt;/code&gt;, and friends before they even touch the executor. You can also point it at a read-only replica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No extra infrastructure.&lt;/strong&gt; Embeddings live in your existing database as a JSON column. No Pinecone, no Weaviate, nothing to set up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It understands your domain.&lt;/strong&gt; You can drop a Markdown file at &lt;code&gt;config/glancer/llm_context.glancer.md&lt;/code&gt; and teach Glancer your business rules — what &lt;code&gt;status&lt;/code&gt; values mean, how revenue is calculated, which columns to ignore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`orders.status`&lt;/span&gt; values: "pending" | "paid" | "shipped" | "refunded"
&lt;span class="p"&gt;-&lt;/span&gt; Monthly revenue = SUM(orders.total) WHERE status = "paid"
&lt;span class="p"&gt;-&lt;/span&gt; When asked about "churn", use the &lt;span class="sb"&gt;`churned_at`&lt;/span&gt; column on &lt;span class="sb"&gt;`subscriptions`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The UI has some nice touches.&lt;/strong&gt; Results render in a table with one-click CSV export. Charts are auto-generated where they make sense. Queries run in a background thread, so the main app thread stays free. You can type &lt;code&gt;@table_name&lt;/code&gt; to pin a specific table to your question, edit the generated SQL inline and re-run it, and even dictate questions via microphone. There is also a schema viewer at &lt;code&gt;/glancer/db-schema&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blazer integration.&lt;/strong&gt; If you already have Blazer installed, Glancer shows a button to open the generated SQL there directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The story behind it
&lt;/h2&gt;

&lt;p&gt;This started as a study project. I had never published a gem before and wanted to understand the full process, from engine internals to gemspec to CI. I shared it with a few colleagues and they actually found it useful, so I decided to put it out there for the community.&lt;/p&gt;

&lt;p&gt;It is version 1.0.0.&lt;/p&gt;

&lt;p&gt;If you try it, I would love to hear what you think, about the code or the idea itself. Issues and pull requests are open.&lt;/p&gt;

&lt;p&gt;If you find it useful, a star on the repo goes a long way in helping more people discover it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ErnaneJ/glancer" rel="noopener noreferrer"&gt;https://github.com/ErnaneJ/glancer&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;RubyGems:&lt;/strong&gt; &lt;a href="https://rubygems.org/gems/glancer" rel="noopener noreferrer"&gt;https://rubygems.org/gems/glancer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>🇧🇷 Glancer — Converse com seu banco de dados Rails em linguagem natural</title>
      <dc:creator>Ernane Ferreira</dc:creator>
      <pubDate>Wed, 27 May 2026 17:05:40 +0000</pubDate>
      <link>https://dev.to/videosdeti/glancer-converse-com-seu-banco-de-dados-rails-em-linguagem-natural-2eep</link>
      <guid>https://dev.to/videosdeti/glancer-converse-com-seu-banco-de-dados-rails-em-linguagem-natural-2eep</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Uma engine Rails que permite consultar o banco de dados com linguagem natural, usando RAG e LLMs. Sem precisar escrever código.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Todo projeto Rails chega num ponto em que alguém do time (produto, suporte, gestão, etc.) precisa de um dado, mas ninguém tem tempo de parar para compreender a necessidade e escrever uma query. A mensagem no Slack, o card aberto, o pedido de CSV que some no backlog. Quem nunca.&lt;/p&gt;

&lt;p&gt;Foi isso que me fez pensar no &lt;strong&gt;Glancer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ernanej/glancer/" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6totp0rn66zht7onugm0.gif" alt="Demo" width="480" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é
&lt;/h2&gt;

&lt;p&gt;Glancer é uma engine Ruby on Rails que monta uma interface de chat em &lt;code&gt;/glancer&lt;/code&gt; dentro da sua aplicação. Você digita uma pergunta em linguagem natural, ele busca o contexto relevante do sistema, gera um &lt;code&gt;SELECT&lt;/code&gt; (ou uma expressão ActiveRecord), valida, executa com segurança e retorna o resultado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Quantos pedidos foram feitos nos últimos 30 dias, agrupados por status?"
→ SELECT executado, resultados exibidos, resposta escrita em português.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A inspiração direta foi o &lt;a href="https://github.com/ankane/blazer" rel="noopener noreferrer"&gt;Blazer&lt;/a&gt;, uma gem que já usei bastante. A ideia aqui é dar um passo a mais: em vez de escrever o SQL, você só pergunta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como começar
&lt;/h2&gt;

&lt;p&gt;Adicione no &lt;code&gt;Gemfile&lt;/code&gt;:&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;gem&lt;/span&gt; &lt;span class="s2"&gt;"glancer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute o gerador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails generate glancer:install
rails db:migrate
rails glancer:index:all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acesse &lt;code&gt;/glancer&lt;/code&gt; e comece a perguntar.&lt;/p&gt;

&lt;p&gt;O gerador cria um initializer onde você configura o provider de LLM. Uma configuração mínima com Gemini:&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="no"&gt;Glancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;llm_provider&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:gemini&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;llm_model&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"gemini-2.0-flash"&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gemini_api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GEMINI_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;schema_permission&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenAI e OpenRouter também são suportados. Ela roda em cima do &lt;a href="https://rubyllm.com/" rel="noopener noreferrer"&gt;RubyLLM&lt;/a&gt; então os modelos que ele suportar, o Glancer suportará. Dá para usar modelos diferentes por papel, por exemplo, um modelo mais capaz para gerar a query e um mais barato para escrever a resposta.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que ele faz
&lt;/h2&gt;

&lt;p&gt;Alguns pontos que vale conhecer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Segurança por padrão:&lt;/strong&gt; Toda query roda dentro de uma transaction que sempre faz rollback. Um blocklist de palavras rejeita &lt;code&gt;DELETE&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;DROP&lt;/code&gt; e afins antes mesmo de chegar no executor. Também é possível apontar para uma réplica de leitura.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sem infraestrutura adicional:&lt;/strong&gt; Os embeddings ficam no seu banco existente, numa coluna JSON. Sem Pinecone, sem Weaviate, sem nada extra para subir. Raramente será muita coisa, por isso essa abordagem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ensina o contexto do seu negócio.&lt;/strong&gt; Você coloca um arquivo Markdown em &lt;code&gt;config/glancer/llm_context.glancer.md&lt;/code&gt; e explica as regras do domínio: o que os valores de &lt;code&gt;status&lt;/code&gt; significam, como a receita é calculada, quais colunas/tabelas/modelos ignorar, etc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`orders.status`&lt;/span&gt;: "pending" | "paid" | "shipped" | "refunded"
&lt;span class="p"&gt;-&lt;/span&gt; Receita mensal = SUM(orders.total) WHERE status = "paid"
&lt;span class="p"&gt;-&lt;/span&gt; Para perguntas sobre "churn", usar a coluna &lt;span class="sb"&gt;`churned_at`&lt;/span&gt; em &lt;span class="sb"&gt;`subscriptions`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Informações adicionais mais dinâmicas podem ser adicionadas em um campo texto nas configurações. Entretanto, não será gerado embedding disso pois será utilizado de contexto ao modelo base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A interface tem uns detalhes legais.&lt;/strong&gt; Os resultados aparecem em tabela com export CSV de um clique. Gráficos são gerados automaticamente quando fazem sentido. O processo de execução foi pensado para não travar a thread principal da aplicação. Dá para digitar &lt;code&gt;@nome_da_tabela&lt;/code&gt; para fixar e ser mais assertivo sobre uma tabela específica na pergunta, editar o SQL gerado e reexecutar, e até ditar a pergunta pelo microfone. Tem também um visualizador de schema em &lt;code&gt;/glancer/db-schema&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integração com Blazer.&lt;/strong&gt; Se você já usa o Blazer, o Glancer mostra um botão para abrir o SQL gerado direto lá.&lt;/p&gt;

&lt;h2&gt;
  
  
  A história por trás
&lt;/h2&gt;

&lt;p&gt;Comecei isso como projeto de estudo. Estudei bastante sobre RAG e LLMs ao longo do ano passado e quando a ideia surgiu eu nunca tinha publicado uma gem antes e queria experimentar o processo completo, de engine a gemspec a CI. Com isso, juntei o útil ao agradável. Como mostrei para alguns colegas e eles acharam útil, então decidi abrir para a comunidade.&lt;/p&gt;

&lt;p&gt;Atualmente está na versão 1.0.0.&lt;/p&gt;

&lt;p&gt;Se você testar, adoraria saber o que achou, seja sobre o código ou sobre a ideia. Issues e pull requests são bem-vindos.&lt;/p&gt;

&lt;p&gt;Se gostar do projeto, uma estrela no repositório ajuda bastante a divulgar para mais pessoas da comunidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ErnaneJ/glancer" rel="noopener noreferrer"&gt;https://github.com/ErnaneJ/glancer&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;RubyGems:&lt;/strong&gt; &lt;a href="https://rubygems.org/gems/glancer" rel="noopener noreferrer"&gt;https://rubygems.org/gems/glancer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ai</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🇺🇸 Rails Realtime ERD: Visualize Your Rails Schema in Real Time</title>
      <dc:creator>Jackson Pires</dc:creator>
      <pubDate>Wed, 27 May 2026 13:23:42 +0000</pubDate>
      <link>https://dev.to/videosdeti/rails-realtime-erd-visualize-your-rails-schema-in-real-time-4ha</link>
      <guid>https://dev.to/videosdeti/rails-realtime-erd-visualize-your-rails-schema-in-real-time-4ha</guid>
      <description>&lt;p&gt;Anyone who works with &lt;strong&gt;Ruby on Rails&lt;/strong&gt; applications knows that, as a project grows, quickly understanding the relationships between models can become increasingly difficult.&lt;/p&gt;

&lt;p&gt;Even when using traditional ERD (&lt;em&gt;Entity Relationship Diagram&lt;/em&gt;) generation tools, there is usually some friction in the workflow: generating files, manually updating diagrams, or relying on external processes.&lt;/p&gt;

&lt;p&gt;With that in mind, I created the &lt;strong&gt;Rails Realtime ERD&lt;/strong&gt; gem.&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%2Ff4mivebeq82k0e4kpy8a.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%2Ff4mivebeq82k0e4kpy8a.png" alt=" " width="799" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Rails Realtime ERD?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;rails-realtime-erd&lt;/strong&gt; is a Ruby on Rails gem that allows you to &lt;strong&gt;visualize your schema ERD diagrams in real time directly inside your application&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the gem&lt;/li&gt;
&lt;li&gt;Add it to your project&lt;/li&gt;
&lt;li&gt;Open a route&lt;/li&gt;
&lt;li&gt;See your diagram automatically updated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No manual image generation. No intermediate exports. No leaving your application context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Real-time schema visualization
&lt;/li&gt;
&lt;li&gt;✅ Simple integration with Rails applications
&lt;/li&gt;
&lt;li&gt;✅ Built on Rails Engine
&lt;/li&gt;
&lt;li&gt;✅ Automatic updates as your models evolve
&lt;/li&gt;
&lt;li&gt;✅ Integrated web interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding existing architectures&lt;/li&gt;
&lt;li&gt;Onboarding new developers&lt;/li&gt;
&lt;li&gt;Quickly exploring model relationships&lt;/li&gt;
&lt;li&gt;Keeping living documentation of your application's domain&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the gem to your &lt;code&gt;Gemfile&lt;/code&gt;:&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;gem&lt;/span&gt; &lt;span class="s2"&gt;"rails-realtime-erd"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now simply access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/rails/erd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in your project to visualize your diagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why create this gem?
&lt;/h2&gt;

&lt;p&gt;During consulting work, training sessions, and Rails application development, I often felt the lack of a more dynamic experience for inspecting an application's domain.&lt;/p&gt;

&lt;p&gt;I wanted something closer to the experience we already have with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/rails/mailers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/sidekiq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;internal dashboards&lt;/li&gt;
&lt;li&gt;integrated development tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: &lt;strong&gt;open a URL and start exploring immediately&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's how Rails Realtime ERD was born.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Project
&lt;/h2&gt;

&lt;p&gt;The gem is open source and available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/jacksonpires/rails-realtime-erd" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-realtime-erd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contributions, feedback, issues, and suggestions are very welcome.&lt;/p&gt;

&lt;p&gt;If you work with Rails and enjoy tools that improve productivity and architectural understanding, give it a try.&lt;/p&gt;

</description>
      <category>database</category>
      <category>rails</category>
      <category>ruby</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🇧🇷 Rails Realtime ERD: visualize seu schema Rails em tempo real</title>
      <dc:creator>Jackson Pires</dc:creator>
      <pubDate>Wed, 27 May 2026 13:10:31 +0000</pubDate>
      <link>https://dev.to/videosdeti/rails-realtime-erd-visualize-seu-schema-rails-em-tempo-real-63k</link>
      <guid>https://dev.to/videosdeti/rails-realtime-erd-visualize-seu-schema-rails-em-tempo-real-63k</guid>
      <description>&lt;p&gt;Quem trabalha com aplicações &lt;strong&gt;Ruby on Rails&lt;/strong&gt; sabe que, conforme o projeto cresce, entender rapidamente as relações entre modelos pode se tornar cada vez mais difícil.&lt;/p&gt;

&lt;p&gt;Mesmo utilizando ferramentas tradicionais de geração de ERD (&lt;em&gt;Entity Relationship Diagram&lt;/em&gt;), normalmente existe um pequeno atrito no fluxo: gerar arquivos, atualizar diagramas manualmente ou depender de processos externos.&lt;/p&gt;

&lt;p&gt;Pensando nisso, criei a gem &lt;strong&gt;Rails Realtime ERD&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%2Ff4mivebeq82k0e4kpy8a.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%2Ff4mivebeq82k0e4kpy8a.png" alt=" " width="799" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Rails Realtime ERD?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;rails-realtime-erd&lt;/strong&gt; é uma gem para Ruby on Rails que permite &lt;strong&gt;visualizar diagramas ERD do seu schema em tempo real diretamente dentro da aplicação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A proposta é simples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instalar a gem&lt;/li&gt;
&lt;li&gt;Montar a engine no projeto&lt;/li&gt;
&lt;li&gt;Abrir uma rota&lt;/li&gt;
&lt;li&gt;Ver seu diagrama atualizado automaticamente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sem geração manual de imagens. Sem exportações intermediárias. Sem sair do contexto da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Visualização do schema em tempo real
&lt;/li&gt;
&lt;li&gt;✅ Integração simples com aplicações Rails
&lt;/li&gt;
&lt;li&gt;✅ Baseado em Rails Engine
&lt;/li&gt;
&lt;li&gt;✅ Atualizações automáticas conforme seus models evoluem
&lt;/li&gt;
&lt;li&gt;✅ Interface web integrada ao projeto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideal para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entender arquiteturas existentes&lt;/li&gt;
&lt;li&gt;Onboarding de novos desenvolvedores&lt;/li&gt;
&lt;li&gt;Exploração rápida de relacionamentos entre modelos&lt;/li&gt;
&lt;li&gt;Documentação viva do domínio da aplicação&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Adicione a gem ao seu &lt;code&gt;Gemfile&lt;/code&gt;:&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;gem&lt;/span&gt; &lt;span class="s2"&gt;"rails-realtime-erd"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora basta acessar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/rails/erd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;em seu projeto e visualizar seu diagrama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que criar essa gem?
&lt;/h2&gt;

&lt;p&gt;Durante consultorias, cursos e desenvolvimento de aplicações Rails, frequentemente senti falta de uma experiência mais dinâmica para inspeção do domínio da aplicação.&lt;/p&gt;

&lt;p&gt;Queria algo próximo da experiência que temos com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/rails/mailers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/sidekiq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;dashboards internos&lt;/li&gt;
&lt;li&gt;ferramentas de desenvolvimento integradas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja: &lt;strong&gt;abrir uma URL e começar a explorar imediatamente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Foi daí que nasceu o Rails Realtime ERD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projeto Open Source
&lt;/h2&gt;

&lt;p&gt;A gem é open source e está disponível no GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/jacksonpires/rails-realtime-erd" rel="noopener noreferrer"&gt;https://github.com/jacksonpires/rails-realtime-erd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contribuições, feedbacks, issues e sugestões são muito bem-vindos.&lt;/p&gt;

&lt;p&gt;Se você trabalha com Rails e gosta de ferramentas para melhorar produtividade e entendimento de arquitetura, vale a pena experimentar.&lt;/p&gt;

</description>
      <category>database</category>
      <category>rails</category>
      <category>ruby</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Stop Writing Setup READMEs: Add Nix to Your Project in 5 Minutes</title>
      <dc:creator>Rodrigo Barreto</dc:creator>
      <pubDate>Sat, 14 Feb 2026 22:54:24 +0000</pubDate>
      <link>https://dev.to/videosdeti/add-nix-to-your-project-one-file-zero-setup-drama-4cl4</link>
      <guid>https://dev.to/videosdeti/add-nix-to-your-project-one-file-zero-setup-drama-4cl4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;You have a Laravel API and a React frontend. Add one file and your team never fights dependency versions again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Ignore the quality of the PHP and React code, this post is focused on Nix and creating a simple environment for your development team.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How This Started
&lt;/h2&gt;

&lt;p&gt;A friend of mine works with Symfony for a local government office. His team is growing fast, they went from 10 to 73 developers in a few months, and onboarding has become a nightmare. Every new hire spends their first day fighting PHP versions, MySQL configs, and missing extensions.&lt;/p&gt;

&lt;p&gt;He uses Docker for development and it works fine. But he was curious if there was something lighter for local dev environments, especially for smaller projects or quick onboarding, without having to maintain Dockerfiles and docker-compose configs.&lt;/p&gt;

&lt;p&gt;He called me one evening, "do you have 5 minutes?" We caught up, had some good laughs, but at the end of the call I suggested he look at &lt;a href="https://nixos.org/" rel="noopener noreferrer"&gt;Nix&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nix is a package manager that guarantees &lt;strong&gt;reproducibility&lt;/strong&gt;. You declare what your project needs in a single file, commit it, and anyone who clones your repo gets the exact same environment, same PHP, same Node, same MySQL, same everything. No containers, no VMs. Just your terminal with the right tools available. And it works with any language or framework, Python, Ruby, Go, you name it.&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="c"&gt;# Outside nix develop&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;php &lt;span class="nt"&gt;--version&lt;/span&gt;    &lt;span class="c"&gt;# whatever your system has (or nothing)&lt;/span&gt;

&lt;span class="c"&gt;# Inside nix develop&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;php &lt;span class="nt"&gt;--version&lt;/span&gt;    &lt;span class="c"&gt;# PHP 8.3.x, exactly what the file says&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;node &lt;span class="nt"&gt;--version&lt;/span&gt;   &lt;span class="c"&gt;# v22.x.x&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;mysql &lt;span class="nt"&gt;--version&lt;/span&gt;  &lt;span class="c"&gt;# mysql Ver 8.4.x&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;             &lt;span class="c"&gt;# back to normal, nothing changed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I told him I'd write a post showing exactly how to do it. So here we are. I'm using Laravel for this tutorial, but everything you'll see here applies to any framework.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing Nix
&lt;/h2&gt;

&lt;p&gt;Nix runs on &lt;strong&gt;macOS&lt;/strong&gt;, &lt;strong&gt;Linux&lt;/strong&gt;, and &lt;strong&gt;WSL2&lt;/strong&gt;. The recommended installer is from &lt;a href="https://determinate.systems/" rel="noopener noreferrer"&gt;Determinate Systems&lt;/a&gt;, it's simpler than the official one and enables Flakes by default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://install.determinate.systems/nix | sh &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart your terminal after installing, then verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# nix (Determinate Nix) 2.33.x&lt;/span&gt;

nix flake &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;span class="c"&gt;# Should show flake commands&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If &lt;code&gt;nix flake --help&lt;/code&gt; fails, add &lt;code&gt;experimental-features = nix-command flakes&lt;/code&gt; to &lt;code&gt;~/.config/nix/nix.conf&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;WSL2 users&lt;/strong&gt;: Keep your projects inside the Linux filesystem (&lt;code&gt;~/projects/&lt;/code&gt;), not &lt;code&gt;/mnt/c/&lt;/code&gt;. Performance is much better.&lt;/p&gt;

&lt;p&gt;That's it. One install, and you're ready for any Nix-managed project, forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Sample Project
&lt;/h2&gt;

&lt;p&gt;For this post I created a simple backend with a product CRUD in Laravel and a React frontend that lists those products. The code was generated with AI, ignore it, our focus is Nix.&lt;/p&gt;

&lt;p&gt;You can find the full source code here: &lt;a href="https://github.com/rodrigonbarreto/nix_blog_post" rel="noopener noreferrer"&gt;github.com/rodrigonbarreto/nix_blog_post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workspace/
├── product-api/          ← Laravel API (PHP + MySQL)
├── product-frontend/     ← React list (Node)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both projects work fine with my local PHP 8.3, Node, and MySQL. The question is: &lt;strong&gt;how do I make sure the next person who clones this doesn't spend half a day setting things up?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Your project README probably looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Setup
1. Install PHP 8.3
2. Install Composer
3. Install Node 22
4. Install MySQL
5. Copy .env.example to .env
6. Run composer install
7. Run npm install
8. Create the database
9. Run migrations
10. Pray it works
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every new developer spends half a day on this. Someone has PHP 8.1, someone else has MySQL 5.7, and the intern can't compile the &lt;code&gt;pdo_mysql&lt;/code&gt; extension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nix replaces all of that with one command: &lt;code&gt;nix develop&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: One File
&lt;/h2&gt;

&lt;p&gt;We add a single file, &lt;code&gt;flake.nix&lt;/code&gt;, next to our projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workspace/
├── product-api/
├── product-frontend/
└── flake.nix              ← this is all we add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Dev environment, PHP, Node, MySQL"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nv"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:NixOS/nixpkgs/nixos-24.11"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:numtide/flake-utils"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nv"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;flake-utils&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="nv"&gt;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;eachDefaultSystem&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt;
        &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;legacyPackages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="nv"&gt;php&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;php83&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;buildEnv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c"&gt;# All extensions Laravel needs out of the box&lt;/span&gt;
          &lt;span class="nv"&gt;extensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nv"&gt;mbstring&lt;/span&gt;
            &lt;span class="nv"&gt;iconv&lt;/span&gt;
            &lt;span class="nv"&gt;pdo_mysql&lt;/span&gt;
            &lt;span class="nv"&gt;mysqlnd&lt;/span&gt;
            &lt;span class="nv"&gt;openssl&lt;/span&gt;
            &lt;span class="nv"&gt;tokenizer&lt;/span&gt;
            &lt;span class="nv"&gt;xmlwriter&lt;/span&gt;
            &lt;span class="nv"&gt;xmlreader&lt;/span&gt;
            &lt;span class="nv"&gt;ctype&lt;/span&gt;
            &lt;span class="nv"&gt;fileinfo&lt;/span&gt;
            &lt;span class="nv"&gt;bcmath&lt;/span&gt;
            &lt;span class="nv"&gt;curl&lt;/span&gt;
            &lt;span class="nv"&gt;dom&lt;/span&gt;
            &lt;span class="nv"&gt;filter&lt;/span&gt;
            &lt;span class="nv"&gt;pdo&lt;/span&gt;
            &lt;span class="nv"&gt;session&lt;/span&gt;
            &lt;span class="nv"&gt;simplexml&lt;/span&gt;
            &lt;span class="nv"&gt;zip&lt;/span&gt;
          &lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

      &lt;span class="kn"&gt;in&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;devShells&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mkShell&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nv"&gt;buildInputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nv"&gt;php&lt;/span&gt;
            &lt;span class="nv"&gt;php&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;composer&lt;/span&gt;

            &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nodejs_22&lt;/span&gt;
            &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mariadb&lt;/span&gt;

            &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;
            &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;curl&lt;/span&gt;
            &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;unzip&lt;/span&gt;
          &lt;span class="p"&gt;];&lt;/span&gt;

          &lt;span class="nv"&gt;shellHook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;''&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            # Prevent tools like Laravel Herd from hijacking PHP config&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            unset PHP_INI_SCAN_DIR&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            unset PHPRC&lt;/span&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;span class="s2"&gt;            export MYSQL_HOME="$PWD/.nix-mysql"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            export MYSQL_DATADIR="$MYSQL_HOME/data"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            export MYSQL_UNIX_PORT="$MYSQL_HOME/mysql.sock"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            export MYSQL_TCP_PORT="3307"&lt;/span&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;span class="s2"&gt;            if [ ! -d "$MYSQL_DATADIR" ]; then&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;              echo "Initializing MySQL..."&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;              mkdir -p "$MYSQL_HOME"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;              mysql_install_db --datadir="$MYSQL_DATADIR" --auth-root-authentication-method=normal &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            fi&lt;/span&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;span class="s2"&gt;            echo ""&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "=========================================="&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "  Dev Environment Ready"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "=========================================="&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "  PHP:    $(php -r 'echo PHP_VERSION;')"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "  Node:   $(node --version)"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "  MySQL:  port $MYSQL_TCP_PORT"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "=========================================="&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo ""&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "  Start MySQL:"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo "    mysqld --datadir=\$MYSQL_DATADIR --socket=\$MYSQL_UNIX_PORT --port=\$MYSQL_TCP_PORT &amp;amp;"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;            echo ""&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;          ''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. &lt;strong&gt;One file.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Happening Here?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flake.nix
│
├── inputs          → where packages come from (pinned to nixos-24.11)
│
└── outputs
    └── devShell
        ├── buildInputs   → packages: PHP, Node, MySQL, etc.
        └── shellHook     → bash that runs on entry (sets up local MySQL)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things worth noting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;nixos-24.11&lt;/code&gt;&lt;/strong&gt; pins the package versions. Everyone with this file gets the same PHP, same Node, same MySQL. Always.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;php83.buildEnv&lt;/code&gt;&lt;/strong&gt; builds PHP with the exact extensions your project needs. The base PHP in Nix is minimal, you declare what you need explicitly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;unset PHP_INI_SCAN_DIR&lt;/code&gt;&lt;/strong&gt; prevents tools like Laravel Herd from injecting their own PHP config and overriding the Nix extensions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;mariadb&lt;/code&gt;&lt;/strong&gt; is used instead of MySQL because it's easier to manage locally with Nix and is fully MySQL-compatible. Your Laravel app won't notice the difference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port &lt;code&gt;3307&lt;/code&gt;&lt;/strong&gt; avoids conflicts if you already have MySQL running on 3306.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;shellHook&lt;/code&gt;&lt;/strong&gt; initializes a MySQL data directory inside the project. Nothing touches your system.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Let's Use It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Enter the shell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;workspace
nix develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First time takes a few minutes (downloads packages). After that, it's instant.&lt;/p&gt;

&lt;p&gt;You'll see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;==========================================
  Dev Environment Ready
==========================================
  PHP:    8.3.11
  Node:   v22.9.0
  MySQL:  port 3307
==========================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything from this point runs inside &lt;code&gt;nix develop&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start MySQL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysqld &lt;span class="nt"&gt;--datadir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_DATADIR&lt;/span&gt; &lt;span class="nt"&gt;--socket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_UNIX_PORT&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_TCP_PORT&lt;/span&gt; &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait a couple of seconds, then create the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;--socket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_UNIX_PORT&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"CREATE DATABASE IF NOT EXISTS product_api;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run the backend
&lt;/h3&gt;

&lt;p&gt;Update &lt;code&gt;product-api/.env&lt;/code&gt; to use port 3307:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3307
DB_DATABASE=product_api
DB_USERNAME=root
DB_PASSWORD=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&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="nb"&gt;cd &lt;/span&gt;product-api
composer &lt;span class="nb"&gt;install
&lt;/span&gt;php artisan migrate
php artisan db:seed
php artisan serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If you previously ran &lt;code&gt;composer install&lt;/code&gt; with a different PHP, delete &lt;code&gt;vendor/&lt;/code&gt; first: &lt;code&gt;rm -rf vendor &amp;amp;&amp;amp; composer install&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Run the frontend
&lt;/h3&gt;

&lt;p&gt;Open a &lt;strong&gt;new terminal&lt;/strong&gt;, same directory:&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="nb"&gt;cd &lt;/span&gt;workspace
nix develop
&lt;span class="nb"&gt;cd &lt;/span&gt;product-frontend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:5173&lt;/code&gt;, your product list is running, powered entirely by Nix.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Day-to-Day
&lt;/h2&gt;

&lt;p&gt;Every time you work on the project:&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="nb"&gt;cd &lt;/span&gt;workspace
nix develop

&lt;span class="c"&gt;# Start MySQL&lt;/span&gt;
mysqld &lt;span class="nt"&gt;--datadir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_DATADIR&lt;/span&gt; &lt;span class="nt"&gt;--socket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_UNIX_PORT&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_TCP_PORT&lt;/span&gt; &amp;amp;

&lt;span class="c"&gt;# Terminal 1: backend&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;product-api &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; php artisan serve

&lt;span class="c"&gt;# Terminal 2 (new terminal, nix develop first): frontend&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;product-frontend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything you're used to works normally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan tinker
php artisan migrate
php artisan make:model
composer require &amp;lt;package&amp;gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;package&amp;gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;--socket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_UNIX_PORT&lt;/span&gt; product_api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What to Commit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add flake.nix flake.lock
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add Nix dev environment"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to &lt;code&gt;.gitignore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.nix-mysql/
.direnv/
result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;flake.lock&lt;/code&gt; pins exact versions, treat it like &lt;code&gt;composer.lock&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  When a New Developer Joins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before Nix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Read the README
2. Install PHP 8.3 (they install 8.1)
3. Install Node (wrong version)
4. Install MySQL (can't connect)
5. Spend 4 hours debugging
6. Finally get it running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After Nix:&lt;/strong&gt;&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="c"&gt;# One-time: install Nix&lt;/span&gt;
curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://install.determinate.systems/nix | sh &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Every time:&lt;/span&gt;
git clone https://github.com/rodrigonbarreto/nix_blog_post.git
&lt;span class="nb"&gt;cd &lt;/span&gt;nix_blog_post
nix develop
&lt;span class="c"&gt;# Same PHP, same Node, same MySQL. Done.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Customizing
&lt;/h2&gt;

&lt;p&gt;Need Redis? Add it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;buildInputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c"&gt;# ... existing packages&lt;/span&gt;
  &lt;span class="nv"&gt;redis&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Need more PHP extensions? Add them to the &lt;code&gt;buildEnv&lt;/code&gt; block in &lt;code&gt;flake.nix&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;php&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;php83&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;buildEnv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;extensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c"&gt;# ... existing extensions&lt;/span&gt;
    &lt;span class="nv"&gt;redis&lt;/span&gt;
    &lt;span class="nv"&gt;imagick&lt;/span&gt;
    &lt;span class="nv"&gt;gd&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;nix develop&lt;/code&gt; again and the new packages are there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"experimental feature 'flakes' is disabled"&lt;/strong&gt;: Add &lt;code&gt;experimental-features = nix-command flakes&lt;/code&gt; to &lt;code&gt;~/.config/nix/nix.conf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"The iconv OR mbstring extension is required"&lt;/strong&gt;: Add missing extensions to the &lt;code&gt;buildEnv&lt;/code&gt; block in &lt;code&gt;flake.nix&lt;/code&gt;, then &lt;code&gt;exit&lt;/code&gt; and re-enter &lt;code&gt;nix develop&lt;/code&gt;. Also make sure the &lt;code&gt;shellHook&lt;/code&gt; includes &lt;code&gt;unset PHP_INI_SCAN_DIR&lt;/code&gt;, tools like Laravel Herd can hijack the PHP config and hide Nix extensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MySQL won't start&lt;/strong&gt;: Check if port 3307 is in use. Look at the error output from &lt;code&gt;mysqld&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"command not found" outside the shell&lt;/strong&gt;: Expected. Everything only exists inside &lt;code&gt;nix develop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want auto-activation?&lt;/strong&gt; Install &lt;a href="https://direnv.net/" rel="noopener noreferrer"&gt;direnv&lt;/a&gt;, create &lt;code&gt;.envrc&lt;/code&gt; with &lt;code&gt;use flake&lt;/code&gt;, run &lt;code&gt;direnv allow&lt;/code&gt;. The environment activates automatically when you &lt;code&gt;cd&lt;/code&gt; into the project.&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%2Fqqtdr5v1x4kvilwzakty.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%2Fqqtdr5v1x4kvilwzakty.png" alt=" " width="800" height="864"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;If you found this useful, I'm planning a &lt;strong&gt;Part 2&lt;/strong&gt; where we set up the entire stack, MySQL, Laravel, and React, to start with a single command. No more opening 3 terminals. Just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix develop
start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And everything is running. Drop a comment or a like if you'd want to see that.&lt;/p&gt;

&lt;p&gt;In the meantime, some useful links to go deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://direnv.net/" rel="noopener noreferrer"&gt;direnv&lt;/a&gt;&lt;/strong&gt;, auto-activate the environment on &lt;code&gt;cd&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://devenv.sh/" rel="noopener noreferrer"&gt;devenv.sh&lt;/a&gt;&lt;/strong&gt;, higher-level Nix tool with built-in services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nix.dev/tutorials/nix-language" rel="noopener noreferrer"&gt;Nix language tutorial&lt;/a&gt;&lt;/strong&gt;, understand what's inside the flake&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;One file. One command. Every machine. That's Nix.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source code: &lt;a href="https://github.com/rodrigonbarreto/nix_blog_post" rel="noopener noreferrer"&gt;github.com/rodrigonbarreto/nix_blog_post&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Configuração setup básico p/ projetos Ruby/Rails - utilizando o WSL 2</title>
      <dc:creator>Dominique Morem</dc:creator>
      <pubDate>Wed, 08 Oct 2025 15:44:48 +0000</pubDate>
      <link>https://dev.to/videosdeti/configuracao-setup-basico-p-projetos-rubyrails-utilizando-o-wsl-2-3ngf</link>
      <guid>https://dev.to/videosdeti/configuracao-setup-basico-p-projetos-rubyrails-utilizando-o-wsl-2-3ngf</guid>
      <description>&lt;h2&gt;
  
  
  O que será visto durante esta postagem:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Instalação do Windows Terminal.&lt;/li&gt;
&lt;li&gt;Instalação do WSL 2. &lt;/li&gt;
&lt;li&gt;Instalação e configuração do Ubuntu.&lt;/li&gt;
&lt;li&gt;Instalação do Git.&lt;/li&gt;
&lt;li&gt;Instalação do PostgreSQL.&lt;/li&gt;
&lt;li&gt;Instalação e configuração do VSCode.&lt;/li&gt;
&lt;li&gt;Instalação do Rails.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Observação inicial
&lt;/h2&gt;

&lt;p&gt;Pessoal, alguns dos passos apresentados neste guia podem ser acompanhados em vídeo no canal &lt;a href="https://www.youtube.com/@videosdeti1954" rel="noopener noreferrer"&gt;Vídeos de TI&lt;/a&gt; no Youtube, que também traz tutoriais práticos e explicativos sobre a temática aqui abordada. Para quem aprende bem por meio de audiovisual, fica a dica. Alguns dos exemplos de conteúdos aqui presentes que vocês também encontrarão por lá são os comandos básicos do terminal Ubuntu (&lt;a href="https://www.youtube.com/watch?v=tlNLIj01Bmo&amp;amp;list=PLmSWX0ePcw4iMR1nTLXmsamnvOnnMNCNO&amp;amp;index=9" rel="noopener noreferrer"&gt;video&lt;/a&gt;) e o processo de instalação do RVM (&lt;a href="https://www.youtube.com/watch?v=naswiUjtq58" rel="noopener noreferrer"&gt;video&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Assim, você poderá optar por seguir via texto por aqui, ou por acompanhar visualmente pelo canal, o que for mais confortável a sua pessoa. &lt;/p&gt;

&lt;h2&gt;
  
  
  1 - Começando pela instalação do Windows Terminal
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Este passo é opcional&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O Windows Terminal é uma interface moderna para usar vários shells (CMD, PowerShell, WSL, etc). Apesar de ser opcional, ele é muito recomendado pois facilita quando formos utilizar o WSL 2.&lt;/p&gt;

&lt;p&gt;Para instalá-lo é muito simples.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.1 - Vá até a Microsoft Store
&lt;/h3&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%2Fnarz21zqdzc3r52d5gb2.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%2Fnarz21zqdzc3r52d5gb2.png" alt="'Image description'" width="476" height="405"&gt;&lt;/a&gt; &lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2 - Na Microsoft Store busque por ‘Windows Terminal’
&lt;/h3&gt;

&lt;p&gt;E clique nessa opção do menu:&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%2Ffyz8goymmk3mets14l0j.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%2Ffyz8goymmk3mets14l0j.png" alt="'Image description'" width="800" height="147"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.3 - Clique em 'Abrir'
&lt;/h3&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%2Fug2hj3t168m7dkrc8nk2.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%2Fug2hj3t168m7dkrc8nk2.png" alt="'Image description'" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto! Já temos o Windows Terminal instalado!&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2 - Instalando o WSL 2
&lt;/h2&gt;


&lt;h3&gt;
  
  
  O que é o WSL 2 e por que instalá-lo?
&lt;/h3&gt;

&lt;p&gt;WSL 2 (Windows Subsystem for Linux 2) é uma tecnologia da Microsoft que permite rodar um ambiente Linux completo dentro do Windows, de maneira leve e integrada. &lt;/p&gt;

&lt;p&gt;Em vez de usar uma máquina virtual tradicional, o WSL 2 roda um kernel Linux real dentro do Windows - só que em segundo plano - permitindo executar comandos, ferramentas e aplicações Linux, como se você estivesse num Ubuntu ou Debian, contudo sem sair do Windows.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Por que o WSL 2 é importante no desenvolvimento em Ruby?
&lt;/h3&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A maioria das aplicações Ruby (especialmente as do Rails) são desenvolvidas e implantadas em servidores Linux.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usar WSL 2 faz com que seu ambiente local seja idêntico ao do servidor de produção — evitando aquele clássico “funcionava no meu Windows”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Muitas gems Ruby dependem de bibliotecas nativas do Linux&lt;br&gt;
&lt;br&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  2.1 - Checando a nossa versão do Windows
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Por que checar a versão:&lt;/strong&gt; É importante checar a versão do Windows antes de instalar o WSL 2 (Windows Subsystem for Linux 2) porque nem todas as versões do Windows suportam o WSL 2 ou suas funções mais recentes.&lt;/p&gt;

&lt;p&gt;O WSL 2 requer recursos específicos do sistema operacional, como o subsistema de máquina virtual (Virtual Machine Platform), que só está presente a partir do Windows 10 ( versão 1903 - build 18362 ou superior) e do Windows 11 (em todas as versões).&lt;/p&gt;

&lt;p&gt;Para checar a versão do SO vamos pressionar: &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%2Fzcw9rqizlt5oqtctdnb1.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%2Fzcw9rqizlt5oqtctdnb1.png" alt="'Image description'" width="411" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na janela de execução que se abrir digite ‘winver’ e dê um ‘ok’.&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%2F2oje4iadxbukay3inhlo.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%2F2oje4iadxbukay3inhlo.png" alt="'Image description'" width="475" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Windows lhe trará a versão que está em vigor na sua máquina. &lt;/p&gt;

&lt;p&gt;Certifique-se de que é versão 10 ou alguma acima desta.&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%2F9bw7lkc9rij7dyjwc0n6.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%2F9bw7lkc9rij7dyjwc0n6.png" alt="'Image description'" width="596" height="538"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.2 - Verificando se há atualizações a serem feitas
&lt;/h3&gt;

&lt;p&gt;Antes de seguir com o processo, é importante verificar se há atualizações a fazer. Para isso:&lt;/p&gt;

&lt;p&gt;Abra o menu iniciar e vá em ‘configurações’.&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%2Fd7z0b5vm5w4ynxugaebm.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%2Fd7z0b5vm5w4ynxugaebm.png" alt="'Image description'" width="637" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vá em ‘Atualização e segurança’.&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%2Fhi39na2kqg0awiyykm0j.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%2Fhi39na2kqg0awiyykm0j.png" alt="'Image description'" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verifique se há alguma atualização disponível, caso exista, instale-a.&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%2Fqoghogrt7w6sopopp98j.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%2Fqoghogrt7w6sopopp98j.png" alt="'Image description'" width="373" height="207"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  2.3 - Ativando recursos
&lt;/h3&gt;

&lt;p&gt;Agora vamos ativar alguns recursos do Windows que serão necessários à instalação do WSL 2. Vamos acessá-los.&lt;/p&gt;

&lt;p&gt;No menu iniciar vá em ‘ativar ou desativar recursos Windows’.&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%2Fmw8nly86f6ntqxyxomff.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%2Fmw8nly86f6ntqxyxomff.png" alt="'Image description'" width="698" height="609"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.3.1 - Subsistema do Windows para Linux
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;explicação:&lt;/strong&gt; É o componente principal do WSL, ele cria a camada de compatibilidade que permite rodar binários Linux (ELF64) diretamente no Windows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na janela de opções que irá se abrir ative o ‘Subsistema do Windows para Linux'.&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%2F68o1unhh0yddjisapvey.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%2F68o1unhh0yddjisapvey.png" alt="'Image description'" width="556" height="479"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.3.2 - Plataforma de Máquina Virtual
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;explicação:&lt;/strong&gt; Ela fornece os recursos básicos de virtualização que o WSL 2 precisa para rodar um kernel Linux real. Ou seja, ela cria e gerencia pequenas máquinas virtuais leves, usadas pelo WSL 2 para executar o kernel Linux.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ative também a opção ‘Plataforma de Máquina Virtual’.&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%2Fz756nxe8xfyiqqshxwqa.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%2Fz756nxe8xfyiqqshxwqa.png" alt="'Image description'" width="553" height="477"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.3.3 - Plataforma do Hipervisor do Windows
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;explicação:&lt;/strong&gt; É o conjunto de APIs que permite que o sistema operacional e aplicativos (como WSL 2 ou Docker) usem o Hyper-V — o hipervisor nativo do Windows. É interessante ativar, pois o kernel Linux do WSL 2 roda em uma VM gerenciada por esse hipervisor, que faz o isolamento entre o Windows e o Linux.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ative adicionalmente a 'Plataforma do Hipervisor do Windows'&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%2Fvwd4kd0ci4at7u0e68g6.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%2Fvwd4kd0ci4at7u0e68g6.png" alt="'Image description'" width="555" height="476"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.3.4 - Depois de marcar todas essas opções clique em ‘ok’
&lt;/h4&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%2F0bce0cn3znnvu4rtb3ir.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%2F0bce0cn3znnvu4rtb3ir.png" alt="'Image description'" width="557" height="479"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  2.4 - Reiniciando a máquina para efetivar as mudanças
&lt;/h3&gt;

&lt;p&gt;Depois de feito o carregamento dos recursos selecionados anteriormente, o Windows vai pedir para reiniciar a máquina, clique em ‘reiniciar agora’.&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%2Fdc559bkzh0fhallwz0fb.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%2Fdc559bkzh0fhallwz0fb.png" alt="'Image description'" width="701" height="582"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  2.5 - Baixando o pacote
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;explicação&lt;/strong&gt;: Nós já ativamos os componentes: Subsistema do Windows para Linux, Plataforma de Máquina Virtual e Plataforma do Hipervisor, ou seja, habilitamos o ambiente onde o WSL 2 vai rodar. Mas, ainda falta o kernel Linux propriamente dito — ou seja,  “coração” do sistema. O Windows não vem com ele instalado por padrão, o que vamos fazer agora é baixar e instalar o pacote kernel Linux compilado pela Microsoft.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reiniciada a nossa máquina, agora vamos ao navegador. Insira esta URL neste para baixar o WSL, posteriormente, dê um ‘Enter’:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi" rel="noopener noreferrer"&gt;https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de baixado, vamos executá-lo. Clique no arquivo baixado.&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%2Fxn193zp722nyj0eb3rxq.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%2Fxn193zp722nyj0eb3rxq.png" alt="'Image description'" width="369" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E depois clique em 'Executar'.&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%2Fjkzmfx5j4ovldgze790t.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%2Fjkzmfx5j4ovldgze790t.png" alt="'Image description'" width="533" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E instale o pacote.&lt;/p&gt;


&lt;h3&gt;
  
  
  2.6 - Definindo o WSL 2 como a versão padrão
&lt;/h3&gt;

&lt;p&gt;Como o WSL possui duas versões, o WSL e o WSL 2, vamos dar um comando para definir o WSL 2 como a versão padrão para todas as novas distribuições Linux que você instalar no Windows.&lt;/p&gt;

&lt;p&gt;Para definir isso, precisaremos dos 'poderes' de Administrador.&lt;/p&gt;

&lt;p&gt;Portanto, vamos abrir o terminal ‘PowerShell’ e executá-lo como 'Administrador'.&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%2Fj7vn6bcrum323ife1txh.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%2Fj7vn6bcrum323ife1txh.png" alt="'Image description'" width="721" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No terminal ‘PowerShell’ vamos digitar/colar a seguinte opção e rodá-la:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wsl &lt;span class="nt"&gt;--set-default-version&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3 - Instalação e configuração do Ubuntu
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 - Instalação do Ubuntu
&lt;/h3&gt;

&lt;p&gt;Uma vez instalado o WSL 2, vamos finalmente poder instalar agora o Ubuntu.&lt;/p&gt;

&lt;p&gt;Para isso, vá até a ‘Microsoft Store’.&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%2Fyyr8dh5jf3v04wpq3bk2.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%2Fyyr8dh5jf3v04wpq3bk2.png" alt="'Image description'" width="591" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma vez nesta, vamos procurar por ‘Ubuntu’ e instalar a versão 'Ubuntu 24.04.1 LTS'.&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%2Ftfn626suhkcqepal4noj.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%2Ftfn626suhkcqepal4noj.png" alt="'Image description'" width="407" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique em ‘Abrir’ para confirmar se a instalação foi concluída corretamente.&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%2F93nylu7qj8piredso69b.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%2F93nylu7qj8piredso69b.png" alt="'Image description'" width="507" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 - Checando se o Ubuntu consta no Windows Terminal
&lt;/h3&gt;

&lt;p&gt;Vamos checar se o Ubuntu foi certinho para o menu de terminais do Windows Terminal.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Para isso acesse o seu Windows Terminal. &lt;/li&gt;
&lt;li&gt;Clique na setinha ao lado do ‘+’ na parte superior da janela.&lt;/li&gt;
&lt;li&gt;No menu que aparecer clique na opção ‘Ubuntu’.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Como mostrado na figura à seguir: &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%2F1x0tyif7905ae5mlrf0z.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%2F1x0tyif7905ae5mlrf0z.png" alt="'Image description'" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assim que abrir o terminal no Ubuntu ele vai mostrar essa mensagem na tela:&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%2Fyd8ybqo01o49xev70abz.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%2Fyd8ybqo01o49xev70abz.png" alt="'Image description'" width="800" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aguarde uns segundinhos até ele terminar de instalar.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 - Atribuindo Usuário e Senha ao Ubuntu
&lt;/h3&gt;

&lt;p&gt;Depois disso ele vai pedir para você atribuir um nome para o novo usuário UNIX em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Enter new UNIX username: 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insira o nome de usuário desejado.&lt;/p&gt;

&lt;p&gt;E vai pedir uma senha - e uma repetição de senha - a esse novo usuário em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;New password:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e em&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Retype new password:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois disso ele vai terminar de configurar o Ubuntu.&lt;/p&gt;

&lt;p&gt;A tela vai ficar mais ou menos assim:&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%2Fjo5slfgn5v23ayvliswl.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%2Fjo5slfgn5v23ayvliswl.png" alt="'Image description'" width="510" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 - Confirmando se as distros estão utilizando o WSL 2
&lt;/h3&gt;

&lt;p&gt;Vá até o PowerShell, digite o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wsl &lt;span class="nt"&gt;--list&lt;/span&gt; &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O terminal vai mostrar algo assim - caso o WSL que está em uso seja o 2 - na coluna ‘Version’, nesta estará o número 2:&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%2F8wba6wjuv39rhjmwuu46.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%2F8wba6wjuv39rhjmwuu46.png" alt="'Image description'" width="408" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4 - APRENDENDO OS COMANDOS BÁSICOS NO TERMINAL DO UBUNTU
&lt;/h3&gt;

&lt;p&gt;Alguns comandos são essenciais para uma boa navegação em terminais do Ubuntu. Aqui traremos alguns, vale a pena revisar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pwd           — Exibe o caminho completo da pasta onde você está.&lt;/li&gt;
&lt;li&gt;ls            — Lista arquivos e pastas.&lt;/li&gt;
&lt;li&gt;cd Documentos - Entra na pasta Documentos.&lt;/li&gt;
&lt;li&gt;cd ..         - volta uma pasta.&lt;/li&gt;
&lt;li&gt;cd ~          - volta para o diretório pessoal.(home)&lt;/li&gt;
&lt;li&gt;mkdir projetos — Cria uma nova pasta.&lt;/li&gt;
&lt;li&gt;rm -r pasta    - apaga uma pasta e seu conteúdo.&lt;/li&gt;
&lt;li&gt;cp arquivo.txt backup.txt  - copia um arquivo.&lt;/li&gt;
&lt;li&gt;cp -r pasta1 pasta2       - copia uma pasta com tudo dentro.&lt;/li&gt;
&lt;li&gt;cat arquivo.txt - — Exibe o conteúdo de um arquivo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O link para a videoaula é esse: &lt;/p&gt;

&lt;h3&gt;
  
  
  5 - COMANDOS ESSENCIAIS ANTES DAS INSTALAÇÕES
&lt;/h3&gt;

&lt;p&gt;Se você acabou de instalar o Ubuntu via WSL 2 ou precisa instalar um novo programa, é bom começar com:&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="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E depois, se quiser aplicar as atualizações de fato dando um:&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="nb"&gt;sudo &lt;/span&gt;apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;explicação&lt;/strong&gt;: Porque dar esses comandos antes de começar as instalações? Rodar ambos os comandos antes de instalar qualquer pacote no WSL 2 é uma prática essencial por motivos técnicos e de segurança. Quando você instala o Ubuntu no WSL 2, ele vem com uma lista de pacotes desatualizada.&lt;br&gt;
Se você não rodar sudo apt update, o sistema pode: não encontrar o Git (ou outro pacote), instalar versões antigas, ou gerar erros de dependência ao instalar.&lt;br&gt;
Já o ‘sudo apt upgrade’ vai atualizar os pacotes que já estão no sistema, isso é importante para: corrigir bugs e falhas de segurança, garantir que tudo esteja compatível com os pacotes novos que serão instalados (como o Git).&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h3&gt;
  
  
  6 - INSTALAÇÃO DO GIT
&lt;/h3&gt;

&lt;p&gt;Vá ao Windows Terminal (no Ubuntu) e dê o comando para atualizar a lista de pacotes disponíveis nos repositórios.&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="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois dê o comando para instalar as atualizações disponíveis dos pacotes listados&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="nb"&gt;sudo &lt;/span&gt;apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se ele perguntar se quer continuar a instalação aperte ‘y’ para ‘yes’ se ele perguntar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Do you want to &lt;span class="k"&gt;continue&lt;/span&gt;? &lt;span class="o"&gt;[&lt;/span&gt;Y/n]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, agora que tomamos medidas seguras, vamos instalar o GIT de fato.&lt;/p&gt;

&lt;p&gt;Para isso utilizaremos o comando:&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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para checar se o GIT foi de fato instalado podemos dar os seguintes comandos (de mesma função):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, agora já temos o Git instalado!&lt;/p&gt;



&lt;h3&gt;
  
  
  7 - INSTALAÇÃO DO RUBY
&lt;/h3&gt;

&lt;p&gt;Nós vamos instalar a nossa primeira versão do Ruby e todas as demais versões que quisermos utilizar depois de uma mesma maneira: Ruby Version Manager(RVM), ou seja, via Gerenciador de Versões do Ruby. Usa-se essa forma pois é bem mais eficiente do que as demais e mais fácil de gerenciar também.&lt;/p&gt;

&lt;p&gt;Para isso, vamos lá:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra o Windows Terminal.&lt;/li&gt;
&lt;li&gt;Dê os dois comandos de praxe que sempre damos antes de instalar qualquer coisa:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e&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="nb"&gt;sudo &lt;/span&gt;apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Vamos ao &lt;a href="https://rvm.io/rvm/install" rel="noopener noreferrer"&gt;site oficial&lt;/a&gt; do RVM (Ruby Version Manager), na parte de instalação.&lt;/li&gt;
&lt;li&gt;Copie a chave GPG que estiver lá e cole no seu terminal.&lt;/li&gt;
&lt;/ol&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%2Fil4wq5wfz4lmmvj5iky4.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%2Fil4wq5wfz4lmmvj5iky4.png" alt="'Image description'" width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A do nosso caso aqui é essa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--keyserver&lt;/span&gt; keyserver.ubuntu.com &lt;span class="nt"&gt;--recv-keys&lt;/span&gt; 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verifique que ele importou as chaves.&lt;/li&gt;
&lt;/ol&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%2F5lx20hc0z22qwsqt7ja4.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%2F5lx20hc0z22qwsqt7ja4.png" alt="'Image description'" width="800" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Importadas com sucesso. Vamos ao próximo passo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retorne ao site do RVM, copie o comando à seguir e cole-o no terminal:&lt;/li&gt;
&lt;/ol&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%2Fnuurl53vwznbiwptpokf.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%2Fnuurl53vwznbiwptpokf.png" alt="'Image description'" width="800" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No nosso exemplo:&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="se"&gt;\c&lt;/span&gt;url &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://get.rvm.io | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo der certo, vai aparecer uma tela assim:&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%2Fql09u6jvs777bbbtkf47.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%2Fql09u6jvs777bbbtkf47.png" alt="'Image description'" width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Feche o Windows Terminal. Posteriormente a isso, abra-o novamente para tirar a prova real se a instalação do RVM deu certo ou não. Dê um:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rvm &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a instalação tiver sido bem sucedida vai aparecer isso aqui:&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%2Fs7rnjqai9jghd4y0yttc.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%2Fs7rnjqai9jghd4y0yttc.png" alt="'Image description'" width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Uma vez instalado o RVM podemos baixar a nossa primeira versão do Ruby. Vá ao &lt;a href="https://www.ruby-lang.org/en/downloads/" rel="noopener noreferrer"&gt;site oficial&lt;/a&gt; da linguagem e veja qual é a &lt;em&gt;current version&lt;/em&gt; do momento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pegue a numeração da &lt;em&gt;current version&lt;/em&gt; e aplique o seguinte comando no terminal (contendo essa versão): &lt;br&gt;
'rvm install '.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo prático, eu quero a versão 3.4.7:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; rvm &lt;span class="nb"&gt;install &lt;/span&gt;3.4.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O processo de instalação será exibido no terminal.&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%2F64ms7mmzjmwduowm9uca.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%2F64ms7mmzjmwduowm9uca.png" alt="'Image description'" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dê um ‘rvm list’ para checar se a versão do Ruby que queremos foi instalada de fato.&lt;/li&gt;
&lt;/ol&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%2Fapzi6bl40own30p7lxv0.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%2Fapzi6bl40own30p7lxv0.png" alt="'Image description'" width="622" height="207"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  8 - INSTALAÇÃO DO POSTGRESQL
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;No Windows Terminal, digite:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;postgresql postgresql-contrib libpq-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Esse comando serve para instalar o PostgreSQL, os módulos adicionais (postgresql-contrib) e a biblioteca de desenvolvimento (libpq-dev).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Durante a instalação ele pede a senha do seu usuário do Ubuntu, bem como pergunta se você deseja seguir com o processo de instalação. &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%2Fqwf0e7k923bxy15m4e50.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%2Fqwf0e7k923bxy15m4e50.png" alt="'Image description'" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vamos checar a versão do PostgreSQL que foi instalada.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para isso utilizamos o seguinte comando no terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;psql &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Apesar de instalado o PostgreSQL ainda não está funcionando, para que ele funcione precisamos startá-lo. &lt;br&gt;
Mas antes disso precisamos setar uma nova senha para o SGBD.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alterando a senha do usuário postgres no sistema (usuário padrão do PostgreSQL).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dê o comando:&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="nb"&gt;sudo &lt;/span&gt;passwd postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insira a senha que deseja e depois repita-a e ele dará uma mensagem de sucesso.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Startando o PostgreSQL &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para isso vamos dar o comando para startar o serviço:&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="nb"&gt;sudo &lt;/span&gt;service postgresql start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E depois vamos checar se o serviço/banco está ativo com um:&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="nb"&gt;sudo &lt;/span&gt;service postgresql status
&lt;/code&gt;&lt;/pre&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%2Fg5gkjdhtfb51w176t6mv.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%2Fg5gkjdhtfb51w176t6mv.png" alt="'Image description'" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Entrando no PostgreSQL com o usuário postgres&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Podemos acessar o console interativo do PostgreSQL (psql) como usuário postgres dando o seguinte comando:&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="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; postgres psql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando vai abrir o terminal, para trabalharmos com o PostgreSQL.&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%2Fcko5pp3xjt2kghhz99bc.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%2Fcko5pp3xjt2kghhz99bc.png" alt="'Image description'" width="649" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O banco já está funcionando e a instalação do PostgreSQL já foi concluída!&lt;/p&gt;



&lt;h3&gt;
  
  
  9 - INSTALAÇÃO DO VSCODE
&lt;/h3&gt;

&lt;p&gt;Se você já tiver o VSCode instalado na sua máquina, no seu Windows mesmo, não há a necessidade de baixar uma nova versão no WSL 2. Vamos utilizar o VSCode baixado no Windows mesmo.&lt;/p&gt;

&lt;p&gt;Caso ainda não possua o editor de código:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesse o &lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;site oficial&lt;/a&gt; para baixar.&lt;/li&gt;
&lt;li&gt;Veja esse &lt;a href="https://www.youtube.com/watch?v=v6RbyUk0DhM" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt;rápido para instalação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10 - CONFIGURANDO EXTENSÃO NO VSCODE
&lt;/h3&gt;

&lt;p&gt;Abra o VSCode que foi instalado.&lt;br&gt;
Uma vez neste clique neste botão para acessar as extensões:&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%2F8dxn0elzctlh05k1h5k4.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%2F8dxn0elzctlh05k1h5k4.png" alt="'Image description'" width="534" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Digite ‘WSL’ e instale a extensão indicada: &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%2Flmmjpm8taf2e40y1vggc.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%2Flmmjpm8taf2e40y1vggc.png" alt="'Image description'" width="436" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Há também outras 2 sugestões de extensões para quem trabalha com o VSCode e com o Ruby/Rails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A Material Icon Theme - Para que o seu projeto, quando você abre no VSCode saia com aqueles ícones todos bonitinhos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;E essa aqui - Que muda as cores gerais do seu VScode. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fihdq707hemq52c5uvhow.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%2Fihdq707hemq52c5uvhow.png" alt="'Image description'" width="691" height="263"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  11 - INSTALAÇÃO DO RAILS
&lt;/h3&gt;

&lt;p&gt;Você pode instalar o Rails de maneira global no seu sistema. Mas não é uma prática recomendada. o ideal é instalar a  versão do Rails especificamente na pasta de cada projeto.&lt;/p&gt;

&lt;p&gt;Portanto, vamos começar criando uma pasta para os nossos projetos.&lt;/p&gt;
&lt;h4&gt;
  
  
  11.1 - Consultando o acesso as pastas em diferentes sistemas
&lt;/h4&gt;

&lt;p&gt;Para evitar problemas de desempenho e de compatibilidade as pastas do nosso projeto NÃO serão criadas no Windows, ou seja, no caminho (/mnt/c/).&lt;/p&gt;

&lt;p&gt;Vamos ao Windows Terminal para acessar a pasta do usuário no Ubuntu.&lt;/p&gt;

&lt;p&gt;Para consultar essa pasta vamos dar o comando:&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="nb"&gt;pwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Esse comando vem de print working directory e serve para mostrar a sua pasta atual e o caminho para ela. Ou seja, o comando localiza aonde você está dentro da hierarquia de pastas.&lt;/p&gt;

&lt;p&gt;Por exemplo, ao dar esse comando no Ubuntu vamos ter:&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%2Fo4w55eovkqnzca374utd.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%2Fo4w55eovkqnzca374utd.png" alt="'Image description'" width="424" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já no Windows esse caminho estará bem aqui:&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%2F2520g9vbmqjlizica0lq.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%2F2520g9vbmqjlizica0lq.png" alt="'Image description'" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  11.2 - Criando a pasta para os seus projetos no Ubuntu
&lt;/h4&gt;

&lt;p&gt;Para criar a pasta, escolha e navegue até a pasta mãe - onde deseja deixar os seus projetos Rails - e dê o comando 'mkdir + nome_da_pasta_do_seu_projeto'.&lt;/p&gt;

&lt;p&gt;Exemplo:&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="nb"&gt;mkdir &lt;/span&gt;Projetos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  11.3 - Mude para dentro da pasta que foi criada
&lt;/h4&gt;

&lt;p&gt;Para isso utilize o comando:&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="nb"&gt;cd &lt;/span&gt;Projetos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou &lt;em&gt;'cd nomedasuapasta'&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  11.4 - Instalando o Rails na pasta de Projetos
&lt;/h4&gt;

&lt;p&gt;O Rails além de ser um framework é uma Gem, logo é instalado como uma. Os pacotes no Ruby são Gems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rubygems.org/gems/rails/versions" rel="noopener noreferrer"&gt;Aqui&lt;/a&gt; você pode acompanhar todas as versões do Rails.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se quiser instalar uma versão mais específica do Rails, dê este comando no terminal:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;rails &lt;span class="nt"&gt;-v&lt;/span&gt; 8.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Se eu quiser instalar a versão mais recente e atualizada do Rails eu dou o comando:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;rails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A instalação do Rails vai gerar algo semelhante a isso:&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%2Fs06t7gqhf0ubymao70py.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%2Fs06t7gqhf0ubymao70py.png" alt="'Image description'" width="737" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  11.5 - Checando se o Rails foi instalado com sucesso
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dê um comando para consultar a versão do framework Rails.&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%2Fuh3k5zotb20h21chq3ww.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%2Fuh3k5zotb20h21chq3ww.png" alt="'Image description'" width="593" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  12 - CRIANDO UM PROJETO NO RAILS NO VSCODE
&lt;/h3&gt;

&lt;p&gt;Para criar um projeto no Rails dê o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails new nome_do_seu_projeto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode deixar algumas coisas  pré-definidas, como por exemplo o SGBD que será utilizado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails new meu_projeto &lt;span class="nt"&gt;--database&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou deixar pré-definido se vai utilizar o Tailwind no projeto ou não:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails new meu_projeto &lt;span class="nt"&gt;-d&lt;/span&gt; postgresql &lt;span class="nt"&gt;-c&lt;/span&gt; tailwind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos gerar o nosso próprio projeto aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails new teste &lt;span class="nt"&gt;--database&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Aqui o projeto sendo criado:&lt;/li&gt;
&lt;/ul&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%2Fbxjxz6jme11a5k3v6mtc.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%2Fbxjxz6jme11a5k3v6mtc.png" alt="'Image description'" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma vez criado o projeto, se mude para dentro da pasta deste utilizando um 'cd teste'.&lt;/li&gt;
&lt;/ul&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%2Fq6zcuuz70xops7lg185h.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%2Fq6zcuuz70xops7lg185h.png" alt="'Image description'" width="605" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Posteriormente, abra o seu projeto com o Visual Studio Code e vá mexer nele. Edite-o como quiser. Para isso se utilize do comando: 'code .'&lt;/p&gt;

&lt;p&gt;Repare que ele vai - na primeira vez que o VSCode abre ali - instalar o editor de código para o Linux x64:&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%2F4z1i340oafvvtz9kwcjl.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%2F4z1i340oafvvtz9kwcjl.png" alt="'Image description'" width="800" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso, fico por aqui. Espero que tenham gostado da explicação sobre como instalar o setup para desenvolvimento em Ruby/Rails. Tentei deixar o mais detalhado possível, para evitar que as pessoas -  mesmo as mais iniciantes em programação - consigam ter um bom entendimento desse processo de instalação da linguagem e dos demais componentes utilizados no desenvolvimento web com a linguagem. &lt;/p&gt;

&lt;p&gt;Vejo vocês na próxima.&lt;/p&gt;

&lt;p&gt;Tchau tchau.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>wsl2</category>
      <category>windows</category>
    </item>
  </channel>
</rss>
