Press Win+C (or the Copilot key) and Gemini Live starts listening and sees the display you were working on. Talk over it any time, pick another display (or your webcam) from the flyout, and press Win+C again (or ×) to end.
Created by Avi.
2026-10-24.07-49-50.msedge.mp4
Warning
By default, Gemini Live rides your Gemini subscription through Google's own web client, which Google doesn't offer for this use. Google may suspend or ban an account that uses it. If you'd rather not risk your account, switch to your own Gemini API key - the official, public Live API.
- Windows 11 23H2 or newer, up to date, so it has the Customize Copilot key on keyboard setting that lets you choose what Win+C opens
- A Chromium browser (Chrome, Edge, Brave…) that can sideload an extension in Developer mode, signed in to the Google account you use Gemini with
Nothing else to install by hand: the package carries its own Node for the pill (about 90 MB of the download) and the install script adds the Windows App SDK 2.2 runtime if your PC lacks it.
Download the files from the latest release.
- Put
GeminiLive-<version>.msix,GeminiLive.cer,Install-GeminiLive.ps1andInstall-WindowsAppRuntime.ps1in one folder. - In that folder, run:
The release is signed with a self-signed certificate, so the first install asks once (UAC) to trust it. If the Windows App SDK 2.2 runtime is missing, the script first installs it from Microsoft's installer, which it runs only when the signature is Microsoft's. Later versions install over it and keep your microphone permission.
powershell -ExecutionPolicy Bypass -File .\Install-GeminiLive.ps1
- Set it as Win+C. The script opens Settings › Personalization › Text input. Under Customize Copilot key on keyboard, choose Gemini Live. That setting covers both the Copilot key and Win+C.
The extension hands the app your browser's Google session, so Gemini runs signed in as you.
- Open
chrome://extensions(edge://extensionsin Edge) and turn on Developer mode (top right). - Drag
gemini-live-session-<version>-chrome.zipfrom File Explorer onto the page.
The .crx in the release is the same extension, signed. You can drag it in the same way, but on Windows, Chrome may turn off an extension that didn't come from the Chrome Web Store, so the .zip is the reliable choice.
Stay signed in to Google in that browser. If you sign out there, Gemini Live waits until you sign back in.
The extension is only needed for the Google account engine. With your own API key, skip it.
The app reads a small manifest this repository hosts (docs/updates.json: the version, the package's URL and its SHA-256) at start and every six hours. When it names a newer release, the app downloads the package in the background and checks it against the hash, then the gear menu offers Restart to update. That opens the package in Windows' App Installer, where you choose Update. Check for updates in the same menu looks right away, and Check for updates automatically turns the looking, and every connection it makes, off. The release must be signed with the same certificate as your install.
To publish one: .\scripts\install.ps1 -Mode Release, attach build\release\GeminiLive-<version>.msix to the GitH
8000
ub release v<version>, then .\scripts\Write-UpdateManifest.ps1 -Package build\release\GeminiLive-<version>.msix and push docs/updates.json. Until that push, installed copies see no update.
Open the pill (Win+C), click the gear, and under Gemini runs on choose Your API key. Paste the key and press Enter. Change API key… in the same menu replaces it. Switch back to Your Gemini subscription at any time.
The key is stored encrypted for your Windows user (DPAPI). A GEMINI_API_KEY environment variable, if set, takes precedence.
Usage is billed to the key's Google Cloud project under the Gemini API pricing; the free tier works, with lower rate limits.
The quickest route is Google AI Studio › API keys › Create API key. AI Studio sets up everything the key needs, including the service account it's bound to.
The Gemini API now rejects unrestricted keys, and new Gemini keys must be bound to a service account (details). To make one in the Google Cloud console instead:
- Open the Google Cloud console and create a project (or pick an existing one) from the project picker at the top.
- Go to APIs & Services › Library, search for Gemini API (
generativelanguage.googleapis.com) and click Enable. - Go to IAM & Admin › Service accounts › Create service account, name it (e.g.
gemini-live) and click Done. - Go to APIs & Services › Credentials › Create credentials › API key.
- Under API restrictions, choose Restrict key and tick Generative Language API.
- Tick Authenticate API calls through a service account, click Select a service account, and pick the one from step 3.
- Click Create, copy the key from the API key created dialog, and paste it into Gemini Live.
Use this key only for Gemini. Google's docs warn that a key shared with other APIs breaks Gemini once it's restricted to them.
With the gcloud CLI installed, in PowerShell:
gcloud auth login
gcloud projects create gemini-live-<something-unique> # or skip and use an existing project
gcloud config set project gemini-live-<something-unique>
gcloud services enable generativelanguage.googleapis.com apikeys.googleapis.com
$project = gcloud config get-value project
gcloud iam service-accounts create gemini-live --display-name="Gemini Live for Windows"
gcloud beta services api-keys create --display-name="Gemini Live for Windows" `
--api-target=service=generativelanguage.googleapis.com `
--service-account="gemini-live@$project.iam.gserviceaccount.com"
$keyName = gcloud services api-keys list --filter="displayName='Gemini Live for Windows'" --format="value(name)"
gcloud services api-keys get-key-string $keyName --format="value(keyString)"The last command prints the key. --api-target restricts it to the Gemini API and --service-account binds it, like steps 5 and 6 above. Binding needs the beta command, and your account needs the Service Account User and Service Account API Key Binding Admin roles on the project.
- Google account engine (default). The real Gemini web client (
gemini.google.com/glic, the one behind Gemini in Chrome) runs in a hidden WebView2. It owns the mic, echo cancellation, the Live connection and Gemini's voice.- Pictures: it pulls screen stills from the app, a fresh one each second. The app announces the screen under a new tab id each time, since the client sends one picture per tab id.
- Text: each picture comes with an exact text copy of the foreground window, read through UI Automation, so small text Gemini can't make out in the picture still reaches it word for word.
- Recovery: a Live that breaks is retried with Gemini's own Try again, then reloaded, up to three times in ten minutes.
- Your browser's Google session. The companion extension pushes the session over a loopback WebSocket whenever Google rotates it. The app never rotates the cookies itself, so your browser stays the only owner of the session.
- The socket has no fixed port. The app listens on a free one each run and hands it out, with a fresh token, through a native messaging host (
GeminiLiveHost.exe). The browser lets only this extension's ID talk to that host. - The extension sends cookies only after the app greets it with that token.
- The socket has no fixed port. The app listens on a free one each run and hands it out, with a fresh token, through a native messaging host (
- API key engine (gear › Gemini runs on › Your API key). The public Gemini Live API over a WebSocket, with Windows' echo-cancelled audio (default microphone) and about one JPEG screen frame per second. No browser, extension or Google account involved.
Needs the .NET 10 SDK, the Windows 10 SDK (for makeappx and signtool), Node 24 and pnpm. Node is only for building; the installed app runs the pill on the node.exe it ships. The install script downloads that Node (the version in Directory.Build.props, checked against nodejs.org's SHA-256) into build\node, and installs the Windows App SDK 2.2 runtime if it is missing.
pnpm install
pnpm --filter @gemini-live/pill build # type-check and build the pill into pill\dist
pnpm --filter @gemini-live/app build # type-check and build the TypeScript app into app\dist
.\scripts\install.ps1 # build, sign with a local certificate, install
.\scripts\install.ps1 -Mode Register # unsigned dev-mode install for fast iteration
.\scripts\install.ps1 -Mode Release # the release files, in build\release
.\scripts\install.ps1 -Mode Stage -Entry Sea # lay out the TypeScript app's package, install nothingThe default install is the WPF app with the pill as a sidecar. -Entry Sea builds the TypeScript app in app/ instead: the same pill, engines and overlays in one Node process (the bundled node.exe, turned into GeminiLive.exe), with a main thread for the logic and a UI worker for the windows. See the architecture note.
Windows only lists signed providers in the Copilot key setting, so use the default mode to try Win+C. The release mode signs the extension's .crx with keys\chrome.pem, which git ignores; the extension's ID comes from that key.
| Path | What |
|---|---|
src/GeminiLive |
the WPF app |
src/GeminiLiveHost |
the native messaging host the extension asks for the app's link |
pill/ |
the pill's UI: Svelte on winui-svelte, run by the app as a Node sidecar |
app/ |
the whole app in TypeScript on winui-svelte (the -Entry Sea install): src/main.ts and src/window.ts are its two threads, src/wiring/ builds it |
protocol/ |
the wire shared by the pill, the app and the extension: the pill's view and actions, and the extension link |
bridge/ |
the TypeScript injected into the hidden Gemini and Google Home pages (glic/, home/, shared/) |
extension/ |
the companion browser extension (WXT) |
messaging/ |
typed messaging, in @webext-core/messaging's protocol-map style, shared by the bridges, the extension and (as Messaging.cs) the app |
analyzers/ |
the C# side of the lint rules |
package/ |
the MSIX manifest and assets |
pnpm dev:lint # fallow, oxlint + ESLint, stylelint, svelte-check, the tests, and dotnet format
pnpm svelte:check # type-check the pill's and the app's Svelte and TypeScript
pnpm test # the TypeScript app's tests (Node's test runner)TypeScript follows the youtube-time-manager setup: oxlint for logic, ESLint for layout, fallow for dead code and complexity. The C# side mirrors the same rules through .editorconfig and the analyzers in analyzers/. A pre-commit hook runs them on staged files.
- Log:
%LOCALAPPDATA%\GeminiLive\log.txt. - Create
%LOCALAPPDATA%\GeminiLive\debug.flagto turn on DevTools and CDP for the hidden pages, each on a free port the log names (glic: devtools on localhost:<port>), and to keep the overlays visible in screenshots.
Press Win+Alt+C to freeze the screen, circle something, and then ask Gemini about it, search it with Google Lens, or select its text and copy it. While Live runs, the circled area becomes what Gemini sees, until you press Esc to go back to the whole monitor.
Inspired by AKS-Labs/CircleToSearch, an Android app. Only its idea and look were carried over; it is GPL-3, and none of its code is used here.
Apache License 2.0. Forks and other redistributions must keep the NOTICE file and credit Avi in their documentation and in any about or credits screen.
Not affiliated with Google or Microsoft.