docs(readme): padroniza README (hero, badges, quickstart, arquitetura)
Release / Semantic Release (push) Successful in 11m32s
Tests / Unit Tests (push) Successful in 11m51s
Tests / Type Check (push) Successful in 11m32s

This commit is contained in:
evandro committed 2026-10-24 04:13:00 +00:00
1 parent 9d1ce44ea3
commit 2a5d482c52
1 file changed
+135 -170
+135 -170
View File
@@ -2,62 +2,41 @@
<img src="docs/assets/logo.png" width="110" alt="Gemini Nexus logo">
# Gemini Nexus
<h1>Gemini Nexus</h1>
**A desktop gateway that pools your Google Gemini and Claude accounts behind one
local OpenAI- and Anthropic-compatible API — with automatic account switching,
usage analytics and full traffic inspection.**
<p><strong>Desktop gateway that pools Google accounts behind a local OpenAI/Anthropic-compatible API, with encrypted credentials and auto-switching.</strong></p>
![Version](https://img.shields.io/badge/version-0.15.3-informational)
![Stack](https://img.shields.io/badge/Electron_41-React_19_%C2%B7_TypeScript-informational)
![License](https://img.shields.io/badge/license-CC_BY--NC--SA_4.0_%2B_MIT-informational)
<a href="#-quickstart">Quickstart</a> ·
<a href="#-architecture">Architecture</a> ·
<a href="#-security-model">Security</a> ·
<a href="https://git.evandro.dev.br/evandro/gemini-nexus/issues">Issues</a>
English | [Português](README.pt-BR.md) | [中文](README.zh-CN.md) | [Español](README.es.md)
![Stack](https://img.shields.io/badge/Stack-Electron_41_%C2%B7_React_19-47848F?logo=electron&logoColor=white)
![Status](https://img.shields.io/badge/status-v0.15.3_active-brightgreen)
![License](https://img.shields.io/badge/license-CC_BY--NC--SA_4.0_%2B_MIT-lightgrey)
[Install](#installation) · [Features](#features) · [How it works](#how-it-works) · [Build from source](#build-from-source) · [CI/CD](#cicd)
<sub>English · <a href="README.pt-BR.md">Português</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.es.md">Español</a></sub>
</div>
> [!NOTE]
> **Project status:** actively released — current version is **0.15.3** (2026-05-02),
> versioned automatically by semantic-release from Conventional Commits (see
> [`CHANGELOG.md`](CHANGELOG.md)). The app started as a fork of
> [AntigravityManager](https://github.com/Draculabo/AntigravityManager); most of the
> code has since been rewritten (see [Licensing and credits](#licensing-and-credits)).
<hr />
> [!IMPORTANT]
> **Mixed licensing.** Code inherited from AntigravityManager is under
> **CC BY-NC-SA 4.0** ([`LICENSE`](LICENSE) — non-commercial, share-alike); all new
> code is under **MIT** ([`LICENSE-MIT`](LICENSE-MIT)). The project is being migrated
> to MIT as the remaining original code is rewritten. Check both files before any
> commercial use.
## 📌 The problem
## Why Gemini Nexus
Working with AI-powered IDEs and coding tools on a single Google account means quota that runs out, manual account switching, no idea how many tokens you spent, and no view of what the proxy actually sends upstream. Gemini Nexus keeps all accounts in one pool, switches between them automatically and shows the traffic.
Working with AI-powered IDEs and coding tools on a single account means quota that
runs out, manual account switching, no idea how many tokens you spent, and no view
of what the proxy actually sends. Gemini Nexus puts all of that in one desktop app:
## ✨ What it does
- **Account pool** — add as many Google accounts as you need via OAuth.
- **Smart auto-switching** — rotates to the next available account when quota is low or rate-limited.
- **Drop-in local proxy** — speaks the OpenAI and Anthropic protocols, so Cursor, Windsurf, OpenCode and any compatible tool can point at it.
- **Observability** — live traffic monitor, request replay and per-model capability inspector.
- **Usage analytics** — token charts, trends and cost tracking.
- **Pools** Google accounts added through OAuth, with status (Active, Rate Limited, Expired), last-used time and an optional per-account proxy URL.
- **Switches** accounts automatically when quota drops below 5 % or an account is rate-limited; `CloudMonitorService` polls quota every 5 minutes.
- **Schedules** requests across the pool in `cache-first`, `balance` (default) or `performance-first` mode, with a per-account circuit breaker (default backoff 60 s → 5 min → 30 min → 2 h).
- **Serves** `POST /v1/chat/completions` (OpenAI), `POST /v1/messages` (Anthropic), `GET /v1/models` and `GET /v1/models/capabilities`, so Cursor, Windsurf, OpenCode, Claude Code and similar clients can connect.
- **Maps** requested model names to upstream models through the `custom_mapping` and `anthropic_mapping` settings; request timeout defaults to 120 s.
- **Tracks** token usage per account and model, charts prompt and completion tokens, and estimates cost with editable per-model pricing.
- **Inspects** traffic (latency, status, model), replays logged requests and generates cURL and Python snippets plus an IDE Quick Setup.
- **Protects** stored credentials with AES-256-GCM and an OS-keychain master key (see [Security model](#-security-model)).
## Features
| Area | What you get |
|---|---|
| **Cloud account pool** | OAuth sign-in; avatar, email, status (Active / Rate Limited / Expired) and last-used time; per-account proxy URL; device identity profiles with history |
| **Local API gateway** | `POST /v1/chat/completions` (OpenAI), `POST /v1/messages` (Anthropic), `GET /v1/models` and `GET /v1/models/capabilities`; SSE streaming; model mapping (e.g. `claude-sonnet-4-6` → `gemini-3-flash`); configurable port, timeout (default 120 s) and API key; per-model visibility |
| **Auto-switching** | Switches when an account's quota drops below 5 % or it is rate-limited; background quota monitor every 5 minutes; scheduling modes `cache-first`, `balance` and `performance-first`; circuit breaker with 60 s → 5 min → 30 min → 2 h backoff |
| **Usage analytics** | Token consumption charts (daily/hourly, prompt vs. completion), trend indicators, model ranking, cost tracking with custom model pricing |
| **Proxy observability** | Traffic monitor (latency, status, model), request replay, model capabilities (vision, thinking, streaming, JSON mode), cURL and Python snippets, IDE Quick Setup (OpenCode, Cursor, VS Code, Claude Code) |
| **Security** | AES-256-GCM for sensitive data, OS credential storage (Keytar + Electron SafeStorage), automatic migration of legacy plaintext data |
| **Desktop experience** | System tray, dark / light / system theme, collapsible sidebar, status bar with live proxy indicators, UI in English, 简体中文, Русский and Tiếng Việt |
The account-pool and auto-switching design is written up in
[`docs/cloud_features.md`](docs/cloud_features.md).
## 🖼️ Demo
<details>
<summary>Screenshots</summary>
@@ -72,154 +51,140 @@ The account-pool and auto-switching design is written up in
</details>
## Installation
## 🚀 Quickstart
1. Download the build for your platform from [**Releases**](https://git.evandro.dev.br/evandro/gemini-nexus/releases).
The CI build matrix covers Windows (x64, arm64), macOS (x64, arm64) and Linux
(x64, arm64); the configured makers produce MSI (Windows x64, only when WiX is
available) and ZIP (Windows/macOS), DMG (macOS), AppImage, `.deb` and `.rpm` (Linux).
2. Open the app and add at least one account.
3. Enable the proxy and point your IDE at it:
**Use a release.** Download the build for your platform from [Releases](https://git.evandro.dev.br/evandro/gemini-nexus/releases), open the app, add at least one account, enable the proxy (it is disabled by default) and point your IDE at it:
```text
API Base URL: http://localhost:8045/v1 (default port; configurable on the Proxy page)
API Base URL: http://localhost:8045/v1 (default, configurable on the Proxy page; development builds use 8046)
API Key: (copy it from the Proxy page in the app)
Model: gemini-3-flash (or any mapped model)
Model: gemini-3-flash (or any mapped model)
```
> [!WARNING]
> **Windows SmartScreen.** The builds are not code-signed. If Windows shows
> **"Windows protected your PC"**, click **More info → Run anyway**. Separately, the
> proxy is disabled by default; once enabled it listens on `0.0.0.0`, and requests
> are only authenticated when an API key is configured (an empty key means open
> mode) — set one and keep it private.
> Builds are not code-signed. If Windows shows "Windows protected your PC", click **More info → Run anyway**.
## How it works
**Build from source.**
```mermaid
flowchart LR
IDE["Cursor · Windsurf · OpenCode<br/>Claude Code · any OpenAI/Anthropic client"] -->|"/v1/chat/completions<br/>/v1/messages"| P
subgraph APP["Gemini Nexus (Electron)"]
R["Renderer<br/>React 19 · TanStack Router/Query"] <-->|"oRPC over IPC"| M["Main process<br/>config · tray · services"]
M --> DB[("SQLite<br/>better-sqlite3 + Drizzle")]
M --> SEC["Encryption<br/>AES-256-GCM · Keytar/SafeStorage"]
M --> MON["CloudMonitor + AutoSwitch<br/>quota every 5 min"]
M --> P["NestJS proxy<br/>port 8045"]
P --> SCH["Account scheduler<br/>+ circuit breaker"]
end
SCH -->|"Google OAuth account"| UP["Google upstream APIs"]
MON --> UP
```
<details>
<summary>Stack and layout</summary>
| Layer | Technology |
| Tool | Minimum version |
|---|---|
| Shell / build | Electron 41, Electron Forge, Vite 8 |
| UI | React 19, TypeScript, Tailwind CSS 4, Radix UI, Nivo charts, react-i18next |
| State / routing | TanStack Query, TanStack Router |
| Backend | NestJS 11 (proxy gateway), oRPC (type-safe IPC) |
| Data | better-sqlite3, Drizzle ORM |
| Tests | Vitest (unit), Playwright (E2E) |
```text
src/
├── components/ # UI (proxy/, usage/, ui/ primitives)
├── ipc/ # oRPC routers: account, cloud, config, gateway, usage, proxy-advanced…
├── server/ # NestJS proxy gateway (modules: proxy, usage)
├── services/ # AutoSwitchService, CloudMonitorService, GoogleAPIService
├── routes/ # index, usage, proxy, settings
├── localization/ # i18n resources
└── types/ # types + Zod schemas
```
The `cli/` folder holds a separate Python command-line tool (Typer + Rich) for
account switching and quota checks; see [`cli/README.md`](cli/README.md).
</details>
## Known limitations
- Upstream access goes through Google's `v1internal` Cloud Code endpoints and OAuth scopes (see [`src/services/GoogleAPIService.ts`](src/services/GoogleAPIService.ts)). These are internal, undocumented APIs and may change without notice; the project is unofficial and not affiliated with Google or Anthropic.
- End-to-end tests are not run in CI (Electron needs a graphical environment); run `pnpm run test:e2e` locally.
- The Windows MSI is only produced when the WiX Toolset is available on the build machine; otherwise the Windows artifact is the ZIP.
- Builds are unsigned, so Windows and macOS may show security prompts on first launch.
## Build from source
Requirements: **Node.js ≥ 20** (`.nvmrc` pins 22.17.1) and **pnpm** (`packageManager: [email protected]`; the lockfile is `pnpm-lock.yaml`).
`pnpm install` runs [`scripts/setup-dev.js --check-only`](scripts/setup-dev.js), which
verifies the native toolchain needed by `better-sqlite3` and `keytar`: Visual Studio
2022 Build Tools (C++) on Windows, Xcode Command Line Tools on macOS, and
`build-essential`, `python3` and `libsecret-1-dev` on Ubuntu (`base-devel`, `python`,
`libsecret` on Arch).
| Node.js | 20+ (recommended in `AGENTS.md`; `.nvmrc` pins 22.17.1) |
| pnpm | 10.11.0 (`packageManager`; lockfile is `pnpm-lock.yaml`) |
| Native toolchain | needed by `better-sqlite3` and `keytar`: Visual Studio 2022 Build Tools (C++) on Windows, Xcode Command Line Tools on macOS, `build-essential` + `python3` + `libsecret-1-dev` on Ubuntu (`base-devel` + `python` + `libsecret` on Arch) |
```bash
git clone https://git.evandro.dev.br/evandro/gemini-nexus.git
cd gemini-nexus
pnpm install
pnpm start # dev mode (Electron + Vite HMR)
pnpm run make # build installers/packages for the current platform
pnpm run make:win # Windows build helper (extracts WiX from wix314-binaries.zip)
pnpm run lint # ESLint
pnpm run type-check # tsc --noEmit
pnpm run format:write
pnpm test # Vitest unit tests
pnpm run test:e2e # Playwright (local only)
pnpm install # postinstall runs scripts/setup-dev.js --check-only to verify the toolchain
pnpm start # dev mode (Electron + Vite HMR)
pnpm run make # installers/packages for the current platform
pnpm run make:win # Windows: extracts WiX from wix314-binaries.zip, then runs make
```
<details>
<summary>FAQ</summary>
There is no `.env.example` and no variable is required. Optional variables read by the code or described in the docs:
**My IDE can't connect to the proxy.** Check that the proxy is running (green
indicator in the status bar), that the port matches your IDE config (default `8045`),
that you pasted the API key from the Proxy page, and that at least one account is
active.
**Account login failed.** Verify your network connection, clear the app data and
sign in again, and check whether the account is restricted by the provider.
**The app won't start when building from source.** Reinstall dependencies with
`pnpm install`, confirm your Node.js version, and make sure the native toolchain
listed above is installed.
</details>
## CI/CD
Workflows in [`.github/workflows/`](.github/workflows):
| Workflow | Trigger | What it does |
| Variable | Required | Description |
|---|---|---|
| [`format.yaml`](.github/workflows/format.yaml) | Pull request to `main` | Prettier check (`pnpm run format`) |
| [`lint.yaml`](.github/workflows/lint.yaml) | Pull request to `main` | ESLint (`pnpm run lint`) |
| [`testing.yaml`](.github/workflows/testing.yaml) | Push / PR to `main` | Unit tests (`pnpm test`) and type check (`pnpm run type-check`) |
| [`release.yml`](.github/workflows/release.yml) | Push to `main`, manual | Semantic-release on Node 22, driven by [`release.config.cjs`](release.config.cjs): `feat` → minor; `fix`, `perf`, `style`, `refactor`, `build` → patch; `docs`, `test`, `ci`, `chore` → no release |
| [`publish.yaml`](.github/workflows/publish.yaml) | After **Release** succeeds, manual (`dry_run` defaults to `true`) | Builds the 6-target matrix (Windows/macOS/Linux × x64/arm64) and uploads MSI, DMG, ZIP, AppImage, deb, rpm and update metadata to the release |
| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | No | Route the app's outbound requests through a local proxy (see [TLS inspection](#-security-model)). |
| `NODE_EXTRA_CA_CERTS` | No | Extra CA certificate for Node-side TLS when inspecting traffic. |
| `SENTRY_DSN` | No | Sentry DSN used when error reporting is enabled. |
These workflows are written for GitHub: they call the `gh` CLI and the GitHub
release publisher.
## 🧱 Architecture
## Licensing and credits
```mermaid
flowchart LR
C["Client: Cursor, Windsurf, OpenCode, Claude Code"] -->|"/v1/chat/completions, /v1/messages"| P["NestJS proxy, port 8045"]
P --> S["Account scheduler and circuit breaker"]
S -->|"Google OAuth account"| G["Google upstream APIs"]
M["CloudMonitor and AutoSwitch, quota every 5 min"] -->|"quota polling"| G
S -->|"reads accounts"| DB[("SQLite: better-sqlite3 and Drizzle")]
M --> DB
K["AES-256-GCM, master key in OS keychain"] -->|"encrypts tokens"| DB
```
- **Original code** from [AntigravityManager](https://github.com/Draculabo/AntigravityManager) by [Draculabo](https://github.com/Draculabo) — [CC BY-NC-SA 4.0](LICENSE).
- **All new code, features and architecture** by [evandrodevbr](https://git.evandro.dev.br/evandro) — [MIT](LICENSE-MIT).
1. A client sends OpenAI- or Anthropic-format requests to the NestJS proxy (Fastify, bound to `0.0.0.0`).
2. The proxy guard checks the API key when one is configured; with an empty key the proxy runs in open mode.
3. The token manager picks an account according to the scheduling mode and each account's circuit-breaker state, then calls Google's upstream APIs with that account's OAuth token.
4. `CloudMonitorService` polls quota every 5 minutes and `AutoSwitchService` switches the active account when quota is below 5 % or the account is rate-limited.
5. The React 19 renderer (TanStack Router and Query) talks to the main process over oRPC on IPC; accounts, usage and settings live in SQLite (better-sqlite3 + Drizzle). Design notes: [`docs/cloud_features.md`](docs/cloud_features.md).
The initial proxy concept and early Electron scaffolding came from AntigravityManager.
Since the fork, the vast majority of the codebase has been rewritten, redesigned and
expanded, including the UI/UX redesign, the usage analytics dashboard with cost
tracking and OpenRouter pricing integration, the traffic monitor, dev/prod
environment isolation, the CI/CD pipeline and test infrastructure, IDE Quick Setup,
custom model pricing, and all documentation and its translations (EN, PT-BR, ES, ZH-CN).
## 🔒 Security model
Contributing: see [`CONTRIBUTING.md`](CONTRIBUTING.md), [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
and [`SECURITY.md`](SECURITY.md).
Gemini Nexus holds OAuth tokens for several accounts and forwards traffic upstream, so credential handling is the core of the design. Everything below is implemented in this repository; limits are stated where they exist.
## Notices
- **Credential storage and isolation.** `token_json` and `quota_json` are encrypted with AES-256-GCM (unique IV per operation, authenticated) before they reach SQLite. The master key lives in the OS credential store through `keytar` (Windows Credential Manager, macOS Keychain, Linux Secret Service/libsecret), never in a plain file. Legacy plaintext rows are migrated at startup. Accounts are kept in their own database (`cloud_accounts.db`), independent from the IDE's local database.
- **Log masking.** Keys such as `token`, `refresh_token`, `api_key`, `authorization`, `cookie` and `client_secret` are replaced by `[REDACTED]` before logging ([`src/utils/sensitiveDataMasking.ts`](src/utils/sensitiveDataMasking.ts)); the traffic logger also redacts the `authorization`, `x-api-key` and `cookie` headers.
- **Request logging, not an audit trail.** Winston writes API, traffic and app logs to rotating files (API log: 30 days, 50 MB per file). These are operational logs, not a tamper-evident audit trail; the `*-audit.json` files are rotation bookkeeping from `winston-daily-rotate-file`.
- **Proxy access.** The proxy is off by default. Once enabled it listens on `0.0.0.0`, and requests are authenticated only when `api_key` is non-empty (empty means open mode). Set a key and keep it private.
- **TLS inspection (debugging only).** [`docs/proxyman-install.md`](docs/proxyman-install.md) and [`docs/proxyman-debugging.md`](docs/proxyman-debugging.md) explain how to read the app's HTTPS traffic with Proxyman: trust its root CA, set the proxy variables and `NODE_EXTRA_CA_CERTS`, then start the app. `NODE_TLS_REJECT_UNAUTHORIZED=0` (and the script's `-AllowInsecureTls` flag) is a temporary override; never leave it on. Do not commit proxy addresses, certificate paths, cookies or OAuth codes, and redact logs before sharing them. `scripts/start-antigravity-with-proxyman.ps1` targets the installed official Antigravity client, not this app.
- **Error reporting.** Sentry reports (they need `SENTRY_DSN`) are gated by the `error_reporting_enabled` setting, which `DEFAULT_APP_CONFIG` ships as `true`; turn it off in Settings to opt out. The Windows user-name segment is masked in reported exception messages.
- Unofficial project; not affiliated with Google or Anthropic.
- Optional Sentry error reporting is controlled by the `error_reporting_enabled` setting; user paths are masked in reported events.
- Built with [Electron](https://www.electronjs.org/), [Electron Forge](https://www.electronforge.io/), [NestJS](https://nestjs.com/), [oRPC](https://orpc.unnoq.com/) and [Drizzle ORM](https://orm.drizzle.team/).
Supported versions and how to report a vulnerability: [`SECURITY.md`](SECURITY.md).
## 🗂️ Structure
```text
src/
├── components/ # UI (proxy/, usage/, ui/ primitives)
├── ipc/ # oRPC routers (account, cloud, config, gateway, usage...)
├── server/ # NestJS proxy gateway (modules: proxy, usage)
├── services/ # AutoSwitchService, CloudMonitorService, GoogleAPIService
├── routes/ # index, usage, proxy, settings
├── utils/ # paths, logger, sensitiveDataMasking
└── tests/ # unit tests (Vitest) and E2E (Playwright)
cli/ # separate Python CLI for account switching and quota checks
docs/ # design notes and Proxyman guides
scripts/ # setup-dev, build-windows, generate-assets
```
## 🧪 Scripts
| Command | What it does |
|---|---|
| `pnpm start` | Run the app in dev mode (`electron-forge start`, with `DEBUG=electron-forge:*`). |
| `pnpm run dev` | Same as `start`. |
| `pnpm run package` | Package the app with Electron Forge, without building installers. |
| `pnpm run make` | Build installers/packages for the current platform. |
| `pnpm run make:win` | Windows build helper: extracts WiX from `wix314-binaries.zip`, adds it to `PATH`, runs `electron-forge make`. |
| `pnpm run publish` | Publish through Electron Forge. |
| `pnpm run setup` | Run `scripts/setup-dev.js`: detect the native toolchain and install or guide the setup. |
| `pnpm run postinstall` | `scripts/setup-dev.js --check-only`; runs automatically after `pnpm install`. |
| `pnpm run lint` | ESLint over the repo. |
| `pnpm run format` | Prettier check. |
| `pnpm run format:write` | Prettier write. |
| `pnpm test` | Vitest unit tests (`vitest run`). |
| `pnpm run test:watch` | Vitest in watch mode. |
| `pnpm run test:unit` | Vitest (default mode). |
| `pnpm run test:e2e` | Playwright E2E tests. |
| `pnpm run test:all` | Unit tests, then Playwright. |
| `pnpm run type-check` | `tsc --noEmit`. |
## 📚 Documentation
- [`docs/cloud_features.md`](docs/cloud_features.md): account pool, quota monitoring and auto-switch design.
- [`docs/proxyman-install.md`](docs/proxyman-install.md) and [`docs/proxyman-debugging.md`](docs/proxyman-debugging.md): TLS inspection setup (Windows).
- [`docs/OpencodeAPI.md`](docs/OpencodeAPI.md): OpenCode custom-endpoint integration (in Portuguese).
- [`cli/README.md`](cli/README.md): the Python command-line tool.
- [`CONTRIBUTING.md`](CONTRIBUTING.md), [`SECURITY.md`](SECURITY.md), [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md), [`CHANGELOG.md`](CHANGELOG.md), [`LICENSE`](LICENSE), [`LICENSE-MIT`](LICENSE-MIT).
- Translations: [Português](README.pt-BR.md), [中文](README.zh-CN.md), [Español](README.es.md).
## 🛣️ Limitations and next steps
- Upstream access goes through Google's `v1internal` Cloud Code endpoints and OAuth scopes ([`src/services/GoogleAPIService.ts`](src/services/GoogleAPIService.ts)). These are internal, undocumented APIs and may change without notice. The project is unofficial and not affiliated with Google or Anthropic.
- Accounts are added through Google OAuth; Claude models are reached through model mapping, not through separate Claude accounts.
- End-to-end tests are not run in CI (Electron needs a graphical environment); run `pnpm run test:e2e` locally.
- The Windows MSI is only produced when the WiX Toolset is available on the build machine; otherwise the Windows artifact is the ZIP.
- The workflows in `.github/workflows/` are written for GitHub (they call the `gh` CLI and the GitHub release publisher), so this README shows no CI badge.
- Next step stated by the project: migrate the remaining original code to MIT (see [License](#-license)).
## 🤝 Contributing
Read [`CONTRIBUTING.md`](CONTRIBUTING.md) and [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). Releases are versioned by semantic-release from Conventional Commits. Before opening a PR, these must pass:
```bash
pnpm run lint && pnpm run format:write && pnpm run type-check && pnpm test
```
## 📄 License
Mixed licensing: code inherited from [AntigravityManager](https://github.com/Draculabo/AntigravityManager) (by Draculabo) is [CC BY-NC-SA 4.0](LICENSE) (non-commercial, share-alike); all new code is [MIT](LICENSE-MIT). The project is migrating to MIT as the remaining original code is rewritten, so check both files before any commercial use.