An unofficial desktop client for Google Gemini, built with Electron.
Google does not provide an official desktop application for Gemini. This project wraps the Gemini web interface in a native desktop window, offering a streamlined experience with system-level integration.
- Native Desktop Window — Runs Gemini as a standalone application, separate from your browser.
- System Tray — Closing the window minimizes the app to the system tray instead of quitting. Right-click the tray icon for quick access.
- Global Shortcut — Press
Ctrl+Shift+G(orCmd+Shift+Gon macOS) to instantly show or hide the app from anywhere. - Persistent Session — Login state and cached data are preserved across restarts using a dedicated Electron session partition.
- Auto-Update — The app checks for new releases on GitHub and updates automatically with in-app progress notifications.
- Settings Panel — Configure close behavior, launch at startup, and always-on-top mode.
- Single Instance — Only one instance of the app can run at a time. Launching again focuses the existing window.
- Keyboard Shortcuts —
Ctrl+R/Cmd+Rto reload the Gemini view, plus navigation controls (Back / Forward). - Cross-Platform — Available for Windows (x64, ARM64) and macOS.
Download the latest release for your platform from the Releases page.
| Platform | Architecture | Format |
|---|---|---|
| Windows | x64 | .exe (NSIS installer) |
| Windows | ARM64 | .exe (NSIS installer) |
| macOS | Universal | .dmg / .zip |
The Windows installer allows you to choose a custom installation directory.
- Node.js 20 or later
- npm
git clone https://github.com/x3r0s/gemini-desktop.git
cd gemini-desktop
npm installRun in development mode:
npm run devBuild distributable packages:
npm run packageOutput files will be placed in the release/ directory.
| Script | Description |
|---|---|
npm run dev |
Start the app in development mode with hot-reload |
npm run build |
Compile the source with electron-vite |
npm run preview |
Preview the built app |
npm run icons |
Generate platform-specific icons from src/assets/icon.png |
npm run package |
Full build: generate icons, compile source, and create distributable packages |
gemini-desktop/
├── .github/workflows/ # CI/CD (GitHub Actions release workflow)
├── build/ # Build resources and generated icons
├── src/
│ ├── main/ # Electron main process
│ │ ├── index.ts # App lifecycle, window, tray, IPC, auto-updater
│ │ └── settings.ts # Persistent settings (JSON in userData)
│ ├── preload/
│ │ └── index.ts # Context bridge (safe IPC for renderer)
│ └── renderer/ # React UI
│ ├── components/
│ │ ├── TitleBar.tsx # Custom titlebar with nav controls (Windows)
│ │ ├── Settings.tsx # Settings modal
│ │ └── UpdateToast.tsx # Auto-update notification toast
│ ├── App.tsx
│ ├── main.tsx
│ ├── index.html
│ └── index.css
├── electron-builder.yml # electron-builder packaging config
├── electron.vite.config.ts
├── tailwind.config.js
├── tsconfig.json
└── package.json
| Category | Technology |
|---|---|
| Framework | Electron |
| UI | React 19 |
| Language | TypeScript |
| Styling | Tailwind CSS |
| Bundler | Vite via electron-vite |
| Packaging | electron-builder |
| Auto-Update | electron-updater |
Contributions are welcome! Whether it's a bug report, feature suggestion, or pull request, your input helps improve the project.
- Use GitHub Issues to report bugs or request features.
- Include your OS, architecture, and app version when reporting bugs.
- Attach relevant logs or screenshots if possible.
- Fork the repository and create your branch from
main. - Install dependencies with
npm install. - Make your changes — keep commits focused and descriptive.
- Test locally by running
npm run devand verifying your changes work on your platform. - Build with
npm run packageto confirm the distributable builds without errors. - Open a pull request against
mainwith a clear description of what changed and why.
- TypeScript strict mode is enabled for the entire codebase.
- Use functional React components with hooks.
- Style with Tailwind CSS utility classes — avoid custom CSS unless necessary.
- Follow the existing project structure when adding new files.
mainis the primary branch. All development and releases flow from here.- Feature branches should be short-lived and merged via pull requests.
This project follows Semantic Versioning (MAJOR.MINOR.PATCH):
| Change Type | Version Bump | Example |
|---|---|---|
| Breaking changes | MAJOR |
Fundamental architecture changes |
| New features, enhancements | MINOR |
Adding settings panel, ARM64 support |
| Bug fixes, small tweaks | PATCH |
Fixing window behavior, icon corrections |
Releases are fully automated through GitHub Actions:
- Create and push a git tag following the
v*pattern (e.g.,v1.2.0). - The CI workflow automatically:
- Syncs
package.jsonversion with the git tag. - Builds the app for Windows (x64, ARM64) and macOS.
- Publishes the artifacts to a GitHub Release.
- Syncs
- Existing installations will detect the new version and prompt users to update.
This project is licensed under the MIT License.