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://sadame-client-docs.pages.dev/syncpres/sync-lite.js"
data-session-id="my-talk-2026"
data-framework="reveal"></script>
| URL | 挙動 |
|---|---|
?role=presenter | 発表者端末。矢印キーで操作、スライド変更を送信 |
?role=display | 表示端末。発表者に追従、カーソル非表示 |
(未指定) | 発表者として起動、sidを自動生成してURLに埋め込む |
発表者端末で起動 → 画面下に「表示側URL」が表示 → それを会場PCのブラウザで開く。以上。
平成桜まつり2026の代表挨拶用スライド(reveal.js + sync-lite):
ソース: marche-slides.html
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 | falseで接続状態UIを非表示(自作UIを使う時) |
| 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 + URLの sid パラメータでチャンネル名を構成。他の発表と混線しないrequest-sync で現在位置を即時取得data-session-id にランダム文字列を含める| SyncPres PDF版 | SyncPres HTML Mode | |
|---|---|---|
| 素材 | PDFアップロード | 任意のHTMLスライド |
| デザイン自由度 | 元PDF依存 | CSS/JSで完全カスタム |
| 動画・アニメ | 不可 | 可(reveal.jsの機能すべて使える) |
| ホスト | SyncPres側 | 自分のサイト or Pages |
| 同期対象 | PDFページ | スライドインデックス |
| 視聴者の接続 | syncpres.comのURL | スライド作成者のURL |