Show HN: RePlaya – セルフホスト型ブラウザセッションリプレイでライブテール機能付き

2026/06/03 2:40

Show HN: RePlaya – セルフホスト型ブラウザセッションリプレイでライブテール機能付き

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

RePlaya は、S2 プロトコルに基づいて構築されたセルフホスト型のセッションレプレイプラットフォームであり、各セッションは単一の S2 ストリームとして保存され、別途データベースやオブジェクトストレージを必要としない。S2 ストリームはリアルタイムで尾部を追跡(tail)でき、マウントされたプレーヤーを通じてアクティブなセッションのライブレプレイおよび完了したセッションの再生を可能にする。

インストールには、S2 アクセストークンと Basin が必要であり、

.env.local
S2_ACCESS_TOKEN
S2_BASIN
といった変数およびセルフホストされた
s2-lite
用のエンドポイントを指定するオプションが設定できる。開発環境では、ローカル API は
http://localhost:8787
で動作し、Vite がダッシュボードを
http://localhost:5173
で提供する。

レコーディングを開始するためのドロップイン型のレコーダースニペットが提供されており、オプションのメタデータフィールド「source」と

distinctId
/
userId
タギングをサポートする。デフォルトでは、すべての入力要素(input/select/textarea)の値は
rrweb maskAllInputs
を使用してマスクされ、生の状態をキャプチャするには
maskAllInputs: false
を渡す必要がある。機密性の高い UI 領域を除外するには、CSS クラス名
replaya-block
または
replaya-ignore
を追加する。

本番環境では、公開の書き込み専用コレクタールート(例:

/recorder.js
/events
)とアクセスレイヤー(VPN および oauth2-proxy など)の背後にあるプライベートダッシュボード/読み取り API に分離してデプロイされる。セキュリティは
NODE_ENV=production
の際に強制され、安定した
REPLAYA_APPEND_TOKEN_SECRET
が必要であり、デフォルトではオリジンレスのインゲストが無効化される。有用な設定には
REPLAYA_SESSION_CREATE_RATE_LIMIT
(60/分)、
REPLAYA_MAX_EVENTS_PER_BATCH
(100)、および
REPLAYA_JSON_BODY_LIMIT
(8MB)が含まれる。

Docker デプロイメントでは、コンパイル済みの単一のサーバーイメージ(

node dist-server/server/index.js
)を使用し、非ルートユーザーとして実行し、ヘルスチェック用の組み込みのエンドポイント
/api/health
を提供する。

テスト用には、S2 の必要のない

pnpm test
によるユニットテストおよび煙突测试を実行するか、または
S2_TEST_ENDPOINT
を使用して実際の
s2-lite
インスタンスに対する統合テストを実行する。

本文

RePlaya セッションリプレイシステム

S2(StreamStore)を基盤とした、セルフホスト対応のセッションリプレイ機能です。

概要と特徴

  • アーキテクチャ: 各セッションは単一の S2 ストリーム として保存され、これがシステム全体のバックエンドとなります。
    • データベース、メッセージバス、オブジェクトストア、検索インデックスの別途設置は不要です。
  • リアルタイム性: S2 ストリームは書き込みながらテール(追跡)可能です。
    • 来訪者がページ内にいる間にもライブでセッションを再生できます。
    • 完了したセッションも巻き戻して表示可能です。
  • 導入の簡単さ: サイトにレコーダーのスクリプトを追加するだけで、セッションはストリーム形式で保存され、後からライブテールやフィルタリング、エクスポートが可能です。

デモ

  • リストに新しいセッションが出現し、その S2 ストリームからライブテールされています。
  • 来訪者がアプリを使用するにつれて、再生画面とアクティビティフィードもリアルタイムで更新されます。

クイックスタート

初期設定 (
.env.local
)

S2 アクセストークンとバジンを準備し、以下を記述してください:

