<?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: Cirdes Henrique</title>
    <description>The latest articles on DEV Community by Cirdes Henrique (@cirdes).</description>
    <link>https://dev.to/cirdes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F204623%2Fa32b15f3-e52e-4358-9348-3308ca575d31.png</url>
      <title>DEV Community: Cirdes Henrique</title>
      <link>https://dev.to/cirdes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cirdes"/>
    <language>en</language>
    <item>
      <title>Beyond Autocomplete: How Cursor AI is Helping Standardize and Write Ruby on Rails Code</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Sun, 23 Mar 2025 20:48:47 +0000</pubDate>
      <link>https://dev.to/cirdes/beyond-autocomplete-how-cursor-ai-is-helping-standardize-and-write-ruby-on-rails-code-1ie6</link>
      <guid>https://dev.to/cirdes/beyond-autocomplete-how-cursor-ai-is-helping-standardize-and-write-ruby-on-rails-code-1ie6</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/alem-do-autocomplete-como-o-cursor-ai-esta-ajudando-na-padronizacao-e-escrita-do-codigo-ruby-on-52e0"&gt;PT-BR&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Context
&lt;/h2&gt;

&lt;p&gt;Until recently, aside from code autocomplete capabilities, I had yet to see a truly reliable way to generate AI-powered code that would be useful for my company, &lt;a href="https://www.linkana.com/" rel="noopener noreferrer"&gt;Linkana&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;I agree with &lt;a href="https://world.hey.com/dhh/the-premise-trap-924b8cd9" rel="noopener noreferrer"&gt;DHH&lt;/a&gt; when he says that AI is merely an excellent junior developer—sometimes producing overly complex code or introducing subtle, hard-to-spot bugs. Whether this will change in the future is uncertain. What matters is that today, by providing good context, we can get AI to help us write high-quality code.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor AI
&lt;/h2&gt;

&lt;p&gt;In September of last year, &lt;a href="https://x.com/rafaelfranca" rel="noopener noreferrer"&gt;Rafael França&lt;/a&gt; (Rails Core) spent a few days in São Paulo and showed me that he was using Cursor instead of VSCode. I decided to switch to Cursor AI, and since then, I’ve been taking advantage of its superior autocomplete capabilities and its ability to explain code snippets. So far, nothing too sophisticated.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor Rules
&lt;/h2&gt;

&lt;p&gt;Over the past few weeks, I discovered the &lt;a href="https://docs.cursor.com/context/rules-for-ai" rel="noopener noreferrer"&gt;Rules for AI&lt;/a&gt; feature—a way to teach AI how to "think." This allows us to guide Cursor to behave like a good junior developer would: recognizing code patterns, replicating them in similar contexts, and ensuring consistency across the project.  &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/A9BiNPf34Z4"&gt;
&lt;/iframe&gt;
  &lt;/p&gt;
&lt;h3&gt;
  
  
  Migrating from RSpec to MiniTest
&lt;/h3&gt;

&lt;p&gt;Last year, we decided to migrate to MiniTest. We started writing new tests in MiniTest, but we still have hundreds of files written in RSpec. As expected, no one wants to prioritize rewriting tests, making this migration extremely slow.  &lt;/p&gt;

&lt;p&gt;To speed up the process, we created a structure like this, allowing us to define specific rules for different contexts within our code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.cursor/rules/
  ├── rails8.mdc
  ├── models/
  │   ├── active_record.mdc
  │   ├── tests.mdc
  │   └── postgresql.mdc
  ├── controllers/
  │   ├── api.mdc
  │   └── tests.mdc
  └── views/
      ├── phlex.mdc
      └── components.mdc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's take a look at &lt;code&gt;models/tests.mdc&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;---
description: ""
globs: test/models/**/*.rb
alwaysApply: true
---

# Rails Model Testing with Minitest and FactoryBot

## General Structure

- Each model should have its own corresponding test file (e.g., `user_test.rb` for the `User` model)
- Test files should be organized within the `test/models` directory, mirroring the application structure
- Subdirectories can be used to organize specific components (e.g., `test/models/documents/`)

## Test Configuration and Organization

- Each file should include `require "test_helper"` at the beginning
- The test class should inherit from `ActiveSupport::TestCase`
- Tests should be written using `test "description" do` instead of `def test_description`
- Related tests should be grouped together
- The `setup` method should be used to create test data with factories

## Using Factories

- Factories should be defined in `test/factories/`
- Use `create(:factory_name)` for persisted records and `build(:factory_name)` for non-persisted ones
- Use `build_stubbed(:factory_name)` when persistence is not needed
- Use descriptive traits for factory variations (e.g., `:with_buyer`, `:not_clear`)

## Example Structure

# frozen_string_literal: true

require "test_helper"

class ModelNameTest &amp;lt; ActiveSupport::TestCase
  def setup
    @model = create(:model_name, :with_trait)
  end

  test "associations" do
    assert_respond_to(@model, :association_name)
    # Test other associations...
  end

  test "validations" do
    invalid_model = build(:model_name, required_attribute: nil)
    refute(invalid_model.valid?)
    assert_equal(invalid_model.errors[:required_attribute], ["expected error message"])
  end
end

## Style and Best Practices

- Tests should be independent and isolated
- Avoid fixtures whenever possible, preferring factories
- Use meaningful test data to clearly express intent
- Test edge cases and failure scenarios
- Follow the "Arrange, Act, Assert" pattern
- Cover both positive and negative cases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rule establishes standards for things like using factories, organizing tests, and formatting &lt;code&gt;test "instance_method" do&lt;/code&gt; statements. Beyond guiding AI in writing tests, these rules help maintain project standardization and serve as documentation of best practices for both the human team and the AI itself.  &lt;/p&gt;

&lt;p&gt;The most interesting part is that I generated this rule with a single prompt in Cursor. I provided documentation and examples from my own code, and the AI automatically created the instructions—I only had to make minor adjustments.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Using It in Practice
&lt;/h2&gt;

&lt;p&gt;With the rules in place, it was time to test them in practice. When I asked Cursor to migrate an RSpec test to MiniTest, it automatically identified the applicable rule based on &lt;code&gt;globs: test/models/**/*.rb&lt;/code&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%2Fznxtlstap35f8udgaxlc.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%2Fznxtlstap35f8udgaxlc.png" alt="Cursor applying the rule" width="786" height="1830"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;To validate the process, I migrated the files one by one. The only error I encountered was related to language—Cursor expected error messages in English, but my application is in Portuguese.  &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%2Fb4icwhxuktfnv1tosdf4.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%2Fb4icwhxuktfnv1tosdf4.png" alt="Language error in generated tests" width="800" height="408"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;In the end, I was able to open a Pull Request with minimal effort and the expected quality. Will this PR be merged without any requested changes?  &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%2Fsiiwwsq7blfdq5wwdgzl.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%2Fsiiwwsq7blfdq5wwdgzl.png" alt="PR created on GitHub" width="800" height="132"&gt;&lt;/a&gt;  &lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>ai</category>
      <category>cursor</category>
    </item>
    <item>
      <title>Além do autocomplete: como o Cursor AI está ajudando na padronização e escrita do código Ruby on Rails</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Sun, 23 Mar 2025 20:48:17 +0000</pubDate>
      <link>https://dev.to/cirdes/alem-do-autocomplete-como-o-cursor-ai-esta-ajudando-na-padronizacao-e-escrita-do-codigo-ruby-on-52e0</link>
      <guid>https://dev.to/cirdes/alem-do-autocomplete-como-o-cursor-ai-esta-ajudando-na-padronizacao-e-escrita-do-codigo-ruby-on-52e0</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/beyond-autocomplete-how-cursor-ai-is-helping-standardize-and-write-ruby-on-rails-code-1ie6"&gt;ENGLISH&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto
&lt;/h2&gt;

&lt;p&gt;Até pouco tempo atrás, além da capacidade de autocompletar código, eu ainda não tinha visto uma forma realmente confiável de gerar código com IA que fosse útil para minha empresa, a &lt;a href="https://www.linkana.com/" rel="noopener noreferrer"&gt;Linkana&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Concordo com o &lt;a href="https://world.hey.com/dhh/the-premise-trap-924b8cd9" rel="noopener noreferrer"&gt;DHH&lt;/a&gt; quando ele diz que a IA é apenas um excelente programador júnior, que por vezes pode gerar um código excessivamente complexo ou introduzir bugs quase imperceptíveis. Se no futuro isso será diferente, não sabemos. O que importa é que, hoje, podemos fornecer um bom contexto para que a IA nos ajude a escrever código de qualidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor AI
&lt;/h2&gt;

&lt;p&gt;Em setembro do ano passado, o &lt;a href="https://x.com/rafaelfranca" rel="noopener noreferrer"&gt;Rafael França&lt;/a&gt; (Rails Core) passou alguns dias em São Paulo e me mostrou que estava usando o Cursor no lugar do VSCode. Decidi migrar para o Cursor AI e, desde então, tenho aproveitado sua melhor capacidade de autocomplete e a funcionalidade de explicar trechos de código. Até então, nada muito sofisticado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor Rules
&lt;/h2&gt;

&lt;p&gt;Nas últimas semanas, conheci a funcionalidade de &lt;a href="https://docs.cursor.com/context/rules-for-ai" rel="noopener noreferrer"&gt;Rules for AI&lt;/a&gt;, uma maneira de ensinar à IA como ela deve "pensar". Dessa forma, conseguimos orientar o Cursor a agir como um bom desenvolvedor júnior se comportaria, reconhecendo padrões de código, replicando-os em contextos semelhantes e garantindo consistência no projeto.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/A9BiNPf34Z4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Migrando de RSpec para MiniTest
&lt;/h3&gt;

&lt;p&gt;No ano passado, decidimos migrar para MiniTest. Passamos a escrever novos testes em MiniTest, mas ainda temos centenas de arquivos escritos em RSpec. Como era de se esperar, ninguém quer priorizar a reescrita de testes, o que tornou essa migração extremamente lenta.&lt;/p&gt;

&lt;p&gt;Para acelerar esse processo, criamos uma estrutura semelhante a esta, permitindo definir regras específicas para diferentes contextos do nosso código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.cursor/rules/
  ├── rails8.mdc
  ├── models/
  │   ├── active_record.mdc
  │   ├── tests.mdc
  │   └── postgresql.mdc
  ├── controllers/
  │   ├── api.mdc
  │   └── tests.mdc
  └── views/
      ├── phlex.mdc
      └── components.mdc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos dar uma olhada no &lt;code&gt;models/tests.mdc&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;---
description: ""
globs: test/models/**/*.rb
alwaysApply: true
---

# Rails Model Testing with Minitest and FactoryBot

## General Structure

- Each model should have its own corresponding test file (e.g., `user_test.rb` for the `User` model)
- Test files should be organized within the `test/models` directory, mirroring the application structure
- Subdirectories can be used to organize specific components (e.g., `test/models/documents/`)

## Test Configuration and Organization

- Each file should include `require "test_helper"` at the beginning
- The test class should inherit from `ActiveSupport::TestCase`
- Tests should be written using `test "description" do` instead of `def test_description`
- Related tests should be grouped together
- The `setup` method should be used to create test data with factories

## Using Factories

- Factories should be defined in `test/factories/`
- Use `create(:factory_name)` for persisted records and `build(:factory_name)` for non-persisted ones
- Use `build_stubbed(:factory_name)` when persistence is not needed
- Use descriptive traits for factory variations (e.g., `:with_buyer`, `:not_clear`)

## Example Structure

# frozen_string_literal: true

require "test_helper"

class ModelNameTest &amp;lt; ActiveSupport::TestCase
  def setup
    @model = create(:model_name, :with_trait)
  end

  test "associations" do
    assert_respond_to(@model, :association_name)
    # Test other associations...
  end

  test "validations" do
    invalid_model = build(:model_name, required_attribute: nil)
    refute(invalid_model.valid?)
    assert_equal(invalid_model.errors[:required_attribute], ["expected error message"])
  end
end

## Style and Best Practices

