Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Lotus
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Luca Guidi
October 14, 2014
Programming
560
8
Share
Lotus
Lotus: a complete web framework for Ruby.
Luca Guidi
October 14, 2014
More Decks by Luca Guidi
See All by Luca Guidi
Functional Web with Hanami
jodosha
4
440
Lessons Learned While Building Hanami
jodosha
4
1.1k
Lotus RubyDay 2015
jodosha
2
950
Lotus For Rails Developers
jodosha
2
320
Lotus - Brighton Ruby 2015
jodosha
3
910
A Rails Criticism
jodosha
4
1.7k
Other Decks in Programming
See All in Programming
Alternatives to JPA 2026
debop
0
110
CursorとClaudeCodeとCodexとOpenCodeを実際に比較してみた
terisuke
1
470
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
16
5.6k
Making the RBS Parser Faster
soutaro
0
370
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
4
3k
How Swift's Type System Guides AI Agents
koher
0
270
ふりがな Deep Dive try! Swift Tokyo 2026
watura
0
220
10年分の技術的負債、完済へ ― Claude Code主導のAI駆動開発でスポーツブルを丸ごとリプレイスした話
takuya_houshima
0
2.6k
mruby on C#: From VM Implementation to Game Scripting (RubyKaigi 2026)
hadashia
2
490
CDK Deployのための ”反響定位”
watany
4
770
Liberating Ruby's Parser from Lexer Hacks
ydah
2
1.2k
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
270
Featured
See All Featured
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
340
A designer walks into a library…
pauljervisheath
211
24k
Typedesign – Prime Four
hannesfritz
42
3k
Are puppies a ranking factor?
jonoalderson
1
3.3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
[SF Ruby Conf 2025] Rails X
palkan
2
960
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
99
Ruling the World: When Life Gets Gamed
codingconduct
0
210
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
210
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
450
My Coaching Mixtape
mlcsv
0
99
Transcript
Lotus A c o mp l e t e web
framework @jodosha / #lotusrb
None
Do we need yet another web framework?
Are you reinventing the wheel?
What if we never reinvented the wheel?
The wheel
None
We reinvented the wheel after observing it
Complexity should be managed, not hidden.
Why does this matter?
The ultimate goal is…
Money https://flic.kr/p/aFAEHR
Use case: http://bit.ly/github-rails-upgrade
We should not trade control for convenience.
Cost of maintenance 0 20 40 60 80 Years 0
1 2 3 Covenience Simplicity
Silver bullets are a lie.
Philosophy
Standalone frameworks
Full stack applications
Few conventions More objects No monkey- patching
Few conventions More objects No monkey- patching
Few conventions More objects No monkey- patching
Simple
Simplicity is achieved by removing what isn’t essential
Coffee https://flic.kr/p/6rX8pn
Convenient https://flic.kr/p/93Bk4K
Simple https://flic.kr/p/mn57Zm
The output https://flic.kr/p/9oG93w
Lotus doesn’t enable optional features by default
We perceive as simple the things we are familiar with
BookRepository.find 23
Rails.application.routes.draw do get '/' => 'home#index', as: :home resources :books
end ! Rails.application.routes # => ???
router = Lotus::Router.new do get '/', to: 'home#index', as: :home
resources :books end ! router.path(:home) # => '/' router.call(env) # Rack env run router # in config.ru
Fast
Micro benchmarks http://bit.ly/lotus-micro-bench
HTTP benchmarks http://bit.ly/lotus-http-bench
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Testable
Testability is a virtue
There is no “test-damaged” design
class Show include Lotus::Action ! expose :book ! def initialize(repository
= BooksRepository) @repository = repository end ! def call(params) @book = @repository.find params[:id] end end
book = Object.new repository = Minitest::Mock.new repository.expect(:find, book, [Integer]) !
action = Show.new(repository) action.call(id: 23) # => [200, {}, nil] ! repository.verify action.book.must_equal book # assigns(:book) isn’t needed
Demo
The future
Get involved
lotusrb.org #lotusrb @jodosha
Q&A
Thank you!