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.
Run the server
docker run --rm --network host 0state/iceyOpen `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.
Install and run icey-server. Docker, release binaries, package managers. Stream, record, or relay in under a minute.
Use icey modules in your own C++ project. FetchContent, CMake targets, recipes for HTTP, WebRTC, TURN, and more.
Deploy to production. Config reference, TLS, TURN, health endpoints, monitoring, and troubleshooting.
| 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 |
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.