- Tests should be independent and isolated
- Avoid fixtures whenever possible, preferring factories
- Use meaningful test data to clearly express intent
- Test edge cases and failure scenarios
- Follow the "Arrange, Act, Assert" pattern
- Cover both positive and negative cases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos notar que essa regra define padrões como o uso de factories, a organização dos testes, e o formato das declarações &lt;code&gt;test "instance_method" do&lt;/code&gt;. Além de guiar a IA na escrita dos testes, essas regras também ajudam a manter a padronização do projeto e servem como documentação de boas práticas tanto para a equipe humana quanto para a própria IA.&lt;/p&gt;

&lt;p&gt;O mais interessante é que consegui gerar essa rule com um único prompt no Cursor. Forneci a documentação e exemplos do meu próprio código, e a IA criou as instruções automaticamente – precisei apenas ajustar alguns detalhes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilizando na prática
&lt;/h2&gt;

&lt;p&gt;Com as regras definidas, chegou a hora de testar na prática. Ao solicitar que o Cursor fizesse a migração de um teste de RSpec para MiniTest, ele identificou automaticamente a regra aplicável com base no &lt;code&gt;globs: test/models/**/*.rb&lt;/code&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%2Fznxtlstap35f8udgaxlc.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%2Fznxtlstap35f8udgaxlc.png" alt="Imagem do Cursor aplicando a regra" width="786" height="1830"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para validar o processo, fiz a migração arquivo por arquivo. O único erro que encontrei foi relacionado ao idioma: o Cursor esperava mensagens de erro em inglês, mas minha aplicação está em português.&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%2Fb4icwhxuktfnv1tosdf4.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%2Fb4icwhxuktfnv1tosdf4.png" alt="Erro de idioma nos testes gerados" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No final, consegui abrir um Pull Request com baixíssimo esforço e com a qualidade esperada. Será que esse PR vai ser mergeado sem pedidos de correçã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%2Fsiiwwsq7blfdq5wwdgzl.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%2Fsiiwwsq7blfdq5wwdgzl.png" alt="PR criado no GitHub" width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>cursor</category>
      <category>ai</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Why Your Company Should Sponsor Events</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Sun, 10 Nov 2024 21:19:52 +0000</pubDate>
      <link>https://dev.to/cirdes/why-your-company-should-sponsor-events-4e04</link>
      <guid>https://dev.to/cirdes/why-your-company-should-sponsor-events-4e04</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/por-que-sua-empresa-deveria-patrocinar-eventos-475j"&gt;Versão em Português&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's start by better defining a special type of event: non-commercial events aimed at the developer community. These are events like &lt;a href="https://www.tropicalonrails.com/" rel="noopener noreferrer"&gt;Tropical on Rails&lt;/a&gt;, &lt;a href="https://rubyonrails.org/world/2024" rel="noopener noreferrer"&gt;Rails World&lt;/a&gt;, &lt;a href="https://rubyconf.org/" rel="noopener noreferrer"&gt;Ruby/Rails Conf&lt;/a&gt;, &lt;a href="https://2024.euruko.org/#speakers" rel="noopener noreferrer"&gt;EuRuko&lt;/a&gt;, &lt;a href="https://friendlyrb.com/" rel="noopener noreferrer"&gt;Friendly.rb&lt;/a&gt;, and many others. I want to help you—whether you’re a developer, a business owner, or an HR manager—understand why you should encourage your company to sponsor these events.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Developers:
&lt;/h3&gt;

&lt;p&gt;There are two types of developers: those who have attended a great event and those who haven’t. The first group knows what I’m talking about—they were the ones who sold out Tropical tickets 10 times faster, in just over 6 hours. But what actually happens at these events?&lt;/p&gt;

&lt;h4&gt;
  
  
  We Learn New Techniques
&lt;/h4&gt;

&lt;p&gt;If you're developing software the same way you did last year, you're likely missing out on productivity, quality, or speed. Rails 7 and 8 have introduced various tools that impact one or more of these pillars. Technical events are where you learn new ‘tricks’ or meet people who are solving similar problems in different ways.&lt;/p&gt;

&lt;h4&gt;
  
  
  Access to Real-World Problem Solving
&lt;/h4&gt;

&lt;p&gt;Hearing how other developers are tackling similar challenges can bring immediate value to your work. Events address real-world problems and solutions, shared by experienced developers who have tested various approaches and can help you solve challenges you may be facing right now.&lt;/p&gt;

&lt;h4&gt;
  
  
  We Meet Inspiring People
&lt;/h4&gt;

&lt;p&gt;At events, you meet inspiring people, and—whether for better or worse—the people you choose to connect with have a greater &lt;a href="https://www.nfx.com/post/your-life-network-effects" rel="noopener noreferrer"&gt;impact on your life&lt;/a&gt; than you might think. The connection you create with someone after attending their talk and chatting in the hallway is incomparable to reading a blog article.&lt;br&gt;
You leave the event motivated to learn and to become like that amazing person you met at the conference. It’s common to see stories of projects, whether open source, companies, or even other events, that emerge after these encounters.&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%2F4pudzubh3gpgyjefir3d.jpg" 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%2F4pudzubh3gpgyjefir3d.jpg" alt="Tropical panel" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  For Companies
&lt;/h3&gt;

&lt;p&gt;Who has been questioned for choosing Ruby on Rails in recent years? Who has struggled to find good developers? Events are a key factor in strengthening the community.&lt;/p&gt;

&lt;h4&gt;
  
  
  Motivated Developers
&lt;/h4&gt;

&lt;p&gt;The most common feedback I heard from companies that participated in Tropical was that employees returned from the event eager to make things happen. Some organized internal workshops to share the knowledge they gained, while others adopted new practices they learned. Collectively, we’ve seen several meetups revive across Brazil, and according to Rafael França (Rails Core), more Brazilians have started contributing to the Rails project. For business owners, having motivated developers is essential for success. Motivated professionals are the ones who become seniors faster and produce more.&lt;/p&gt;

&lt;h4&gt;
  
  
  Employer Branding
&lt;/h4&gt;

&lt;p&gt;Building your employer brand is essential. The best developers aren’t chosen by you; they choose your company.&lt;br&gt;
This choice happens daily, whether during hiring or when deciding to stay with the company.&lt;br&gt;
Attendees will have the chance to get to know your company and your team members. In a future hiring process, this will be remembered. The best developers I know are not only driven by salary; it’s important, but not decisive.&lt;/p&gt;

&lt;h3&gt;
  
  
  From the Organizer’s Perspective
&lt;/h3&gt;

&lt;p&gt;Organizing an event, like contributing to open source, is a &lt;a href="https://world.hey.com/dhh/the-open-source-gift-exchange-2171e0f0" rel="noopener noreferrer"&gt;gift&lt;/a&gt;. To organize Tropical, I need to dedicate about 15% of my annual work time. Tropical is a 100% pro bono project. I've already talked about the &lt;a href="https://dev.to/cirdes/tropicalrb-os-desafios-de-organizar-uma-conferencia-de-rubyrails-pt-br-90p"&gt;challenges of organizing a conference&lt;/a&gt; and that Tropical came from my perception that the Ruby community in Brazil needed a large-scale event more than ever.&lt;/p&gt;

&lt;p&gt;The challenge of events like this is that, in my case, ticket revenue only covers 50% of the conference costs. The other 50% I need to obtain with sponsor support. This isn’t different for Rails World or RubyConf: tickets are subsidized, and they also need the support of companies. Here, we have three types of companies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;There are companies like &lt;a href="https://www.appsignal.com/" rel="noopener noreferrer"&gt;AppSignal&lt;/a&gt;, the first sponsor of Tropical in 2024, which sponsors events worldwide; &lt;a href="https://www.cedarcode.com/" rel="noopener noreferrer"&gt;CedarCode&lt;/a&gt;, a small company from Uruguay that not only sponsors various events but also supports the Rails Foundation; and Brazilian companies like &lt;a href="https://www.smartfit.com.br/" rel="noopener noreferrer"&gt;SmartFit&lt;/a&gt;, &lt;a href="https://www.agendor.com.br/" rel="noopener noreferrer"&gt;Agendor&lt;/a&gt;, and &lt;a href="https://www.tropicalonrails.com/archive-2024#sponsors2024" rel="noopener noreferrer"&gt;others&lt;/a&gt; that proactively reach out to sponsor the event because they know the importance of these events for the community and want to give back to the ecosystem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then, we have companies that still don’t understand the importance of events. These are companies that have never had the opportunity to participate or have a very commercial view. Their first reaction is to calculate the return on investment (ROI). Of course, we need to generate value for sponsors, but this ROI isn’t easy to calculate. It manifests as strengthening the “Employer Brand,” “Motivation,” and “Training” of employees and has the collective impact of events, which help attract and retain Ruby developers, ultimately benefiting the sponsor. Some of these companies sponsor the event, while others don’t.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The third type of company understands the importance of events but opts to gain the benefits without effectively contributing. They buy tickets and encourage developers to submit talks but don’t sponsor. It’s okay for these companies to exist; what matters is that we have enough companies of types 1 and 2 to keep conferences like Tropical viable.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I need your help to convince companies about the importance of sponsoring events, not just Tropical. If you think your company needs a better understanding of the importance of events, share this text with leadership or try to explain it to them. If you’re interested in supporting Tropical, send me an email at &lt;a href="mailto:sponsors@tropicalonrails.com"&gt;sponsors@tropicalonrails.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>techtalks</category>
      <category>community</category>
    </item>
    <item>
      <title>Por que sua empresa deveria patrocinar eventos</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Sat, 09 Nov 2024 15:25:04 +0000</pubDate>
      <link>https://dev.to/cirdes/por-que-sua-empresa-deveria-patrocinar-eventos-475j</link>
      <guid>https://dev.to/cirdes/por-que-sua-empresa-deveria-patrocinar-eventos-475j</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/why-your-company-should-sponsor-events-4e04"&gt;English version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos começar definindo melhor um tipo especial de evento: os eventos não comerciais voltados para a comunidade de desenvolvedores. São eventos como o &lt;a href="https://www.tropicalonrails.com/" rel="noopener noreferrer"&gt;Tropical on Rails&lt;/a&gt;, a &lt;a href="https://rubyonrails.org/world/2024" rel="noopener noreferrer"&gt;Rails World&lt;/a&gt;, a &lt;a href="https://rubyconf.org/" rel="noopener noreferrer"&gt;Ruby/Rails Conf&lt;/a&gt;, &lt;a href="https://2024.euruko.org/#speakers" rel="noopener noreferrer"&gt;EuRuko&lt;/a&gt;, &lt;a href="https://friendlyrb.com/" rel="noopener noreferrer"&gt;Friendly.rb&lt;/a&gt; e tantos outros. Quero ajudar você, desenvolvedor, dono de empresa ou responsável pela área de RH, a entender melhor por que você deveria incentivar sua empresa a patrocinar eventos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Para os desenvolvedores:
&lt;/h2&gt;

&lt;p&gt;Existem dois tipos de desenvolvedores: aqueles que já participaram de um bom evento e aqueles que nunca foram. O primeiro grupo sabe do que estou falando – foram eles que esgotaram os ingressos da &lt;a href="https://www.tropicalonrails.com/" rel="noopener noreferrer"&gt;Tropical&lt;/a&gt; 10 vezes mais rápido, em pouco mais de 6 horas. Mas o que acontece nesses eventos?&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprendemos novas técnicas
&lt;/h3&gt;

&lt;p&gt;Se você está desenvolvendo software da mesma forma que no ano passado, está perdendo em produtividade, qualidade ou velocidade. O Rails 7 e o 8 trouxeram diversas ferramentas que impactam um ou mais desses pilares. São em eventos técnicos que você aprende novos 'truques' ou conhece pessoas que estão resolvendo problemas parecidos com os seus, de uma forma diferente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acesso à Resolução de Problemas do Mundo Real
&lt;/h3&gt;

&lt;p&gt;Ouvir como outros desenvolvedores estão enfrentando desafios semelhantes pode trazer valor imediato ao seu trabalho. Os eventos abordam problemas e soluções do mundo real, compartilhados por desenvolvedores experientes que testaram várias abordagens e que podem ajudar você a resolver desafios que esteja enfrentando no momento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conhecemos pessoas inspiradoras
&lt;/h3&gt;

