React components replace the presentation file format
Open Slide treats every page as a React component rendered on a 1920 by 1080 canvas. A deck is an array of those page components plus metadata, rather than a proprietary presentation file or a Markdown document. The framework supplies scaling, navigation, hot reload, a slide browser, and fullscreen playback. That gives a coding agent familiar primitives and leaves the resulting deck readable to a frontend developer.
The tradeoff is equally clear. Layout lives in JSX and styles, so a designer who expects to drag every object on a canvas is working against the tool. The built-in inspector lets you click an element, leave a plain-language comment, and ask the agent to apply pending comments to source. It shortens the correction loop without pretending that visual edits no longer become code changes.
The scaffolder hides Vite while keeping slides editable
Running npx @open-slide/cli init my-slide creates a small workspace with a starter deck, configuration, and agent skills. Vite, React, and TypeScript configuration live inside @open-slide/core. Slides stay in slides/<id>/index.tsx, where developers can inspect or edit them directly. The supplied create-slide skill asks about topic, appearance, page count, text density, and motion before writing a deck.
The skills are preconfigured in both .claude/skills and .agents/skills, despite the CLI README describing them as Claude Code skills. That makes the repository useful with Claude Code and Codex, while the React output remains independent of either agent after generation. No model API key is part of the core setup; the coding agent uses whatever subscription and configuration the developer already has.
What happened when we ran it
Our sandbox installed 897 pnpm packages in 63 seconds and left 1,185 MB on disk. The build succeeded in 39 seconds. Vitest finished in 12 seconds with 313 passed and 0 failed out of 313. Among the 4 measured repositories in this assignment, Open Slide was the only one with a fully passing test step and an available build target.
The source checkout held 565 files, about 67,490 lines of source, and 5.3 MB before installation. Our scan found 2 CI workflow files, no Dockerfile, and no tests directory at the root. The passing command matters more than that directory signal because Vitest discovered and ran the project's tests successfully. These results describe commit ba5af02 in a fresh 3-CPU, 8 GB Debian container.
We did not generate a deck with a model, inspect visual quality, present on a projector, or compare PDF fidelity. The lab result establishes that dependencies installed, the monorepo built, and all 313 discovered tests passed. It does not establish that an agent will write a persuasive narrative or respect a brand system from one prompt. Those remain editorial and visual checks.
Static HTML is the simplest delivery path
The framework can export a deck as a static site, which fits Vercel, Cloudflare Pages, Netlify, Zeabur, or a plain static host. Presenter mode includes current and next slide views, speaker notes, and a timer. A self-contained HTML export works without keeping the development server online, while PDF provides a conventional file for distribution or print.
Static output is a good match for React slides because motion, links, and interactive components can survive in the browser version. PDF necessarily flattens those behaviors. Open Slide also manages per-deck images, videos, and fonts, and searches the svgl catalog for brand logos. Teams should still download and pin important assets rather than assume a remote catalog will remain available during a presentation build.
The 1920 by 1080 canvas excludes portrait decks
Every slide uses a fixed 16:9 canvas. That consistency simplifies scaling and gives agents one coordinate system, but it rules out portrait carousels, square social graphics, and traditional 4:3 decks without custom work. Open issue 404 identifies the dimensions in the runtime and exporters and proposes workspace-level presets. Because the request remains open, it is evidence of a current limitation rather than a feature promise.
Multilingual content has a similar boundary. The runtime interface can be localized, but issue 273 says slide text itself has no shared translation structure. Authors must duplicate decks or build their own dictionaries and language state. A bilingual product launch deck can still be made in React, though maintaining synchronized layouts becomes the author's responsibility.
Hidden tabs can stall the asset loading gate
Issue 399 reports that the preload layer advances page mounting through requestAnimationFrame. Browsers suspend those callbacks in hidden or occluded tabs, so the reporter saw a background deck remain on LOADING ASSETS until the tab received focus. The described case used a 17-page deck and affected hidden or headless capture rather than ordinary foreground presenting.
That distinction makes the bug easy to miss in manual testing and important in automated export. A CI job or remote capture process may keep the page hidden by design. Until the issue is resolved in the release you deploy, test PDF or screenshot automation under the same visibility conditions as production, not only in an open foreground browser.
Active 1.x releases coexist with unfinished policy docs
GitHub recorded 7,170 stars, 92 combined issues and pull requests, and a last push on August 26, 2026. The latest release endpoint returned @open-slide/core@1.19.1, published August 21 with sidebar fixes and viewer interaction changes. Current pushes and issue discussion indicate active maintenance, while the combined open count should not be read as 92 confirmed bugs.
The weak spot is SECURITY.md, which still tells maintainers to fill in the template and lists unrelated 5.1.x and 4.0.x support rows. Issue 422 calls out the same problem. That does not make the slide runtime insecure, but it leaves researchers without a documented private reporting path. For ordinary deck work, the passing 313-test run outweighs that governance mistake; organizations with a formal intake requirement may disagree.

