A Windows-first desktop recording studio for educators, trainers and creators β screen capture, always-on-top webcam, background replacement, audio controls and MP4 export in one workflow.
β¬οΈ Download Β·
Repository-hosted visual pipeline: the animation assets live inside the repository so the README does not depend on a placeholder demo URL.
Explore
- β¨ Highlights
- ποΈ Animated pipeline
- π₯ Real-world demo
- π§ Architecture
- π Recording Lifecycle
- π§© Features
- π οΈ Stack
- π Development
- π¦ Build & Release
- π¬ Usage
- β¨οΈ Hotkeys
- π Project Structure
- π§ͺ Verification
- πΊοΈ Roadmap
β οΈ Limitations- π€ Contributing
- β Star History
| Capability | Implementation |
|---|---|
| π₯οΈ Desktop capture | getDisplayMedia() |
| π₯ Floating camera | Transparent always-on-top Electron window |
| π¨ Background replacement | MediaPipe Tasks Vision segmentation |
| ποΈ Audio | Microphone + system audio controls |
| β‘ Encoding | FFmpeg with hardware β software fallback |
| πΎ Recovery | Incremental recording chunks |
| β¨οΈ Hotkeys | F7 / F8 / F9 / F10 |
| πͺ Platform | Windows x64 Electron desktop app |
Less setup. More teaching.
Teaching Studio separates the dashboard, native overlay and recording finalization responsibilities instead of forcing everything into one renderer.
flowchart LR
U[Teacher] --> D[Dashboard]
D --> P[Preload / IPC]
P --> M[Electron Main Process]
M --> O[Transparent Webcam Overlay]
W[Windows Desktop] --> C[getDisplayMedia]
O --> W
C --> R[MediaRecorder]
R --> CH[WebM Chunks]
CH --> F[FFmpeg Finalizer]
F --> E[MP4 H.264/AAC]
The webcam bubble is a real transparent, always-on-top desktop window. Windows composes that overlay into the desktop, allowing the screen-capture path to capture a composed desktop view that already includes the camera bubble.
A closer look at what actually happens between pressing F9 and getting an MP4 β including the crash-recovery path.
stateDiagram-v2
[*] --> Idle
Idle --> FirstRun: First launch
FirstRun --> Idle: Setup complete
Idle --> Recording: Press F9
Recording --> Recording: Toggle mic (F7) / camera (F8)
Recording --> Finalizing: Press F10
Finalizing --> Saved: FFmpeg mux β MP4
Saved --> Idle: Ready for next take
Recording --> Interrupted: Unexpected exit
Interrupted --> Recoverable: Incremental WebM chunks found
Recoverable --> Finalizing: Resume finalize
Select display β getDisplayMedia() β MediaRecorder β WebM chunks β FFmpeg β final MP4
Incremental chunks keep temporary media recoverable when a recording is interrupted before finalization.
Capture YouTube, browsers, PDFs, PowerPoint, VS Code and other Windows applications.
A transparent, always-on-top camera window stays visible while you teach.
Use segmentation-based removal with presets and custom backgrounds.
Configure lecture audio directly from the dashboard.
The FFmpeg finalization pipeline tries available hardware encoders before software fallback.
Recording data is written incrementally so interrupted sessions can leave recoverable temporary media.
Control core recording actions without returning to the dashboard.
| Layer | Technology |
|---|---|
| π₯οΈ Desktop runtime | Electron 30 |
| π¨ UI | React 18 |
| π§ Language | TypeScript 5 |
| βοΈ Build | electron-vite + Vite |
| π Styling | Tailwind CSS |
| π§ Segmentation | MediaPipe Tasks Vision |
| π₯ Capture | getDisplayMedia() + MediaRecorder |
| ποΈ Processing | FFmpeg via ffmpeg-static |
| πΎ Persistence | electron-store |
| π¦ Packaging | electron-builder |
| πͺ Target | Windows x64 / NSIS |
1. Download the portable ZIP
2. Extract it
3. Launch Teaching Studio.exe
4. Complete first-run setup
5. Press F9 and start teaching
No separate Python, Node.js or Electron runtime is required for the packaged portable build.
- Windows 10 or Windows 11 for real device testing
- Node.js 18+
- npm
- Git
git clone https://github.com/RICK2814/teaching-studio.git
cd teaching-studionpm installnpm run dev| Command | Purpose |
|---|---|
npm run dev |
Development mode with hot reload |
npm run typecheck |
TypeScript validation |
npm run build |
Build main, preload and renderer bundles |
npm run dist |
Build a Windows x64 distributable |
npm run dist:dir |
Build an unpacked Windows app for smoke testing |
npm run distnpm run dist:dirOutput:
release/win-unpacked/
The Windows packaging configuration targets x64 and uses NSIS. Current binaries are unsigned by default.
1. FIRST RUN β Camera Β· Microphone Β· Quality Β· Background
2. OVERLAY β Shape Β· Size Β· Position Β· Border Β· Shadow
3. RECORD β Dashboard β F9
4. TEACH β Bubble stays on top of the desktop content
5. CONTROL β F7 mic Β· F8 camera
6. FINISH β F10 β MP4
Teaching Studio is designed for exactly this kind of session: a PDF, browser, presentation or code editor can remain the main teaching surface while the floating webcam bubble stays visible above it.
Default output location:
Videos/Teaching Studio/
| Key | Action |
|---|---|
F9 |
Start recording |
F10 |
Stop and save |
F8 |
Toggle camera |
F7 |
Toggle microphone |
A full in-app hotkey editor is planned.
src/
βββ main/
β βββ main.ts
β βββ overlayWindow.ts
β βββ recorder.ts
β βββ store.ts
β βββ hotkeys.ts
β βββ env.ts
β βββ preload-dashboard.ts
β βββ preload-overlay.ts
β
βββ renderer/
β βββ dashboard/
β β βββ App.tsx
β β βββ ui.tsx
β β βββ RecordingHistory.tsx
β β βββ FirstRunWizard.tsx
β β βββ recordingEngine.ts
β β
β βββ overlay/
β β βββ App.tsx
β β βββ compositor.ts
β β
β βββ globals.css
β
βββ shared/
βββ types.ts
Before shipping a Windows build, validate it on an actual Windows 10/11 machine.
- Camera ON/OFF during recording
- Microphone ON/OFF during recording
- Repeated start/stop cycles
- 5+ minute continuous session
- Audio/video synchronization
- Always visible above teaching content
- Smooth dragging
- Lock Position works
- Resize behavior works
- No unwanted rectangular background
- Every preset
- Custom image
- Hair / shoulder / clothing edges
- MP4 opens in a standard player
- Audio is present
- Audio/video stays synchronized
- Webcam bubble appears in captured frames
- No unexpected green fringing
The segmentation runtime/model can be loaded from Google's CDN on first use and may subsequently benefit from cache.
For fully offline first-run environments, bundle the MediaPipe WASM runtime and selfie_segmenter.tflite under resources/mediapipe/, then update the corresponding local paths in src/renderer/overlay/compositor.ts.
Current Windows packaging is unsigned. Unsigned Windows applications may trigger SmartScreen warnings on first launch.
For wider distribution, sign the Windows package with an Authenticode certificate and configure the corresponding electron-builder signing settings.
- Multi-monitor presets currently target the primary display work area, although dragging onto another display is supported.
- Hotkeys have stored settings, but there is not yet a complete in-app key-rebinding editor.
- Crash recovery data can be detected, but a one-click recovery UI remains on the roadmap.
- Hardware-specific capture, transparency and encoder behavior should be validated on target Windows machines.
| Status | Item |
|---|---|
| π | In-app hotkey editor |
| π | One-click recording recovery UI |
| π | Improved multi-monitor presets |
| π | Automated Windows release builds |
| π | Code signing for production distribution |
| π | More webcam shapes and layout presets |
| π | More recording quality/export profiles |
| π | Richer animated product demo assets |
See TROUBLESHOOTING.md for common problems and fixes.
Contributions, bug reports and feature ideas are welcome.
1. Fork the repository
2. Create a feature branch β git checkout -b feature/my-improvement
3. Make your changes β npm run typecheck && npm run build
4. Commit with a clear message
5. Open a Pull Request against main
If Teaching Studio saves you setup time, consider dropping a β β it helps other educators find it.
Licensed under the MIT License.