&lt;p&gt;Nos eventos, você conhece pessoas inspiradoras e, para o bem ou para o mal, as pessoas com quem você escolhe se conectar têm mais &lt;a href="https://www.nfx.com/post/your-life-network-effects" rel="noopener noreferrer"&gt;efeito na sua vida&lt;/a&gt; do que você imagina. A conexão que você cria com alguém depois de assistir à palestra dele e conversar no corredor não se compara a ler um artigo de blog.&lt;br&gt;
Você sai do evento motivado a aprender e a se tornar como aquela pessoa incrível com quem conversou na conferência. É comum ver relatos de projetos, sejam open source, empresas ou até outros eventos que surgem após esses encontros.&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%2F4pudzubh3gpgyjefir3d.jpg" 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%2F4pudzubh3gpgyjefir3d.jpg" alt="Tropical panel" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Para as empresas
&lt;/h2&gt;

&lt;p&gt;Quem já foi questionado por ter escolhido Ruby on Rails nos últimos anos? Quem tentou achar bons desenvolvedores e não conseguiu? Eventos são um fator chave para fortalecer a comunidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desenvolvedores motivados
&lt;/h3&gt;

&lt;p&gt;O relato mais comum que escutei das empresas que participaram do Tropical foi que as pessoas que foram ao evento voltaram com muita vontade de fazer acontecer. Algumas realizaram workshops internos para compartilhar o conhecimento adquirido, outras adotaram novas práticas aprendidas. Coletivamente, vimos vários meetups voltarem pelo Brasil e, segundo Rafael França (Rails Core), mais brasileiros começarem a contribuir com o projeto do Rails. Para donos de empresas, ter desenvolvedores motivados é essencial para o sucesso. São esses profissionais motivados que se tornam seniors mais rapidamente e produzem mais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Marca empregadora
&lt;/h3&gt;

&lt;p&gt;Trabalhar sua marca empregadora é fundamental. Os melhores desenvolvedores não são escolhidos por você; eles escolhem sua empresa. &lt;br&gt;
Essa escolha é feita diariamente, seja em uma contratação ou na decisão de permanecer na empresa.&lt;br&gt;
Os participantes terão a oportunidade de conhecer sua empresa e seus colaboradores. Em um futuro processo seletivo, isso será lembrado. Os melhores desenvolvedores que conheço não são motivados apenas por salário; ele é importante, mas não decisivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ponto de vista do organizador
&lt;/h2&gt;

&lt;p&gt;Organizar um evento, assim como contribuir com open source, é um &lt;a href="https://world.hey.com/dhh/the-open-source-gift-exchange-2171e0f0" rel="noopener noreferrer"&gt;presente&lt;/a&gt;. Para organizar o Tropical, preciso dedicar cerca de 15% da minha jornada de trabalho anual. O Tropical é um projeto 100% pró bono. Já falei sobre os &lt;a href="https://dev.to/cirdes/tropicalrb-os-desafios-de-organizar-uma-conferencia-de-rubyrails-pt-br-90p"&gt;desafios de organizar uma conferência&lt;/a&gt; e que o Tropical surgiu da minha percepção de que a comunidade Ruby no Brasil precisava, mais do que nunca, de um evento de grande porte.&lt;/p&gt;

&lt;p&gt;O desafio de eventos assim é que o valor do ingresso, no meu caso, cobre apenas 50% dos custos da conferência. Os outros 50% eu preciso obter com o apoio de patrocinadores. Não é diferente para a Rails World ou a RubyConf: os ingressos são subsidiados e eles também precisam do apoio das empresas. Temos três tipos de perfis de empresas aqui:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Temos empresas como a &lt;a href="https://www.appsignal.com/" rel="noopener noreferrer"&gt;AppSignal&lt;/a&gt;, a primeira patrocinadora do Tropical em 2024, que patrocinam eventos pelo mundo todo; a &lt;a href="https://www.cedarcode.com/" rel="noopener noreferrer"&gt;CedarCode&lt;/a&gt;, uma empresa do Uruguai, com poucas pessoas, que não só patrocina vários eventos, mas também apoia a própria Rails Foundation; e empresas brasileiras como a &lt;a href="https://www.smartfit.com.br/" rel="noopener noreferrer"&gt;SmartFit&lt;/a&gt;, &lt;a href="https://www.agendor.com.br/" rel="noopener noreferrer"&gt;Agendor&lt;/a&gt; e &lt;a href="https://www.tropicalonrails.com/archive-2024#sponsors2024" rel="noopener noreferrer"&gt;outras&lt;/a&gt; que me procuram proativamente para patrocinar o evento, pois sabem da importância dos eventos para a comunidade e querem contribuir com o ecossistema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Temos empresas que ainda não entendem a importância dos eventos. São empresas que nunca tiveram a oportunidade de participar ou que possuem uma visão muito comercial. A primeira reação delas é tentar calcular o retorno do investimento (ROI). É claro que precisamos gerar valor para os patrocinadores, mas esse ROI não é fácil de calcular. Ele se manifesta como fortalecimento da "Marca Empregadora", "Motivação" e "Capacitação" dos funcionários e também tem o aspecto coletivo dos eventos, que ajudam a atrair e reter programadores para a linguagem Ruby, o que acaba retornando para o patrocinador. Algumas dessas empresas patrocinam o evento; outras, não.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O terceiro tipo de empresa entende a importância dos eventos, mas opta por tentar obter o benefício sem colaborar efetivamente. Elas compram ingressos e incentivam que os desenvolvedores enviem palestras, mas não patrocinam. Tudo bem existirem empresas assim; o importante é termos empresas do tipo 1 e 2 em quantidade suficiente para que conferências como o Tropical continuem viáveis.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Preciso da sua ajuda para convencer as empresas sobre a importância de patrocinar eventos, não apenas o Tropical. Se você acha que sua empresa precisa entender melhor a importância dos eventos, compartilhe este texto com a liderança ou tente explicar para eles. Se você tem interesse em apoiar o Tropical, me envie um e-mail para &lt;a href="mailto:sponsors@tropicalonrails.com"&gt;sponsors@tropicalonrails.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>techtalks</category>
      <category>community</category>
    </item>
    <item>
      <title>Tropical.rb - Os desafios de organizar uma conferência de Ruby/Rails - [PT-BR]</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Tue, 02 Jul 2024 11:41:03 +0000</pubDate>
      <link>https://dev.to/cirdes/tropicalrb-os-desafios-de-organizar-uma-conferencia-de-rubyrails-pt-br-90p</link>
      <guid>https://dev.to/cirdes/tropicalrb-os-desafios-de-organizar-uma-conferencia-de-rubyrails-pt-br-90p</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/tropicalrb-the-challenges-of-organizing-a-rubyrails-conference-en-ofk"&gt;English version&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Meu objetivo com este relato é ajudar outros organizadores de eventos, contando um pouco sobre o desafio de organizar o &lt;a href="https://www.tropicalrb.com/"&gt;Tropical.rb - The Latin America Rails Conference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para quem não participou, esse vídeo destaca alguns momentos da conferência:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/QYACqPiMFD4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Eventos de tecnologia fazem parte da minha vida há bastante tempo. Minha primeira empresa foi uma startup de eventos, a &lt;a href="https://pt.wikipedia.org/wiki/Eventick"&gt;Eventick&lt;/a&gt;. Por conta dela, tive a oportunidade de participar de, ou até mesmo ajudar no credenciamento de, diversos eventos. Alguns exemplos são: &lt;a href="https://conf.braziljs.org/"&gt;BrazilJS&lt;/a&gt;, &lt;a href="https://agiletrendsbr.com/"&gt;AgileTrends&lt;/a&gt;, &lt;a href="https://frontinsampa.com.br/"&gt;FrontInSampa&lt;/a&gt;, &lt;a href="https://frontinvale.com.br/"&gt;FrontInVale&lt;/a&gt;, &lt;a href="https://www.frontinbh.com.br/"&gt;FrontInBh&lt;/a&gt;, &lt;a href="https://www.rubyconf.com.br/"&gt;RubyConf&lt;/a&gt; e alguns eventos internacionais como a &lt;a href="https://rubyonrails.org/world/2023"&gt;Rails World&lt;/a&gt;, &lt;a href="https://conference.dpw.ai/"&gt;DPW&lt;/a&gt; e a &lt;a href="https://blog.heroku.com/waza-2013"&gt;Waza do Heroku&lt;/a&gt;. Inclusive, foi na Waza em 2013 que conheci o &lt;a href="https://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;Matz&lt;/a&gt;, criador do Ruby. ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbtsi34ikzouhammuwsb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbtsi34ikzouhammuwsb.jpg" alt="Thiago, Matz and Cirdes" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O Início do Plano
&lt;/h2&gt;

&lt;p&gt;O Tropical.rb já existia, e sua última edição havia acontecido em 2015. Ele começou como um evento local organizado pelo grupo de usuários Ruby de Recife, o &lt;a href="http://frevoonrails.com.br/"&gt;FrevoOnRails&lt;/a&gt;. Na época, o evento se chamava AbrilProRuby. Eu organizei a segunda edição regional do evento e ajudei na primeira edição nacional, que foi idealizada por &lt;a href="https://www.linkedin.com/in/lailsonbm/"&gt;Lailson Bandeira&lt;/a&gt; e também teve &lt;a href="https://www.linkedin.com/in/thiagodiniz/"&gt;Thiago Diniz&lt;/a&gt; como organizador.&lt;/p&gt;

&lt;p&gt;No começo de 2023, eu estava sentindo falta de eventos de Ruby/Rails no Brasil. Os meetups regionais não estavam acontecendo com regularidade, e ouvia-se falar muito pouco sobre Ruby. Os grandes responsáveis por divulgar o Rails no Brasil, &lt;a href="https://x.com/AkitaOnRails"&gt;Fábio Akita&lt;/a&gt; e a &lt;a href="https://plataformatec.com/"&gt;Plataformatec&lt;/a&gt;, já não estavam mais focados em Ruby. Estava claro para mim que era preciso retomar os eventos.&lt;/p&gt;

&lt;p&gt;O primeiro grande desafio de organizar um evento é que a maioria deles é deficitária. A última edição do Tropical.rb, em 2015, teve um prejuízo, em valores atuais, de R$ 250.000,00 (USD 50k). A RubyConf, a TheConf, a FrontInSampa e tantas outras conferências deram prejuízo, e muitas vezes vi esse custo recaindo sobre o organizador.&lt;/p&gt;

&lt;p&gt;Quando levei essa ideia para o meu sócio, &lt;a href="https://www.linkedin.com/in/leozaca/"&gt;Leo Cavalcanti&lt;/a&gt;, ele topou imediatamente. Como ele gosta de dizer, a &lt;a href="https://leozaca.substack.com/p/uma-defesa-do-lifestyle-business"&gt;Linkana&lt;/a&gt; é uma &lt;a href="https://leozaca.substack.com/p/uma-defesa-do-lifestyle-business"&gt;startup independente&lt;/a&gt; e lucrativa. Decidimos nos arriscar e organizar uma conferência, mesmo que nossos clientes não fossem desenvolvedores, pois sabíamos que era algo importante a ser feito. Com isso, a Linkana assumiu o risco financeiro do evento.&lt;/p&gt;

&lt;p&gt;A primeira pessoa que procurei para me ajudar foi &lt;a href="https://x.com/rafaelfranca"&gt;Rafael França&lt;/a&gt;, membro do Rails Core e amigo de longa data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b3tq3u5maf696poxgix.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b3tq3u5maf696poxgix.jpg" alt="Zeno Racha, Rodolfo, Cirdes, Rafael França e Lucas Mazza" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;França topou imediatamente ajudar a organizar o evento, e isso fez toda a diferença. Pela rede de contatos dele e pela credibilidade que a conferência ganhou ao ser co-organizada por um membro do Rails Core. Alguns meses depois, &lt;a href="https://x.com/juuh42dias"&gt;Ju Dias&lt;/a&gt; e &lt;a href="https://www.linkedin.com/in/debborafernandess/"&gt;Débora Fernandes&lt;/a&gt; se juntaram ao time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buscando Palestrantes
&lt;/h2&gt;

