Skip to content

The hosted service

deck.kadal.cc hosts published decks and runs their live rooms. You can use the engine without it — this page is for when you want a link to send and a room that holds a hall.

Sign in with Google or GitHub. You get a personal workspace, named by a handle you pick (@ada). On the Team plan a workspace is shared: everyone in it can publish to its decks, and billing is the workspace’s, not a person’s.

A published deck lives at

https://decks.kadal.cc/@<handle>/<slug>/

with its presenter view at …/presenter and its audience page at …/join, exactly as in development.

Terminal window
npx kadal-deck login # once: approve the CLI in your browser
npx kadal-deck publish # build, upload what changed, print the link

What publish does:

  1. finds or creates the deck in your workspace by its slug (the folder name, unless you pass --slug);
  2. builds it with the right base path for its address;
  3. hashes every file in dist/ and asks the host which ones it doesn’t already have;
  4. uploads only those — an unchanged image is never sent twice, across versions or decks;
  5. makes the new version current and prints the URL.

The live room needs no setup: the host tells the deck which room is its own when it serves it, so a deck built anywhere joins the right room wherever it is published.

Visibility Who can open it
Public anyone with the link; search engines may index it
Unlisted anyone with the link; kept out of search engines
Passcode only people who enter the passcode you set

Unlisted and passcode decks are on the paid plans. Separately, every published deck has a presenter passcode: the presenter view, and everything only a presenter may do in the room, ask for it. Set both in the dashboard.

Each publish is a new version. The dashboard lists them, and Roll back makes an earlier one current again — the files are still there, so it is instant. How many versions are kept per deck depends on the plan.

For every deck: views; on paid plans, time spent on each slide; on Pro and Team, everything the room records — sessions and their peak audience, questions, reactions, poll and quiz results — with CSV export.

Create an API token in the dashboard (its secret is shown once) and store it as a CI secret. The CLI reads KADAL_DECK_TOKEN instead of a login:

.github/workflows/publish-deck.yml
name: Publish the deck
on:
push:
branches: [main]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npx kadal-deck publish
env:
KADAL_DECK_TOKEN: ${{ secrets.KADAL_DECK_TOKEN }}

A token acts as the person who made it, in the workspace it was made in. Revoke it from the dashboard the moment you think it has leaked.

Storage counts the files of your published decks, each distinct file once. A publish that would take a workspace over its storage is refused before anything is uploaded; nothing already published is affected. The room’s audience cap is checked as each phone connects. What each plan allows is on the pricing page.

The dashboard and the CLI use the same JSON API at https://deck.kadal.cc/api/v1/, authenticated by your session or by Authorization: Bearer kd_…: workspaces, decks, versions, content-addressed blob uploads, tokens and stats. It is stable within a major version; breaking changes will be announced in the changelog.