Show HN: StreamCore – Open-source realtime voice infrastructure for AI StreamCore, an open-source realtime voice infrastructure for AI, launched on Hacker News, offering a single Go binary that handles WebRTC transport, adaptive turn-taking, barge-in, streaming STT/LLM/TTS, NAT traversal, and session state, while allowing developers to bring their own agent. The project, which runs streamcore.ai, supports browsers, phones, backends, telephony, and embedded devices, and includes SDKs for TypeScript, React Native, Go, and Rust. Talk to your AI over WebRTC — with interruption, streaming speech, and NAT traversal handled. One Go binary. Bring your own agent. No install, no signup — browser mic, and you can cut it off mid-sentence. Live demo https://streamcore.ai · · quick-start Quick start · /streamcoreai/streamcore-server/blob/main/docs Docs · sdks-and-examples SDKs · /streamcoreai/streamcore-server/blob/main/docs/roadmap.md Roadmap · https://discord.gg/xKGFaGWawT Discord 简体中文 /streamcoreai/streamcore-server/blob/main/README.zh-CN.md Anyone can demo a voice agent. Then a real caller talks over it, pauses mid-sentence, dials in from behind a firewall that blocks UDP, or waits three seconds for the first word — and the demo stops being a product. StreamCore is the layer that handles all of that. It owns the latency-sensitive media path between your users and your AI: WebRTC transport, adaptive turn-taking, barge-in, streaming STT/LLM/TTS, NAT traversal, session state, and realtime events — across browsers, phones, backends, telephony, and embedded devices. What it deliberately does not own is your agent. Keep your prompts, tools, models, and business logic exactly where they are — four supported ways bring-your-own-agent , no fork required. Built with it: voice agents, realtime copilots, live translation, AI-hosted audio rooms, embedded voice devices, and phone applications. streamcore.ai runs this repo. Open it, hit Start Conversation , and interrupt the agent while it is talking. Per-turn STT, LLM, and TTS latency is on screen while you do it. Prefer a recording? Watch the walkthrough https://www.loom.com/share/ee079aca75aa4fa1ba6a5e51302fbd56 . Two terminals, five minutes, and you are talking to it. Needs Go 1.25+ or Docker and API keys for an STT, LLM, and TTS provider. No keys? Run it fully local /streamcoreai/streamcore-server/blob/main/docs/quickstart.md fully-local-no-api-keys with Ollama + VibeVoice. cp config.toml.example config.toml add your provider credentials go run . The server listens on :8080 ; clients connect to http://localhost:8080/whip . Then talk to it from a browser: git clone https://github.com/streamcoreai/examples.git cd examples/typescript && npm install && npm run dev Open http://localhost:3000 http://localhost:3000 and start talking. Docker, TURN ports, and production notes: Quick start guide /streamcoreai/streamcore-server/blob/main/docs/quickstart.md . Transport | WebRTC audio over WHIP | Connectivity and TCP 3478 — no external coturn. A network handover or NAT rebind is recovered by ICE restart on the same session, so the conversation survives it Turn-taking Interruption Streaming Sessions & events Reach SIP telephony https://github.com/streamcoreai/sip-server , and ESP32 https://github.com/streamcoreai/esp32 endpointsFull capability list: Capabilities /streamcoreai/streamcore-server/blob/main/docs/capabilities.md . Listed so the table above stays honest — unticked items are real gaps today, not soon-shipping promises. Ticked ones shipped recently and stay listed for a release or two so you can see what moved: - Session reconnection server — a dropped connection recovers on the same session via ICE restart, so the conversation and the running pipeline survive it - Client-driven reconnection — the TypeScript, React Native, Go and Rust SDKs recover a network change automatically: ICE restart first, then a resume redial if the connection failed - Session resume — a drop past the point ICE restart can help is recovered by redialling with a single-use token, reattaching to the running conversation. Every SDK runs restart-then-resume as one ladder, so a backgrounded phone rejoins the same conversation - Panic recovery — a panic in one call's goroutines now ends that call alone: it recovers, logs the stack, and the session is reaped like any other ended call - Session cap — server.max sessions bounds live sessions globally; past it, POST /whip returns 503 with Retry-After . Resumes are exempt - Env-var secrets — every API key and secret can come from the environment OPENAI API KEY , STREAMCORE JWT SECRET , … instead of config.toml . See Configuration /streamcoreai/streamcore-server/blob/main/docs/configuration.md secrets-from-environment-variables - Metrics export — /health and timing events exist, no Prometheus/OpenTelemetry - Structured logging — log.Printf text today, no JSON logs carrying session id - Versioned releases — a Docker image ships to GHCR on each GitHub release, but no version in the binary and no tagged standalone binaries yet - Horizontal scaling — sessions live in process memory, so the server is single-node; reconnection and resume need sticky routing or an external store to work behind a load balancer - HTTP agent endpoint — llm.provider = "agent" POSTs each turn to an agent you host in any language; replies stream back as speech - Persistent memory — the built-in runtime forgets callers between sessions; BYO agents can already persist their own Full TODO list, including ecosystem items: Roadmap / TODO /streamcoreai/streamcore-server/blob/main/docs/roadmap.md . Want one of these? Say so in Discord https://discord.gg/xKGFaGWawT — demand reorders the list. StreamCore starts one layer below prompt-and-tool frameworks: the media path. Your intelligence stays yours, five ways — Tool call — plugins Python/TS/JS or native Go tools call into your existing backend Your agent — set llm.provider = "agent" and each turn is POSTed to an HTTP endpoint you host, in any language Your models — point llm.provider = "ollama" at any Ollama-compatible URL you run Your code — implement one small Go interface; the whole media path works unchanged Built in — or use StreamCore's optional agent runtime with tools, skills, RAG, and history Details and code: Bring your own agent /streamcoreai/streamcore-server/blob/main/docs/bring-your-own-agent.md · Agent runtime /streamcoreai/streamcore-server/blob/main/docs/agent-runtime.md . Providers: Deepgram, AssemblyAI, OpenAI, Cartesia, ElevenLabs, MiniMax, Speechify, Ollama, VibeVoice local , xAI Grok Voice speech-to-speech , pgvector/Supabase for retrieval. See Providers /streamcoreai/streamcore-server/blob/main/docs/providers.md . | Page | What's in it | |---|---| | Capabilities /streamcoreai/streamcore-server/blob/main/docs/capabilities.md Bring your own agent /streamcoreai/streamcore-server/blob/main/docs/bring-your-own-agent.md llm.Client interface Agent runtime /streamcoreai/streamcore-server/blob/main/docs/agent-runtime.md Providers /streamcoreai/streamcore-server/blob/main/docs/providers.md Configuration /streamcoreai/streamcore-server/blob/main/docs/configuration.md config.toml reference Protocol /streamcoreai/streamcore-server/blob/main/docs/protocol.md Architecture /streamcoreai/streamcore-server/blob/main/docs/architecture.md Connect from anywhere — every SDK speaks the same WHIP + DataChannel protocol: React Native / Expo @streamcore/react-native-sdk is built but not yet published to npm. Plugin SDKs: @streamcore/plugin and streamcore-plugin in plugin-sdk https://github.com/streamcoreai/plugin-sdk . Runnable browser, CLI, and TUI apps: examples https://github.com/streamcoreai/examples . Thank you Interested in sponsoring? Reach out for logo placement on GitHub + demo page. Read CONTRIBUTING.md /streamcoreai/streamcore-server/blob/main/CONTRIBUTING.md first — it covers running the server locally, the four checks CI runs before you push, and the extra care the timing-sensitive media path needs. Good places to start: good first issue https://github.com/streamcoreai/streamcore-server/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22 and . https://github.com/streamcoreai/streamcore-server/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22 help wanted Client SDKs, the SIP bridge, examples, and the ESP32 firmware live in their own repos under streamcoreai https://github.com/streamcoreai — send those changes there. Found a vulnerability? Don't open a public issue — report it privately through the Security tab https://github.com/streamcoreai/streamcore-server/security/advisories/new . SECURITY.md /streamcoreai/streamcore-server/blob/main/SECURITY.md covers scope, response targets, and the settings that matter on a public address — JWT auth on /whip above all. Apache 2.0. See LICENSE /streamcoreai/streamcore-server/blob/main/LICENSE .