&lt;p&gt;Boa parte da experiência de uma conferência são as pessoas que você conhece ou reencontra. Nos melhores eventos que já participei, além do networking, aprendi muito com as palestras. Para conseguir a atenção dos keynotes mais famosos, sabia que precisava convidá-los pessoalmente para o evento. Fui um dos "sortudos" que conseguiu comprar um dos ingressos da primeira edição do Rails World em Amsterdã.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1w4ejloevhhri96fthev.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1w4ejloevhhri96fthev.jpeg" alt="Rails World" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Encontrei pessoalmente boa parte dos palestrantes que vieram de fora. Preparei um kit com camisa, havaianas, cachaça e uma bolsa de praia. Também levei várias camisas que distribuí para os brasileiros e os membros do Rails Core. O evento foi "invadido" pelo Tropical.rb, e todo mundo estava se perguntando o que era essa camisa roxa. Até o DHH ganhou a dele:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwg7ekkgecxnhogjbamc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwg7ekkgecxnhogjbamc.png" alt="Rafael França, DHH e Cirdes" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com a divulgação do evento em &lt;a href="https://rubyconferences.org/"&gt;https://rubyconferences.org/&lt;/a&gt;, nas newsletters e no Twitter, conseguimos mais de 100 propostas de palestras. Outro ponto importante para a conferência foi que definimos bem o nosso foco. Assim como na Rails World, queríamos falar sobre o futuro do framework e sobre startups. Ter o Rafael França como um dos revisores foi muito importante; ele nos dizia o que estava ou não alinhado com o Rails 8.&lt;/p&gt;

&lt;p&gt;Para que os palestrantes se sentissem em casa, pensamos em vários detalhes. Para os palestrantes que não falavam português, eu e os outros organizadores fomos pessoalmente buscá-los no aeroporto e levá-los para o hotel. O hotel que escolhemos era uma rede internacional, que os palestrantes já conheciam e ficava próxima ao local do evento. Thiago Diniz ficou responsável por cuidar de todos os palestrantes durante todo o período de estadia deles.&lt;/p&gt;

&lt;p&gt;Boa parte das empresas de fora possuem política de arcar com custos de viagem e hospedagem caso seus funcionários sejam selecionados para palestrar. Isso ajuda muito, já que fica inviável para o evento arcar com passagem e hospedagem. Para os demais, pagamos os custos de hospedagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Venda dos Ingressos
&lt;/h2&gt;

&lt;p&gt;Para vender os ingressos, inspirei-me no Rails World, que focou bastante na divulgação antes de iniciar as vendas. Isso deu muito certo para nós também. Com os keynotes confirmados, colocamos um site no ar para que as pessoas pudessem manifestar interesse em participar, e comecei a participar de &lt;a href="https://www.youtube.com/watch?v=4_EA11hiewI"&gt;meetups&lt;/a&gt;, &lt;a href="https://www.hipsters.tech/ecossistema-ruby-on-rails-hipsters-ponto-tech-393/"&gt;podcasts&lt;/a&gt; e &lt;a href="https://www.youtube.com/watch?v=W5j1F7l17C0&amp;amp;t=1s"&gt;lives no YouTube&lt;/a&gt;. Reativamos nosso &lt;a href="https://www.linkedin.com/company/tropicalrb/"&gt;LinkedIn&lt;/a&gt; e &lt;a href="https://x.com/tropical_rb"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com o público já aguardando, abrimos as vendas e, em menos de 3 dias, todos os ingressos esgotaram. Entre ingressos e patrocinadores, tivemos um público de aproximadamente 400 pessoas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Busca por Patrocinadores
&lt;/h2&gt;

&lt;p&gt;Pelo fato de nossa equipe ser enxuta, acabamos não paralelizando as iniciativas, e a busca por patrocinadores ficou por último. Acontece que isso foi, acidentalmente, a melhor coisa que fizemos. Esse era o meu maior desafio de longe, tanto porque não sou um vendedor quanto pelo histórico do evento. Por ter ficado por último, quando chegamos para falar com potenciais patrocinadores, já tínhamos os keynotes anunciados e todos os ingressos para o público geral esgotados.&lt;/p&gt;

&lt;p&gt;As empresas que patrocinam eventos não têm recursos ilimitados. Elas precisam escolher quais eventos vão poder patrocinar. Fizemos um documento bem elaborado para listar tudo que fazia parte do pacote e mapeamos diversas empresas que utilizam Ruby on Rails. Com um bom material de patrocínio, ingressos esgotados e keynotes confirmados, acabou sendo mais fácil do que eu esperava. Diferente da última edição, as empresas que utilizam Rails estão bem mais maduras e tem faltado profissionais de Ruby no mercado; elas querem associar a marca ao evento para consolidar sua marca empregadora. Também conseguimos apoio de empresas que vendem para desenvolvedores e outras de fora do país que estão interessadas em contratar no Brasil. No final, conseguimos fechar as contas do evento no azul.&lt;/p&gt;

&lt;p&gt;Outro fator importante é que abrimos um CNPJ de uma associação sem fins lucrativos, a "Rubi nos Trilhos do Brasil", para que pudéssemos emitir nota fiscal para os patrocinadores, ao mesmo tempo que os recursos seriam destinados única e exclusivamente para o evento. Nenhum organizador ou voluntário recebeu nada do evento. No final, tivemos 19 patrocinadores incríveis!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  O Dia do Evento
&lt;/h2&gt;

&lt;p&gt;A escolha do local e do formato foi crucial. Eu queria associar o Rails às startups, por isso escolhi o Cubo Itaú, o maior hub de startups da América Latina. Um auditório moderno com excelente infraestrutura.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funeywayy1ib4sywy86ok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funeywayy1ib4sywy86ok.png" alt="Auditório Cubo Itaú" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um dos desafios foi acumular a responsabilidade de co-apresentador do evento. Para enfrentar esse desafio, a &lt;a href="https://www.linkedin.com/in/larissasantana/"&gt;Larissa Santana&lt;/a&gt; e a consultoria Calor me ajudaram muito.&lt;/p&gt;

&lt;p&gt;Além das palestras tradicionais, tivemos algumas iniciativas diferentes.&lt;/p&gt;

&lt;p&gt;A primeira delas foi um painel com quatro fundadores das maiores empresas brasileiras que utilizam Rails. &lt;a href="https://www.linkedin.com/in/wagnernarde/"&gt;Wagner Narde&lt;/a&gt; da Vindi, &lt;a href="https://www.linkedin.com/in/carlosbrando/"&gt;Carlos Brando&lt;/a&gt; da Enjoei, &lt;a href="https://www.linkedin.com/in/scalone/"&gt;Thiago Scalone&lt;/a&gt; da CloudWalk e o &lt;a href="https://www.linkedin.com/in/brunoghisi/"&gt;Bruno Ghisi&lt;/a&gt; da RD Station. Muitos desenvolvedores sonham em empreender, e eu queria que as pessoas percebessem que o Rails continua sendo um dos melhores frameworks para iniciar uma startup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i7bfbu7p4d1fd8ueq96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i7bfbu7p4d1fd8ueq96.png" alt="Painel de Startups" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O outro painel foi sobre a Rails Foundation. A criação da fundação foi uma das iniciativas mais importantes do Rails para a comunidade. Eu acreditava que as pessoas da América Latina precisavam conhecer a fundação, ao mesmo tempo que a fundação precisava entender melhor as demandas e necessidades dos desenvolvedores Ruby que estão fora do eixo América do Norte/Europa. Foi incrível contar com a participação de &lt;a href="https://www.linkedin.com/in/amandabrookeperino/"&gt;Amanda Perino&lt;/a&gt;, Diretora Executiva da Rails Foundation, &lt;a href="https://www.linkedin.com/in/brunomiranda/"&gt;Bruno Miranda&lt;/a&gt;, brasileiro e membro do conselho da Rails Foundation, e &lt;a href="https://www.linkedin.com/in/robbyrussell/"&gt;Robby Russel&lt;/a&gt; como mediador das perguntas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkmy0gvtoigxl4lrnywmc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkmy0gvtoigxl4lrnywmc.png" alt="Rails Foundation AMA" width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como um dos objetivos do evento era fortalecer a comunidade, todos os organizadores de meetups de Ruby/Rails do Brasil foram homenageados no palco, juntamente com Fábio Akita, responsável por criar e organizar a RubyConfBR ao longo de vários anos. Além disso, tivemos a oportunidade de homenagear Paulo Fagiani, organizador do histórico evento Oxente Rails, que infelizmente nos deixou alguns meses depois.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7e08915q2t7w80ppvik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7e08915q2t7w80ppvik.png" alt="Homenagem aos Gurus" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim, junto com a Le Wagon, selecionamos desenvolvedores juniors recém-formados no bootcamp para criar um &lt;a href="https://empresas.ruby.com.br/"&gt;catálogo de empresas&lt;/a&gt; que utilizam Ruby on Rails no Brasil, apresentado no palco do evento. Muitos membros da equipe conseguiram seu primeiro emprego durante o processo.&lt;/p&gt;

&lt;p&gt;Essas quatro iniciativas certamente tornaram o Tropical.rb ainda mais único.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por fim
&lt;/h2&gt;

&lt;p&gt;Organizar eventos de tecnologia trata-se de doar o que você tem de mais precioso: seu tempo. É crucial que sua motivação esteja no lugar certo. Não se trata de ROI (Retorno sobre o Investimento), não é sobre marketing de carreira. Trata-se de contribuir para algo em que você acredita.&lt;/p&gt;

&lt;p&gt;Links para as palestras: &lt;a href="https://www.youtube.com/@tropicalrb"&gt;Assista às palestras aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Links para as fotos: &lt;a href="https://photos.app.goo.gl/hkJZ3xbD1pajNQ7P9"&gt;Veja as fotos aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esperamos todos vocês em 2025!&lt;/p&gt;

&lt;p&gt;Se quiserem discutir sobre organização de eventos, estou disponível no &lt;a href="https://www.linkedin.com/in/cirdesh/"&gt;Linkedin&lt;/a&gt; e &lt;a href="https://x.com/cirdesh"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>conference</category>
    </item>
    <item>
      <title>Tropical.rb - The Challenges of Organizing a Ruby/Rails Conference [EN]</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Tue, 02 Jul 2024 11:40:29 +0000</pubDate>
      <link>https://dev.to/cirdes/tropicalrb-the-challenges-of-organizing-a-rubyrails-conference-en-ofk</link>
      <guid>https://dev.to/cirdes/tropicalrb-the-challenges-of-organizing-a-rubyrails-conference-en-ofk</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/tropicalrb-os-desafios-de-organizar-uma-conferencia-de-rubyrails-pt-br-90p"&gt;Versão em Português&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;My goal with this post is to help other event organizers by sharing a bit about the challenge of organizing the &lt;a href="https://www.tropicalrb.com/"&gt;Tropical.rb - The Latin America Rails Conference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For those who didn't attend, this video highlights some moments from the conference:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/QYACqPiMFD4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Technology events have been a part of my life for quite some time. My first company was an event startup, &lt;a href="https://pt.wikipedia.org/wiki/Eventick"&gt;Eventick&lt;/a&gt;. Because of it, I had the opportunity to participate in, or even help with the accreditation of, several events. Some examples are: &lt;a href="https://conf.braziljs.org/"&gt;BrazilJS&lt;/a&gt;, &lt;a href="https://agiletrendsbr.com/"&gt;AgileTrends&lt;/a&gt;, &lt;a href="https://frontinsampa.com.br/"&gt;FrontInSampa&lt;/a&gt;, &lt;a href="https://frontinvale.com.br/"&gt;FrontInVale&lt;/a&gt;, &lt;a href="https://www.frontinbh.com.br/"&gt;FrontInBh&lt;/a&gt;, &lt;a href="https://www.rubyconf.com.br/"&gt;RubyConf&lt;/a&gt;, and some international events like &lt;a href="https://rubyonrails.org/world/2023"&gt;Rails World&lt;/a&gt;, &lt;a href="https://conference.dpw.ai/"&gt;DPW&lt;/a&gt;, and &lt;a href="https://blog.heroku.com/waza-2013"&gt;Heroku's Waza&lt;/a&gt;. In fact, it was at Waza in 2013 that I met &lt;a href="https://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;Matz&lt;/a&gt;, the creator of Ruby. ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbtsi34ikzouhammuwsb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbtsi34ikzouhammuwsb.jpg" alt="Thiago, Matz and Cirdes" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Beginning of the Plan
