reveal.js・impress.js・自作のHTMLスライドに <script> を1つ追加するだけ。発表者端末の操作を、別端末の画面がリアルタイムで追従します。HDMIケーブルが壇上まで届かない会場で、あなたのスマホから会場PCのスライドを操作できます。
<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 を使ってください。
| URL | 挙動 |
|---|---|
?role=presenter | 発表者端末。矢印キーで操作、スライド変更を送信 |
?role=display | 表示端末。発表者に追従、カーソル非表示 |
(未指定) | 発表者として起動、sidを自動生成してURLに埋め込む |
発表者端末で起動 → 画面下に「表示側URL」が表示 → それを会場PCのブラウザで開く。以上。
4枚だけの最小サンプルです。開くと操作端末になり、画面の下に表示端末用のURLが出ます。それを別のタブか会場のPCで開くと、ページ送りが揃います。
同期のために書いてあるのは <script> 1行と、onSlide / broadcast の2箇所だけです。ソースを表示すれば全部見えます。
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: false、touch: false、controls: false、hash: false にしておく(発表者に操作権を集約するため)。上記例のように role パラメータで分岐する。
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-session-id | syncpres-lite | チャンネル名のプレフィックス。発表名で分ける |
data-framework | custom | reveal / impress / custom |
data-heartbeat | 1000 | 再送間隔(ミリ秒)。ネット不安定時は短く |
data-auto-ui | true | 接続状態の小さな表示を出すかどうか。自分でUIを作るなら false |
| API | 説明 |
|---|---|
SyncPres.role | "presenter" or "display" |
SyncPres.sid | セッションID(文字列) |
SyncPres.broadcast(h) | スライド番号を送信(発表者側) |
SyncPres.onSlide(fn) | スライド受信時のハンドラ登録(表示側) |
SyncPres.onReady(fn) | 初期化完了時のコールバック |
SyncPres.getChannel() | 生のSupabase channelへアクセス(拡張用) |
data-session-id がチャンネルを分けています。data-session-id="seminar" のような短い名前だと、たまたま同じ名前を使った第三者と繋がる可能性があります。
data-session-id="seminar-4f9c2a" のように、ランダムな文字を混ぜてください。| SyncPres PDF版 | SyncPres HTML Mode | |
|---|---|---|
| 素材 | PDFアップロード | 任意のHTMLスライド |
| デザイン自由度 | 元PDF依存 | CSS/JSで完全カスタム |
| 動画・アニメ | 不可 | 可(reveal.jsの機能すべて使える) |
| ホスト | SyncPres側 | 自分のサイト or Pages |
| 同期対象 | PDFページ | スライドインデックス |
| 参加者が開くURL | syncpres.app が発行するURL(QRで配る) | あなたのサイトのURL(自分で配る) |
| 回答を集める | 投票・人数カウント・コメントを収集 | ページ送りのみ(回答収集は開発中) |