Show HN: Jauvex, one app for Claude+Codex+Grok+Jev with two-way voice chat Reindent released Jauvex Personal 1.1, an Apache License 2.0 Electron desktop app for macOS that runs Claude Code, Codex and Grok Build coding-agent sessions side by side with two-way voice chat, installed via a single curl command that builds the app locally from source. The app requires Node 22.18 or newer and at least one signed-in Claude or Codex account, keeps sessions where Claude Code and Codex store them, and self-updates by polling jauvex.reindent.com's /api/personal/version at launch and every six hours. Your coding agents, side by side, by voice. Claude, Codex and Grok in one desktop app, with Jev TypeSafe for the fast decisions. Jauvex Personal, version 1.1, for macOS; Apache License 2.0. Source: github.com/reindent/jauvex https://github.com/reindent/jauvex ; site: jauvex.reindent.com https://jauvex.reindent.com . Made by Reindent one human and agents . Jauvex is an Electron client for the Claude Code, Codex and Grok Build sessions on your Mac. Add a folder, pick up any of its sessions or start new ones with either provider, and talk to them: a voice channel that answers in three beats a quick word, what it understood, a summary of the agent's answer , steers a working agent without interrupting it, names and starts agents by voice, and lets agents talk to each other inside the app. No server: the window talks to the main process over IPC, and your sessions stay where Claude Code and Codex keep them. One command in Terminal: curl -fsSL https://jauvex.reindent.com/install | sh It needs Node 22.18 or newer. It downloads this source, checks its SHA-256 and builds Jauvex on your Mac: nothing prebuilt is downloaded, so there is nothing for Apple to notarize. Jauvex lands in Applications ~/Applications when /Applications is not writable , a real app with its own name, icon and microphone permission; the source and the build stay in ~/.jauvex/personal/app . Run the command again to update, with Jauvex closed, or let Jauvex do it: it asks jauvex.reindent.com which version is the latest /api/personal/version , at launch and every six hours, and when a newer one is out the sidebar's footer says so "1.2.0 is out" and the Jauvex agent asks you, once per version, whether to update now. On a yes or "update the app" at any time it runs node scripts/jauvex.ts update : refused while other agents work --now on your word ; otherwise the app fetches the same install command, checks that it installs the version offered, leaves it and a small runner in ~/.jauvex/personal/update/ , hands the runner to launchd and quits. The runner waits for the app to exit, runs the install command it rebuilds the app on your Mac and opens it , opens the old app again if it does not finish, and removes it; its log is update/update.log . Only the app the install command made updates itself; a clone updates with git T-165 . To remove it, quit it and delete Jauvex.app and ~/.jauvex/personal/app ; its settings stay in ~/.jauvex/personal . To work on the code, clone this repository instead: npm start runs it from the clone, and npm run app makes the same app in tmp/mac-app/Jauvex.app scripts/mac-app.ts : Electron's app renamed Jauvex, with the built app, the Whisper models, Claude and Codex inside, signed ad hoc on your Mac . Jauvex needs a few things that are not in this repository; the install command and npm start take care of most of them. The welcome screen on the first start, and from Jauvex settings after checks each of them and tells you what is missing. 1. Node 22.18 or newer it runs the TypeScript scripts and checks as they are , then npm install in this folder it also fetches the Electron binary; if the app ever says Electron.app does not exist , run npx install-electron . 2. Claude or Codex, signed in: at least one is a must. Both binaries come with npm install the Claude Agent SDK brings Claude Code, @openai/codex brings Codex , and Jauvex uses the account each one is signed in to on this Mac. You sign in with their own command lines, in Terminal: claude auth login Claude Code; to install it, curl -fsSL https://claude.ai/install.sh | bash or codex login Codex; brew install codex . Jauvex signs no one in itself: Anthropic does not let apps built on its Agent SDK offer the Claude.ai login. The welcome screen and the accounts panel the Jauvex button below the sidebar say who is signed in and give the command; with one signed in, the Jauvex agent can walk you through the other. 3. Grok, optional : Grok Build, xAI's coding agent, when it is on this Mac curl -fsSL https://x.ai/cli/install.sh | bash , then grok login . Jauvex runs it as grok agent stdio with your Grok account and settings; without it, Grok is simply not offered. 4. whisper.cpp for the ears : npm start installs it with Homebrew if it is missing and downloads the two models into models/ git-ignored : ggml-small-q5 1.bin for the transcript and ggml-base-q5 1.bin for the live words while you speak. Each is checked against the size and SHA-256 Hugging Face lists for it scripts/models.sh : a download goes to a .part file and becomes the model once it is whole, so one cut short is downloaded again the next time, never taken for done. Other models from huggingface.co/ggerganov/whisper.cpp can be dropped in the same folder and picked in the voice settings ggml-large-v3-turbo-q5 0.bin , 574 MB, hears better and is still quick on Apple silicon . Without Whisper you can still type. 5. A TypeSafe key for Jev , optional: in TYPESAFE API KEY or the file ~/.typesafe/token , the key alone the way Hugging Face keeps its token; the older ~/.typesafe/jev still works . Without it the small voice model makes the decisions Jev would make, a little more slowly. 6. The microphone : macOS asks the first time voice mode is switched on. 7. The voice is macOS's System voice, through say . On a fresh Mac that is the basic Samantha, which sounds robotic: pick a Siri voice in System Settings Accessibility Spoken Content System voice. An app cannot choose a Siri voice by itself say -v falls back to Samantha ; only that setting reaches them. The welcome screen checks this and has a button that opens the pane. npm start builds, then launches through macOS LaunchServices start.sh npm run dev Vite + Electron with reload, for working on the UI Put the folder somewhere plain, such as ~/Coding/jauvex : macOS protects Documents, Desktop, Downloads and iCloud Drive, and an app started there cannot read its own files until it has been granted access npm start then starts it from the terminal instead, which works but attributes the permission prompts to the terminal . Only one copy may run at a time the app holds a lock; a second launch focuses the first . It keeps its own state in its data folder, ~/.jauvex/personal every copy, run from source or compiled; data/ below means that folder; CVC DATA DIR moves it , and uses ports 4340 Vite, dev only and 4341 whisper-server , plus 4342 for the live words Pro uses 4320 to 4322, so both can run side by side . Jauvex is built on your Mac from this source: npm start runs it from the Electron binary in node modules , the install command as Jauvex.app. - Add folder : native folder dialog. Each folder is a project, like in Claude Code. - + on a project : lists every Claude, Codex and Grok session recorded for that folder title, first prompt, provider, branch, size, last activity , with a switch to see all, only Claude's or only Codex's with counts and each provider's mark on its rows. Tick the ones you want; they appear under the project in the sidebar. - Folders fold, the sidebar resizes : a click on a folder's name its folder icon open or closed folds its sessions away, and it stays folded after a reload. The sidebar's right edge drags to any width from 220 to 560 px, kept too. - Only a signed-in provider can be chosen : a provider that is not signed in on this Mac is greyed out, with the reason, in the provider selector, in the Jauvex agent's move selector and in the default-agent setting; a new session never starts on one. - What agents are told about the thread : it is plain markdown, so no LaTeX formulas and matrices as plain text or a code block , no Mermaid or other diagram languages plain-text drawings in a code block , no raw HTML, local files as paths in backticks rather than links, images as markdown images. Terminal colour codes in tool output are stripped. - A provider's failure is an error, not an answer : a turn that fails, or an answer that is the provider's own failure text an organisation that disabled subscription access, an allowance run out, a network error , shows as a red card in the thread, and the voice says one line about it instead of summing it up. - One provider per session, for life : a session imported from Claude continues with Claude, one imported from Codex continues with Codex, one from Grok with Grok each session row carries its provider's own tiny mark, Claude's, OpenAI's or Grok's, and a Jev agent row TypeSafe's; the title bar has a chip. The marks are their owners' trademarks, used only to say whose session it is: the first three from @lobehub/icons-static-svg , MIT; TypeSafe's is its site icon, assets/typesafe.png . A new session lets you pick the provider in the composer until the first message is sent; the model and effort pickers follow the provider effort: Claude's fixed levels, or the levels Codex or Grok reports for the chosen model; applies from the next message Codex models come from your account through model/list , Grok's from its agent's model list . - Open a session : the conversation loads. User messages as bubbles, Claude's replies as text, tool calls and thinking folded into one-line rows you can expand a Codex call shows the moment it starts and gets its result when it completes , harness plumbing reminders, tool results, cross-session messages hidden unless you toggle the eye icon. Long sessions page from the end "Load earlier messages" . - The Jauvex agent : one session that always exists, pinned at the top of the sidebar, with the app's own folder as its project and a briefing about the app itself. It is the entry point for everything about the app: restart it, update it git pull , build, relaunch, on request , install what is missing, explain how it works, create agents and add folders through the app's command line, below , and develop it for contributors. Every other agent is told it exists and to send it what concerns running the app, and that the app's code is theirs to work on too when the user asks and the source is in their folder a Codex agent made a development agent once refused to read it, told that anything about the app was the Jauvex agent's . It runs on the default agent, keeps one session for life ui.jauvexSession , and can be hidden in Jauvex settings it still exists and still answers other agents . It moves between providers with its whole context the only session that does, for now : the app keeps its own transcript of it data/jauvex-transcript.json , user and assistant text only , the provider selector in its composer stays live, and the first message after a move carries the conversation so far as a prelude to a fresh session on the other provider, so Claude and Codex pick up where the other left off. Moving back works the same way. The thread shows the app's transcript, tool calls and results included results trimmed , with a note at every move. A move ends voice mode the voice engine and its acknowledgment model belong to the provider it started with : start it again when you like. Two ways to move, asked on the welcome when both providers are signed in and changeable in Jauvex settings: unified the default, experimental: the app replays the whole conversation, and more can break or handover the leaving assistant writes a handover note in a visible turn, saved as data/jauvex-handover.md too, and the next provider starts from that note: cheaper on long histories, and the note says what mattered . - The app's command line node scripts/jauvex.ts