S2_ACCESS_TOKEN=replace-with-an-s2-access-token
S2_BASIN=replaya-your-name
PORT=8787
  • バシン(データ蓄積領域): 初回使用時に RePlaya のデフォルトストリーム設定で自動作成されます。
  • ヘルスチェック: ダッシュボードのインジケーターに、利用可能なバシンと実効的な S2 エンドポイントが表示されるため接続確認が可能です。
  • 他社製品との互換性:
    s2-lite
    や他の互換環境を使用する場合、以下のようにエンドポイントを明示的に設定してください:
S2_ACCOUNT_ENDPOINT=http://localhost:7070
S2_BASIN_ENDPOINT=http://localhost:7070

サーバー起動とポート情報

依存関係をインストールし、開発サーバーを起動します。以下のポートで動作します:

  • API:
    http://localhost:8787
  • Vite ダッシュボード:
    http://localhost:5173

テスト用録画(計器化なし)

他のアプリケーションを計器化せず、テスト用のレコーディングを行うには、以下の URL をブラウザで開いてください:

  • http://localhost:8787/recorder-test

本番環境風のローカル実行

Express で单一ポートからすべてのコンポーネントをビルド・提供する場合:

pnpm build
pnpm start

その後、

http://localhost:8787
を開いてください。


ドロップインレコーダー

任意のページに以下のスクリプトを追加することで、レコーディングを開始できます(例:RePlaya のホスト URL 接続):

<script>
  !function(w,d,s,u){w.replaya=w.replaya||function(){(w.replaya.q=w.replaya.q||[]).push(arguments)};var e=d.createElement(s);e.async=1;e.src=u;d.head.appendChild(e)}(window,document,"script","https://replaya.example.com/recorder.js");
  replaya("init", {
    apiHost: "https://replaya.example.com",
    source: "web-app"
  });
</script>

ローカル開発環境:

  • ホスト:
    http://localhost:8787
  • 専用パス:
    /recorder-test
    (上記スクリプトを使用して録画)

カスタマイズオプション

  • source
    : アプリ、サイト、環境、テナントごとにキャプチャをグループ化するためのメタデータ。
  • distinctId
    /
    userId
    : セッションにアプリケーション識別子をタグ付けするために渡す ID。
  • セキュリティ設定 (
    maskAllInputs
    )
    :
    • デフォルトでは、入力値(パスワード、メールアドレスなど)は一切サーバーに送信されません(rrweb の機能)。
    • 生状態キャプチャが必要な場合は、以下のいずれかを実装してください:
      replaya("init", ..., { maskAllInputs: false })
      // または HTML アтриビュートで設定
      <script data-mask-all-inputs="false">...</script>
      
  • 除外設定:
    • マスキングは入力値のみをカバーします。DOM にレンダリングされたテキストは記録されます。
    • 機密情報を除外するには
      replaya-block
      クラス、子ツリーの変更をスキップするには
      replaya-ignore
      クラスを使用してください。
  • 本番環境推奨: ダッシュボードと読み込み専用 API はプライベートにし、収集(collect)専用のルーティングのみをパブリックに公開してください。

S2 上で動作する仕組み

セッション録画はログの一種であり、追加専用かつ順序付け・タイムスタンプ付与されたイベントの列です。RePlaya は各セッションを単一の S2 ストリームとして保存し、同様に読み出すため、通常複数のシステムに分散させる必要な機能を一つのプロセスで完結させます。

主要機能

  • ストレージ:
    • rrweb イベントは、S2 プライダー API を介してセッションストリームの末尾に追加されます。
    • バッチ処理、バックプレッシャー制御、永続化確認が行われます。
    • オブジェクトストアの他に独立したバッファリングを行いません。大きなイベントは S2 レコードに分割され、読み込み時に再構成されます。
  • タイムライン:
    • timestamping.mode: client-require
      を採用しており、rrweb がキャプチャした時刻が各イベントレコードの S2 タイムスタンプとして書き込まれます。
    • 巻き戻し(スクラブ)タイムラインとして読み出され、Create/Stop/Heartbeat レコードはサーバー側の壁時計時間を使用します。
  • リスト表示:
    • S2 はストリームを辞書式順序で管理するため、データベースによる順序維持は不要です。
    • ストリーム名形式:
      sessions/<反転したタイムスタンプ>
    • startAfter
      パージングにより、新規セッション開始時のリスト更新もベストエフォートなサイドカーインデックスで対応します。
  • ライブテール:
    • GET
      /api/sessions/:id/live
      はスナップショットの末尾から S2 を読み出し、SSE(Server-Sent Events)を介して新しいレコードをブラウザにブリッジします。
    • 同じストリームが歴史的スクラブと現在のライブエッジの両方を提供します。
  • 並行処理:
    • ストリームの作成および停止はアクティブ/停止フェンシングトークンを発行します。
    • イベントおよびハートビートの追加はアクティブフェンシング下で実行されるため、完了したセッションが後から書き込まれることはありません。

