DEEPSEEK_API_KEYis runtime-only. It is never written to config files, logs, or disk.BRAVE_API_KEYandUNSTRUCTURED_API_KEYare runtime-only. Same protections.- The bridge redacts
Authorizationheaders, bearer tokens, and API keys from all log output. ~/.jamini/config.jsononly contains non-secret settings (model, mode, URLs). API keys are never persisted.- Generated Gemini CLI
settings.jsoncontains no DeepSeek secrets. - Debug endpoints (
/debug/config) redact all secret values before returning.
- The bridge binds to
127.0.0.1only by default. - Remote binding (e.g.,
0.0.0.0) requires explicitJAMINI_ALLOW_REMOTE_BRIDGE=1and prints a warning. - Bridge port is ephemeral by default (dynamically allocated), reducing predictable attack surface.
- Fixed port can be set via
JAMINI_BRIDGE_PORTif needed.
Between the Jamini wrapper and the bridge:
- Wrapper generates a random UUID local proxy key on first run
- Key is stored in
~/.jamini/run/.local-proxy-key(permissions:0600) - Wrapper sets
GEMINI_API_KEYto this proxy key for the Gemini CLI child - Gemini CLI sends the key in
Authorization: Bearer {key}headers - Bridge validates inbound requests against this key before processing
- The proxy key is never a real Google or DeepSeek key
This prevents other local processes from accidentally or maliciously using the bridge.
- Jamini does not use the user's real
~/.geminidirectory. - Gemini CLI state is isolated to
~/.jamini/gemini-cli-home/(set viaGEMINI_CLI_HOME). - Settings are written to force API-key auth mode and disable OAuth/Vertex paths.
- Google Cloud env vars (
GOOGLE_APPLICATION_CREDENTIALS,GOOGLE_CLOUD_PROJECT,GOOGLE_CLOUD_LOCATION) are explicitly unset/overridden.
- Jamini never requires Google OAuth, browser login, or a real Gemini API key.
- Gemini CLI is configured to use
gemini-api-keyauth mode with a local dummy key. - All Gemini API requests go to
http://127.0.0.1:{port}— never to Google servers. - If Gemini CLI somehow attempts Google auth, this is treated as a release-blocking bug.
- Bridge only listens on loopback (
127.0.0.1). - No inbound connections from other hosts are possible by default.
- External bridge mode users must configure their own firewall/network security.
- Container bridge mode binds host port to
127.0.0.1only (not0.0.0.0).
- YOLO is NOT enabled by default. Users must explicitly pass
-y,--yolo, or--approval-mode=yolo. - When YOLO is enabled, Gemini CLI auto-approves all tool actions — this can execute destructive commands.
⚠️ Only use YOLO in disposable VMs, containers, or trusted workspaces.- Jamini preserves Gemini CLI's approval/sandbox behavior unless YOLO is explicitly requested.
- YOLO flags are passed through to Gemini CLI unchanged; Jamini does not add or remove them.
- Brave Search and Unstructured tools are disabled by default unless:
- The corresponding API key (
BRAVE_API_KEY/UNSTRUCTURED_API_KEY) is set, AND - Config allows it (
enableBraveSearch/enableUnstructurednot set tooff)
- The corresponding API key (
- Even when enabled, these tools are optional — Jamini works with only
DEEPSEEK_API_KEY. - Tool timeouts, rate limits, and structured error handling prevent abuse.
All Jamini-created files and directories use restrictive permissions:
| Path | Permissions |
|---|---|
~/.jamini/ |
0700 |
~/.jamini/config.json |
0600 |
~/.jamini/run/ |
0700 |
~/.jamini/run/.local-proxy-key |
0600 |
~/.jamini/run/bridge.pid |
0600 |
~/.jamini/log/ |
0700 |
~/.jamini/log/*.log |
0600 |
~/.jamini/gemini-cli-home/ |
0700 |
~/.jamini/gemini-cli-home/settings.json |
0600 |
- If DeepSeek is unreachable, the bridge returns errors — it never silently falls back to Google Gemini.
- If the bridge fails to start, Jamini reports the error clearly.
- Auto mode never silently chooses a less-compatible or less-secure translator.
- Unsupported models are rejected with a clear error message, not silently routed.
No Hidden Telemetry
- Gemini CLI telemetry is disabled by default in the generated settings (
usageStatisticsEnabled: false). - Jamini itself has no telemetry or phone-home behavior.
- No analytics, crash reports, or usage data is sent anywhere.