A web-based oscilloscope simulator with a physically-inspired multi-pass phosphor rendering pipeline. Simulates the characteristic glow, persistence, and bloom of vintage CRT oscilloscope displays.
π’ Try the Live Demo Β Β Β·Β Β Docker Setup Β Β Β·Β Β Report Bug Β Β Β·Β Β Request Feature
docker compose up --buildOpen http://localhost:8090 in your browser. That's it.
Requirements: Docker and Docker Compose. Nothing else is installed on your machine.
| Mode | Description |
|---|---|
| Lissajous | Classic XY figures with adjustable frequency, phase, and amplitude |
| Waveform | Sine, square, sawtooth, triangle, noise β Y-T sweep or X-Y dual-channel |
| Multi | Additive synthesis, AM/FM modulation, harmonic series |
| Audio | Real-time music visualizer β microphone or audio file input |
| Draw | Freehand vector drawing with templates and keyframe animation |
Four display modes for live audio: Waveform (time-domain), Spectrum (FFT with log scale), X-Y (stereo oscilloscope), Radial (circular spectrum with beat detection). Auto-gain scales weak signals to fill the screen. Drag-and-drop audio files or use your microphone.
Draw directly on the scope screen. 10 built-in templates (circle, star, heart, spiral, etc.). Catmull-Rom spline smoothing. Keyframe animation with timeline scrubbing and loop playback. Save drawings as presets.
Pass 1: BEAM Soft gaussian dots, additive blending (HDR)
Pass 2: PHOSPHOR Exponential decay persistence (linear HDR space)
Pass 3: BLOOM Two-pass Gaussian blur at half resolution
Pass 4: COMPOSITE Tone mapping, CRT curvature, vignette, scanlines, grid
The phosphor buffer runs in linear HDR space using HalfFloat textures. Tone mapping (Reinhard) is applied only once in the composite pass, preventing accumulation artifacts.
- Playground mode β sliders, toggles, and shape selectors for all parameters
- Realistic mode β skeuomorphic oscilloscope panel with rotary knobs, BNC connectors, and phosphor color switch
- Collapsible panel β press Tab to hide controls and maximize the scope
- Fullscreen β press F or double-click the scope screen
- Floating quick-controls β signal mode tabs, phosphor color, bloom, and persistence available when the panel is collapsed
- Ambient desk surface β subtle workbench texture behind the oscilloscope
| Key | Action |
|---|---|
Tab |
Toggle controls panel |
F |
Toggle fullscreen |
Esc |
Exit fullscreen |
docker-compose.yml
βββ nginx Port 8090 β browser
β βββ / Static frontend (Vite build)
β βββ /api/* Proxy to backend
βββ backend Node.js + Express + SQLite
β βββ /api/presets CRUD for saved configurations
βββ frontend-build Vite + TypeScript + Three.js β static files
| Layer | Technology |
|---|---|
| Rendering | Three.js + custom GLSL shaders |
| Frontend | TypeScript, Vite |
| Backend | Node.js, Express, better-sqlite3 |
| Audio | Web Audio API (AnalyserNode, FFT) |
| Serving | Nginx (reverse proxy + static files) |
| Container | Docker Compose |
All development happens inside Docker. No local Node.js required.
# Start the app
docker compose up --build
# Rebuild after changes
docker compose down && docker compose up --build
# Reset database (re-seeds demo presets)
docker compose down -v && docker compose up --buildSee CONTRIBUTING.md for project structure, rendering pipeline details, and contribution guidelines.