アーキテクチャの利点

  • ストリームの自動作成: 初回追加時(
    createStreamOnAppend
    )に作成され、バジンのデフォルト設定を継承するため、プロビジョニング管理は不要です。
  • 完全なセルフホスト: S2 クラウドまたは s2-lite のいずれかに対応し、すべての処理が自分のインフラストラクチャ内で動作します。
  • セキュリティ: ブラウザには S2 トークン自体は渡されず、すべての読み書きは RePlaya サーバーを介して行われます。

一般的なリプレイバックエンドとの比較

機能一般的なリプレイバックエンドRePlaya
実行サービス数メッセージバス、分析ストア、関係型 DB、オブジェクトストア、検索インデックスノードサーバー 1 つ + S2
ライブセッションインゲスト/フラッシュの遅延後に再生同じストリームからアクティブセッションをライブテール
保存済み録画オブジェクトストレージのバイナリ+分散データベースのメタデータセッションごとの順序付き S2 ストリーム
セルフホスト足跡マルチサービスクラスタ(通常 Kubernetes)サンプルプロセス 1 つ + S2(または s2-lite)

全体設計については ARCHITECTURE.md を参照してください。


設定とデプロイメント

サーバー側のみを S2 に依存する設定は、以下の通り

.env.local
などに記述します。

  • 本番環境: RePlaya は収集用インターフェースをパブリックにし、ダッシュボードおよび読み取り専用 API をプライベートとして扱います。

