{title} {#if isJoinOnly}
{#if logoUrl} {:else} {/if}

{branding.name}

{#if branding.description}

{branding.description}

{/if}
{:else}

{branding.headline}

{branding.description}

How it works

Three steps, no setup for the people joining.

{#each steps as step, index}
{String(index + 1).padStart(2, "0")}

{step.title}

{step.body}

{/each}

Features

Everything the room needs on one screen.

{#each features as feature}

{feature.title}

{feature.body}

{/each}

Self host

Your screens, your server, your data.

PiStation ships as a Docker Compose stack: a LiveKit media server, a Rust backend and this site. Media travels directly between devices on your own network, so a presentation never touches anyone else's infrastructure.

{#each ["One command to bring the whole stack up", "SQLite for storage, no external database", "Add as many kiosks and rooms as you like", "Every kiosk reports its own CPU, memory and signal strength"] as line}

{line}

{/each}

Get started

cp infra/.env.example infra/.env
docker compose -f infra/docker-compose.yml up -d

Then sign in to the admin panel, add a kiosk, and copy its enrollment token onto the Pi.

{/if}