6 min read

Skyvern: Automate Browser Tasks With AI Vision (GitHub, Scanned)

Automate websites with AI that reads pages visually, via Playwright, a no-code builder or an API.

Skyvern logo
✅
Scan: safe. Nothing malicious. Basic usage statistics are on by default (SKYVERN_TELEMETRY=false turns them off), and a browser agent can act on any site it is logged in to, so give it accounts and credentials scoped to the job. Scanned Oct 22, 2026; the full report is below.

Skyvern automates work in a web browser by looking at the page the way a person does. Instead of a script full of CSS selectors that breaks when a site changes its layout, it gives a vision-capable language model a screenshot and the page structure, and lets it decide what to click, type and select to reach a goal you describe, such as filling in a form, downloading invoices from a portal or getting a quote.

There are three ways to use it. As a Python or TypeScript SDK it extends Playwright, so page.click can take a prompt like Click the green Submit button, and page.extract returns structured data matching a schema. As a local server it comes with a web UI and a no-code workflow builder that chains tasks, loops, data extraction and file downloads, with logins, two-factor codes and credentials handled through built-in integrations. And there is a managed cloud version from the same team.

It is AGPL-3.0, with about 23,200 stars, at v1.0.56 when scanned. The anti-bot measures used in the cloud version are not part of the open source code.

  • Repository: github.com/Skyvern-AI/skyvern
  • Licence: AGPL-3.0 (GNU Affero General Public License v3.0)
  • Language: Python. Stars: 23.2K. Forks: 2,203. Last push: Oct 22, 2026.
  • Scan: safe, Oct 22, 2026, commit 73e49ce

Who it is for

Operations teams with repetitive browser work across sites that have no API, developers who already use Playwright and want AI fallbacks, and builders of agents that need to act on real websites.

Getting started

1. Install the server and web UI (Python 3.11 to 3.13)

pip install "skyvern[all]"

2. Run the guided setup: picks your LLM provider and starts everything

skyvern quickstart

3. Open the web UI

open http://localhost:8080

The local setup stores its data in SQLite at ~/.skyvern/data.db by default; Docker Compose and Postgres are options. Every step calls a vision model, so long workflows add up on a paid API. Set SKYVERN_TELEMETRY=false before starting to turn off usage statistics.

Safety scan

We cloned Skyvern-AI/skyvern at commit 73e49ce on Oct 22, 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.

  • No secrets and no committed binaries across 5,595 files and about 1.8 million lines of Python and TypeScript.
  • The pattern hits are explained: install.sh documents the project's own installer at install.skyvern.com and itself downloads before executing rather than piping into a shell, two Dockerfiles install uv, and the two exfiltration-host hits are error messages telling users not to use webhook.site or requestbin.com as webhook targets. Five very long lines are a bundled browser extension script and test fixtures.
  • The README states that basic usage statistics are collected by default, with SKYVERN_TELEMETRY=false to opt out.
  • 55 known advisories (3 critical), 38 of them in uv.lock. The criticals are Pillow image-decoding bugs; Skyvern mostly decodes its own browser screenshots. The rest are in the frontend and TypeScript SDK build tooling.
  • 13 workflows. One uses pull_request_target to sync to the cloud repository and does not check out the pull request; all 15 third-party actions are pinned to commits. Security policy, licence and contributing guide present; no Dependabot or CodeQL.

What the scanner counted

CheckResult
SecretsNone found.
Suspicious code15 pattern hits found and read; every one is listed under the raw findings.
Install-time code1 npm lifecycle script. 5 installer scripts (one fetches and runs a remote script)
Committed binariesNone.
CI workflows13 workflows. 1 uses pull_request_target, none check out the pull request head. 0 of 15 third-party actions pinned to a tag rather than a commit.
Network hosts40 distinct hosts referenced from source; most often example.test, api.skyvern.com, portal.example.com, www.googleapis.com. 15 URLs to a bare IP address, listed under the raw findings.
Known vulnerabilities55 advisories across 1,461 pinned packages: 3 critical, 24 high, 25 moderate, 3 low. skyvern-frontend/package-lock.json: 845 packages, 15 advisories; skyvern-ts/client/package-lock.json: 221 packages, 7 advisories; skyvern-ts/client/pnpm-lock.yaml: 235 packages, 8 advisories; skyvern/cli/mcpb/claude_desktop/package-lock.json: 81 packages, 0 advisories; tests/sdk/typescript_sdk/package-lock.json: 83 packages, 4 advisories; uv.lock: 404 packages, 38 advisories.
Project hygieneHas security policy, licence file, contributing guide. Missing automated dependency updates, CodeQL.
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.

