diff --git a/README.md b/README.md
index 606c4cd..7afe685 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
[](https://community.ultralytics.com)
[](https://reddit.com/r/ultralytics)
-Lite is a fast, local workspace for [Claude Code](https://code.claude.com/docs/en/overview), [Codex](https://developers.openai.com/codex/cli) on OpenAI or [DeepSeek](https://api-docs.deepseek.com/quick_start/agent_integrations/codex), [Kimi Code](https://www.kimi.com/code), and your shell. Keep agent sessions, files, and Git context together without repository indexing, telemetry, or a cloud service.
+Lite is a fast, local workspace for [Claude Code](https://code.claude.com/docs/en/overview), [Codex](https://developers.openai.com/codex/cli) on OpenAI, [DeepSeek](https://api-docs.deepseek.com/quick_start/agent_integrations/codex), or [OpenRouter](https://openrouter.ai/docs/cookbook/coding-agents/codex-cli), [Gemini CLI](https://google-gemini.github.io/gemini-cli/), [Kimi Code](https://www.kimi.com/code), [Qwen Code](https://qwenlm.github.io/qwen-code-docs/en/), and your shell. Keep agent sessions, files, and Git context together without repository indexing, telemetry, or a cloud service.
@@ -21,11 +21,12 @@ Lite is a fast, local workspace for [Claude Code](https://code.claude.com/docs/e
## ✨ Features
-- Run Claude Code, Codex, Kimi Code, and shell sessions side by side
-- Run Codex against DeepSeek when your Codex configuration provides that model
+- Run Claude Code, Codex, Gemini CLI, Kimi Code, Qwen Code, and shell sessions side by side
+- Run Codex against DeepSeek or OpenRouter without changing your default Codex provider
- Resume session tabs automatically after closing Lite or restarting your computer
+- Undo a restart or close for eight seconds before Lite stops the terminal
- Authenticate once with each provider and reuse its existing local credentials
-- Or save an API key per provider in Lite and skip the sign-in flows entirely
+- Or save API keys for supported providers in Lite and skip their sign-in flows entirely
- Browse files on demand with syntax highlighting for popular languages
- Preview rendered Markdown safely alongside source files
- See the active Git branch, worktree, and changed files
@@ -73,11 +74,13 @@ Install the provider CLIs you want to use:
- [Claude Code](https://code.claude.com/docs/en/setup)
- [Codex](https://developers.openai.com/codex/cli)
+- [Gemini CLI](https://google-gemini.github.io/gemini-cli/)
- [Kimi Code](https://www.kimi.com/code/docs/en/kimi-code-cli/guides/getting-started.html) — Windows also needs Git for Windows
+- [Qwen Code](https://qwenlm.github.io/qwen-code-docs/en/)
-Open each provider in Lite and complete its normal sign-in once. Every CLI keeps credentials in its own local store, so later Lite sessions reuse the same authentication. Lite never reads or copies those stores. The new-session dialog tells you when a CLI is missing and links to its setup guide.
+Open each provider in Lite and complete its normal sign-in once. Every CLI keeps credentials in its own local store, so later Lite sessions reuse the same authentication. Lite never reads or copies those stores. The new-session dialog installs a missing CLI for you.
-If you would rather use API keys, open **API keys** in the Lite menu and paste one per provider. Lite keeps them in an owner-only file in its own data folder — the same shape Codex and Kimi already use for their credentials — and passes a key to a session through the environment variable that CLI already reads (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `DEEPSEEK_API_KEY`, `MOONSHOT_API_KEY`). Nothing is written into provider configuration, deleting a key takes effect on the next launch, and app updates keep the file since the updater replaces the bundle and not your data.
+If you would rather use API keys, open **API keys** in the Lite menu and paste one for a supported provider. Lite keeps them in an owner-only file in its own data folder — the same shape Codex and Kimi already use for their credentials — and passes a key to a session through the environment variable that CLI already reads (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `DEEPSEEK_API_KEY`, `OPENROUTER_API_KEY`, `GEMINI_API_KEY`, or `MOONSHOT_API_KEY`). Qwen Code keeps ownership of its regional provider and authentication setup. Nothing is written into provider configuration, deleting a key takes effect on the next launch, and app updates keep the file since the updater replaces the bundle and not your data.
@@ -98,6 +101,8 @@ experimental_bearer_token = ""
Leave `preferred_auth_method` and `forced_login_method` out. Codex applies those globally, and setting them signs you out of ChatGPT the next time it runs. Lite selects the DeepSeek provider per launch, so your default Codex provider and existing OpenAI sessions are untouched, and it never reads or stores the DeepSeek key.
+**Codex · OpenRouter** works the same way: save an OpenRouter key in Lite or configure an `openrouter` Codex provider, and Lite launches OpenRouter's current OpenAI model route without changing your default Codex setup.
+
Choose a project folder, create a session, and work. Lite saves only the local metadata needed to restore tabs; provider conversation history remains owned by the provider CLI.
## 🛠️ Development
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index b205612..0eb9544 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -1857,7 +1857,7 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
[[package]]
name = "lite"
-version = "0.0.13"
+version = "0.0.14"
dependencies = [
"atomicwrites",
"portable-pty",
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index 03adbf9..25586fd 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -2,7 +2,7 @@
[package]
name = "lite"
-version = "0.0.13"
+version = "0.0.14"
description = "A fast, local workspace for AI coding agents."
authors = ["Ultralytics"]
edition = "2024"
diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs
index 8910724..013bdc1 100644
--- a/src-tauri/src/lib.rs
+++ b/src-tauri/src/lib.rs
@@ -29,9 +29,44 @@ const MAX_GIT_DIFF_BYTES: u64 = 1_000_000;
const CODEX_CONNECT_TIMEOUT: Duration = Duration::from_secs(5);
// Requests stay bounded so an app server that never answers surfaces an error instead of a stuck tab.
const CODEX_REQUEST_TIMEOUT: Duration = Duration::from_secs(20);
-const DEEPSEEK_PROFILE: &str = "deepseek";
const DEEPSEEK_MODEL: &str = "deepseek-v4-flash";
-const SUPPORTED_KEYS: [&str; 4] = ["claude", "codex", "deepseek", "kimi"];
+const SUPPORTED_KEYS: [&str; 6] = [
+ "claude",
+ "codex",
+ "deepseek",
+ "openrouter",
+ "gemini",
+ "kimi",
+];
+
+#[derive(Clone, Copy)]
+struct CodexProvider {
+ id: &'static str,
+ name: &'static str,
+ base_url: &'static str,
+ env_key: &'static str,
+ model: &'static str,
+ setup_url: &'static str,
+}
+
+const CODEX_PROVIDERS: [CodexProvider; 2] = [
+ CodexProvider {
+ id: "deepseek",
+ name: "DeepSeek",
+ base_url: "https://api.deepseek.com/",
+ env_key: "DEEPSEEK_API_KEY",
+ model: DEEPSEEK_MODEL,
+ setup_url: "https://api-docs.deepseek.com/quick_start/agent_integrations/codex",
+ },
+ CodexProvider {
+ id: "openrouter",
+ name: "OpenRouter",
+ base_url: "https://openrouter.ai/api/v1",
+ env_key: "OPENROUTER_API_KEY",
+ model: "~openai/gpt-latest",
+ setup_url: "https://openrouter.ai/docs/cookbook/coding-agents/codex-cli",
+ },
+];
struct PtySession {
child: Box,
@@ -220,12 +255,14 @@ fn is_sensitive_component(component: &std::ffi::OsStr) -> bool {
".codex",
".config",
".docker",
+ ".gemini",
".git-credentials",
".gnupg",
".kimi-code",
".netrc",
".npmrc",
".pypirc",
+ ".qwen",
".ssh",
"id_ed25519",
"id_rsa",
@@ -1333,21 +1370,69 @@ fn shell_path(shell: &str) -> Option {
// An account shell that does not speak this command leaves nothing usable, so the search falls back to
// the POSIX shell rather than losing every provider CLI.
-// Asking costs a login shell, and the answer holds for as long as Lite is open, so it is asked once
-// and every command Lite resolves afterwards is free.
+// Asking costs a login shell, so the answer is cached until Lite itself installs a CLI that changes it.
#[cfg(unix)]
fn user_path() -> Option {
- static PATH: std::sync::OnceLock