SYNCPRES / HTML MODE

任意のHTMLスライドを、
1行で追従可能にします。

reveal.js・impress.js・自作のHTMLスライドに <script> を1つ追加するだけ。発表者端末の操作を、別端末の画面がリアルタイムで追従します。HDMIケーブルが壇上まで届かない会場で、あなたのスマホから会場PCのスライドを操作できます。

2分でセットアップ

1. Supabaseクライアントと sync-lite.js を読み込む

<script src="https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2/dist/umd/supabase.min.js"></script>
<script src="https://syncpres.app/sync-lite.js"
        data-session-id="my-talk-2026"
        data-framework="reveal"></script>
既に貼ってある方はそのままで大丈夫です
以前に案内していた https://sadame-client-docs.pages.dev/syncpres/sync-lite.js今後も動き続けます。貼り替えは不要です。
新しく貼るときだけ、上の syncpres.app を使ってください。

2. URLパラメータで役割を決める

URL挙動
?role=presenter発表者端末。矢印キーで操作、スライド変更を送信
?role=display表示端末。発表者に追従、カーソル非表示
(未指定)発表者として起動、sidを自動生成してURLに埋め込む

3. 接続

発表者端末で起動 → 画面下に「表示側URL」が表示 → それを会場PCのブラウザで開く。以上。

完成形の例

4枚だけの最小サンプルです。開くと操作端末になり、画面の下に表示端末用のURLが出ます。それを別のタブか会場のPCで開くと、ページ送りが揃います。

https://syncpres.app/html-mode-demo

同期のために書いてあるのは <script> 1行と、onSlide / broadcast の2箇所だけです。ソースを表示すれば全部見えます。

対応フレームワーク

reveal.js(data-framework="reveal"

reveal.js本体を先に読み込んで Reveal.initialize() を呼んだ後に、sync-lite.jsを読み込む。自動でアダプターが繋がります。

<script src="...reveal.js"></script>
<script>
  Reveal.initialize({
    hash: false,
    keyboard: new URLSearchParams(location.search).get('role') !== 'display'
  });
</script>
<script src="...sync-lite.js" data-framework="reveal"></script>
必須設定
表示端末側で keyboard: falsetouch: falsecontrols: falsehash: false にしておく(発表者に操作権を集約するため)。上記例のように role パラメータで分岐する。

impress.js(data-framework="impress"

<div id="impress">
  <div class="step">Slide 1</div>
  <div class="step">Slide 2</div>
</div>
<script src="...impress.js"></script>
<script>impress().init();</script>
<script src="...sync-lite.js" data-framework="impress"></script>

自作スライド(data-framework="custom"

任意のスライド実装。SyncPresのAPIで手動配線:

<script src="...sync-lite.js" data-framework="custom"></script>
<script>
  SyncPres.onReady(() => {
    // 表示側: 受信した番号でスライドを切り替える
    SyncPres.onSlide(h => myRenderer.goto(h));

    // 発表者側: スライド変更時に送信
    if (SyncPres.role === 'presenter') {
      myRenderer.on('change', h => SyncPres.broadcast(h));
    }
  });
</script>

data-* 属性オプション

属性デフォルト説明
data-session-idsyncpres-liteチャンネル名のプレフィックス。発表名で分ける
data-frameworkcustomreveal / impress / custom
data-heartbeat1000再送間隔(ミリ秒)。ネット不安定時は短く
data-auto-uitrue接続状態の小さな表示を出すかどうか。自分でUIを作るなら false

JavaScript API

API説明
SyncPres.role"presenter" or "display"
SyncPres.sidセッションID(文字列)
SyncPres.broadcast(h)スライド番号を送信(発表者側)
SyncPres.onSlide(fn)スライド受信時のハンドラ登録(表示側)
SyncPres.onReady(fn)初期化完了時のコールバック
SyncPres.getChannel()生のSupabase channelへアクセス(拡張用)

会場で困りそうなことへの対策

できないこと

PDF版との違い

SyncPres PDF版SyncPres HTML Mode
素材PDFアップロード任意のHTMLスライド
デザイン自由度元PDF依存CSS/JSで完全カスタム
動画・アニメ不可可(reveal.jsの機能すべて使える)
ホストSyncPres側自分のサイト or Pages
同期対象PDFページスライドインデックス
参加者が開くURLsyncpres.app が発行するURL(QRで配る)あなたのサイトのURL(自分で配る)
回答を集める投票・人数カウント・コメントを収集ページ送りのみ(回答収集は開発中)