&lt;/h2&gt;

&lt;p&gt;Tropical.rb already existed, and its last edition had taken place in 2015. It started as a local event organized by the Recife Ruby user group, &lt;a href="http://frevoonrails.com.br/"&gt;FrevoOnRails&lt;/a&gt;. At the time, the event was called "AbrilProRuby". I organized the second regional edition of the event and helped with the first national edition, which was conceived by &lt;a href="https://www.linkedin.com/in/lailsonbm/"&gt;Lailson Bandeira&lt;/a&gt; and also had &lt;a href="https://www.linkedin.com/in/thiagodiniz/"&gt;Thiago Diniz&lt;/a&gt; as an organizer.&lt;/p&gt;

&lt;p&gt;At the beginning of 2023, I was missing Ruby/Rails events in Brazil. Regional meetups were not happening regularly, and there was very little talk about Ruby. The main promoters of Rails in Brazil, &lt;a href="https://x.com/AkitaOnRails"&gt;Fábio Akita&lt;/a&gt; and &lt;a href="https://plataformatec.com/"&gt;Plataformatec&lt;/a&gt;, were no longer focused on Ruby. It was clear to me that events needed to be revived.&lt;/p&gt;

&lt;p&gt;The first major challenge of organizing an event is that most of them operate at a loss. The last edition of Tropical.rb, in 2015, had a loss of R$ 250,000 (USD 50k) in today's values. RubyConf, TheConf, FrontInSampa, and so many other conferences have incurred losses, often with the organizer bearing the cost.&lt;/p&gt;

&lt;p&gt;When I brought this idea to my partner, &lt;a href="https://www.linkedin.com/in/leozaca/"&gt;Leo Cavalcanti&lt;/a&gt;, he agreed immediately. As he likes to say, &lt;a href="https://leozaca.substack.com/p/uma-defesa-do-lifestyle-business"&gt;Linkana&lt;/a&gt; is an &lt;a href="https://leozaca.substack.com/p/uma-defesa-do-lifestyle-business"&gt;independent&lt;/a&gt; and profitable startup. We decided to take the risk and organize a conference, even though our clients weren't developers, because we knew it was something important to do. With that, Linkana took on the financial risk of the event.&lt;/p&gt;

&lt;p&gt;The first person I reached out to for help was &lt;a href="https://x.com/rafaelfranca"&gt;Rafael França&lt;/a&gt;, a member of the Rails Core and a long-time friend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b3tq3u5maf696poxgix.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b3tq3u5maf696poxgix.jpg" alt="Zeno Rocha, Rodolfo, Cirdes, Rafael França and Lucas Mazza" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;França immediately agreed to help organize the event, and that made all the difference. His network and the credibility that the conference gained by being co-organized by a Rails Core member were invaluable. A few months later, &lt;a href="https://x.com/juuh42dias"&gt;Ju Dias&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/debborafernandess/"&gt;Débora Fernandes&lt;/a&gt; joined the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seeking Speakers
&lt;/h2&gt;

&lt;p&gt;A significant part of the conference experience is the people you meet or reconnect with. At the best events I've attended, in addition to networking, I've learned a lot from the talks. To get the attention of the most famous keynotes, I knew I had to invite them personally. I was one of the "lucky ones" who managed to get a ticket to the first edition of Rails World in Amsterdam.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1w4ejloevhhri96fthev.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1w4ejloevhhri96fthev.jpeg" alt="Rails World" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I met most of the speakers who came from abroad in person. I prepared a kit with a shirt, flip-flops, cachaça, and a beach bag. I also brought several shirts that I distributed to Brazilians and Rails Core members. The event was "invaded" by Tropical.rb, and everyone was wondering what that purple shirt was. Even DHH got his:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwg7ekkgecxnhogjbamc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwg7ekkgecxnhogjbamc.png" alt="Rafael França, DHH and Cirdes" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the event's promotion on &lt;a href="https://rubyconferences.org/"&gt;https://rubyconferences.org/&lt;/a&gt;, newsletters, and Twitter, we received over 100 talk proposals. Another important point for the conference was defining our focus well. Like Rails World, we wanted to talk about the framework's future and startups. Having Rafael França as one of the reviewers was very important; he told us what was or wasn't aligned with Rails 8.&lt;/p&gt;

&lt;p&gt;To make the speakers feel at home, we thought of several details. For the speakers who didn't speak Portuguese, the organizers and I personally picked them up from the airport and took them to the hotel. The hotel we chose was an international chain that the speakers were familiar with and was close to the event venue. Thiago Diniz was responsible for taking care of all the speakers during their stay.&lt;/p&gt;

&lt;p&gt;Many foreign companies have policies to cover travel and accommodation costs if their employees are selected to speak. This helps a lot since it's unfeasible for the event to cover these expenses. For the others, we covered the accommodation costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ticket Sales
&lt;/h2&gt;

&lt;p&gt;To sell tickets, I was inspired by Rails World, which focused heavily on promotion before starting sales. This worked very well for us too. With the keynotes confirmed, we launched a website where people could express interest in attending, and I started participating in &lt;a href="https://www.youtube.com/watch?v=4_EA11hiewI"&gt;meetups&lt;/a&gt;, &lt;a href="https://www.hipsters.tech/ecossistema-ruby-on-rails-hipsters-ponto-tech-393/"&gt;podcasts&lt;/a&gt;, and &lt;a href="https://www.youtube.com/watch?v=W5j1F7l17C0&amp;amp;t=1s"&gt;YouTube lives&lt;/a&gt;. We reactivated our &lt;a href="https://www.linkedin.com/company/tropicalrb/"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://x.com/tropical_rb"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With the audience already waiting, we opened sales, and in less than three days, all tickets sold out. Between tickets and sponsors, we had an audience of approximately 400 people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seeking Sponsors
&lt;/h2&gt;

&lt;p&gt;Because our team was small, we didn't parallelize initiatives, and finding sponsors was the last task. This turned out to be the best thing we did. It was my biggest challenge by far, both because I'm not a salesperson and due to the event's history. By the time we approached potential sponsors, we already had the keynotes announced and all tickets for the general public sold out.&lt;/p&gt;

&lt;p&gt;Companies that sponsor events do not have unlimited resources. They need to choose which events to sponsor. We created a well-crafted document listing everything included in the package and mapped several companies that use Ruby on Rails. With good sponsorship material, sold-out tickets, and confirmed keynotes, it was easier than I expected. Unlike the last edition, companies using Rails are now much more mature, and there is a shortage of Ruby professionals in the market. They want to associate their brand with the event to strengthen their employer brand. We also received support from companies that sell to developers and others from abroad interested in hiring in Brazil. In the end, we managed to break even.&lt;/p&gt;

&lt;p&gt;Another important factor is that we opened a non-profit association, "Rubi nos Trilhos do Brasil," so we could issue invoices to sponsors, ensuring that resources were dedicated exclusively to the event. No organizer or volunteer received any compensation from the event. In the end, we had 19 amazing sponsors!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The Day of the Event
&lt;/h2&gt;

&lt;p&gt;Choosing the venue and format was crucial. I wanted to associate Rails with startups, so I chose Cubo Itaú, the largest startup hub in Latin America. A modern auditorium with excellent infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funeywayy1ib4sywy86ok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funeywayy1ib4sywy86ok.png" alt="Cubo Itaú Auditorium" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the challenges was taking on the responsibility of co-presenting the event. To tackle this, &lt;a href="https://www.linkedin.com/in/larissasantana/"&gt;Larissa Santana&lt;/a&gt; and the consultancy Calor helped me a lot.&lt;/p&gt;

&lt;p&gt;Besides the traditional talks, we had some unique initiatives.&lt;/p&gt;

&lt;p&gt;The first was a panel with four founders of the largest Brazilian companies that use Rails: &lt;a href="https://www.linkedin.com/in/wagnernarde/"&gt;Wagner Narde&lt;/a&gt; from Vindi, &lt;a href="https://www.linkedin.com/in/carlosbrando/"&gt;Carlos Brando&lt;/a&gt; from Enjoei, &lt;a href="https://www.linkedin.com/in/scalone/"&gt;Thiago Scalone&lt;/a&gt; from CloudWalk, and &lt;a href="https://www.linkedin.com/in/brunoghisi/"&gt;Bruno Ghisi&lt;/a&gt; from RD Station. Many developers aspire to become entrepreneurs, and I wanted people to see that Rails remains one of the best frameworks for launching a startup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i7bfbu7p4d1fd8ueq96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i7bfbu7p4d1fd8ueq96.png" alt="Startup Panel" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The other panel was about the Rails Foundation. The creation of the foundation was one of the most important initiatives for the Rails community. I believed that people in Latin America needed to know about the foundation, and the foundation needed to understand the demands and needs of Ruby developers outside the North America/Europe axis. It was incredible to have &lt;a href="https://www.linkedin.com/in/amandabrookeperino/"&gt;Amanda Perino&lt;/a&gt;, Executive Director of the Rails Foundation, &lt;a href="https://www.linkedin.com/in/brunomiranda/"&gt;Bruno Miranda&lt;/a&gt;, a Brazilian and a member of the Rails Foundation board, and &lt;a href="https://www.linkedin.com/in/robbyrussell/"&gt;Robby Russel&lt;/a&gt; as the question moderator.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkmy0gvtoigxl4lrnywmc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkmy0gvtoigxl4lrnywmc.png" alt="Rails Foundation AMA" width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the event's goals was to strengthen the community, so all the organizers of Ruby/Rails meetups in Brazil were honored on stage, along with Fábio Akita, who created and organized RubyConfBR for many years. Additionally, we had the opportunity to honor Paulo Fagiani, organizer of the historic Oxente Rails event, who sadly passed away a few months later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7e08915q2t7w80ppvik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7e08915q2t7w80ppvik.png" alt="Tribute to the Gurus" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, in collaboration with Le Wagon, we selected junior developers recently graduated from the bootcamp to create a &lt;a href="https://empresas.ruby.com.br/"&gt;catalog of companies&lt;/a&gt; that use Ruby on Rails in Brazil, presented on stage at the event. Many team members got their first jobs during this process.&lt;/p&gt;

&lt;p&gt;These four initiatives certainly made Tropical.rb even more unique.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Conclusion
&lt;/h2&gt;

&lt;p&gt;Organizing tech events is about giving what is most precious: your time. It's crucial that your motivation is in the right place. It's not about ROI (Return on Investment), nor is it about career marketing. It's about contributing to something you believe in.&lt;/p&gt;

&lt;p&gt;Links to the talks: &lt;a href="https://www.youtube.com/@tropicalrb"&gt;Watch the talks here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Links to the photos: &lt;a href="https://photos.app.goo.gl/hkJZ3xbD1pajNQ7P9"&gt;See the photos here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We hope to see you all in 2025!&lt;/p&gt;

&lt;p&gt;If you want to discuss event organization, I'm available on &lt;a href="https://www.linkedin.com/in/cirdesh/"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://x.com/cirdesh"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>conference</category>
    </item>
    <item>
      <title>From React to Hotwire - Part II - [EN]</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Sun, 16 Jun 2024 15:50:03 +0000</pubDate>
      <link>https://dev.to/cirdes/from-react-to-hotwire-part-ii-en-2lim</link>
      <guid>https://dev.to/cirdes/from-react-to-hotwire-part-ii-en-2lim</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/do-react-ao-hotwire-parte-ii-pt-br-3aa4"&gt;Versão em Português&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/cirdes/from-react-to-hotwire-part-i-en-2o6g"&gt;first article&lt;/a&gt; about this migration from React to Hotwire, I discussed how we arrived at our current React stack. In this Part II, I will talk about the return to Rails views at Linkana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolution of Rails and SSR
&lt;/h2&gt;

