LangGraph is a Python framework for building AI agents as graphs: each step is a node, edges decide what runs next, and a shared state object carries the work through. That structure gives you things simple agent loops lack: durable execution that resumes exactly where it stopped after a crash, checkpoints you can inspect and rewind, human approval at any point, and short-term and long-term memory.
It is from LangChain Inc. but works without LangChain, and it is the engine under many production agents; the README names Klarna, Replit and Elastic. Checkpoints can live in memory, SQLite or Postgres, a CLI runs a local development server, and LangSmith adds tracing and hosted deployment if you want them. For a higher-level starting point, the same team's Deep Agents package is built on LangGraph.
It is MIT-licensed, with about 43,900 stars and 292 contributors, at 1.2.17 when scanned. It is deliberately low level, so expect to write more code than with an all-in-one agent builder, and a JavaScript version lives in a separate repository.
- Repository: github.com/langchain-ai/langgraph
- Licence: MIT (MIT License)
- Language: Python. Stars: 43.9K. Forks: 7,547. Last push: Oct 26, 2026.
- Scan: safe, Oct 26, 2026, commit a25bfaf
Who it is for
Python developers building agents that must run for a long time, survive failures or wait for a person to approve a step, and teams moving an agent prototype into production.
Getting started
1. Install the library
pip install -U langgraph2. Install the CLI for a local development server
pip install -U "langgraph-cli[inmem]"3. Start the server in your project
langgraph devYou also need a model provider package and key, for example langchain-openai or langchain-anthropic, or a local model. The quickstart at docs.langchain.com walks through a first agent.
Safety scan
We cloned langchain-ai/langgraph at commit a25bfaf 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.
- No secrets, no suspicious patterns, no install hooks and no committed binaries across 698 files and about 222,000 lines of Python.
- 14 known advisories (7 high), none critical. Most are in the CLI's example projects (libs/cli/js-examples and uv-examples); the rest are development pins in uv.lock files, such as langsmith and picomatch. pip installs current releases, and LangSmith tracing is off unless you turn it on.
- Two of 17 workflows use pull_request_target: one checks that a PR links an issue and one labels external PRs. Both only call the GitHub API, and require_issue_link.yml carries a comment forbidding checkout of PR code.
- All 12 third-party actions are pinned to commits and Dependabot is on. No security policy file in this repository.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | None found. |
| Suspicious code | None found. |
| Install-time code | None: nothing runs at install beyond the package manager itself. |
| Committed binaries | None. |
| CI workflows | 17 workflows. 2 use pull_request_target, none check out the pull request head. 0 of 12 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often docs.langchain.com, github.com, api.example.com, smith.langchain.com. No URLs to bare IP addresses. |
| Known vulnerabilities | 14 advisories across 997 pinned packages: 0 critical, 7 high, 4 moderate, 3 low. libs/checkpoint-conformance/uv.lock: 42 packages, 0 advisories; libs/checkpoint-postgres/uv.lock: 52 packages, 0 advisories; libs/checkpoint-sqlite/uv.lock: 50 packages, 0 advisories; libs/checkpoint/uv.lock: 61 packages, 0 advisories; libs/cli/js-examples/yarn.lock: 671 packages, 4 advisories; libs/cli/js-monorepo-example/yarn.lock: 283 packages, 2 advisories; libs/cli/uv-examples/monorepo/uv.lock: 40 packages, 2 advisories; libs/cli/uv-examples/simple/uv.lock: 34 packages, 1 advisories; libs/cli/uv.lock: 125 packages, 3 advisories; libs/langgraph/uv.lock: 185 packages, 2 advisories; libs/prebuilt/uv.lock: 56 packages, 0 advisories; libs/sdk-py/uv.lock: 50 packages, 0 advisories. |
| Project hygiene | Has automated dependency updates, licence file. Missing security policy, CodeQL, contributing guide. |
| OpenSSF Scorecard | Not 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.
Worst known vulnerabilities (14 of 14)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-c2c7-rcm5-vvqj | high | picomatch@2.3.1 | Picomatch has a ReDoS vulnerability via extglob quantifiers |
| GHSA-c2c7-rcm5-vvqj | high | picomatch@4.0.3 | Picomatch has a ReDoS vulnerability via extglob quantifiers |
| GHSA-mrhx-c7xc-m3w5 | high | zod@4.3.6 | Zod can exhaust memory while validating oversized constrained collections |
| GHSA-f4xh-w4cj-qxq8 | high | langsmith@0.8.0 | LangSmith SDK TracingMiddleware: Arbitrary server-side file read |
| GHSA-f4xh-w4cj-qxq8 | high | langsmith@0.8.5 | LangSmith SDK TracingMiddleware: Arbitrary server-side file read |
| GHSA-v4x8-3wr5-3wq8 | high | filelock@3.28.0 | filelock ReadWriteLock: SQLite reopens the lock database by name, so a planted symlink or journal file makes the lock us… |
| GHSA-c3mw-737p-c7g2 | high | jupyter-server@2.20.0 | Jupyter Server: 5xx request logging leaks token-bearing Referer header values |
| GHSA-3v7f-55p6-f55p | moderate | picomatch@2.3.1 | Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Matching |
| GHSA-3v7f-55p6-f55p | moderate | picomatch@4.0.3 | Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Matching |
| GHSA-p498-v437-472g | moderate | @humanfs/node@0.16.7 | humanfs: Recursive copy follows symlinked files and copies data from outside the source tree |
| GHSA-65pc-fj4g-8rjx | moderate | idna@3.11 | Internationalized Domain Names in Applications (IDNA): Specially crafted inputs to idna.encode() can bypass CVE-2024-365… |
| GHSA-567q-5qvw-pf92 | low | filelock@3.28.0 | filelock: On Windows an oplock on a soft lock's marker holds SoftFileLock.acquire() past its timeout and blocks the stal… |
| GHSA-9vhv-jxww-xfm5 | low | filelock@3.28.0 | filelock: ReadWriteLock on Windows acts on SQLite side files another local user places beside its database |
| GHSA-xmj3-9gf7-h52w | low | setuptools@83.0.0 | setuptools: Windows path escape via namespace_packages.txt during legacy wheel installation Description |
Workflows worth a look
- .github/workflows/require_issue_link.yml: pull_request_target
- .github/workflows/tag-external-prs.yml: pull_request_target
By the numbers
| Stars | 43.9K |
|---|---|
| Forks | 7,547 |
| Contributors | 292 |
| Commits | 7,218 |
| Open issues | 359 |
| Open pull requests | 157 |
| Releases | 585 |
| Latest release | 1.2.17 |
| Licence | MIT |
| Main language | Python |
| Project age | 3 years |
| Last push | Oct 26, 2026 |
| Tracked files | 698 |
| Lines of code | 222K |
| Checkout size | 14 MB |
Lines by language: Python 202.7K, Jupyter 9,057, JSON 3,542, YAML 3,160, Markdown 2,021, TOML 1,040.
Questions
Is LangGraph free?
Yes. LangGraph is MIT-licensed and free, and runs anywhere Python does. LangSmith, the company's tracing and deployment platform, is a separate product with free and paid plans, and LangGraph does not need it.
Do I need LangChain to use LangGraph?
No. LangGraph works on its own with any model client. LangChain's integrations make it quicker to plug in models and tools, but they are optional.
LangGraph or Deep Agents?
Start with Deep Agents if you want an agent that can plan, use sub-agents and work with files right away. Use LangGraph directly when you need full control over each step, state and approval point.
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.
