{"id":51320397,"url":"https://github.com/AreevAI/flowcat","last_synced_at":"2026-07-04T14:00:41.370Z","repository":{"id":365091050,"uuid":"1269796643","full_name":"AreevAI/flowcat","owner":"AreevAI","description":"Self-hosted native-Rust runtime for real-time voice agents. Own the stack: one binary in your own VPC or air-gapped, no hosted control plane. pipecat-compatible pipeline, in-process SIP/RTP, single-process call density. Apache-2.0.","archived":false,"fork":false,"pushed_at":"2026-07-02T05:39:08.000Z","size":1016,"stargazers_count":42,"open_issues_count":5,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-02T07:13:41.645Z","etag":null,"topics":["on-premise","pipecat","realtime","rust","self-hosted","sip","speech-to-speech","telephony","voice-agents","voice-ai","webrtc"],"latest_commit_sha":null,"homepage":"https://areevai.github.io/flowcat/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AreevAI.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-15T05:30:20.000Z","updated_at":"2026-07-02T05:14:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/AreevAI/flowcat","commit_stats":null,"previous_names":["areevai/flowcat"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/AreevAI/flowcat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AreevAI%2Fflowcat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AreevAI%2Fflowcat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AreevAI%2Fflowcat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AreevAI%2Fflowcat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AreevAI","download_url":"https://codeload.github.com/AreevAI/flowcat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AreevAI%2Fflowcat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35124130,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["on-premise","pipecat","realtime","rust","self-hosted","sip","speech-to-speech","telephony","voice-agents","voice-ai","webrtc"],"created_at":"2026-07-01T13:00:24.584Z","updated_at":"2026-07-04T14:00:41.364Z","avatar_url":"https://github.com/AreevAI.png","language":"Rust","funding_links":[],"categories":["Frameworks \u0026 Platforms | 框架与平台","Interconnect"],"sub_categories":["Comprehensive Frameworks | 综合性框架","SBC, IMS"],"readme":"\u003c!-- SPDX-License-Identifier: Apache-2.0 --\u003e\n# Flowcat\n\n[![CI](https://github.com/AreevAI/flowcat/actions/workflows/ci.yml/badge.svg)](https://github.com/AreevAI/flowcat/actions/workflows/ci.yml)\n[![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)\n[![Docs](https://img.shields.io/badge/docs-areevai.github.io-blue)](https://areevai.github.io/flowcat/)\n\n**A native-Rust runtime for real-time voice agents — built to run on your own\ninfrastructure.** Flowcat carries a phone or WebRTC call through a composable\nmedia pipeline — transport in → VAD / turn-taking → STT · LLM · TTS (or a single\nspeech-to-speech model) → transport out — as **one self-contained binary you\ndeploy in your own VPC** (or fully air-gapped). No hosted control plane, no\nphone-home, no Python or FreeSWITCH sidecar to operate. You bring your own\nprovider credentials; a call's audio and data never leave infrastructure you\ncontrol.\n\nIt is a clean-room, native-Rust counterpart to the design of\n[pipecat](https://github.com/pipecat-ai/pipecat): the same `FrameProcessor`\npipeline model and the same provider breadth, packaged for teams that need to\n**own the stack** — self-hosted, auditable, and dense enough to run serious call\nvolume per box. No pipecat code is vendored — see [`NOTICE`](NOTICE).\n\n**▶ Watch the overview:**\n\n[![Flowcat — overview video](https://img.youtube.com/vi/XuR4jfJofhg/hqdefault.jpg)](https://youtu.be/XuR4jfJofhg)\n\n**Status:** pre-1.0, building in the open.\n\n\u003e **New here?** → **[`QUICKSTART.md`](QUICKSTART.md)** takes you from `git clone` to\n\u003e a running pipeline and a real audio round-trip in about five minutes (no\n\u003e credentials), then to a **real agent you talk to in your browser** — define it in\n\u003e YAML and run one binary (`flowcat-server`), no Rust required.\n\n---\n\n## Why Flowcat\n\nMost voice-agent platforms are hosted SaaS: your audio, transcripts, and call\ndata flow through someone else's cloud, and you pay per minute. Flowcat is the\nopposite — **a runtime you own and run yourself**, for teams that can't or won't\nput regulated call traffic on a multi-tenant platform and want one auditable\nartifact instead of a fleet of services.\n\n### 1. Own your voice stack\n\nFlowcat is a single self-contained binary you deploy in your own VPC — or fully\nair-gapped. There is **no Flowcat cloud and no phone-home**: the runtime reads\nonly its own `FLOWCAT_*` config and talks to the providers *you* configure with\n*your* credentials. Pair it with the local STT/TTS/LLM connectors (Whisper,\nKokoro / Piper / XTTS, Ollama) and a call's audio and transcript never leave your\ninfrastructure. For data-residency, on-prem, and sovereignty requirements\n(healthcare, finance, public sector), that's the deployment model itself — not a\ncheckbox bolted onto a SaaS.\n\n### 2. Long-call memory — without the audio tax\n\nRealtime models re-bill the **whole conversation every turn** — as bulky, expensive\naudio — so the usual way to keep long calls affordable, sliding-window compression,\nsaves money by **discarding the oldest turns** (your agent forgets the account number\nfrom minute one). Flowcat's **ContextRelay** converts that accumulated audio context\ninto a compact text transcript and reseeds the session: the model re-attends cheap text\n(~7× smaller, ~4× cheaper per token) instead of audio, and the **whole conversation\nsurvives**. The live voice path is unchanged — the agent still speaks native audio; the\ntrade-off is that converted turns carry their words, not their prosody. Off by default,\nprovider-agnostic. See\n[the ContextRelay evaluation](docs/context-relay-evaluation.md).\n\n### 3. pipecat-compatible by design\n\nIf you know [pipecat](https://github.com/pipecat-ai/pipecat), you already know\nFlowcat. It deliberately mirrors pipecat's architecture and public API model —\nthe `FrameProcessor` graph, the typed `Frame` taxonomy, the system-frame\npriority / interruption model, and the STT/TTS/LLM/realtime service seams. You\nbring the same mental model and the **same vendor credentials**; you get a single\nstatic Rust binary instead of a Python process tree. See\n[Connectors \u0026 providers](#connectors--providers).\n\n### 4. One process, room to scale\n\nBecause the media loop is Rust — no garbage collector, no GIL — one Flowcat\nprocess uses every core and holds a **flat p99 from 10 to 2,000 concurrent calls\non a single box**, where an equivalent Python deployment grows a multi-second\ntail and needs a worker fleet. Read this as **capacity and operational headroom**,\nnot as a claim about conversational latency: end-to-end voice latency is\ndominated by your STT/LLM/TTS providers (hundreds of ms) and Flowcat can't change\nthat. What it guarantees is that *the runtime itself* never becomes the\nbottleneck or the source of a stall — so you provision fewer boxes and your tail\nstays predictable under load. See [Benchmark \u0026 capacity](#benchmark--capacity).\n\n### 5. Drive it from Python\n\nYou don't have to write Rust. Run Flowcat as a service and drive it from Python\nat **turn granularity**: implement your conversation policy as a small HTTP\nservice (the `RemoteBrain` adapter, `brain-http` feature) and expose your Python\nfunctions as tools over MCP. Your code never touches the per-frame path, so the\ncapacity profile above is preserved. In-process **PyO3 bindings** are on the\n[roadmap](ROADMAP.md). See [Using Flowcat from Python](#using-flowcat-from-python)\nand [`examples/`](examples/).\n\n---\n\n## Benchmark \u0026 capacity\n\n**What this measures:** how much call volume one box absorbs before the *runtime*\nbecomes the bottleneck, and how tight the tail stays under load. **What it does\nnot measure:** end-to-end conversational latency — that's dominated by your\nSTT/LLM/TTS providers (typically hundreds of ms), and Flowcat doesn't change it.\nRead the sub-millisecond figures below as framework/transport overhead — capacity\nand reliability headroom — not as the latency a caller hears.\n\nA like-for-like benchmark on a single Azure `Standard_FX16mds_v2` box (16 vCPU):\none Flowcat process (12 cores) vs pipecat in its **real multiprocess\ndeployment** (12 workers, `SO_REUSEPORT`, one per core — Python given every\nadvantage). Identical Rust WebSocket + μ-law load generator, full-duplex echo,\n50 frames/s/call, 10 s per data point.\n\n### p99 round-trip latency vs concurrent calls\n\n![p99 round-trip latency vs concurrent calls — Flowcat (1 process) stays flat at ≤0.61 ms while pipecat (12 workers) climbs past the 150 ms conversational limit by ~300 calls and reaches 5,673 ms at 1,000 calls](docs/bench-p99-latency.png)\n\nFlowcat's line is flat along the floor; pipecat crosses the ~150 ms\nconversational limit at a few hundred calls and reaches multi-second tails by\n1,000.\n\n| Concurrent calls | Flowcat (1 process) | pipecat (12 workers) |\n| --- | --- | --- |\n| 250  | **0.59 ms** p99 | 51 ms p99 |\n| 500  | **0.51 ms** p99 | 843 ms p99 |\n| 1000 | **0.47 ms** p99 | 5,673 ms p99 · 77% throughput |\n| 2000 | **0.61 ms** p99 | failing · 41% throughput (982 conns refused) |\n\n### Other measured metrics\n\n| Metric | Flowcat (Rust) | pipecat (Python) | Ratio |\n| --- | --- | --- | --- |\n| Worst-case p99, 10→2,000 calls | **0.61 ms** | 5,673 ms | — |\n| Tail at 500 calls (matched load) | **0.51 ms** | 843 ms | **~1,650× lower** |\n| Sustained throughput | **100%** to 2,000 calls | collapses past ~250 | — |\n| Per-frame routing (framework floor) | **~0.20 µs** | ~106 µs | ~525× |\n| RAM per idle session | **~19.6 KB** | ≤ ~1 MB | ~50× tighter |\n| Tasks per session | 7 tokio | 22 asyncio | — |\n| Multi-core scaling (1→14 cores) | **8.4×** (no GIL) | n/a (1 core/process) | — |\n\nFull percentile distributions (p50 / p90 / p99 / p99.9 / max), the methodology,\nand the phase history are in **[`bench/RESULTS.md`](bench/RESULTS.md)**.\n\n### Reproduce it\n\n![Reproduce: docker compose -f bench/compose.yml up --build · Azure Standard_FX16mds_v2 · 16 vCPU · io_harness WebSocket + μ-law load · 10 s/point · 50 fps/call](docs/bench-setup.png)\n\n```bash\ndocker compose -f bench/compose.yml up --build   # on a 16-vCPU VM\n```\n\nSee [`bench/README.md`](bench/README.md) for the full harness and SKU notes.\n\n\u003e **Disclaimer.** Numbers above are from the reproducible kit in this repo on the\n\u003e stated hardware; your results will vary with hardware and configuration.\n\u003e pipecat is an independent open-source project; it is used here as an\n\u003e architecture reference and a benchmark baseline. Flowcat is **not affiliated\n\u003e with, sponsored by, or endorsed by Daily or the pipecat project**. \"pipecat\" is\n\u003e referenced for identification and comparison only; all marks belong to their\n\u003e respective owners. See [`NOTICE`](NOTICE).\n\n---\n\n## How to use it\n\nFlowcat is a Cargo workspace of four library crates plus a demo binary. Nothing\nnetworked is in the default build — every provider, transport, and exporter is\nan opt-in Cargo feature.\n\n```bash\n# Build the whole workspace (default features only → no provider client deps).\ncargo build\n\n# Run the full fixture/wire test suite (no network, no credentials).\ncargo test\n\n# Build a \"fat\" binary that pulls in every provider client:\ncargo build -p flowcat-services \\\n  --features stt-all,tts-all,llm-all,realtime-all,obs-all\n\n# The demo binary — two runnable, credential-free demos:\ncargo run -p flowcat-cli -- pipeline           # in-process FrameProcessor pipeline\ncargo run -p flowcat-cli -- ws-echo --loopback # real WebSocket PCM echo round-trip\n```\n\n### Run an agent from a config — no Rust\n\nDon't want to embed Flowcat in a Rust binary? Run **`flowcat-server`**: describe\none agent in a YAML/JSON config (a node/edge graph + the realtime or cascaded\nprovider topology) and serve it over HTTP — no control plane, no database.\n\n```bash\ncargo build --release -p flowcat-server --features webrtc\nGOOGLE_API_KEY=… ./target/release/flowcat-server --config deploy/agent.example.yaml\n# open http://localhost:6210/ to talk to it (mic + live transcript), or bridge a\n# Plivo number to the server's /telephony/ws/plivo/{run_id}\n```\n\nProviders are selected **by name** from the config (the `flowcat-services`\nfactory) and their keys come from the environment; the agent graph is run by\n`flowcat-agent`. A Dockerfile, compose file, sample config, and env template are\nin [`deploy/`](deploy/). The config schema lives in `flowcat-server/src/config.rs`.\n\n### Embed it in your own service\n\nFor full control (custom routing, your own control plane, in-process brain logic),\nembed the library and implement three seams:\n\n- **`FrameProcessor` pipeline** — compose `transport.input() → vad → stt → llm →\n  tts → transport.output()` (or a single realtime S2S model) into a `Pipeline`,\n  drive it with a `PipelineTask` / `PipelineRunner`. Each processor runs in its\n  own tokio task behind a bounded channel (natural backpressure).\n- **`AgentBrain`** — your conversation decision-making. Flowcat never sees your\n  control-plane, REST contract, or database; the brain is a trait seam. (Don't\n  want to write Rust? The ready-made `RemoteBrain` adapter implements this seam\n  against an HTTP service — see [Using Flowcat from Python](#using-flowcat-from-python).)\n- **`SessionSource`** — how a call is bootstrapped and finalized.\n\nThe runtime is **provider- and contract-agnostic**: it knows nothing about any\ndownstream control plane. Full processor-author contract:\n[`PROCESSOR-DESIGN.md`](PROCESSOR-DESIGN.md) and\n[`CONTRIBUTING.md`](CONTRIBUTING.md).\n\n### Feature-flag model\n\n`flowcat-core` defaults to `[\"sip\", \"recorder\"]` (no HTTP/gRPC/ONNX). Every\nprovider, transport, and exporter is `dep:`-gated, so adding the 80th provider\ncosts the default build nothing. Umbrella features (`stt-all`, `tts-all`,\n`llm-all`, `realtime-all`, `obs-all`) exist for the CLI and CI. Full enumeration:\n[`FEATURES.md`](FEATURES.md).\n\n\u003e The `flowcat` CLI ships two demos (the analogue of pipecat's `examples/`), both\n\u003e credential-free and exercised in CI: **`pipeline`** drives a synthetic\n\u003e sine-wave source through a composable `FrameProcessor` pipeline in-process, and\n\u003e **`ws-echo`** echoes PCM over the real WebSocket transport (`--loopback` for a\n\u003e self-contained round-trip, or `--connect \u003cws://url\u003e` to a live peer). See\n\u003e [`flowcat-cli/src/`](flowcat-cli/src/).\n\n---\n\n## Using Flowcat from Python\n\nFlowcat is a Rust runtime, but you don't have to write Rust to use it. The media\nloop (SIP/RTP, VAD, STT/LLM/TTS) runs in Rust; your Python runs at **turn\ngranularity** over a network boundary, so it never sits on the per-audio-frame\npath that determines tail latency.\n\n- **Drive the conversation policy** — the `RemoteBrain` adapter\n  (`flowcat-services`, feature `brain-http`) implements the `AgentBrain` seam by\n  POSTing to two JSON endpoints you host. Decide transitions, what to say, and\n  when to end the call — in Python. Reference server + wire contract:\n  [`examples/python-remote-brain`](examples/python-remote-brain).\n- **Expose Python functions as tools** — run an MCP server; Flowcat's `mcp`\n  client lists and calls its tools.\n  [`examples/python-mcp-tools`](examples/python-mcp-tools).\n\nIn-process **PyO3 bindings** — `import flowcat`, build a pipeline in Python, pass\nPython callables as the brain — are on the [roadmap](ROADMAP.md); they will keep\nPython at turn granularity to preserve the same tail-latency guarantees.\n\n## Connectors \u0026 providers\n\n**Start here: the live-verified path.** The **Gemini Live + Plivo** combination\n— speech-to-speech over WebSocket-media telephony — is the one path run\nend-to-end against the real services today. Build on it first, and treat\neverything below as wire-ready but unproven until you run it yourself.\n\nBeyond that, Flowcat carries a broad provider catalogue, each connector **one\n`dep:`-gated Cargo feature** so the default build pulls none of their client\ndependencies:\n\n| Category | Count | Examples |\n| --- | --- | --- |\n| **STT** | 20 | Deepgram, AssemblyAI, Gladia, Cartesia, Azure, ElevenLabs, OpenAI/Whisper (+ Groq/Fal/xAI wrappers), Google/NVIDIA (gRPC), AWS Transcribe (SigV4), local Whisper |\n| **TTS** | 29 | Cartesia, ElevenLabs, Deepgram, Rime, OpenAI (+ Groq/xAI), Azure, Hume, MiniMax, Fish, LMNT, Kokoro/Piper/XTTS (local), Google/NVIDIA (gRPC), AWS Polly (SigV4) |\n| **LLM** | 23 | OpenAI (+ ~18 OpenAI-compatible wrappers: Groq, Together, Fireworks, OpenRouter, DeepSeek, …), Anthropic, Google Gemini, AWS Bedrock (SigV4) |\n| **Realtime (S2S)** | 7 | Gemini Live (in core), OpenAI Realtime (+ Azure/Grok/Inworld), Ultravox, AWS Nova Sonic |\n| **Transports** | 5 | `str0m` WebRTC (+ Opus), WebSocket, Daily, LiveKit, local mic/speaker |\n| **Telephony serializers** | 9 | Twilio, Telnyx, Plivo, Exotel, Vonage, Genesys, Asterisk, Cloudonix, Vobiz + DTMF (RFC2833 + in-band Goertzel) |\n| **Observability** | 3 | OpenTelemetry, Sentry, Langfuse exporters |\n\nThe full feature-flag matrix is in [`FEATURES.md`](FEATURES.md); how the distinct\n(D) clients and thin (W) wrappers relate is in\n[`PROVIDERS.md`](PROVIDERS.md).\n\n\u003e **What \"supported\" means here — read this before you count providers.** Every\n\u003e connector is **fixture/wire-tested**: unit tests pin its message framing (plus\n\u003e SigV4 known-answer tests for the AWS path), so the encode/decode seam is\n\u003e correct. They are **not** all exercised against the live service in CI — an\n\u003e end-to-end call needs that vendor's credentials. Today the **Gemini Live +\n\u003e Plivo/Zadarma** path is confirmed live end-to-end; the rest are a short step\n\u003e away but unproven until you run them. Live-verifying a provider against its real\n\u003e service is one of the most useful contributions you can make — see\n\u003e [`CONTRIBUTING.md`](CONTRIBUTING.md).\n\n---\n\n## How it works\n\n```\n carrier / WebRTC          FrameProcessor graph (each stage = 1 tokio task)\n ───────────────►  ┌──────────────────────────────────────────────────┐\n   SIP / RTP       │  transport.in → vad/turn → stt → llm → tts → out  │\n   WebSocket       │                    └──── or realtime S2S ────┘     │\n ◄───────────────  └──────────────────────────────────────────────────┘\n                      system frames (Start/Cancel/Interruption/End)\n                      jump the queue on a priority channel\n```\n\n- **Typed `Frame` taxonomy** (audio / text / control / system). The hot audio\n  frame is an `Arc\u003cAudioFrame\u003e`, so each hop moves a pointer, not a buffer.\n- **Each processor runs in its own tokio task** fed by a bounded mpsc channel,\n  giving natural backpressure on the output media leg. The per-hop channel cost\n  is ~0.029 µs — three orders of magnitude under the audio frame period.\n- **System frames jump the queue.** `Start` / `Cancel` / `Interruption` / `End` /\n  `Stop` ride an unbounded priority channel and invoke a processor's\n  `start()` / `stop()` lifecycle hooks, bypassing `process_frame`.\n- **Native SIP/RTP, in-process — softswitch optional.** `flowcat-core` speaks SIP\n  (REGISTER + digest auth, INVITE/ACK/BYE) and hand-rolled RTP/SDP for G.711\n  telephony directly, so a single binary can terminate calls with no\n  FreeSWITCH/Asterisk at all. That's a *deployment choice, not a mandate* — if you\n  already run a softswitch, keep it in front and feed audio over the WebSocket\n  media transport. ([`SIP-DESIGN.md`](SIP-DESIGN.md).)\n\nDesign details: [`PROCESSOR-DESIGN.md`](PROCESSOR-DESIGN.md) (frozen API +\nlatency argument) and [`DESIGN.md`](DESIGN.md) (runtime architecture + trait\nseams).\n\n## Crate map\n\n```\nflowcat/\n├── flowcat-core/        # framework: Frame, FrameProcessor, Pipeline/Task/Runner,\n│                        #   Observer/metrics, audio codec/resample/recorder,\n│                        #   native SIP/RTP/SDP UA, Gemini Live, all trait seams\n├── flowcat-services/    # every STT/TTS/LLM/realtime provider + obs exporters + MCP\n│                        #   — one cargo feature each\n├── flowcat-transports/  # str0m WebRTC + Opus, WebSocket, Daily, LiveKit, local\n├── flowcat-telephony/   # carrier FrameSerializers (Twilio/Telnyx/Plivo/…) + DTMF\n├── flowcat-agent/       # declarative graph agent — a config-driven AgentBrain\n├── flowcat-server/      # config-driven single-agent server + browser playground\n├── flowcat-cli/         # `flowcat` demo binary (DX / examples surface)\n├── bench/               # the reproducible pipecat-vs-flowcat benchmark kit + RESULTS.md\n├── bench-rs/            # standalone load-gen + framework micro-bench\n├── PROCESSOR-DESIGN.md  # the frozen FrameProcessor API + latency argument\n├── DESIGN.md            # runtime architecture + the trait seams\n├── FEATURES.md          # the full feature-flag matrix\n└── CONTRIBUTING.md      # how to add a provider + the processor-author contract\n```\n\n## Contributing\n\nContributions welcome — start with [`CONTRIBUTING.md`](CONTRIBUTING.md). Adding a\nprovider is usually a small, self-contained PR; the processor-author contract in\n[`PROCESSOR-DESIGN.md`](PROCESSOR-DESIGN.md) §2.1–§2.3 is required reading.\n\n## License \u0026 attribution\n\nFlowcat is licensed under **Apache-2.0** ([`LICENSE`](LICENSE)). It is built to\nthe same architecture and API model as pipecat (BSD-2-Clause, © Daily), used as\na design reference; no pipecat source is vendored. Third-party provider\nprotocols, service names, and trademarks belong to their respective owners, and\ntheir use requires your own credentials and acceptance of each vendor's terms.\nFull attribution: [`NOTICE`](NOTICE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAreevAI%2Fflowcat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FAreevAI%2Fflowcat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAreevAI%2Fflowcat/lists"}