&lt;p&gt;One of Rails' most brilliant characteristics is its obsession with simplicity. Since Rails was born within &lt;a href="https://brasil.basecamp.com/"&gt;Basecamp&lt;/a&gt;, a company that chose to have few employees, it is part of Rails' DNA to seek ways to keep web development simple. This is why Rails is known as the &lt;a href="https://world.hey.com/dhh/the-one-person-framework-711e6318"&gt;One Person Framework&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Attending the latest edition of &lt;a href="https://rubyonrails.org/world/2024"&gt;Rails World&lt;/a&gt; and watching the talk by &lt;a href="https://www.youtube.com/watch?v=iqXjGiQ_D-A"&gt;DHH&lt;/a&gt; made me realize that generating views on the backend with Rails was no longer synonymous with slow, ugly interfaces that do not care about UX. With Hotwire, through Turbo and Stimulus, it was possible to create applications as complex as Gmail, &lt;a href="https://hey.com/"&gt;Hey&lt;/a&gt;, or Slack, &lt;a href="https://once.com/campfire"&gt;Campfire&lt;/a&gt;. And this became even more surreal with &lt;a href="https://evilmartians.com/chronicles/the-future-of-full-stack-rails-turbo-morph-drive"&gt;Turbo 8&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYnprZ2x6bjdudzZ1Y2NqOXlqdGVwMzZvY2ZhOGFlbDFpazdpOWJ0ZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/vUvxwcgQ6Iqlm2p6g9/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYnprZ2x6bjdudzZ1Y2NqOXlqdGVwMzZvY2ZhOGFlbDFpazdpOWJ0ZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/vUvxwcgQ6Iqlm2p6g9/giphy.gif" alt="SSR Giphy" width="480" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But the great benefit of returning to Server Side Rendering (SSR) is not needing APIs. Creating an API, whether REST or GraphQL, makes development slower. And it's not just Rails that is realizing this; Elixir with Liveview, PHP with &lt;a href="https://livewire.laravel.com/docs/quickstart"&gt;Livewire&lt;/a&gt;, and even JS with &lt;a href="https://htmx.org/"&gt;HTMX&lt;/a&gt;, and &lt;a href="https://react.dev/reference/react-dom/server"&gt;React&lt;/a&gt; are following this trend. As Deno.js says: &lt;a href="https://deno.com/blog/the-future-and-past-is-server-side-rendering"&gt;The Future (and the Past) of the Web is Server Side Rendering&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Components Are Here to Stay
&lt;/h2&gt;

&lt;p&gt;As we saw in Part I of this article, views in React/Vue/etc. introduced the concept of components. These components are small interface blocks that condense "Style (Tailwind)", "Structure (HTML)", and "Behavior/JavaScript". Componentization, in addition to promoting reuse and facilitating testing, allows customization or use to create your own Design System. But most importantly, they are ready-made. You don't need to reinvent the wheel. A great example is &lt;a href="https://ui.shadcn.com/"&gt;Shadcn&lt;/a&gt;, launched only in March 2023 and already has 60k stars on Github.&lt;/p&gt;

&lt;p&gt;Unfortunately, Rails views were created in a pre-components context. Html.erb is very good for writing HTML, but it is not good for writing behavior. Partials are great for writing behavior, but they are terrible for HTML.&lt;/p&gt;

&lt;p&gt;To try to solve this, the first solution that emerged was &lt;a href="https://viewcomponent.org/"&gt;ViewComponents&lt;/a&gt;, a framework created by the folks at Github. ViewComponent is our React, allowing the frontend to be thought of as components. It is the most popular solution today. Although I have never used it, I feel it lacked boldness. It seems like a fusion of partials with erb. But what disappointed me the most was that &lt;a href="https://news.ycombinator.com/item?id=33576722"&gt;Github is migrating from Rails to React&lt;/a&gt;, and the maintainers of ViewComponents &lt;a href="https://www.youtube.com/watch?v=YdeuXQJkZrs"&gt;don't seem very enthusiastic&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As an alternative to ViewComponent, I found &lt;a href="https://www.phlex.fun/"&gt;Phlex&lt;/a&gt;. It comes with the boldness of creating components using only Ruby code. This is the kind of boldness that scares. I was scared when I first saw React put HTML, JS, and CSS (StyledComponents) inside a component. I was scared to see Tailwind create classes for each CSS property and have HTML created with dozens of classes in an element. Letting go of this "prejudice" and testing Phlex was important here. But the decisive factor was following the creator of Phlex, &lt;a href="https://x.com/joeldrapper"&gt;Joel Drapper&lt;/a&gt;, on social media and realizing how motivated he is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Component Library
&lt;/h2&gt;

&lt;p&gt;As we do not like to reinvent the wheel here at Linkana, we decided to look for component libraries that we could use and evaluated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://phlexui.com/"&gt;https://phlexui.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://primer.style/guides/rails"&gt;https://primer.style/guides/rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shadcn.rails-components.com/"&gt;https://shadcn.rails-components.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://railsdesigner.com/"&gt;https://railsdesigner.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zestui.com/"&gt;https://zestui.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://railsui.com/"&gt;https://railsui.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://protos.inhouse.work/"&gt;https://protos.inhouse.work/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We ended up choosing &lt;a href="https://phlexui.com/"&gt;Phlex UI&lt;/a&gt;, not because we believe it is ready, but because we believe the path it has chosen is the most suitable for the premise of reusable and easily customizable components. It is a library clearly inspired by &lt;a href="https://ui.shadcn.com/"&gt;Shadcn&lt;/a&gt; and brought some Shadcn innovations to the Rails world.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Encouraging you to &lt;a href="https://phlexui.com/docs/customizing_components"&gt;customize&lt;/a&gt; components by copying them into your codebase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A component structure very similar to React:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Shadcn&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Accordion&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;single&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;collapsible&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AccordionItem&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;item-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AccordionTrigger&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Is&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="nx"&gt;accessible&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AccordionTrigger&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AccordionContent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;Yes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;It&lt;/span&gt; &lt;span class="nx"&gt;adheres&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;WAI&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ARIA&lt;/span&gt; &lt;span class="nx"&gt;design&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AccordionContent&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AccordionItem&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Accordion&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PhlexUI&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;render&lt;/span&gt; &lt;span class="no"&gt;PhlexUI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Accordion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="no"&gt;PhlexUI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Accordion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="no"&gt;PhlexUI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Accordion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Trigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"What is PhlexUI?"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="no"&gt;PhlexUI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Accordion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"PhlexUI is a UI component library for Ruby devs who want to build better, faster."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;All CSS is written with Tailwind inside the component itself. It is very easy to make small adjustments/changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The components are made up of several very simple Ruby classes. It is very easy to understand code.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzn0y1wap4fq21dnl438.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzn0y1wap4fq21dnl438.png" alt="Phlex UI Components" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Integration with Stimulus through specific controllers for each component.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Putting it into Production
&lt;/h2&gt;

&lt;p&gt;The first step to start the migration to SSR with Phlex and Hotwire was to map the PhlexUI components and place them in &lt;a href="https://lookbook.build/"&gt;Lookbook&lt;/a&gt; within our application with our brand colors.&lt;/p&gt;

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

&lt;p&gt;The second step was to create a Rails version of all navigation elements. Sidebar, tabs, etc.&lt;/p&gt;

&lt;p&gt;This way, we managed to rewrite route by route using SSR while the React (SPA) routes continued to function. For example:&lt;/p&gt;

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

&lt;p&gt;Everything that is part of the Dashboard is already using SSR. Navigating between the "Summary" and "Lead time" tabs is a navigation that uses Hotwire's Turbo.&lt;/p&gt;

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

&lt;p&gt;When the user clicks on the pending tab, we disable Turbo, and an HTML request is made to the backend that loads our SPA in React and displays the page. Thus, the application switches to SPA mode, and the requests return to being via our GraphQL API with JSON exchange.&lt;/p&gt;

&lt;p&gt;If the user clicks on a link that is already in Hotwire, we make React perform an HTML request, and the application returns to being an SSR.&lt;/p&gt;

&lt;p&gt;The transition from SPA to SSR is practically imperceptible, but from SSR to SPA is a bit slower, without hindering the user experience. Our idea is to complete this transition by the next edition of &lt;a href="https://www.tropicalrb.com/"&gt;Tropical.rb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since June 11th, we have been running Phlex in production, and as a form of gratitude, Linkana has become one of the &lt;a href="https://github.com/sponsors/joeldrapper#sponsors"&gt;sponsors of the project&lt;/a&gt;. We have also started contributing to the PhlexUI project.&lt;/p&gt;

&lt;p&gt;If you are also working with components in Rails, leave a comment about what you have been doing.&lt;/p&gt;

</description>
      <category>react</category>
      <category>hotwire</category>
      <category>rails</category>
      <category>phlex</category>
    </item>
    <item>
      <title>Do React ao Hotwire - Parte II - [PT-BR]</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Sun, 16 Jun 2024 15:44:26 +0000</pubDate>
      <link>https://dev.to/cirdes/do-react-ao-hotwire-parte-ii-pt-br-3aa4</link>
      <guid>https://dev.to/cirdes/do-react-ao-hotwire-parte-ii-pt-br-3aa4</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/from-react-to-hotwire-part-ii-en-2lim"&gt;English version available&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;No &lt;a href="https://dev.to/cirdes/do-react-ao-hotwire-parte-i-pt-br-1hm2"&gt;primeiro artigo&lt;/a&gt; sobre essa migração do React para o Hotwire, eu abordei como chegamos à nossa stack atual em React. Nesta Parte II, vou falar sobre o retorno às views do Rails na Linkana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolução do Rails e o SSR
&lt;/h2&gt;

&lt;p&gt;Uma das características mais brilhantes do Rails é sua obsessão pela simplicidade. Como o Rails nasceu dentro do &lt;a href="https://brasil.basecamp.com/"&gt;Basecamp&lt;/a&gt;, uma empresa que escolheu ter poucos funcionários, faz parte do DNA do Rails buscar maneiras de manter o desenvolvimento web simples. Por isso, o Rails é o &lt;a href="https://world.hey.com/dhh/the-one-person-framework-711e6318"&gt;Framework de uma pessoa só&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ter participado da última edição do &lt;a href="https://rubyonrails.org/world/2024"&gt;Rails World&lt;/a&gt; e assistido à palestra do &lt;a href="https://www.youtube.com/watch?v=iqXjGiQ_D-A"&gt;DHH&lt;/a&gt; me fez perceber que gerar views no backend com Rails já não era mais sinônimo de interfaces lentas, feias e que não se preocupam com UX. Com Hotwire, através do Turbo e do Stimulus, era possível criar aplicações tão complexas como o Gmail, &lt;a href="https://hey.com/"&gt;Hey&lt;/a&gt; ou Slack, &lt;a href="https://once.com/campfire"&gt;Campfire&lt;/a&gt;. E isso ficou ainda mais surreal com o &lt;a href="https://evilmartians.com/chronicles/the-future-of-full-stack-rails-turbo-morph-drive"&gt;Turbo 8&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYnprZ2x6bjdudzZ1Y2NqOXlqdGVwMzZvY2ZhOGFlbDFpazdpOWJ0ZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/vUvxwcgQ6Iqlm2p6g9/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYnprZ2x6bjdudzZ1Y2NqOXlqdGVwMzZvY2ZhOGFlbDFpazdpOWJ0ZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/vUvxwcgQ6Iqlm2p6g9/giphy.gif" width="480" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas o grande benefício do retorno ao Server Side Rendering (SSR) é não precisar de APIs. Criar uma API, seja ela REST ou GraphQL, torna o desenvolvimento mais lento. E não é apenas o Rails que está percebendo isso, é o Elixir com o Liveview, PHP com o &lt;a href="https://livewire.laravel.com/docs/quickstart"&gt;Livewire&lt;/a&gt;, e até mesmo o próprio JS com &lt;a href="https://htmx.org/"&gt;HTMX&lt;/a&gt;, além do próprio &lt;a href="https://react.dev/reference/react-dom/server"&gt;React&lt;/a&gt;. Como diz o Deno.js: &lt;a href="https://deno.com/blog/the-future-and-past-is-server-side-rendering"&gt;O Futuro (e o Passado) da Web é a Renderização do Lado do Servidor&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Componentes vieram para ficar
&lt;/h2&gt;

