Documentation menu
Slidev reference
For a complete walkthrough, start with Your first Slidev integration. This reference describes the current official add-on.
Connection settings
| Environment variable | Purpose | Default |
|---|---|---|
| VITE_INALIA_API_KEY | API token for the speaker account (API-token setup only) | None |
| VITE_INALIA_TALK_NUMBER | Talk number within that account | None |
| VITE_INALIA_ENDPOINT | Inalia server origin | https://inalia.app |
| VITE_REVERB_APP_KEY | Realtime service's public application key | Hosted Inalia key |
| VITE_REVERB_HOST | Realtime hostname | ws.inalia.app |
| VITE_REVERB_PORT | Realtime connection port | 80 for WS; 443 for WSS |
| VITE_REVERB_SCHEME | Realtime transport scheme | https |
OAuth is the default when no non-empty VITE_INALIA_API_KEY is configured. After signing in, configure only your talk number; no authentication-mode variable is needed. An API key selects API-token authentication instead. The add-on discovers your username through the local OAuth proxy; no username environment variable is needed. See Connect with browser sign-in for setup, permissions, credential storage, and localhost-only limitations.
For hosted Inalia using API-token setup, configure only the token and talk number. The add-on retrieves and caches the token owner’s username using GET /api/me. Leave endpoint and realtime settings at their defaults. Override them only for a server you administer, using its actual connection details.
In API-token mode, without both required values, the add-on starts in static mode and does not connect to a talk. Restart Slidev after configuration changes.
CLI commands
The inalia package provides the CLI; slidev-addon-inalia is the separate Slidev add-on installed in your deck and does not provide a command-line executable. Use npx inalia for setup, sign-in, and talk selection.
npx inalia slidev setup
npx inalia auth login
npx inalia auth logout
npx inalia talk select
The bare command shows help. slidev setup installs and configures the add-on in a deck containing slides.md. talk select only updates the deck's connection; it does not install the package or change slides. Both reuse your OAuth session or open browser sign-in, then show an interactive talk picker. Requires Node.js 22.12 or newer.
The CLI saves the talk number in .env, preserving unrelated settings. OAuth needs only VITE_INALIA_TALK_NUMBER; the CLI does not add an empty API key and removes any obsolete VITE_INALIA_AUTH setting. It saves VITE_INALIA_API_KEY only when you have explicitly configured an API token. OAuth credentials remain in your private user-config directory. Existing VITE_INALIA_API_KEY values take precedence over OAuth, using shell values before the project's .env; a token is never requested interactively. The CLI does not read ~/.inaliarc. Restart Slidev after changing the selection.
The CLI defaults to hosted Inalia and never reads or writes the deck's VITE_INALIA_ENDPOINT. The internal development override is the shell environment variable INALIA_ENDPOINT; it does not configure Slidev's runtime endpoint. There is no --endpoint option.
OAuth discovery uses GET /api/slidev/me and GET /api/slidev/{username}/talks, requiring slidev:read. Existing token connections use GET /api/me and GET /api/{username}/talks with read permission. Talk lists return all owned talks as a data array in descending talk-number order, including number, title, and scheduled_at. Both require a verified eligible account and ownership of the requested username. No write or present permission is needed to select a talk.
User-wide configuration
The add-on also reads ~/.inaliarc. For example:
{
"inalia": {
"api_key": "YOUR_DEDICATED_TOKEN",
"talk_number": "YOUR_TALK_NUMBER"
}
}
Nested keys become uppercase, underscore-separated VITE_ variables. Project environment values take precedence over this user configuration. Be careful when switching projects: user-wide credentials can activate a live connection even after you remove a project's .env.
API tokens are not browser secrets. In API-token mode, the integration sends its token from browser-side code. OAuth browser sign-in keeps its tokens outside the deck and browser, but only supports a local development server. Never publicly publish a live-configured deck. See safe publishing.
Permissions
Browser sign-in requests Read for talks, questions, and live results; Present also allows starting talks. Use auth login --read-only for read-only OAuth access. These scopes do not grant MCP or administrative access.
For API-token setup:
- read retrieves your username, talks, and questions.
- read plus write allows integration requests that run talks or change demo mode.
Permissions do not bypass account eligibility, email verification, or talk ownership. Use a dedicated read-only token when managing talk status in the app.
Demo mode
With a connected talk, use Enter Demo Mode (the debug icon) in Slidev's navigation controls to rehearse without saving new participation. The control changes to Exit Demo Mode while enabled. Each successful change reloads the deck; the token needs both read and write permissions.
Demo mode is a per-talk setting, not a separate running state. Run the talk and enable the required features as usual. New poll answers, audience questions, feedback messages, and feedback reactions are not saved; existing data is not erased. Audience-question voting and highlighting are unavailable in demo mode.
Choose Exit Demo Mode before a real session so participation is saved again. Closing Slidev does not disable demo mode.
Live question
<Inalia questionId="1" />
Use the question number from Inalia's generated Slidev output. It is relative to the configured talk, not a global question ID. Live questions retrieve results and listen for updates.
Static question
<Inalia
question="How familiar are you with this topic?"
type="single_select"
chart="bar"
:data="[
{ label: 'Just starting', count: 3, color: '#00DC82' },
{ label: 'Some experience', count: 5, color: '#a855f7' },
{ label: 'Very familiar', count: 2, color: '#2563eb' },
]"
/>
Static data displays exactly what you provide; it does not collect responses or subscribe to answers. Omit questionId when using explicit snapshot data.
For text questions or other result shapes, use Inalia's generated output rather than inventing a data structure. See publishing snapshots.
Common components and layouts
| Component or layout | Purpose |
|---|---|
<Inalia questionId="…" /> | Display a live question |
<InaliaOverview /> | Display the connected talk's audience overview |
<InaliaFeedback /> | Display the connected talk's feedback invitation |
<InaliaQR url="https://inalia.app" /> | Render a QR code for an explicit URL |
<InaliaShortUrl url="https://inalia.app" /> | Display a readable URL |
layout: inalia-overview | Full slide using the overview component |
layout: inalia-feedback | Full slide using the feedback component |
Overview and feedback components need a connected talk. The add-on also provides global live-reaction and audience-question-highlight overlays. Enable the relevant features in Inalia; use the running talk's Dashboard to select or remove a highlighted audience question. A highlight is not the same as poll results, and is unavailable in demo mode.
Customization
Live reactions
The overlay keeps at most 20 active reactions by default. New reactions received at capacity are dropped, not queued. Each accepted reaction expires after three seconds, freeing space for new arrivals.
Set a presentation-wide limit in the root frontmatter (the first frontmatter block in slides.md):
---
addons:
- inalia
inalia:
emoji:
limit: 10
---
Omitting emoji, setting it to true, or using emoji: {} enables reactions with the default limit. Finite numeric limits are rounded down and clamped to zero; zero prevents new reactions. Missing, non-numeric, or non-finite limits use 20. A lower limit does not remove existing reactions early; they expire normally.
Set emoji: false in root frontmatter to hide reactions across the presentation. A slide can override visibility with emoji: true (or an object), or hide reactions with emoji: false. The limit is presentation-wide, not per-slide.
To hide live reactions on a particular slide, add this to that slide's frontmatter:
---
inalia:
emoji: false
---
This controls the slide's reaction overlay, not whether audience submissions are enabled in Inalia. Hidden reactions still occupy the bounded buffer until they expire and can reappear if the overlay is re-enabled within three seconds.
For a manually mounted <InaliaLiveReactions />, use the maxEmojis prop to set its limit.
Charts
Choose Bar or Donut in the question's Chart Type setting, or use chart="bar" or chart="donut" with explicit static data. Choice colors come from question settings or the static data's color fields.
The current chart components use fixed geometry values. Although the add-on's type declarations include inalia.bar and inalia.donut frontmatter options, those components do not currently read them; do not rely on those options to change rendering.
Updating the add-on
For self-hosted installations, deploy backend support for the token-authenticated GET /api/me endpoint before updating the add-on. It returns only { "data": { "username": "speaker" } } and requires read permission, verified email, and account access.
Review the add-on's releases and compatibility requirements before updating. Keep your project's dependency lockfile, and rehearse the same deck and configuration you will present.
For unknown components, failed authentication, or missing updates, see Troubleshooting.