TalkControl lets speakers remotely control their slideshow from any device — phone, tablet, or second screen — via a web interface synchronized with the presentation.
- Node.js 24 (LTS)
- npm 10+
npm install --legacy-peer-deps
npm startThen open a browser at http://localhost:3000 (controller).
The app starts three services in parallel:
| Service | Port | Description |
|---|---|---|
| Controller | 3000 | Remote control interface (Vite dev server) |
| Server | 3001 | Express 5 WebSocket server |
| Showcase | 3002 | Static file server for the presentation |
# Run in watch mode
npm run test:watch
# Unit + integration tests (Vitest, jsdom)
npm test
# Web component tests (Vitest browser mode, Playwright)
npm run test:components
# End-to-end tests (Playwright)
npm run test:e2e
# Build for production
npm run build
# Lint (ESLint 9 flat config)
npm run lint
# Coverage report
npm run coveragenpm run docs:dev # Local VitePress dev server
npm run docs:build # Build static docs| Concern | Tool |
|---|---|
| Runtime | Node.js 24 LTS |
| Language | TypeScript (strict) |
| Bundler | Vite 5 |
| Server | Express 5 + Socket.IO 4 |
| Tests | Vitest 4 (jsdom + browser mode), Playwright |
| Linter | ESLint 9 flat config |
| Docs | VitePress |
See CONTRIBUTING.md for commit conventions and pull request guidelines. Issues: github.com/sfeir-open-source/talk-control/issues
Error: listen EADDRINUSE :::3001 — another process holds the port:
lsof -i :3001
kill -9 <PID>