&lt;p&gt;Como vimos na Parte I desse artigo, views em React/Vue/Angular introduziram o conceito de componentes. Esses componentes são pequenos blocos de interface que condensam "Estilo (Tailwind)", "Estrutura (HTML)" e "Comportamento/JavaScript". Componentizar, além de promover o reuso e facilitar os testes, também facilita a customização. Mas o mais importante, eles já estão prontos. Você não precisa reinventar a roda. Um grande exemplo é o &lt;a href="https://ui.shadcn.com/"&gt;Shadcn&lt;/a&gt;, lançado apenas em março de 2023 e que já conta com 60k estrelas no Github.&lt;/p&gt;

&lt;p&gt;Infelizmente, as views do Rails foram criadas no contexto pré-componentes. O html.erb é muito bom para se escrever HTML, mas não é bom para escrever comportamento. Já os partials são ótimos para se escrever comportamento, mas são péssimos para HTML.&lt;/p&gt;

&lt;p&gt;Para tentar resolver isso, a primeira solução que surgiu foi o &lt;a href="https://viewcomponent.org/"&gt;ViewComponents&lt;/a&gt;, um framework criado pelo pessoal do Github. O ViewComponents é o nosso React, permitindo que o frontend seja pensado na forma de componentes. Ele é a solução mais popular hoje. Apesar de eu nunca ter usado, sinto que faltou ousadia. Ele me parece uma fusão dos partials com o erb. Mas o que mais me decepcionou foi que o &lt;a href="https://news.ycombinator.com/item?id=33576722"&gt;Gihub está migrando do Rails para o React&lt;/a&gt; e os próprios mantenedores do ViewComponents &lt;a href="https://www.youtube.com/watch?v=YdeuXQJkZrs"&gt;não me parecem muito empolgados&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como alternativa ao ViewComponents, encontrei o &lt;a href="https://www.phlex.fun/"&gt;Phlex&lt;/a&gt;. Ele vem com a ousadia de criar componentes utilizando somente código Ruby. Esse é o tipo de ousadia que assusta. Eu me assustei quando vi pela primeira vez o React colocar HTML, JS e CSS (StyledComponents) dentro de um componente. Eu me assustei ao ver o Tailwind criar classes para cada propriedade do CSS e termos HTML criados com dezenas de classes em um elemento. Abrir mão desse "preconceito" e testar o Phlex foi importante aqui. Mas o fator decisivo foi acompanhar o criador do Phlex, o &lt;a href="https://x.com/joeldrapper"&gt;Joel Drapper&lt;/a&gt;, nas redes sociais e perceber o quão motivado ele está.&lt;/p&gt;

&lt;h2&gt;
  
  
  Biblioteca de componentes
&lt;/h2&gt;

&lt;p&gt;Como não gostamos de reinventar a roda aqui na Linkana, resolvemos buscar bibliotecas de componentes que pudéssemos usar e chegamos a avaliar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://phlexui.com/"&gt;https://phlexui.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://primer.style/guides/rails"&gt;https://primer.style/guides/rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shadcn.rails-components.com/"&gt;https://shadcn.rails-components.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://railsdesigner.com/"&gt;https://railsdesigner.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zestui.com/"&gt;https://zestui.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://railsui.com/"&gt;https://railsui.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://protos.inhouse.work/"&gt;https://protos.inhouse.work/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acabamos escolhendo a &lt;a href="https://phlexui.com/"&gt;Phlex UI&lt;/a&gt; não por acreditar que ela está pronta, mas por acreditar que o caminho que ela escolheu é o mais adequado à premissa de componentes reutilizáveis e de fácil customização. Ela é uma biblioteca que foi claramente inspirada na Shadcn e trouxe para o mundo Rails algumas inovações do Shadcn.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Incentivar que você &lt;a href="https://phlexui.com/docs/customizing_components"&gt;customize&lt;/a&gt; os componentes copiando-os para a sua codebase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uma estrutura de componentes muito parecida com o React:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Shadcn&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Accordion&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;single&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;collapsible&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AccordionItem&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;item-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AccordionTrigger&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Is&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="nx"&gt;accessible&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AccordionTrigger&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AccordionContent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;Yes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;It&lt;/span&gt; &lt;span class="nx"&gt;adheres&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;WAI&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ARIA&lt;/span&gt; &lt;span class="nx"&gt;design&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AccordionContent&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AccordionItem&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Accordion&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PhlexUI&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;render&lt;/span&gt; &lt;span class="no"&gt;PhlexUI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Accordion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="no"&gt;PhlexUI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Accordion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="no"&gt;PhlexUI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Accordion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Trigger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"What is PhlexUI?"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="no"&gt;PhlexUI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Accordion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"PhlexUI is a UI component library for Ruby devs who want to build better, faster."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Todo o CSS é escrito com Tailwind dentro do próprio componente. É muito fácil fazer pequenos ajustes/mudanças.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os componentes são formados por várias classes Ruby muito simples. É um código muito fácil de entender.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzn0y1wap4fq21dnl438.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzn0y1wap4fq21dnl438.png" alt="Componentes Phlex UI" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Integração com Stimulus através de controllers específicos de cada componente.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Colocando em produção - SSR + SPA
&lt;/h2&gt;

&lt;p&gt;O primeiro passo para começar a migração para SSR com Phlex e Hotwire foi mapear os componentes do PhlexUI e colocá-los no &lt;a href="https://lookbook.build/"&gt;Lookbook&lt;/a&gt; dentro da nossa aplicação com as cores da nossa marca.&lt;/p&gt;

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

&lt;p&gt;O segundo passo foi criar uma versão em Rails de todos os elementos de navegação. Sidebar, tabs, etc.&lt;/p&gt;

&lt;p&gt;Dessa forma, conseguimos ir reescrevendo rota por rota usando SSR ao mesmo tempo que as rotas em React (SPA) continuam funcionando. Por exemplo:&lt;/p&gt;

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

&lt;p&gt;Tudo que faz parte do Dashboard já está utilizando SSR. Navegar entre as abas "Resumo" e "Lead time" é uma navegação que utiliza o Turbo do Hotwire.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrc5by32evcpda0v6jpt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrc5by32evcpda0v6jpt.png" alt="Pendências" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando o usuário clica na aba de pendências, desabilitamos o Turbo e é feita uma requisição de HTML ao backend que carrega nossa SPA em React e a página é exibida. Com isso, a aplicação muda para o modo SPA e as requisições voltam a ser via nossa API GraphQL com troca de JSON.&lt;/p&gt;

&lt;p&gt;Se o usuário clicar num link que já está em Hotwire, fazemos com que o React realize uma requisição de HTML e a aplicação volte a ser uma SSR.&lt;/p&gt;

&lt;p&gt;A transição do SPA para o SSR é praticamente imperceptível, mas do SSR para o SPA é um pouco mais demorada, sem atrapalhar a experiência do usuário. Nossa ideia é finalizar essa transição até a próxima edição do &lt;a href="https://www.tropicalrb.com/"&gt;Tropical.rb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Desde o dia 11 de junho, estamos rodando o Phlex em produção e, como forma de agradecimento, a Linkana passou a ser um dos &lt;a href="https://github.com/sponsors/joeldrapper#sponsors"&gt;sponsors do projeto&lt;/a&gt;. Também já começamos a contribuir com o projeto do PhlexUI.&lt;/p&gt;

&lt;p&gt;Se você também está trabalhando com componentes em Rails, deixe nos comentários o que você tem feito.&lt;/p&gt;

</description>
      <category>react</category>
      <category>hotwire</category>
      <category>rails</category>
      <category>phlex</category>
    </item>
    <item>
      <title>From React to Hotwire - Part I - [EN]</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Sun, 16 Jun 2024 12:31:21 +0000</pubDate>
      <link>https://dev.to/cirdes/from-react-to-hotwire-part-i-en-2o6g</link>
      <guid>https://dev.to/cirdes/from-react-to-hotwire-part-i-en-2o6g</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/do-react-ao-hotwire-parte-i-pt-br-1hm2"&gt;Versão em Português do Brasil&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/cirdes/from-react-to-hotwire-part-ii-en-2lim"&gt;Part II&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the latest edition of &lt;a href="https://www.tropicalrb.com/"&gt;Tropical.rb&lt;/a&gt;, I announced that &lt;a href="https://www.linkana.com/"&gt;Linkana&lt;/a&gt; would be transitioning from React to Hotwire. This transition has already begun, and I want to share with you the challenges we are encountering. Before starting, I would like to look back on my experience with the frontend of my applications over the past few years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Past - Server Side Rendering (SSR) - 2011/2017&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At my first company, &lt;a href="https://pt.wikipedia.org/wiki/Eventick"&gt;Eventick&lt;/a&gt;, we used only Rails views to create our frontend. The big challenge was creating layouts in a world where Flexbox or Grid did not exist. We relied on floats, absolute/relative positioning, and tables. JavaScript was limited to jQuery; trying to use pure JS was madness, as each browser behaved differently.&lt;/p&gt;

&lt;p&gt;During this time, JavaScript began to be taken seriously. Internet Explorer was losing market share, and the first "modern" frameworks/libs began to emerge. I started using AngularJS 1.0, still integrated with Rails views. Angular's role was to create more interactive interfaces without needing to write many lines of JS or jQuery just to hide or show an element. The JavaScript ecosystem was gaining strength, while in Rails, it was very difficult to use NPM packages. The mindset was to use gems to add JS and CSS files, but the libs would get updates while their gems would not. This was when Rails fell behind in the frontend.&lt;/p&gt;

&lt;p&gt;Shortly after, React appeared and started gaining attention, especially with the appeal of the Virtual DOM. It was a library that promised performance while being lightweight. At that time, Google decided to change the entire architecture of Angular with Angular V2, making V1 incompatible with the framework's future. Seeing Angular in crisis and React emerging, I started experimenting with React. Around this time, Eventick was sold to Sympla, and I knew my next project needed to be a SPA with React. It was inconceivable to start a startup in 2018 using the Rails approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Present - SPA - 2017/2024&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At Linkana, we opted for GraphQL after reading an &lt;a href="https://medium.com/airbnb-engineering/how-airbnb-is-moving-10x-faster-at-scale-with-graphql-and-apollo-aa4ec92d69e2"&gt;article from Airbnb&lt;/a&gt; mentioning that they were advancing 10 times faster with GraphQL and Apollo. But also due to my frustration with Redux, which always seemed like a complex and bureaucratic solution to me. Looking back, I believe it was the right decision. With Apollo and GraphQL, we could develop APIs in less time and avoid the complexity of managing state with Redux, Reflux, etc. However, the main drawback of GraphQL is that it makes the N+1 problem quite complex, something we still face today. Additionally, it complicates implementing cache in requests, though fortunately, this is not a problem we need to tackle at Linkana.&lt;/p&gt;

&lt;p&gt;React also proved to be a good bet due to the large number of available libraries. On the other hand, being a library and not a framework, React code tends to become messy. It lacks the conventions of Rails. This is something we face at Linkana, but I don't consider it one of the most serious problems. We always try to organize our components using &lt;a href="https://medium.com/pretux/atomic-design-o-que-%C3%A9-como-surgiu-e-sua-import%C3%A2ncia-para-a-cria%C3%A7%C3%A3o-do-design-system-e3ac7b5aca2c"&gt;Atomic Design&lt;/a&gt; and a folder structure that we believe makes sense.&lt;/p&gt;

&lt;p&gt;Another important bet at the beginning of Linkana was &lt;a href="https://v2.grommet.io/"&gt;Grommet&lt;/a&gt;, a UI framework that offers React components for creating interfaces. Some may think it was a wrong bet since we eventually moved away from it and Grommet never took off, but that was not the case. At the time, we believed that "creating our own Design System" was a vanity common in many companies, large and small. This mentality, I believe, was a legacy of &lt;a href="https://getbootstrap.com/"&gt;Twitter Bootstrap&lt;/a&gt;. Although Bootstrap was the first UI library to become popular, its strength was never customization. As a result, many sites ended up looking similar. Grommet, besides being a ready-to-use UI framework, was the only one available in 2017/2018 with a Figma file. More popular options like MUI and Ant Design did not offer this feature. Having the Figma file meant that design projects would be done within Grommet's sandbox, avoiding unnecessary customizations.&lt;/p&gt;

