
みなさん、こんにちは!新卒2年目エンジニアのasanoです。普段は、Ruby on Railsを採用したtoC向けプロダクトの開発を担当しています。
2026/4/22〜24に北海道函館市で開催されたRubyKaigi 2026に参加してきました。 Hitoshi Hasumiさん(@hasumikin)のセッション「Funicular: A Browser App Framework Powered by PicoRuby.WASM」が特に印象に残ったので、セッションの概要と実際に動かしてみた感想を共有します。
Funicularとは
FunicularはPicoRuby.WASMを使ったSPAフレームワークです。JavaScriptを一切使わず、Pure Rubyだけでブラウザアプリが書けるというのがポイントです。
このセッションを理解する上で、以下の2つのキーワードを押さえておくと良いです。
- PicoRubyとは:通常のCRubyより軽量なRubyの実装。マイコンなどリソースが限られた環境での動作を想定して作られている。
- WASMとは:WebAssemblyの略。ブラウザ上でRubyなどネイティブ言語のコードを動かすための仕組み。
なお、このセッションの登壇者であるHasumiさんこそが、PicoRubyおよびPicoRuby.WASMの作者です。
セッションの概要
セッションは前半と後半に分かれていました。
前半はPicoRuby.WASMの紹介です。PicoRubyといえばLチカ(LEDをチカチカ点滅させること)ということで、PicoRuby.WASMを使ってブラウザ上でLチカのデモを見せてくれました。赤と緑のLEDを交互に点滅させたり、デバッガーを使ってコンソールからLEDの点滅を操作したりと、JavaScriptがなくてもここまでできるのか!という驚きがありました。 WASMを使う理由として語られていた「Rubyistなら全てRubyで書きたい」という思想は、まさにRubyKaigiらしい熱量を感じるポイントでした。
後半はFunicularの紹介です。Tic-Tac-ToeやTODOリストなどをFunicularを使用して実装したデモが紹介されました。サンプルコードも公開されており、セッション後すぐに手元で試せる内容でした。
本セッションの登壇スライドはこちらです。デモの背景にある技術的な詳細が気になる方は、ぜひこちらもあわせてご覧ください!
実践
PicoRuby.WASMでLチカしてみた
多くのセッションの中でも、特にこのセッションは、PicoRuby.WASMで実装する方法の具体的なイメージが湧きやすいものでした。これなら私でも試せるはず!と早速手を動かしたくなり、まずはFunicularを使わず素朴にPicoRuby.WASMでLチカを実装してみようと思いました。 こちらのサンプルコードを参考にAIと対話しながらコードを書いてみたところ、PicoRuby初心者、Lチカ経験もない私でも簡単にLチカデモを作ることができました。

require 'js' red_led = JS.document.getElementById('red_led') green_led = JS.document.getElementById('green_led') 3.times do red_led.setAttribute('class', 'on') green_led.setAttribute('class', '') sleep 0.5 red_led.setAttribute('class', '') green_led.setAttribute('class', 'on') sleep 0.5 end
普通はマイコンで行うLチカですが、私の初LチカはまさかのブラウザでのLチカとなりました。マイコンでのLチカはまた別の機会に挑戦しようと思います。
Funicularを使ってLチカを書き直してみた
素朴にPicoRuby.WASMでLチカすることはできたので、今度はFunicularを使ってLチカしてみようと思います。
class LED < Funicular::Component def render color = props[:color] led_class = "led #{color}#{props[:on] ? ' on' : ''}" div(class: led_class) end end class App < Funicular::Component def initialize_state { red_on: false, green_on: false } end def component_mounted 3.times do patch(red_on: true, green_on: false) sleep 0.5 patch(red_on: false, green_on: true) sleep 0.5 end end def render div do component(LED, color: 'red', on: state.red_on) component(LED, color: 'green', on: state.green_on) end end end Funicular.start(App, container: 'app')
Funicularを使ってLチカを書き直してみたらこのようなコードになりました。LEDをクラスで表現できるのがRubyらしいなと感じました。
Funicularの強み活かせてる?
実装を終えて、2つのコードを見比べてみた時に、ある違和感にぶつかりました。確かにFunicularを使用した方がRubyらしくはなりましたが、シンプルさという点では、素のPicoRubyの方が圧倒的に実装量が少なくスッキリしています。わざわざフレームワークを導入して、コードを複雑にしてまで得られるメリットは何なのか。単なるLチカだけでは見えてこない、Funicularをあえて使う理由を、自分なりに掘り下げてみることにしました。
Funicularの強みを活かしてみた
Funicularの強みはコンポーネントの再利用にあると思い、「機能が増えたり部品を使い回したくなったら?」という視点で試してみることにしました。実装したのは、ボタンで各LEDを個別にON/OFFできる仕組みです。
class LED < Funicular::Component def initialize_state { on: false } end def toggle(event) patch(on: !state.on) end def render color = props[:color] led_class = "led #{color}#{state.on ? ' on' : ''}" div(class: led_class) button(class: "btn-#{color}", onclick: :toggle) { color.upcase } end end class App < Funicular::Component def render div(id: 'led_container') do component(LED, color: 'red') component(LED, color: 'green') end end end Funicular.start(App, container: 'app')

素のPicoRuby.WASMでは、LEDを増やすたびに似たようなロジックを書き足す必要がありますが、Funicularならコンポーネントを呼び出すだけで済みます。LEDの点灯ロジックやボタンの動作はLEDクラスの中に閉じ込め、AppクラスはどのLEDを置くかだけを知っていれば良いです。そういう役割分担ができることこそが、Funicularの強みを活かした使い方でした。
まとめ
本記事ではRubyKaigi 2026のセッション「Funicular: A Browser App Framework Powered by PicoRuby.WASM」の内容と、実際に手を動かして分かった Funicular の面白さと、使い分けのポイントについて紹介しました。 セッションで刺激を受け、実際に手を動かしてみることで、JavaScriptなしでブラウザアプリが書けるというPicoRuby.WASMの可能性を感じました。今後PicoRuby.WASMがどのように進化していくのか、JavaScriptを書かない世界が訪れるのか、、、そんな想像をしてワクワクしています。 また、Funicularを使用することで、よりRubyらしい再利用可能なコンポーネント設計ができることも体感できました。 セッションを聞く前は「内容が難しそう」という不安もありましたが、実際に自分の手で動かして試せたことで、一気に親近感が湧きました。興味の向くままに一歩踏み込んでみたことが、一番の学びになったと感じています。
最後まで読んでいただきありがとうございました!また来年のRubyKaigi 2027でお会いしましょう!