icey
The usual C++ stack for realtime and media work is a mess. HTTP on one side, FFmpeg on another, WebRTC hidden behind Google's monolith, TURN treated as somebody else's problem, signalling left as an exercise for the reader.
icey pulls those layers into one runtime. WebRTC, signalling, TURN relay, and media encoding in one C++ stack. Run it as a product. Embed it as a library. Same modules either way.
A small PacketStream graph is the core shape:
PacketStream stream;
stream.attachSource(capture.get());
stream.attach(&session->media().videoSender(), 5);
stream.start();If you're evaluating alternatives, the split is simple:
| libWebRTC (Google) | libdatachannel | GStreamer | icey | |
|---|---|---|---|---|
| Build system | GN/Ninja | CMake | Meson | CMake |
| Build time | Hours | Minutes | 30+ min | Minutes |
| Binary size | 50MB+ | Small | Large | Small |
| SSL | BoringSSL (conflicts) | OpenSSL | OpenSSL | OpenSSL |
| Media codecs | Bundled | None | GObject plugins | FFmpeg (any codec) |
| Capture/encode | Included | No | Plugin pipeline | PacketStream pipeline |
| Signalling | No | No | No | Symple (built-in) |
| TURN server | No | No | No | RFC 5766 (built-in) |
| Language | C++ | C++17 | C/GObject | C++20 |
libdatachannel gives you the WebRTC transport pipe. icey gives you the pipe, the water, and the faucet.
See It Work
Run the server
docker run --rm --network host 0state/icey-server:latestOpen http://localhost:4500
Click Watch on the icey peer
Live video in your browser. One binary, no external services.
That binary — icey-server — is built entirely from icey's library modules. The same modules you can use in your own C++ application. The server proves the library works. The library means you are not locked into the server's opinions.
Run
Install and run icey-server. Docker, release binaries, package managers. Stream, record, or relay in under a minute.
Build
Use icey modules in your own C++ project. FetchContent, CMake targets, recipes for HTTP, WebRTC, TURN, and more.
Operate
Deploy to production. Config reference, TLS, TURN, health endpoints, monitoring, and troubleshooting.
Start With The Job
| Goal | Start here |
|---|---|
| Run the media server now | See It Work |
| Install icey-server | Install |
| Understand the three modes (stream, record, relay) | Modes |
| Understand how the server maps to the library | Architecture |
| Build icey into my own C++ project | Getting Started |
| Understand the runtime rules | Runtime Contracts |
| Understand the module layout | Module Map |
| Build a fast HTTP service | HTTP Server |
| Stream a webcam to a browser | Webcam To Browser |
| Record browser media on the server | Browser To Recorder |
| Deploy to production | Deploy |
| Configure TLS | TLS |
| Debug a TURN problem | TURN Deployment |
Docs vs API Reference
The pages here explain architecture, runtime contracts, workflows, and operations. The API Reference tab is the generated C++ reference from Doxygen. Use the prose docs to understand the shape. Use the API tab for exact type signatures.