&lt;p&gt;This architecture served Linkana well for a few years until we realized that Grommet, which initially made our work easier, was becoming an obstacle when we needed to make simple customizations. Additionally, it distanced us from CSS; we were learning Grommet, but not CSS. It was then that we set out to find Stack V2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack V2 with Shadcn and Tailwind&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Linkana's Stack V2 needed to maintain or increase our productivity while allowing us to make the minimal modifications we still desired.&lt;/p&gt;

&lt;p&gt;The first bet I made was on Tailwind. Tailwind is known for "looks ugly and feels good." At first, many people may feel repulsed by looking at Tailwind classes in an HTML tag, but after a few hours of use, you realize how convenient it is not to worry about separate .css files anymore. Everything is available through classes. To understand this, I had to work on a side project.&lt;/p&gt;

&lt;p&gt;Soon after, I discovered a new concept called "unstyled-ui," which are JS libraries that implement all the behavior of library components, leaving the CSS to be applied by you. Good examples are: &lt;a href="https://www.radix-ui.com/"&gt;Radix-ui&lt;/a&gt;, &lt;a href="https://headlessui.com/"&gt;Headless-ui&lt;/a&gt;, and &lt;a href="https://tanstack.com/"&gt;Tanstack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The idea of having components without UI like Radix allows it to be added to any project. It is no longer necessary to "fight" to remove the component's style and make it fit your project. Or reinvent the wheel and build the component from scratch. When I saw this, the direction made a lot of sense to me.&lt;/p&gt;

&lt;p&gt;But the real find was &lt;a href="https://ui.shadcn.com/"&gt;Shadcn&lt;/a&gt;. Shadcn is a library that brings together all these concepts. It uses Radix as a base, incorporates Tailwind to add style to Radix, and has a Figma file. Additionally, Shadcn innovated in one more aspect: instead of being an npm/lib package, it is just a set of reusable code that you can copy and paste into your project. As it says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is NOT a component library. It's a collection of reusable components that you can copy and paste into your apps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although this might seem strange, I have seen this model being increasingly applied in other projects, as it allows you to use components while giving you a customization possibility like never before. It combines the practicality of Bootstrap with the customization of a bespoke "Design System." Additionally, it includes an &lt;a href="https://v0.dev/"&gt;AI for generating graphical interfaces&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bringing all this together, we have Linkana's React SPA frontend.&lt;/p&gt;

&lt;p&gt;I will talk about Hotwire in &lt;a href="https://dev.to/cirdes/from-react-to-hotwire-part-ii-en-2lim"&gt;part II&lt;/a&gt; of this article.&lt;/p&gt;

</description>
      <category>hotwire</category>
      <category>react</category>
      <category>rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Do React ao Hotwire - Parte I - [PT-BR]</title>
      <dc:creator>Cirdes Henrique</dc:creator>
      <pubDate>Sun, 16 Jun 2024 12:19:29 +0000</pubDate>
      <link>https://dev.to/cirdes/do-react-ao-hotwire-parte-i-pt-br-1hm2</link>
      <guid>https://dev.to/cirdes/do-react-ao-hotwire-parte-i-pt-br-1hm2</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/cirdes/from-react-to-hotwire-part-i-en-2o6g"&gt;English version available&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/cirdes/do-react-ao-hotwire-parte-ii-pt-br-3aa4"&gt;Parte II&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na última edição do &lt;a href="https://www.tropicalrb.com/"&gt;Tropical.rb&lt;/a&gt;, anunciei que a &lt;a href="https://www.linkana.com/"&gt;Linkana&lt;/a&gt; iria iniciar a transição do React para o Hotwire. Essa transição já começou e quero contar para vocês quais desafios estamos encontrando. Antes de começar, gostaria de fazer uma retrospectiva de como tem sido minha experiência no Frontend das minhas aplicações nos últimos anos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passado - Server Side Rendering (SSR) - 2011/2017&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na minha primeira empresa, &lt;a href="https://pt.wikipedia.org/wiki/Eventick"&gt;Eventick&lt;/a&gt;, usávamos apenas as views do Rails para criar nosso Frontend. O grande desafio era elaborar layouts em um mundo onde Flexbox ou Grid não existiam. Dependíamos de floats, posicionamento absoluto/relativo e tabelas. O JavaScript se resumia ao jQuery; tentar usar JS puro era uma loucura, já que cada navegador se comportava de maneira diferente.&lt;/p&gt;

&lt;p&gt;Nessa época, o JavaScript começou a ser levado a sério. O Internet Explorer estava perdendo mercado e os primeiros frameworks/libs "modernos" começaram a surgir. Comecei a utilizar o AngularJS 1.0, ainda integrado com as views do Rails. O papel do Angular era criar interfaces mais interativas, sem que fosse necessário escrever várias linhas de código em JS ou jQuery apenas para ocultar ou exibir um elemento. O universo JavaScript estava ganhando força, enquanto no Rails era muito difícil usar os pacotes do NPM. O mindset era utilizar gems para adicionar arquivos JS e CSS, mas as libs recebiam atualizações mas as suas gems não. Foi o momento em que o Rails ficou para trás no Frontend.&lt;/p&gt;

&lt;p&gt;Pouco tempo depois, o React apareceu e começou a chamar atenção, principalmente com o apelo do DOM Virtual. Era uma lib que prometia desempenho ao mesmo tempo que era leve. Nesse momento, o Google decidiu mudar toda a arquitetura do Angular com o Angular V2, tornando o V1 incompatível com o futuro do Framework. Vendo o Angular em crise e o React emergir, comecei a brincar com o React. Foi mais ou menos nessa época que a Eventick foi vendida para a Sympla e eu sabia que meu próximo projeto precisaria ser um SPA com React. Era inconcebível iniciar uma startup em 2018 utilizando o caminho do Rails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Presente - SPA - 2017/2024&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na Linkana, optamos pelo GraphQL depois de ler um &lt;a href="https://medium.com/airbnb-engineering/how-airbnb-is-moving-10x-faster-at-scale-with-graphql-and-apollo-aa4ec92d69e2"&gt;artigo do Airbnb&lt;/a&gt; mencionando que estavam avançando 10 vezes mais rápido com o GraphQL e o Apollo. Mas também devido à minha frustração com o Redux, que sempre me pareceu uma solução complexa e burocrática. Olhando para trás, acredito que foi uma decisão acertada. Com o Apollo e o GraphQL, conseguimos desenvolver APIs em menos tempo e nos livramos da complexidade de lidar com o estado usando Redux, Reflux, etc. No entanto, o principal ponto negativo do GraphQL é que ele torna o problema de N+1 bastante complexo, algo que ainda enfrentamos hoje. Além de dificultar a implementação de cache nas requisições, felizmente não é um problema que precisamos enfrentar na Linkana.&lt;/p&gt;

&lt;p&gt;O React também se mostrou uma aposta acertada, devido à grande quantidade de bibliotecas disponíveis. Por outro lado, por ser uma biblioteca e não um framework, o código React geralmente tende a se tornar bagunçado. Falta a convenção do Rails. Isso é algo que enfrentamos na Linkana, mas não considero ser um dos problemas mais graves. Sempre tentamos organizar nossos componentes utilizando o &lt;a href="https://medium.com/pretux/atomic-design-o-que-%C3%A9-como-surgiu-e-sua-import%C3%A2ncia-para-a-cria%C3%A7%C3%A3o-do-design-system-e3ac7b5aca2c"&gt;Atomic Design&lt;/a&gt; e uma estrutura de pastas que acreditamos fazer sentido.&lt;/p&gt;

&lt;p&gt;Outra aposta importante no início da Linkana foi o &lt;a href="https://v2.grommet.io/"&gt;Grommet&lt;/a&gt;, um framework UI que oferece componentes React para criação de interfaces. Alguns podem pensar que foi uma aposta errada, já que eventualmente migramos dele e o Grommet nunca decolou, mas não foi o caso. Na época, tínhamos em mente que a "criação do nosso Design System" era uma vaidade comum em muitas empresas, grandes e pequenas. Essa mentalidade, acredito, foi um legado do &lt;a href="https://getbootstrap.com/"&gt;Twitter Bootstrap&lt;/a&gt;. Embora o Bootstrap tenha sido a primeira biblioteca de UI a se popularizar, seu ponto forte nunca foi a personalização. Como resultado, muitos sites acabaram com uma aparência semelhante. O Grommet, além de ser um framework UI pronto, foi o único disponível em 2017/2018 que tinha o arquivo do Figma disponível. Outras opções mais populares, como MUI e Ant Design, não ofereciam esse recurso. Ter o arquivo do Figma significava que os projetos de design seriam realizados dentro do Sandbox do Grommet, evitando a necessidade de personalizações desnecessárias.&lt;/p&gt;

&lt;p&gt;Essa arquitetura serviu bem à Linkana por alguns anos, até percebermos que o Grommet, que inicialmente facilitava nosso trabalho, estava se tornando um obstáculo quando precisávamos fazer customizações simples. Além disso, ele nos afastava do CSS; estávamos aprendendo Grommet, mas não CSS. Foi então que partimos em busca da Stack V2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack V2 com Shadcn e Tailwind&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Stack V2 da Linkana precisava manter ou aumentar nossa produtividade, ao mesmo tempo que nos permitisse fazer as modificações mínimas que ainda desejávamos.&lt;/p&gt;

&lt;p&gt;A primeira aposta que fiz foi no Tailwind. O Tailwind é conhecido por "looks ugly and feels good". A princípio, muitas pessoas podem sentir repulsa ao olhar as classes do Tailwind em uma tag HTML, mas depois de algumas horas de uso, percebe-se o quão conveniente é não precisar mais se preocupar com arquivos .css separados. Tudo está disponível através de classes. Para compreender isso, tive que trabalhar em um projeto paralelo.&lt;/p&gt;

&lt;p&gt;Logo depois, descobri um conceito novo chamado "unstyled-ui", que são bibliotecas JS que implementam todo o comportamento dos componentes de uma biblioteca, deixando o CSS para ser aplicado por você. Bons exemplos são: &lt;a href="https://www.radix-ui.com/"&gt;Radix-ui&lt;/a&gt;, &lt;a href="https://headlessui.com/"&gt;Headless-ui&lt;/a&gt; e &lt;a href="https://tanstack.com/"&gt;Tanstack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A ideia de ter componentes sem UI como o Radix permite que ele seja adicionado a qualquer projeto. Não é mais necessário "lutar" para remover o estilo do componente e fazê-lo se adequar ao seu projeto. Ou ter que reinventar a roda e fazer o componente do zero. Quando vi isso, essa direção fez muito sentido para mim. &lt;/p&gt;

&lt;p&gt;Mas o grande achado mesmo foi o &lt;a href="https://ui.shadcn.com/"&gt;Shadcn&lt;/a&gt;. O Shadcn é uma biblioteca que reúne todos esses conceitos. Ele usa o Radix como base, incorpora o Tailwind para adicionar estilo ao Radix e possui um arquivo do Figma. Além disso, o Shadcn inovou em mais um aspecto: em vez de ser um pacote npm/lib, ele é apenas um conjunto de código reutilizável que você pode copiar e colar em seu projeto. Como ele mesmo diz:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Isto NÃO é uma biblioteca de componentes. É uma coleção de componentes reutilizáveis que você pode copiar e colar nos seus aplicativos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Embora isso possa parecer estranho, tenho visto esse modelo sendo aplicado cada vez mais em outros projetos, pois ele permite que você utilize componentes, mas ao mesmo tempo te dá uma possibilidade de personalização como nunca antes foi possível. Ele junta a praticidade de um Bootstrap com a customização de um "Design System" próprio. Além disso ele conta uma &lt;a href="https://v0.dev/"&gt;IA para gerar interfaces gráficas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ao juntar tudo isso, temos o Frontend SPA com &lt;a href="https://linkanalabs.github.io/linkana/"&gt;React da Linkana&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Falarei sobre o Hotwire na &lt;a href="https://dev.to/cirdes/do-react-ao-hotwire-parte-ii-pt-br-3aa4"&gt;parte II&lt;/a&gt; desse artigo.&lt;/p&gt;

</description>
      <category>hotwire</category>
      <category>react</category>
      <category>rails</category>
      <category>ruby</category>
    </item>
  </channel>
</rss>