Pattern hits (15)
WhereRuleMatch
Dockerfile:5download-piped-to-shellRUN curl -LsSf https://astral.sh/uv/install.sh | sh \
install.sh:25download-piped-to-shellcurl -LsSf https://install.skyvern.com | sh
install.sh:26download-piped-to-shellcurl -LsSf https://install.skyvern.com | sh -s -- --no-init
install.sh:27download-piped-to-shellcurl -LsSf https://install.skyvern.com | sh -s -- --run-setup
install.sh:28download-piped-to-shellcurl -LsSf https://install.skyvern.com | sh -s -- --version 1.0.35
install.sh:29download-piped-to-shellcurl -LsSf https://install.skyvern.com | sh -s -- --variant server
install.sh:75download-piped-to-shell# Download then execute (not `curl ... | sh`): POSIX /bin/sh has no
integrations/mcp/Dockerfile:4download-piped-to-shellRUN curl -LsSf https://astral.sh/uv/install.sh | sh && \
skyvern/browser_extension/extension/control_indicator.js:129very-long-line6007 chars
skyvern/browser_extension/relay.py:328very-long-line6027 chars
skyvern/browser_extension/relay.py:345very-long-line6033 chars
skyvern/forge/sdk/api/llm/utils_test.py:316very-long-line7176 chars
skyvern/forge/sdk/api/llm/utils_test.py:437very-long-line16812 chars
skyvern/forge/sdk/routes/webhooks.py:84exfil-host"such as webhook.site or requestbin.com."
skyvern/services/webhook_service.py:606exfil-host"such as webhook.site or requestbin.com."
URLs to bare IP addresses (15)
WhereRuleMatch
skyvern/webeye/schemas.py:59ip-literal-urlexamples=["http://localhost:9222", "https://3.12.10.11/browser/123456"],
tests/unit/test_real_browser_state_navigate.py:193ip-literal-urlpage.url = "https://93.184.216.34/current"
tests/unit/test_remote_cdp_driver_release.py:351ip-literal-urlawait RealBrowserManager()._create_browser_state(browser_address="http://192.0.2.10:9222")
tests/unit/test_remote_cdp_driver_release.py:431ip-literal-urlremote_state = await RealBrowserManager()._create_browser_state(browser_address="http://192.0.2.10:9222")
tests/unit/test_script_skyvern_page.py:156ip-literal-urlawait page.goto("https://93.184.216.34/path")
tests/unit/test_script_skyvern_page.py:162ip-literal-urlurl="https://93.184.216.34/path",
tests/unit/test_script_skyvern_page.py:173ip-literal-urlawait page.goto("https://93.184.216.34/path", max_retries=1)
tests/unit/test_script_skyvern_page.py:208ip-literal-urlurl = "https://93.184.216.34/path"
tests/unit/test_script_skyvern_page.py:265ip-literal-urlrendered_url = "https://93.184.216.34/path"
tests/unit/test_task_request_validation.py:341ip-literal-urlTaskRunRequest(prompt="t", browser_address="http://1.2.3.4:9222", start_fresh_browser=True)
tests/unit/test_task_request_validation.py:347ip-literal-urlTaskRunRequest(prompt="t", browser_address="http://1.2.3.4:9222")
tests/unit/test_task_request_validation.py:357ip-literal-urlWorkflowRunRequest(agent_id="wpid_1", browser_address="http://1.2.3.4:9222", start_fresh_browser=True)
tests/unit/test_task_request_validation.py:363ip-literal-urlWorkflowRunRequest(agent_id="wpid_1", browser_address="http://1.2.3.4:9222")
tests/unit/test_task_request_validation.py:373ip-literal-urlWorkflowRequestBody(browser_address="http://1.2.3.4:9222", start_fresh_browser=True)
tests/unit/test_task_request_validation.py:405ip-literal-urlbrowser_address="http://1.2.3.4:9222",
npm lifecycle scripts (1)
  • skyvern-frontend/package.json prepare: cd .. && command -v pre-commit >/dev/null 2>&1 && pre-commit install || echo 'pre-commit not installed, skipping hook setup'
Installer scripts (5)
Worst known vulnerabilities (24 of 55)
AdvisorySeverityPackageSummary
GHSA-332p-7hrc-92wfcriticalpillow@12.3.0Pillow: Heap buffer overflow in _tiffWriteProc when saving TIFF to BytesIO
GHSA-8g5g-8vmr-9782criticalpillow@12.3.0Pillow: Heap buffer overflow in ImagingJpegDecode
GHSA-w889-685w-c8fhcriticalpillow@12.3.0Pillow: Argument Injection in Ghostscript call, potentially leading into RCE
GHSA-vfj7-8cjw-p6xmhighbraces@3.0.3braces vulnerable to stack-exhaustion denial of service through deeply nested patterns
GHSA-8r9p-f939-6h3chighfollow-redirects@1.16.0follow-redirects sensitiveHeaders regex escaping can expose credential headers
GHSA-q3jh-wrc6-jgq8highfollow-redirects@1.16.0follow-redirects array-form headers bypass cross-origin credential stripping
GHSA-587h-7wmj-h5pmhighvite@6.4.3launch-editor: `fs.existsSync()` existence check can be bypassed on Windows
GHSA-587h-7wmj-h5pmhighvite@7.3.6launch-editor: `fs.existsSync()` existence check can be bypassed on Windows
GHSA-22hg-r758-rrw9highpillow@12.3.0Pillow: Infinite loop in MIC n_frames when the embedded TIFF
GHSA-27h8-gf7j-v5hchighpillow@12.3.0Pillow: NULL dereference in ImagingExpand via rank filters on zero-size images
GHSA-58r4-6rv3-gfh8highpillow@12.3.0Pillow: Out-of-bounds access in _imagingmorph on a zero-width image
GHSA-5xm2-6676-qcp9highpillow@12.3.0Pillow: APNG background disposal allocates full canvas before decompression bomb check
GHSA-65qm-jvmh-6pqghighpillow@12.3.0Pillow: GIF seek keeps rejected size after DecompressionBombError, allowing DoS
GHSA-7mwm-ghpf-9vrmhighpillow@12.3.0Pillow: Double free in ImagingScaleAffine on calloc failure via Image.transform
GHSA-c6hw-5grf-ff96highpillow@12.3.0Pillow: OOB read in TiffDecode.c tile and RGBA paths leaks heap memory into pixels
GHSA-cp9v-662q-vvx9highpillow@12.3.0Pillow: NULL pointer dereference in Image.merge via an unvalidated band 0
GHSA-f2g6-542v-9j58highpillow@12.3.0Pillow: Infinite loop in PdfParser.rewrite_pages on page tree Parent cycle
GHSA-gg2r-wvfm-q9rxhighpillow@12.3.0Pillow: MSP RLE decoder expands a tiny file into unbounded memory
GHSA-j4m9-6w36-pw47highpillow@12.3.0Pillow: Invalid free in FreeType glyph rendering when a stroker is active
GHSA-jg86-v3jv-hrpmhighpillow@12.3.0Pillow: Quadratic-time DoS in PDF save_all (PdfParser.next_object_id)
GHSA-p4wg-p73j-c528highpillow@12.3.0Pillow: Unbounded recursion parsing a PDF page tree or trailer chain (incomplete fix for CVE-2026-42310)
GHSA-pchr-8j38-3x4phighpillow@12.3.0Pillow: TIFF encoder ColorMap plane-size mismatch causes a heap out-of-bounds read
GHSA-q45j-58j2-45rghighpillow@12.3.0Pillow: TiffDecode returns uninitialized memory as pixels for short JPEG strips
GHSA-xvh5-g6gv-559vhighpillow@12.3.0Pillow: Memory disclosure and segfault in libtiff encoder via crafted TIFF tags
Workflows worth a look

By the numbers

Stars23.2K
Forks2,203
Contributors96
Commits7,076
Open issues50
Open pull requests240
Releases160
Latest releasev1.0.56
LicenceAGPL-3.0
Main languagePython
Project age2 years
Last pushOct 22, 2026
Tracked files5,595
Lines of code1.8M
Checkout size262 MB

Lines by language: Python 1.3M, TypeScript 417.1K, JSON 95.4K, Markdown 32.6K, JavaScript 18.9K, YAML 5,013.

Questions

Is Skyvern free?

The open source version is free to self-host under the AGPL-3.0 licence; you pay for the language model calls it makes, or nothing with a local vision model. Skyvern Cloud is a paid managed service with extras such as anti-bot handling and parallel runs.

How is Skyvern different from browser-use?

Both let an AI drive a browser. browser-use is a Python library for agents. Skyvern adds a server with a web UI and a no-code workflow builder, credential and two-factor handling, and a Playwright-compatible SDK where AI is a fallback for ordinary selectors, so it leans more towards repeatable business workflows.

Which models does Skyvern work with?

Any provider with a vision-capable model that its setup supports, including OpenAI, Anthropic, Google Gemini, Azure, Bedrock and OpenRouter, plus local models through Ollama or an OpenAI-compatible server. Larger vision models are noticeably more reliable on complex sites.


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.