Skip to content

SlideStage/SlideStagePro

Repository files navigation

SlideStage Pro

Self-hosted .stage deck platform for teams.
Shared library · notes & annotations · admin invites · Docker-deployable.

Website Lite


SlideStage Pro

Self-hosted .stage presentation platform built on Prisma + SQLite + Hono + React 19, deployable to any VPS via Docker Compose. Pro is a thin shell around the Lite open-source packages (@slidestage/core, @slidestage/ui, @slidestage/lite-preset) — it adds multi-user storage, notes/annotations persistence, admin invites, and Docker-based deployment.

SlideStage ecosystem

SlideStage Lite
SlideStage Lite
Local-first runtime
Open, present, convert .stage decks in any browser. Zero backend, zero accounts.
SlideStage Pro
SlideStage Pro
Self-hosted platform
Multi-user .stage library with notes, annotations, admin invites and Docker deploy.
slidestage-pack
slidestage-pack
Agent skill packer
Turn any HTML deck (reveal / impress / html-ppt / huashu / plain) into a portable .stage file.

Foundation packages (consumed via npm):

  • @slidestage/brand — SVG / PNG marks, favicons, social cards and design tokens shared across the family. · npm
  • @slidestage/spec — TypeScript types and runtime validators for the .stage container schema. · npm

Regenerate this block with pnpm render:ecosystem. The product registry is owned upstream in @slidestage/brand.


Status — v0 feature-complete (on branch rebuild-pro-from-zero). The full stack — API, web, packages, schema, Docker compose, nginx reverse-proxy, boundary checker (+ its own self-test), fixture generator — is implemented and passes check:boundaries / typecheck / 18 tests / build. As of Phase A.A4 (2026-05-26) Lite packages come from the public npm registry (the previous vendor/ tarball bridge has been removed). The docker compose build && up path is wired and statically validated; running it requires a Docker daemon (Docker Desktop / OrbStack / Colima) with outbound network access to registry.npmjs.org at build time.

Documentation: docs/ARCHITECTURE.md · docs/API_CONTRACT.md · docs/AUTH_FLOW.md · docs/DEPLOYMENT.md · docs/LITE_PACKAGE_BOUNDARY.md

Repository layout

SlideStagePro/
├── apps/
│   ├── api/                Hono server, Prisma client, Better Auth, storage
│   └── web/                Vite + React 19 + react-router v7 client
├── packages/
│   ├── pro-preset/         Pro-only SlideStage plugin (proPreset factory)
│   └── pro-shared/         Pro-internal shared types/constants
├── prisma/
│   ├── schema.prisma       Single SQLite schema (Better Auth + business + invites)
│   └── migrations/         Versioned SQL migrations (auto-applied on boot)
├── infra/
│   ├── docker/             Dockerfile.api, Dockerfile.web, api-entrypoint.sh
│   └── nginx/              edge nginx.conf + in-web-image web.conf
├── scripts/
│   ├── check-boundaries.mjs       CI gate: enforce Lite ↔ Pro boundary (rejects all file: refs)
│   ├── check-boundaries.test.mjs  Self-test: forge violations, assert checker fails
│   └── build-fixtures.mjs         Emit canonical .stage fixtures for manual QA
├── fixtures/               Smoke-test .stage files (valid + 3 invalid)
├── docs/                   Architecture · API · Auth · Deployment · Boundary
└── docker-compose.yml      api + web + nginx stack with persistent volume

Quick start (development)

# 1) one-time setup
# Optional for local dev: dev mode has safe local defaults.
# Copy .env.example to .env when you want custom secrets/admin credentials.

# 2) install + migrate + run
#    @slidestage/{core,ui,lite-preset} are fetched from the npm registry.
pnpm install
pnpm db:migrate:dev
pnpm dev                # runs apps/api + apps/web in parallel

The API listens on :3000, the web dev server on :5173. Vite proxies /api to the API (see apps/web/vite.config.ts).

Quick start (production via Docker Compose)

cp .env.example .env
# set BETTER_AUTH_SECRET, BOOTSTRAP_ADMIN_EMAIL, BOOTSTRAP_ADMIN_PASSWORD

docker compose build
docker compose up -d
curl http://localhost/api/health

The compose stack runs three services:

  • api — Node 22 + Hono + Prisma, mounts slidestage-data volume at /data.
  • web — Nginx serving the Vite-built bundle.
  • nginx — Edge reverse proxy on port 80, routes /api/* → api, / → web.

CI checks (run before committing)

pnpm check:boundaries              # 0 violations on prose-free files
pnpm check:boundaries:self-test    # forge a violation per rule, verify checker fails
pnpm typecheck                     # tsc across all 4 workspace packages
pnpm test                          # 18 vitest cases across api + web
pnpm build                         # api dist + packages dist + vite SPA bundle
pnpm fixtures:check                # verify fixture .stage files exist + match

All six green = the diff is safe to merge.

Lite ↔ Pro boundary

Pro never copies Lite source code. It consumes Lite packages by semver from the public npm registry:

"@slidestage/core": "^0.1.1",
"@slidestage/ui":   "^0.1.1",
"@slidestage/lite-preset": "^0.1.1"

(As of Phase A.A4, 2026-05-26, the previous vendor/*.tgz bridge has been removed; any file: dependency in any package.json is now a CI violation.)

Forbidden patterns (enforced by scripts/check-boundaries.mjs):

  • file:../SlideStageLite or link:../SlideStageLite in any dependency
  • import from "../SlideStageLite/..."
  • Re-declaring manifestSchema / assertSafePath / loadDeck (must come from @slidestage/core)
  • VITE_APP_EDITION or isPro edition branching
  • apps/api importing react / react-dom
  • apps/web importing @prisma/client / better-sqlite3 / hono

About

SlideStage Pro: hosted Lite+ workspace with auth, deck storage, and Pro plugins

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors