diff --git a/README.md b/README.md index d0e71f8..7e2cdda 100644 --- a/README.md +++ b/README.md @@ -1,366 +1,225 @@ -

- Gemini Nexus -

+
-

Gemini Nexus

+Gemini Nexus logo -

- ๐Ÿš€ Professional multi-account AI gateway for Google Gemini & Claude -

+# Gemini Nexus -

- English | Portuguรชs | ไธญๆ–‡ | Espaรฑol -

+**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.** -

- - Release - - - Downloads - - - License - - Platform - Electron -

+![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) + +English | [Portuguรชs](README.pt-BR.md) | [ไธญๆ–‡](README.zh-CN.md) | [Espaรฑol](README.es.md) + +[Install](#installation) ยท [Features](#features) ยท [How it works](#how-it-works) ยท [Build from source](#build-from-source) ยท [CI/CD](#cicd) + +
+ +> [!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)). > [!IMPORTANT] -> **Windows Users:** If you see a **"Windows protected your PC"** (SmartScreen) warning during installation, click **"More info"** and then **"Run anyway"**. This is an expected security prompt for new, unsigned applications. +> **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. ---- +## Why Gemini Nexus -## ๐Ÿ“– Table of Contents +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: -- [โœจ Why Gemini Nexus?](#-why-gemini-nexus) -- [๐ŸŽฏ Features](#-features) -- [๐Ÿ“ธ Screenshots](#-screenshots) -- [โšก Installation & Quick Start](#-installation--quick-start) -- [๐Ÿ› ๏ธ Tech Stack](#๏ธ-tech-stack) -- [๐Ÿ’ป Development](#-development) -- [โ“ FAQ](#-faq) -- [๐Ÿค Contributing](#-contributing) -- [๐Ÿ“„ License](#-license) +- **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. ---- +## Features -## โœจ Why Gemini Nexus? +| 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 | -When using AI-powered IDEs and coding tools, have you ever run into these problems? +The account-pool and auto-switching design is written up in +[`docs/cloud_features.md`](docs/cloud_features.md). -- ๐Ÿ˜ซ **Quota limits:** Single account quotas run out quickly, requiring frequent manual switching. -- ๐Ÿ”„ **Account management:** Managing multiple Google/Claude accounts is cumbersome. -- ๐Ÿ“Š **Blind usage:** You don't know how much quota or how many tokens you've actually consumed. -- ๐Ÿ”Œ **Integration issues:** You need a reliable local API proxy that speaks OpenAI/Anthropic protocols natively. -- ๐Ÿ” **Lack of transparency:** You can't see what's actually being sent or received by the proxy under the hood. +
+Screenshots -**Gemini Nexus** solves all of these issues. It's a professional Electron desktop application that acts as an intelligent gateway between your development tools and Google Gemini / Claude AI. +

Main dashboard

+

Usage analytics

+

Proxy monitor

+

Routing config

+

Documentation

+

Active connections

+

Settings

-### Key Value Proposition +
-- โœ… **Unlimited Account Pool** โ€” Add any number of Google Gemini & Claude accounts. -- โœ… **Smart Auto-Switching** โ€” Automatically rotates to the next available account when quota is low or rate-limited. -- โœ… **Real-time Usage Analytics** โ€” SaaS-grade dashboard with area charts, trend indicators, and model distribution. -- โœ… **Full Proxy Observability** โ€” Live traffic monitor, request replay, and model capabilities inspector. -- โœ… **OpenAI & Anthropic Compatible** โ€” Drop-in replacement proxy for Cursor, Windsurf, OpenCode, and any OpenAI-compatible tool. -- โœ… **Secure by Default** โ€” AES-256-GCM encryption with OS-native credential management. +## Installation ---- +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: -## ๐ŸŽฏ Features - - - - - - - - - - - - - - - - - - -
-

โ˜๏ธ Cloud Account Pool

-
    -
  • Add unlimited Google Gemini / Claude accounts via OAuth
  • -
  • Display avatar, email, status, and last used time
  • -
  • Real-time status monitoring (Active, Rate Limited, Expired)
  • -
  • Per-account proxy URL configuration
  • -
  • Device identity profile management with history
  • -
-
-

๐Ÿ“Š Usage Analytics Dashboard

-
    -
  • Real-time token consumption with 15s auto-refresh
  • -
  • Area charts for daily/hourly prompt & completion tokens
  • -
  • Trend indicators (% change vs previous period)
  • -
  • Inline sparklines on stat cards
  • -
  • Model distribution ranking with horizontal bar charts
  • -
  • Prompt/Completion ratio visualization
  • -
-
-

๐Ÿ”Œ Local API Proxy (Gateway)

-
    -
  • OpenAI /v1/chat/completions compatible endpoint
  • -
  • Anthropic /v1/messages compatible endpoint
  • -
  • Full SSE streaming support (tested with Cursor, Windsurf, OpenCode)
  • -
  • Model mapping (e.g. claude-sonnet-4-6 โ†’ gemini-3-flash)
  • -
  • Configurable port, timeout, and API key
  • -
  • Model visibility control (show/hide specific models)
  • -
-
-

๐Ÿ”„ Intelligent Auto-Switching

-
    -
  • Unlimited pool mode with smart backup selection
  • -
  • Auto-switch when quota < 5% or rate-limited
  • -
  • Background monitoring every 5 minutes
  • -
  • Graceful fallback with status reason tracking
  • -
-
-

๐Ÿ” Proxy Observability (Advanced)

-
    -
  • Traffic Monitor โ€” Live request/response log with latency, status, and model info
  • -
  • Request Replay โ€” Replay any recorded request for debugging
  • -
  • Model Capabilities โ€” Inspect vision, thinking, streaming, JSON mode support per model
  • -
  • Developer Tools โ€” cURL & Python code generation, one-click copy
  • -
-
-

๐Ÿ” Security & Encryption

-
    -
  • AES-256-GCM encryption for all sensitive data
  • -
  • OS native credential manager integration (Keytar + SafeStorage)
  • -
  • Auto migration of legacy plaintext data
  • -
  • Encrypted token & quota storage per account
  • -
-
-

โš™๏ธ Settings & Customization

-
    -
  • Dark / Light / System theme support
  • -
  • Multi-language: English & Portuguรชs (Brasil)
  • -
  • Per-account proxy URL override
  • -
  • Model visibility toggles
  • -
  • Log directory access
  • -
-
-

๐Ÿ–ฅ๏ธ Desktop Experience

-
    -
  • Native Electron app with system tray integration
  • -
  • Collapsible sidebar with persistent state
  • -
  • Responsive layouts across all views
  • -
  • Status bar with live proxy and connection indicators
  • -
  • Error boundaries with user-friendly fallbacks
  • -
-
- ---- - -## ๐Ÿ“ธ Screenshots - - -

- Main Dashboard -

-

- Usage Analytics -

-

- Proxy Monitor -

-

- Routing Config -

-

- Documentation -

-

- Active Connections -

-

- Settings Configuration -

