Tiny Python tray-server that converts any RTSP camera/DVR
into lightweight MJPEG feeds for browsers & mobile apps.
Explore the docs »
·
Report Bug
·
Request Feature
Table of Contents
StreamTray is a zero-config micro-server that sits in your system-tray, opens an RTSP connection once per camera, and re-streams frames as multipart/x-mixed-replace; boundary=frame.
This format is universally compatible, allowing any browser <img> tag or mobile framework (like Flutter) to render low-latency video feeds without complex players or HLS latency.
┌────────────────────────┐
│ │
│ RTSP/H-264│ Camera │
│ streams ► │ DVR / NVR │
└────────────────────────┘
│
▼ (single connection per cam)
┌──────────────────────────┐
│ StreamTray Server │
│ ▸ SQLite DB of streams │
│ ▸ OpenCV Capture Engine │
│ ▸ MJPEG HTTP Endpoint │
└──────────────────────────┘
│
▼ (multiple clients)
Browser ▸ <img src=/video_feed/uuid>
Dashboard (localhost:5050)
Mobile App (PixPulse Viewer)- 🚀 Zero Config: Runs instantly from System Tray.
- 🎥 Universal Compatibility: Converts RTSP to MJPEG for valid display in any HTML
<img>tag. - 💻 Modern Dashboard: Manage streams, rename cameras, and preview feeds via a sleek Web UI.
- 🏎️ High Performance: Centralized encoding engine ensures the camera is only polled once, regardless of client count.
- 📦 Portable: Single executable (Windows .exe or macOS .app) with persistent SQLite storage.
- 🌑 Dark Mode: Beautiful, responsive user interface with custom styling.
- Python 3.10+
- RTSP Enabled Camera
-
Clone the repo
git clone https://github.com/zEhmsy/StreamTray.git cd StreamTray -
Install Python packages
pip install -r requirements.txt
-
Run the application
python streamtray.py
Or build the standalone app:
# MacOS ./build_mac.sh
- Start the application. The StreamTray icon will appear in your system tray / menu bar.
- Click Open Dashboard (or go to
http://localhost:5050). - Click + Add Stream.
- Enter a "Friendly Name" (e.g., Front Door) and the RTSP URL (e.g.,
rtsp://user:pass@192.168.1.10:554/stream). - The stream will immediately appear in the list.
Use the Play button on any stream to open the live lightbox preview.
The server exposes a RESTful API for integration.
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/streams |
List all configured streams [{id, url, name}]. |
POST |
/api/streams |
Add a stream. Body: {"url": "...", "name": "..."}. |
PUT |
/api/streams/<id> |
Update a stream. |
DELETE |
/api/streams/<id> |
Remove a stream. |
GET |
/video_feed/<id> |
MJPEG Live Stream. Embed as src in <img>. |
GET |
/api/snapshot/<id> |
Single JPEG frame. |
- Basic RTSP to MJPEG bridging
- Web Dashboard for management
- Persistent SQLite Storage
- Custom Stream Naming
- MacOS .app Packaging
- User Authentication (Login)
- HLS / WebRTC Support
- Docker Container
See the open issues for a full list of proposed features (and known bugs).
Distributed under the Apache 2.0 License. See LICENSE for more information.
Project Link: https://github.com/zEhmsy/StreamTray