セキュリティとアクセス制御

  1. API の公開制限:

    • 読み込み用 API(
      GET /api/sessions*
      ,
      /api/health
      など)はインターネットに公開しないでください。SSO やアクセスクонтроールレイヤー(VPN, Cloudflare Access など)の背後に置きます。
    • 公開側には収集用エンドポイントのみを公開し、以下のルートを厳密に制限してください:
      • GET /recorder.js
      • GET /vendor/rrweb.min.js
      • 書き込み専用エンドポイント(
        POST /api/sessions
        ,
        /events
        ,
        /heartbeat
        ,
        /stop

    これらを環境変数で制御します:

    REPLAYA_ALLOWED_CAPTURE_ORIGINS=...
    REPLAYA_PROJECT_KEY=pk_live_...
    
  2. 本番環境設定:

    • NODE_ENV=production
      を設定し、インゲスト認証を強制します。
    • トークンなしでのサーバー起動はブロックされます。
    • リバースプロキシの背後で動作する場合は
      REPLAYA_TRUST_PROXY=true
      を設定し、クライアント IP によるレート制限に正確に対応させてください。

推奨される環境変数(本番)

NODE_ENV=production
REPLAYA_PROJECT_KEY=pk_live_replace_with_public_write_key
REPLAYA_APPEND_TOKEN_SECRET=replace-with-a-long-random-secret
REPLAYA_ALLOWED_CAPTURE_ORIGINS=https://app.example.com,https://www.example.com
REPLAYA_TRUST_PROXY=true
  • プロジェクトキー: レコーダーの初期化時に
    apiHost
    と共に渡されます。
  • セッション作成: 短いライフタイムを持つ追加トークンが返され、イベント書き込み時に送信されます。

レート制限と制御パラメータ

  • REPLAYA_SESSION_CREATE_RATE_LIMIT
    : デフォルト 60 回/分/クライアント × プロジェクト
  • REPLAYA_SESSION_APPEND_RATE_LIMIT
    : デフォルト 600 回/分/クライアント × セッション
  • REPLAYA_MAX_EVENTS_PER_BATCH
    : デフォルト 100
  • REPLAYA_JSON_BODY_LIMIT
    : デフォルト 8 MB
  • REPLAYA_APPEND_TOKEN_TTL_MS
    : デフォルト 86400000 ms(1 日)
  • REPLAYA_LOG_REQUESTS
    : すべてのリクエストに対してアクセスログを出力(開発:ON、本番:OFF;エラーは常に記録)。
  • REPLAYA_SHUTDOWN_GRACE_MS
    : デフォルト 10,000 ms。停止時に進行中のリクエストをドレインし、滞っているストリームを放棄します。

境界制御の詳細については ARCHITECTURE.md を参照してください。


Docker

ビルドと実行

docker build -t replaya .
docker run --rm -p 8787:8787 \
  -e NODE_ENV=production \
  -e S2_ACCESS_TOKEN=... \
  -e S2_BASIN=... \
  -e REPLAYA_PROJECT_KEY=pk_live_... \
  -e REPLAYA_APPEND_TOKEN_SECRET="$(openssl rand -hex 32)" \
  -e REPLAYA_ALLOWED_CAPTURE_ORIGINS=https://app.example.com \
  replaya
  • 実行ユーザー: イメージは単一コンパイルされたサーバーを非ルートユーザーとして実行します。
  • 公開ルートの制限: 収集用とレコーダー用ルートのみに限ってください。

セcrets の扱い方

  • シークレットは
    -e VAR=value
    またはシークレットマネージャーから渡してください。
  • ローカルの
    .env
    を再利用しないでください。
  • docker --env-file
    を使用する場合は、クォート付きの値(例:
    "..."
    )がそのままコンテナ内へ到達しないよう注意が必要です。

スクリプトコマンド

  • pnpm dev
    : API および Vite(ダッシュボード)を起動
  • pnpm build
    : クライアント/サーバーの型チェックを行い、フロントエンドをビルド
  • pnpm lint
    : ESLint を実行
  • pnpm test
    : ユニットテストおよびスモークテストを実行(レコーダー不変性+HTTP スモーク)。S2 は必須ではありません。
  • pnpm test:integration
    : 実在する s2-lite に対し、S2 往復テストを実行

テスト

ユニットテスト (
pnpm test
)

  • レコーダーの不変性検証とサーバーの HTTP スモークテストを行います。
  • 配信機能、セキュリティヘッダー、インゲスト認証拒否などの確認が含まれます。
  • S2 がなくても実行できます。

インテグレーションテスト (
pnpm test:integration
)

  • 「作成 → 追加 → 再生 → 削除」という実際のパスを網羅します。
  • S2_TEST_ENDPOINT
    を指定しない場合、テストはスキップされます。

s2-lite の起動方法:

docker run -d -p 8080:80 ghcr.io/s2-streamstore/s2-lite

実行コマンド:

S2_TEST_ENDPOINT=http://localhost:8080 pnpm test:integration

CI ジョブ構成

CI では以下の 2 つのジョブが実行されます:

  1. ビルド/リンター/ユニットテスト: Node 20 と 24 で実行。
  2. インテグレーション: s2-lite を起動し、往復テストスイートを実行。

同じ日のほかのニュース

一覧に戻る →

2026/06/03 3:47

MAI コード 1 のフラッシュ処理

## Japanese Translation: 以下の内容は、Key Points List に含まれていた欠落していた具体的な指標およびデータポイントを統合しつつ、明瞭さを維持した改良されたバージョンです。 **Improved Summary:** MAI-Code-1-Flash は、実稼働環境で使用される GitHub Copilot harness を直接トレーニングによって訓練され、現実世界の agentic タスクを処理するコーディング AI における画期的な進歩を表します。以前の手法では正確性と効率性は排他的なものとして扱われていましたが、本モデルはこれらがシームレスに共存できることを実証しました。適応的なソリューション長制御を活用し、推論の深さを動的に調整することで、単純なリクエストには簡潔に応答し、複雑な問題にはより多くの予算を割く仕組みです。その結果、開発者は競合製品である Claude Haiku 4.5 に比べて最大 60% も少ないトークンで有用な出力をより早期に受け取り、レイテンシと運用コストを大幅に削減できます。 同じプロダクション harness 内での多様なデータセット(SWE-Bench Verified、SWE-Bench Multilingual、SWE-Bench Pro、Terminal Bench 2)を含む評価が、優位性の高いパフォーマンスを確認しました。MAI-Code-1-Flash は、テストされたすべてのコアコーディングベンチマークにおいて Claude Haiku 4.5 を凌駕し、多様で現実世界のタスクである SWE-Bench Pro で注目される +16 ポイントのリード(51.2% vs. 35.2%)を達成しました。これらの結果は、MAI-Code-1-Flash を使用する場合、より高い正確性と更大なる効率がもはやトレードオフではないことを検証し、インタラクティブなコーディングワークフローを滑らかにしつつ、全体の生産性を最適化するためのトークン投資を実現します。

2026/06/03 5:30

BYD の車部品 CT 走査検査

## Japanese Translation: 主な洞察は、現代のペットボトルが数十年前進化する工学によって最適化されており、シュリンクラップ、積み重ね、粗悪な取扱いなどに対して耐え抜き、産業物流に適合するように設計されているにもかかわらず、開封した後は実用的な使用時間がわずか数秒しかないという点にあります。この耐久性のパラドックスは、長距離輸送での耐久性に大規模な投資を行いながら製品を瞬時に廃棄するという重大な非効率性を浮き彫りにしています。重量のあるガラス(コカ・コーラの 1899 年の製瓶;エビアンが数世紀の陶器製の壺の使用の後、1908年にガラスへ転換)からプラスチックへの進化は、コスト、安全性、重量削減によって推進されました。初期のプラスチック試作には、モンサント社の「Easy-Goer」アクリロニトリルコポリマー(1975 年)があり、それが漏出と動物毒性に関する懸念から 1977年にFDA にて禁止されました。これにより、デュポン社が Polyethylene Terephthalate(PET)を導入した 1967–1973 年へと道が開かれました。1970年代後半には、大型の 2リットルボトル用の PET 生産が始まり、初期デザインは最大 96 g の重量を持ち、接着剤を用いたベースと 0.3–0.4 mm の壁厚を特徴としていました。1990年代初頭の革新としては、接着剤を使用しない「Petaloid」ベースや、より薄い壁(例:アクアフィナで約 0.2 mm)を採用するものがあり、材料使用量を大幅に削減しました。それ以降のさらなる進歩—例えば、ニージャラ・ボトルリング社の Eco-Air デザインが厚さ 0.17 mm 以下を達成し、1998年から現在にかけてプラスチック使用量を 60%削減した事例や、半リットルボトルが 2000年代中期のバージョンと比較して 75%少ないプラスチックを使用した事例—は、継続的な効率向上を反映しています。これらの進歩は企業の戦略とも整合しており、ネスレ社がペリエ社を買収(1992年)や、ペプシ/コカ・コーラがアクアフィナとダサニを中〜後半の 1990年代に発売したことは、ソーダ販売の減少への対応として行われました。しかし環境上の課題は依然として残っています。リサイクルシステムが材料の分離や汚染管理—if 特に破砕されたガラスが多材料ストリームに混入し、新しい容器にとって使用不可能になる—を失敗した場合、これらの良質に設計されたボトルは多くが埋め立て地に行き着いたり、下位利用されたりします。将来の進歩には、スマートなデザイン、厳格な材料分離プロトコル、改善されたリサイクルインフラストラクチャを通じて、サプライチェーンの耐性と廃棄物削減を調和させる必要があります。 ## Text to translate: The primary insight is that modern water bottles represent decades of advanced engineering optimized for robust industrial logistics—surviving shrink-wrapping, stacking, and rough handling—even though they have only seconds of practical use once opened. This durability paradox highlights a major inefficiency: investing heavily in long-haul resilience while discarding the product instantly. The evolution from heavy glass (Coca-Cola's 1899 bottling; Evian's switch to glass in 1908 after decades of earthenware jugs) to plastics was driven by cost, safety, and weight reductions. Early plastic attempts included Monsanto's "Easy-Goer" acrylonitrile copolymer (1975), which faced FDA bans in 1977 due to leaching and animal toxicity concerns, paving the way for DuPont's Polyethylene Terephthalate (PET) introduced around 1967–1973. By the late 1970s, PET production for large two-liter bottles began, with early designs weighing up to 96 g, featuring glued bases and wall thicknesses of 0.3–0.4 mm. Innovations in the early 1990s, such as "Petaloid" bases that eliminated glue and thinner walls (e.g., Aquafina at ~0.2 mm), cut material use significantly. Further advances since then—such as Niagara Bottling's Eco-Air designs under 0.17 mm thickness, which achieved a 60% plastic reduction from 1998 to today, and half-liter bottles using 75% less plastic than mid-2000s versions—reflect ongoing efficiency gains. These advances also align with corporate strategy: Nestlé's acquisition of Perrier (1992), and Pepsi/Coke launching Aquafina and Dasani in the mid-to-late 1990s, all in response to declining soda sales. Yet environmental challenges remain. If recycling systems fail to separate materials or manage contamination—especially with crushed glass mixed into multimaterial streams that become unusable for new containers—these well-engineered bottles often end up landfilled or downcycled. Future progress must reconcile supply chain resilience with waste reduction through smarter design, stricter material separation protocols, and improved recycling infrastructure.

2026/06/03 4:27

「グメールが私をおろかに思っている」と感じたので、退社しました。

## Japanese Translation: 著者は、嫌悪感と軽慢さを感じてしまう強制的な AI 機能のため、16 年使用してきた Gmail アカウントを恒久離脱することにした。具体的な問題は、不要なメッセージの要約、自動補填された返信文、そして「メールを書いてください」、「Tab で改善する」など、ユーザー自身がメールを作成できないか、あるいは受信者への時間の価値が低いことを示唆するような常駐的なプロンプト(促し)が含まれる。一部の AI 機能はオフにすることもできるが、それを行うことで自動的なスレッド分類といった長く使い続けられ有用な機能を犠牲にせざるを得なくなる。著者は、これらの強制的な機能が真のユーザーニーズを満たすためではなく、言語モデルの利用指標を人為的に高めるための意図的な戦術であることを疑っている。Google の従来からある安定したサービスや、fediverse を通じて独自ドメインと接続して使用している Fastmail での良好な第一印象とは裏腹に、著者はこの移行を Google エコシステムからの故意の断絶——単なるクライアントの切り替えではない——と捉えている。著者は連絡先を移す予定だが、歴史のあるメールスレッドはインポートせず、「不快な経験」として記述する後に「きれいな決別」を図る打算である。この状況はより広範な懸念を示している:技術企業は、ユーザーの自律性や長期的な信頼よりもエンゲージメントデータを優先することで、忠実な顧客を失うリスクを抱えている。 ## Text to translate: Improved Summary: The author is permanently leaving their 16-year-old Gmail account due to mandatory AI features they find intrusive and disrespectful. Specific issues include unsolicited message summaries, pre-filled replies, and persistent prompts ("help me write," "Tab to improve") that imply the user cannot compose emails themselves or that recipients do not deserve their time. While some AI features can be disabled, doing so forces users to sacrifice long-standing, useful functions like automatic thread categorization. The author suspects these unsolicited features are intentional tactics to artificially inflate language model usage metrics rather than serve genuine user needs. Despite Google's historically stable service and positive first impressions with Fastmail (which they have connected their custom domain to and use via the fediverse), the author views this move as a deliberate break from Google's ecosystem—not merely a client switch. They plan to migrate their contacts but will not import historical email threads, seeking a "clean break" after what they describe as a "bad taste" experience. The situation highlights a broader concern: tech companies risk losing loyal customers by prioritizing engagement data over user autonomy and long-term trust.

Show HN: RePlaya – セルフホスト型ブラウザセッションリプレイでライブテール機能付き | そっか~ニュース