VoxCode is a local voice AI coding workspace that lets you talk to a codebase, ask for summaries, explore architecture, and optionally allow Cursor SDK to make small file edits.
It combines three providers with deliberately separate responsibilities:
- Deepgram Voice Agent handles microphone transcription, live voice orchestration, function-call flow, and text-to-speech audio.
- Nebius Token Factory / MiniMax handles reasoning, tool routing, prompt shaping, chat titles, and response polishing.
- Cursor SDK handles codebase inspection and file edits inside your configured
CODE_WORKSPACE.
The app is read-only by default. File edits only run when you explicitly enable Allow file edits before starting a session.
The public deployment is a polished preview of the VoxCode interface and setup flow. The real voice coding backend runs locally because it needs your private API keys and access to your local CODE_WORKSPACE.
- Voice codebase summaries: Ask for brief or deep summaries of a workspace, folder, or file.
- Architecture Q&A: Talk through how a project is structured and what each component does.
- Optional file edits: Enable Cursor SDK edits for small, specific changes.
- Read-only default: The safest path is the default path.
- Activity log: Watch Deepgram, Nebius, Cursor, and local system events while a session runs.
- Text fallback: Use the same routing pipeline from the command box when microphone access is unavailable.
- Provider health check: Visit
/api/healthto confirm configured models and workspace metadata without leaking secrets.
flowchart LR
speak["You speak"] --> app["VoxCode local app"]
app --> deepgram["Deepgram voice"]
app --> nebius["Nebius MiniMax reasoning"]
app --> cursor["Cursor SDK coding agent"]
cursor --> files["Your CODE_WORKSPACE files"]
deepgram --> speak
Deepgram turns speech into a live voice session. Nebius decides whether the user is chatting, asking a code question, requesting a summary, or asking for an edit, then polishes the response. Cursor SDK performs the actual code work against your local workspace.
- Node.js / TypeScript: Express backend, WebSocket voice proxy, Vite + React client.
- Deepgram Voice Agent: Voice orchestration, STT, function calling, and TTS.
- Nebius Token Factory: OpenAI-compatible MiniMax reasoning and response polishing.
- Cursor SDK: Local coding agent for workspace inspection and optional edits.
- Node.js 22.13 or newer. Cursor SDK currently requires Node
>=22.13. - A Cursor API key.
- A Deepgram API key.
- A Nebius Token Factory API key.
- A local codebase you want VoxCode to inspect or edit.
git clone https://github.com/tirth1263/VoxCode-Cursor-Code-Editor.git
cd VoxCode-Cursor-Code-Editor
npm install
cp .env.example .envOpen .env and fill in your keys:
CURSOR_API_KEY=your_cursor_key
DEEPGRAM_API_KEY=your_deepgram_key
NEBIUS_API_KEY=your_nebius_keySet CODE_WORKSPACE to the project VoxCode should inspect:
CODE_WORKSPACE=/absolute/path/to/your/codebaseStart the app:
npm run devOpen:
http://127.0.0.1:8787
Click Start voice and try:
- "Are you listening?"
- "Summarize this workspace."
- "Give me a deep summary of the server folder."
- "What are Deepgram, Nebius, and Cursor doing in this app?"
Use the absolute path to the codebase you want VoxCode to operate on.
Examples:
CODE_WORKSPACE=/Users/alex/projects/my-next-app
CODE_WORKSPACE=/Users/alex/work/company-api
CODE_WORKSPACE=/Users/alex/Desktop/GitHub/Cursor-SDKIf you leave it blank, VoxCode defaults to the parent folder of this app. That is useful for demos, but an explicit path is safer for real work.
| Variable | Required | Default | Purpose |
|---|---|---|---|
CURSOR_API_KEY |
Yes | none | Authenticates Cursor SDK agent runs. |
DEEPGRAM_API_KEY |
Yes | none | Connects to Deepgram Voice Agent. |
NEBIUS_API_KEY |
Yes | none | Powers Deepgram's BYO LLM think step and backend response polishing. |
CODE_WORKSPACE |
No | parent folder of this app | Target codebase Cursor inspects or edits. Use an absolute path for clarity. |
PORT |
No | 8787 |
Local server port. |
CURSOR_MODEL |
No | composer-2 |
Cursor coding-agent model. Cursor may route aliases to the current Composer model. |
DEEPGRAM_LISTEN_MODEL |
No | nova-3 |
Deepgram speech-to-text model. |
DEEPGRAM_SPEAK_MODEL |
No | aura-2-thalia-en |
Deepgram text-to-speech model. |
NEBIUS_ENDPOINT |
No | https://api.tokenfactory.nebius.com/v1 |
OpenAI-compatible Nebius endpoint used by Deepgram and backend calls. |
NEBIUS_MODEL |
No | MiniMaxAI/MiniMax-M2.5 |
Nebius model for voice reasoning and polishing. |
npm run devStarts the local development server with Vite middleware and the Node WebSocket backend.
npm run typecheckRuns TypeScript checks for the browser and server code.
npm run buildBuilds the Vite client and compiles the server.
npm startRuns the production server from dist. Run npm run build first.
VoxCode is read-only by default.
To allow edits:
- Start the app.
- Check Allow file edits before starting voice.
- Ask for a small, specific change.
Cursor SDK is the only component that edits files. Nebius routes and polishes. Deepgram handles voice. The app does not use MiniMax as a direct filesystem editor.
- In the UI, open Activity to see Deepgram, Nebius, Cursor, and local system events.
- In the terminal running
npm run dev, watch backend logs and provider errors. - Visit
/api/healthto confirm configured workspace and provider model metadata. It never returns secret values.
Restart the dev server:
Ctrl+C
npm run devThen hard refresh the browser with Cmd+Shift+R on macOS or Ctrl+Shift+R on Windows/Linux.
Check that .env contains:
CURSOR_API_KEY=
DEEPGRAM_API_KEY=
NEBIUS_API_KEY=Also confirm your browser has microphone permission for 127.0.0.1.
Set CODE_WORKSPACE to an absolute path and restart the server.
Code summaries and edits run a real coding agent against the workspace. Narrow the target:
src/server
src/client/main.tsx
README.md
Use Brief depth for faster summaries.
.envis ignored by git./api/healthreports whether providers are configured, but never returns API keys.- File edits require an explicit UI toggle.
- Keep
CODE_WORKSPACEscoped to the project you actually want Cursor to inspect.
MIT