{"id":51343248,"url":"https://github.com/mahimairaja/livekit-starter","last_synced_at":"2026-07-02T09:33:18.033Z","repository":{"id":365323756,"uuid":"1270033890","full_name":"mahimairaja/livekit-starter","owner":"mahimairaja","description":"Full-stack LiveKit voice agent starter: a Python voice worker, FastAPI token server, and React frontend. Run, deploy, and swap each piece on its own.","archived":false,"fork":false,"pushed_at":"2026-06-16T21:16:06.000Z","size":867,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-16T22:24:10.639Z","etag":null,"topics":["ai-agents","cartesia","conversational-ai","deepgram","fastapi","livekit","llm","openai","python","react","realtime","sip","speech-to-text","starter-template","text-to-speech","typescript","voice-agent","voice-ai","voice-assistant","webrtc"],"latest_commit_sha":null,"homepage":"https://playground.mahimai.ca","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mahimairaja.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"mahimairaja","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2026-06-15T10:16:34.000Z","updated_at":"2026-06-16T21:15:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mahimairaja/livekit-starter","commit_stats":null,"previous_names":["mahimairaja/livekit-starter"],"tags_count":1,"template":true,"template_full_name":"mahimairaja/fastapi-starter","purl":"pkg:github/mahimairaja/livekit-starter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mahimairaja%2Flivekit-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mahimairaja%2Flivekit-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mahimairaja%2Flivekit-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mahimairaja%2Flivekit-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mahimairaja","download_url":"https://codeload.github.com/mahimairaja/livekit-starter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mahimairaja%2Flivekit-starter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35041996,"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-02T02:00:06.368Z","response_time":173,"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":["ai-agents","cartesia","conversational-ai","deepgram","fastapi","livekit","llm","openai","python","react","realtime","sip","speech-to-text","starter-template","text-to-speech","typescript","voice-agent","voice-ai","voice-assistant","webrtc"],"created_at":"2026-07-02T09:33:17.175Z","updated_at":"2026-07-02T09:33:18.028Z","avatar_url":"https://github.com/mahimairaja.png","language":"Python","funding_links":["https://github.com/sponsors/mahimairaja"],"categories":[],"sub_categories":[],"readme":"\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/banner-dark.webp\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"assets/banner-light.webp\"\u003e\n  \u003cimg src=\"assets/banner-light.webp\" alt=\"LiveKit Voice AI Starter\" width=\"100%\" /\u003e\n\u003c/picture\u003e\n\n\u003ch1 align=\"center\"\u003eLiveKit Voice AI Starter\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eTalk to an AI agent in your browser, in minutes.\u003c/b\u003e\u003cbr/\u003e\n  A full-stack, production-minded starter for real-time voice agents: a LiveKit\n  voice worker, a FastAPI token server, and a React frontend built on LiveKit's\n  Agents UI, wired together and ready to extend.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003c!--\u003ca href=\"https://your-demo-url\"\u003e\u003cimg src=\"assets/badges/live-demo.svg\" alt=\"Live Demo\" height=\"30\"\u003e\u003c/a\u003e--\u003e\n  \u003ca href=\"https://livekit.io\"\u003e\u003cimg src=\"assets/badges/livekit.svg\" alt=\"LiveKit\" height=\"30\"\u003e\u003c/a\u003e\n  \u003cimg src=\"assets/badges/voice-first.svg\" alt=\"Voice First\" height=\"30\"\u003e\n  \u003ca href=\"https://www.python.org\"\u003e\u003cimg src=\"assets/badges/python.svg\" alt=\"Python\" height=\"30\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://fastapi.tiangolo.com\"\u003e\u003cimg src=\"assets/badges/fastapi.svg\" alt=\"FastAPI\" height=\"30\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://react.dev\"\u003e\u003cimg src=\"assets/badges/react.svg\" alt=\"React\" height=\"30\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.typescriptlang.org\"\u003e\u003cimg src=\"assets/badges/typescript.svg\" alt=\"TypeScript\" height=\"30\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://tailwindcss.com\"\u003e\u003cimg src=\"assets/badges/tailwind.svg\" alt=\"Tailwind CSS\" height=\"30\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"assets/badges/license-mit.svg\" alt=\"MIT License\" height=\"30\"\u003e\u003c/a\u003e\n  \u003ca href=\"../../issues\"\u003e\u003cimg src=\"assets/badges/prs-welcome.svg\" alt=\"PRs welcome\" height=\"30\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nMost voice-AI demos are a single script. This is the whole loop, structured the\nway you'd actually ship it, and split into three pieces you can run, deploy, and\nswap independently.\n\n## What's inside\n\n| Package         | What it is                                                                                                                                                                  |\n| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **`agent/`**    | A LiveKit voice worker: Deepgram `nova-3` STT, OpenAI `gpt-4.1-mini`, Cartesia TTS, Silero VAD, and the LiveKit multilingual turn detector. Web and SIP, explicit dispatch. |\n| **`backend/`**  | A FastAPI service that mints LiveKit room tokens (`POST /api/v1/token`), with a clean API → service → repository layout you copy to add resources.                          |\n| **`frontend/`** | React + Vite + Tailwind using LiveKit's Agents UI components: audio visualizer, live transcript, and text chat.                                                             |\n\nTyped end to end, tested, linted, with CI and a pre-commit hook across all three.\n\n## How it fits together\n\n```\n  React app  ──POST /api/v1/token──▶  Backend  ──signs token──▶  React joins room\n      │                                                               │\n      └───────────────── connects to LiveKit room ◀──────────────────┘\n                                   │\n                  agent_name dispatches  ──▶  Agent worker joins\n                                   │\n                         mic ▶ STT ▶ LLM ▶ TTS ▶ speaker  (over WebRTC)\n```\n\nThe backend and agent share the same LiveKit credentials, so a backend-minted\ntoken is valid for the room the agent joins. Works against self-hosted LiveKit\nor LiveKit Cloud.\n\n## Run with Docker\n\nThe fastest path. One command brings up Postgres, the backend, the agent, and the\nfrontend together:\n\n```bash\ncp .env.example .env     # fill in LIVEKIT_* + OPENAI/DEEPGRAM/CARTESIA\ndocker compose up --build\n```\n\nOpen `http://localhost:5173` and click **Start conversation**. Uses an external\nLiveKit project (a free LiveKit Cloud project works). The voice demo needs no\ndatabase; for the auth/User endpoints, run once:\n`docker compose exec backend alembic upgrade head`.\n\n## Run manually\n\nYou'll need a LiveKit project (URL + API key/secret) and provider keys\n(OpenAI, Deepgram, Cartesia). Run each in its own terminal:\n\n```bash\n# 1. Backend: token server (http://localhost:8000)\ncd backend \u0026\u0026 cp .env.example .env   # add LIVEKIT_* + JWT_SECRET_KEY\nuv sync \u0026\u0026 uv run uvicorn src.main:app --reload\n\n# 2. Agent: voice worker\ncd agent \u0026\u0026 cp .env.example .env      # add LIVEKIT_*, OPENAI/DEEPGRAM/CARTESIA keys\nuv sync \u0026\u0026 uv run python main.py dev\n\n# 3. Frontend: web client (http://localhost:5173)\ncd frontend \u0026\u0026 cp .env.example .env   # point VITE_TOKEN_ENDPOINT at the backend\npnpm install \u0026\u0026 pnpm dev\n```\n\nOpen `http://localhost:5173`, click **Start conversation**, allow the mic, and talk.\n\n\u003e No frontend yet? Talk to the agent from your terminal with\n\u003e `cd agent \u0026\u0026 uv run python main.py console`.\n\n## Stack\n\n| Layer           | Default                                                                       |\n| --------------- | ----------------------------------------------------------------------------- |\n| STT / LLM / TTS | Deepgram `nova-3` · OpenAI `gpt-4.1-mini` · Cartesia (all swappable)          |\n| Realtime        | LiveKit Agents (`livekit-agents`), WebRTC, Silero VAD, turn detector          |\n| Backend         | FastAPI, async SQLModel/Postgres, dependency-injector, PyJWT, `livekit-api`   |\n| Frontend        | React 19, Vite, TypeScript, Tailwind v4, shadcn + LiveKit Agents UI           |\n| Tooling         | uv, ruff, mypy, pytest · ESLint, Vitest · pre-commit, GitHub Actions, Codecov |\n\n## Highlights\n\n- **One command per service** to run locally; one `.env.example` each.\n- **Web and telephony** (SIP) on the same agent, via a single participant branch.\n- **Swappable providers** and self-hosted ↔ LiveKit Cloud with a one-line change.\n- **Standard token endpoint** so LiveKit client SDKs connect with zero glue.\n- **Copy-to-extend** patterns: a `User` slice in the backend, a bare `Assistant` in the agent.\n\n## Docs\n\nEach package has its own README with details:\n[`agent/`](agent/README.md) · [`backend/`](backend/README.md) · [`frontend/`](frontend/README.md)\n\n## License\n\nMIT. See [`LICENSE`](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmahimairaja%2Flivekit-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmahimairaja%2Flivekit-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmahimairaja%2Flivekit-starter/lists"}