icey
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:
// HEVC + AAC, captured through encoder to network in one zero-copy pipeline
av::EncoderOptions opts;
opts.oformat = {"mpegts", "mpegts",
{"H265", "hevc_videotoolbox", 1920, 1080, 60},
{"AAC", "aac", 2, 48000}};
PacketStream stream;
stream.attachSource(&capture);
stream.attach(new av::MultiplexPacketEncoder(opts), 5);
stream.attach(&socket, 10);
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 | HTTP Server recipe |
| Understand the runtime rules | Runtime Contracts |
| Understand the module layout | Module Map |
| Use icey from Rust | icey crate |
| 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.
