4 min read

自社オンラインイベントを Claude Code で開発したライブ配信ツールで実現した

Claude Code で片手間に作っていた自社製品を利用したライブ配信ツール Misora Live で、自社のオンラインベントを実現しました。

今までは自社製品の開発ツールだったので見栄えが悪かったのですが、今回思い切って Claude Code で作っていたミーティングツール Misora にライブ配信機能を実装し実現する事にしました。

Misora は静的サイトとして作っており Cloudflare R2 にデプロイして終わりです。GitHub Actions から R2 にデプロイする仕組みです。

1 行もコードは書いていません。指示をしているだけです。ただしかなり細かな指示をしていますし、コンポーネントテスト、E2E テストもしっかり書いています。

URL 生成ページ

ここで入力したシークレットキーを利用して jose を使って JWT を生成して、URL パラメーターに access_token を追加しています。

視聴準備画面

ミーティング画面をそれっぽく視聴できる仕組みを作りました。

それっぽい感じで良い感じです

配信画面

配信テストで BBB を流しています。映像が乱れていますがこれは 1080p 60 fps を 500 kbps で配信しています

統計情報

配信側で視聴者の統計情報を Sora から受信していた情報を DuckDB-Wasm (OPFS) にため込んだ値を出力しています。静的サイトで OPFS を使って永続化し、DuckDB-Wasm を利用してクライアント側で集計しています。

平日の昼間かつ、マニアックなミドルウェアで企業イベントにもかかわらず 40 名以上の方に参加いただきました。ありがとうございます。

iPad の罠

今回は Chrome 136 で対応したH.265 で配信したのですが、Safari 18 以上であれば Safari でも H.265 がみれるため、 iPad で見ようとした方がミュート解除ができないという問題が発生してしまいました。これは完全に検証が漏れており、ミュートボタンが見えない状態になっていました。

以下はライブ配信終了後に Claude Code に依頼して修正して貰った結果です。数分で対応できました。

⏺ iPad Safari での videoControls の表示問題を修正しました。

  修正内容

  VideoControls.tsx の 43 行目を変更:
  - hover イベントに依存していた表示制御を、タッチデバイスでも動作するように修正
  - opacity-0 group-hover:opacity-100 → opacity-100 hover:opacity-0 hover:group-hover:opacity-100

  この変更により:
  - iPad Safari などのタッチデバイスでは常に表示される
  - PC などの hover が使えるデバイスでは従来通り hover 時のみ表示される

  すべてのテストが通過し、ビルドも成功しています。
iPad での表示、ちゃんとボタンが表示されている

Misora 利用技術

依存ライブラリ

  "devDependencies": {
    "@biomejs/biome": "2.1.0",
    "@playwright/experimental-ct-react": "1.53.2",
    "@playwright/test": "1.53.2",
    "@tailwindcss/vite": "4.1.11",
    "@types/emscripten": "1.40.1",
    "@types/node": "24.0.10",
    "@types/react": "19.1.8",
    "@types/react-dom": "19.1.6",
    "@vitejs/plugin-react": "4.6.0",
    "@vitest/ui": "3.2.4",
    "dotenv": "17.1.0",
    "fast-check": "4.2.0",
    "playwright": "1.53.2",
    "tailwindcss": "4.1.11",
    "typescript": "5.8.3",
    "vite": "7.0.3",
    "vitest": "3.2.4"
  },
  "engines": {
    "node": ">=24",
    "pnpm": ">=10"
  },
  "dependencies": {
    "@duckdb/duckdb-wasm": "1.29.1-dev263.0",
    "chart.js": "4.5.0",
    "jose": "6.0.11",
    "react": "19.1.0",
    "react-chartjs-2": "5.3.0",
    "react-dom": "19.1.0",
    "react-router-dom": "7.6.3",
    "sora-js-sdk": "2025.2.0-canary.1",
    "zustand": "5.0.6"
  },
  "pnpm": {
    "overrides": {
      "vite": "7.0.2"
    }
  }

雑感

Claude Code でライブ機能は実質 1 日かかっていません。細かい修正はしましたが、イベント開始直前まで色々いじったりしていました。大量のテストがあることから、安心して開発を進められました。

iPad でミュート解除が出来ない問題はありましたが、参加者の多くが技術者ということもありハックを探してくれて(全画面表示するとミュートが解除されるバグをみつけてくれたり、透明なミュート解除ボタンを探してくれたり)なんとか無事オンラインイベントを開催できました。

正直言って、かなりの衝撃を受けています。WebRTC SFU が時前というのもありますが、ここまでのガワを Claude Code で短期間で実現出来るとは思っていませんでした。

今後も片手間にはなりますが積極的に開発していく予定です。


Misora は既に公開しており https://misora.shiguredo.app/ から利用可能ですが、Sora / Sora Cloud / Sora Labo のどれかが必要になります。ご注意ください。

当面 Misora は OSS 化の予定はありませんが、実装が落ち着いてきてコードを整理したら Apache-2.0 として公開予定です。