Brut - Um novo framework web para Ruby
(naildrivin5.com)- Um framework web simples e poderoso para o ecossistema Ruby, com base em “baixa abstração” e “baixo ceremony (low-ceremony)”, oferecendo uma estrutura centrada em página, formulário e ação única sem o conceito de controller e recurso REST
- Renderização HTML no servidor, escrita direta de JS/CSS, integração com OpenTelemetry, e ferramentas Ruby modernas como Sequel e OptionParser embutidas, com instalação e desenvolvimento em poucos minutos
- Estrutura baseada em classes, com gerenciamento de sessão, formulário e parâmetro orientado a tipos reais, minimizando o uso de métodos dinâmicos e hashes para alcançar código mais claro e documentação automática
- Aproveitamento da plataforma web moderna: validação integrada entre servidor e cliente, BrutJS (Web Components), hash e bundling de CSS com esbuild, e reforço de políticas de segurança e de fundamentos de design de banco de dados
- Configuração em YAML minimizada e baseada em Ruby/Hash, com nomenclatura e separação de responsabilidades claras, com objetivo de usar Ruby e tecnologias de navegador de forma divertida sem impor abstrações ou padrões desnecessários
Principais recursos do framework Brut
Estrutura totalmente nova – centrada em páginas, sem controllers
- No lugar de controller, recurso REST e ações de rota, é composto por páginas baseadas em classes, formulários e handlers de ação única
- HTML é gerado diretamente no servidor, enquanto JS/CSS podem ser escritos como você quiser
- Exemplo: uma página de exibição de horário pode ser definida diretamente como
TimePage < AppPage
Forte adoção da plataforma web moderna
- UX de formulário com validação integrada server-side e client-side
- Suporte a extensão progressiva de HTML com BrutJS (biblioteca de web components)
- Processamento de bundle de CSS e hash com esbuild, de forma simples, sem PostCSS ou SASS
Produtividade de desenvolvimento e fundamentos incluídos
- Instrumentação baseada em OpenTelemetry, acesso a dados com Sequel, automação de linha de comando com OptionParser
- Políticas de segurança padrão, valores padrão de colunas/foreign keys do banco, timezone-aware sempre, e localização (Localization) simplificada
- Testes com RSpec, geração de dados com Faker/FactoryBot, geração de HTML com Phlex
Exclusão de YAML, estrutura de configuração clara
- I18n baseado em Hash de Ruby, configuração dinâmica gerenciada por dotenv (YAML usado quase nunca)
- Exceção de uso de YAML: apenas docker-compose
Sem abstrações ou padrões desnecessários
- Nomenclatura e estrutura claras (ex.:
WidgetsPageé acessada por/widgets) - Camada de dados (DB::Widget) e camada de domínio (Widget) podem ser separadas completamente
- Sem conceito de controller, lógica de negócio pode ser implementada do jeito que quiser
- Sem imposição de padrões funcionais complexos, mônadas, Proc etc.
Experiência de desenvolvimento e flexibilidade
- Ferramentas modernas do ecossistema Ruby, como RSpec, já incluídas por padrão
- Uso ativo de bibliotecas principais como Phlex (HTML), Faker/FactoryBot, Sequel e OpenTelemetry
- Em vez de repetitiva boilerplate/configuração/decisões, o foco é aproveitar a “diversão” de Ruby e das tecnologias do navegador
Por que Brut?
- Em vez da configuração repetitiva de frameworks existentes como Rails, das discussões constantes sobre arquitetura e estrutura e de flexibilidade desnecessária, busca-se a diversão no próprio código
- Como um framework de web app baseado em Ruby para construir e fazer deploy rapidamente, foca em produtividade e clareza
Início e roadmap futuro
- Imagem Docker oficial do Brut com suporte a criação e execução rápidas por comandos
- Exemplo de apps reais em produção como ADRs.cloud
- Previsão de atualizações contínuas para a versão 1.0 e para o roadmap oficial
3 comentários
https://naildrivin5.com/blog/2025/…
Acho que é preciso corrigir para este link
Parece que o link está apontando errado.
Comentários do Hacker News
Gosto da abordagem focada em forms e pages; eu mesmo uso algo assim nos meus apps. Toda interação é conduzida por Forms e Links, e qualquer melhoria feita com JavaScript no fundo acaba sendo só um clique em um form que já existe de alguma forma, até os ocultos. Dá para inspecionar o HTML diretamente e sempre saber com clareza qual rota está lidando com a interação. Acho que controllers são usados em excesso; na prática, forms e models (backend), junto com views (Pages), já bastam. Muita validação e vários procedimentos repetidos em controllers também poderiam ser tratados pelo framework de forma mais elegante
Gostei da explicação de que não é necessário entender conceitos complexos como monad, algebraic data types, currying, ou tratar tudo como Proc. Se você quiser usar functor na lógica de negócio, pode escolher isso à vontade. Gosto dessa flexibilidade e tenho vontade de experimentar em um projeto paralelo com alguns poucos colegas experientes
Parece um excelente meio-termo entre a simplicidade do Sinatra e a riqueza do Rails. Eu costumo usar Sinatra para apps simples e Rails quando preciso, mas para apps sem muita complexidade o Rails acabava sendo pesado demais. Estou animado para testar algo novo
Outra opção que vale considerar é o Roda. Foi ótimo para projetos pequenos e também escalava bem. O sistema de plugins facilitava expandir funcionalidades, e a routing tree também era fácil de lidar
Para mim, o hanami era o melhor meio-termo, mas vou acompanhar de perto como o bruts vai evoluir
Gosto muito do livro Sustainable Rails, do David, e é o que sempre recomendo quando o assunto é Rails. A abordagem deste framework me impressionou. Seria muito interessante se um desses frameworks alternativos menores adotasse Sorbet de forma completa para aproveitar em coisas como form validation. Claro, isso pode ir contra a proposta de gradual typing, mas mesmo como experimento seria divertido
O David não é só um desenvolvedor muito talentoso, como também é excelente em palestras. Recomendo este vídeo, que conversa com o tema do livro: https://www.youtube.com/watch?v=CRboMkFdZfg
Sorbet é bom, mas para imposição de estrutura e validação de dados (data validation) eu pessoalmente prefiro o ecossistema dry-rb
Entendi que este framework usa uma licença incomum, mas isso significa por acaso que não dá para ver o código-fonte?
Dá para ver o código no GitHub: https://github.com/thirdtank/brut
Também concordo que a licença parece um pouco estranha
Esse projeto me lembrou o antigo framework Camping, embora sem o construtor dinâmico de classe-pai
O site oficial do Brut (https://brutrb.com/overview.html) também tinha muita coisa interessante
Tentei fazer login no site de exemplo, mas encontrei um erro logo depois da autenticação via GitHub
Ainda não uso Ruby, mas o projeto me interessou e eu dei uma estrela, talvez ele acabe sendo o motivo para eu finalmente experimentar Ruby de verdade
Gostei especialmente da escolha do Phlex. Em particular, fiquei curioso se este framework também combinaria bem com a biblioteca js Datastar e com o uso de SSE (Server-Sent Events) dessa biblioteca. Obrigado