- ---- - -## โšก Installation & Quick Start - -### ๐Ÿ“ฆ Download the App - -You can download the latest pre-compiled binaries for Windows, macOS, and Linux from our [Releases page](https://github.com/evandrodevbr/GeminiNexus/releases). - -*(Refer to the warning at the top of this page if you are using Windows and encounter the SmartScreen prompt).* - -### ๐Ÿ”Œ Using with AI IDEs - -Once the application is running and you have added at least one account, configure your preferred IDE (Cursor, Windsurf, OpenCode, etc.): - -```plaintext -API Base URL: http://localhost:10100/v1 -API Key: (copy this from the Proxy page in the app) -Model: gemini-3-flash (or any mapped model of your choice) +```text +API Base URL: http://localhost:8045/v1 (default port; configurable on the Proxy page) +API Key: (copy it from the Proxy page in the app) +Model: gemini-3-flash (or any mapped model) ``` -### ๐Ÿ› ๏ธ Build from Source +> [!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. -#### Prerequisites +## How it works -- **Node.js** v20 or higher -- **npm** (this project uses `package-lock.json`) - -#### Steps - -```bash -# Clone the repository -git clone https://github.com/evandrodevbr/GeminiNexus.git -cd GeminiNexus - -# Install dependencies -npm install - -# Start the application in development mode -npm start - -# Build for production (e.g., Windows installer) -npm run make +```mermaid +flowchart LR + IDE["Cursor ยท Windsurf ยท OpenCode
Claude Code ยท any OpenAI/Anthropic client"] -->|"/v1/chat/completions
/v1/messages"| P + subgraph APP["Gemini Nexus (Electron)"] + R["Renderer
React 19 ยท TanStack Router/Query"] <-->|"oRPC over IPC"| M["Main process
config ยท tray ยท services"] + M --> DB[("SQLite
better-sqlite3 + Drizzle")] + M --> SEC["Encryption
AES-256-GCM ยท Keytar/SafeStorage"] + M --> MON["CloudMonitor + AutoSwitch
quota every 5 min"] + M --> P["NestJS proxy
port 8045"] + P --> SCH["Account scheduler
+ circuit breaker"] + end + SCH -->|"Google OAuth account"| UP["Google upstream APIs"] + MON --> UP ``` ---- +
+Stack and layout -## ๐Ÿ› ๏ธ Tech Stack +| Layer | Technology | +|---|---| +| 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) | -| Category | Technologies | -|----------|-------------| -| **Core** | [Electron](https://www.electronjs.org/), [React 19](https://react.dev/), [TypeScript](https://www.typescriptlang.org/) | -| **Build** | [Vite](https://vitejs.dev/), [Electron Forge](https://www.electronforge.io/) | -| **Styling** | [Tailwind CSS v4](https://tailwindcss.com/), [Radix UI](https://www.radix-ui.com/), [Lucide Icons](https://lucide.dev/) | -| **State** | [TanStack Query](https://tanstack.com/query/latest), [TanStack Router](https://tanstack.com/router/latest) | -| **Backend** | [NestJS](https://nestjs.com/) (internal gateway), [ORPC](https://orpc.unnoq.com/) (type-safe RPC) | -| **Database** | [Better-SQLite3](https://github.com/WiseLibs/better-sqlite3), [Drizzle ORM](https://orm.drizzle.team/) | -| **Charts** | [Nivo](https://nivo.rocks/) (Line, Bar, Pie) | -| **i18n** | [react-i18next](https://react.i18next.com/) | -| **Testing** | [Vitest](https://vitest.dev/), [Playwright](https://playwright.dev/) | - ---- - -## ๐Ÿ’ป Development - -```bash -# Start dev environment (Electron + Vite HMR) -npm start - -# Run linting -npm run lint - -# Type check -npm run type-check - -# Format code -npm run format:write - -# Run tests -npm test -``` - -### Project Structure - -```plaintext +```text src/ -โ”œโ”€โ”€ actions/ # App actions and flow orchestration -โ”œโ”€โ”€ components/ # React UI components -โ”‚ โ”œโ”€โ”€ proxy/ # Proxy page components (advanced tabs) -โ”‚ โ”œโ”€โ”€ usage/ # Usage analytics components (StatCard, ChartCard) -โ”‚ โ””โ”€โ”€ ui/ # Base UI primitives (Radix-based) -โ”œโ”€โ”€ hooks/ # Custom React hooks -โ”œโ”€โ”€ ipc/ # Electron IPC + database handlers -โ”œโ”€โ”€ layouts/ # Layout components (MainLayout + sidebar) -โ”œโ”€โ”€ localization/ # i18n translation resources -โ”œโ”€โ”€ routes/ # TanStack Router pages (index, usage, proxy, settings) -โ”œโ”€โ”€ server/ # NestJS backend (proxy gateway service) -โ”œโ”€โ”€ services/ # Service layer -โ”œโ”€โ”€ types/ # TypeScript type definitions + Zod schemas -โ””โ”€โ”€ utils/ # Utility functions +โ”œโ”€โ”€ 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). -## โ“ FAQ - -
-Q: "Windows protected your PC" (SmartScreen) warning during installation? - -Yes, this is a common warning for new unsigned applications. Click **"More info"** and then **"Run anyway"**. See the warning at the top of the README for more details.
-
-Q: The app won't start when building from source? +## Known limitations -1. Make sure all dependencies are installed: `npm install` -2. Check if your Node.js version is >= 20. -3. Try deleting `node_modules` and reinstalling. -4. On Windows, ensure the WiX Toolset is available for `npm run make`. -
+- 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: pnpm@10.11.0`; 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). + +```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) +```
-Q: Account login failed? +FAQ + +**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. -1. Ensure your network connection is working. -2. Try clearing the app data and logging in again. -3. Check if the account is restricted by Google/Claude.
-
-Q: My IDE can't connect to the proxy? +## CI/CD -1. Make sure the proxy is actually running (look for the green indicator in the status bar). -2. Verify the port matches your IDE config (default is `10100`). -3. Copy the API key directly from the Proxy page and paste it into your IDE settings. -4. Check that at least one account is active in the Accounts page. -
+Workflows in [`.github/workflows/`](.github/workflows): -
-Q: Token counts are showing zero? +| Workflow | Trigger | What it does | +|---|---|---| +| [`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 | -1. This was a known bug in earlier versions โ€” please update to the latest release. -2. Token tracking now correctly handles streaming metadata and estimated counts. -3. Usage data refreshes every 15 seconds on the Usage Analytics page. -
+These workflows are written for GitHub: they call the `gh` CLI and the GitHub +release publisher. ---- +## Licensing and credits -## ๐Ÿค Contributing +- **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). -Contributions are welcome! Please read `CONTRIBUTING.md` for details. +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). ---- +Contributing: see [`CONTRIBUTING.md`](CONTRIBUTING.md), [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) +and [`SECURITY.md`](SECURITY.md). -## ๐Ÿ“„ License +## Notices -This project uses a dual-license structure: - -- **Original code** from [AntigravityManager](https://github.com/Draculabo/AntigravityManager) by [Draculabo](https://github.com/Draculabo): Licensed under [CC BY-NC-SA 4.0](LICENSE). -- **All new code, features, and architecture** by [evandrodevbr](https://github.com/evandrodevbr): Licensed under the [MIT License](LICENSE-MIT). - -> ๐Ÿ”„ **Migration Notice:** This project is actively being migrated to a fully open-source license (MIT). As the remaining original code is progressively rewritten, the entire project will transition to MIT. We are committed to making Gemini Nexus 100% open-source. - ---- - -## ๐Ÿ™ Credits - -This project was originally forked from [AntigravityManager](https://github.com/Draculabo/AntigravityManager) created by [Draculabo](https://github.com/Draculabo). The initial proxy concept and early Electron scaffolding were based on his work. - -Since the fork, **the vast majority of the codebase has been rewritten, redesigned, and expanded** by [evandrodevbr](https://github.com/evandrodevbr), including but not limited to: - -- Complete UI/UX redesign (navigation, accounts, usage analytics, proxy management) -- Usage Analytics dashboard with cost tracking, token averages, and OpenRouter integration -- Traffic monitor with per-request token/cost inspection -- Environment isolation (dev/prod), CI/CD pipeline, and test infrastructure -- IDE Quick Setup (OpenCode, Cursor, VS Code, Claude Code) -- Custom model pricing configuration -- All documentation and internationalization (EN, PT-BR, ES, ZH-CN) +- 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/).