Skip to main content
Glama
README.md
<div align="center">

# 🎬 Jev Docs Agent

### Describe the goal. Get the video, the screenshots and the user guide.

**An open-source, goal-driven agent that walks through any web app in a real browser, records every task as a<br>
walkthrough video, and turns the recordings into polished user documentation β€” driven from Claude Desktop.**

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Python 3.12](https://img.shields.io/badge/Python-3.12-3776AB?logo=python&logoColor=white)](https://www.python.org/)
[![Playwright](https://img.shields.io/badge/Playwright-1.63-2EAD33?logo=playwright&logoColor=white)](https://playwright.dev/)
[![MCP](https://img.shields.io/badge/MCP-Claude%20Desktop-D97757?logo=anthropic&logoColor=white)](https://modelcontextprotocol.io/)
[![Docker](https://img.shields.io/badge/Docker-ready-2496ED?logo=docker&logoColor=white)](Dockerfile)
[![Powered by Jev](https://img.shields.io/badge/Powered%20by-Jev%20(TypeSafe%20AI)-111111)](https://typesafe.ai)

[Quick start](#-quick-start) Β· [Use cases](#-use-cases) Β· [How it works](#-how-it-works) Β· [Alternatives](#-how-it-compares) Β· [vs. demo platforms](docs/comparison.md) Β· [Claude Desktop](#-drive-it-from-claude-desktop-mcp) Β· [Roadmap](ROADMAP.md) Β· [Contributing](CONTRIBUTING.md)

<br>

<img src="docs/assets/demo-checkout.gif" alt="The agent completing a checkout on Sauce Demo by itself" width="760">

<sub>A real recording: the agent was only told <i>"Order confirmation page shows 'Thank you for your order!'"</i> β€” it planned every click.</sub>

</div>

---

## ✨ Why this exists

Product walkthroughs, help-center articles and test evidence all need the same thing: **someone clicking through the
app, recording it, taking screenshots, and writing it up** β€” and doing it all again after every UI change.

Jev Docs Agent does that work for you:

```yaml
- name: checkout
  goal: "Order confirmation page shows 'Thank you for your order!'."
```

That's a complete test case. The agent opens a browser, figures out the clicks, records an HD video with a visible
cursor, captures a screenshot after every step, and hands the recording to Claude to write the guide.
When the UI changes, you re-run it β€” **no selectors to fix, no scripts to maintain.**

<table>
<tr>
<td width="33%" valign="top">

### 🎯 Goal-driven
Say what *finished* looks like. Jev decides each click from the live page β€” buttons can move, get renamed or
restyled and the goal still works. Hints are optional.

</td>
<td width="33%" valign="top">

### πŸŽ₯ Evidence by default
Every run produces a `.webm` video, a screenshot per action, an `actions.json` trail of every decision, and a
pass/fail report.

</td>
<td width="33%" valign="top">

### πŸ“š Docs, not just videos
Claude turns recordings into how-to guides, quick-starts and FAQs β€” exported as one HTML page (β†’ PDF) or a zip with
MP4s.

</td>
</tr>
<tr>
<td valign="top">

### πŸ’¬ Runs from a chat
20 MCP tools let Claude Desktop create projects, write goals, record, debug failures and write docs. No YAML needed.

</td>
<td valign="top">

### πŸ” Bring any login
Credentials are supplied, never stored in config: per-project `.env`, role profiles (admin / viewer), or
`docker -e` in CI.

</td>
<td valign="top">

### πŸ’Έ Very low cost
Jev answers in typed decisions, not prose. The 5-video example below estimated **~33 Jev calls β‰ˆ $0.01**.

</td>
</tr>
</table>

---

## 🧭 Use cases

| | Use case | What you get |
|---|---|---|
| πŸ“– | **Help-center & user guides** | Step-by-step articles with real screenshots and a video per task, regenerated in minutes after a release |
| πŸš€ | **Customer onboarding** | "Your first 5 minutes" quick-starts and walkthrough videos for new users |
| 🎞️ | **Product demos & interactive tours** | Short, cursor-highlighted demo clips of each feature for sales, landing pages and release notes |
| πŸ§ͺ | **Goal-based end-to-end testing** | Natural-language smoke/regression tests with pass/fail, video evidence and a step log β€” no selectors |
| βœ… | **Manual-test replacement & UAT evidence** | Executes the steps from your manual test cases and records proof for sign-off, audits or QA reports |
| πŸ”„ | **Docs drift detection** | Re-run after each deploy: a failed or changed video tells you the docs (or the UI) need attention |
| πŸ‘₯ | **Role & permission walkthroughs** | Same goal, different credential profiles β€” see exactly what admins vs. viewers can do |
| 🌍 | **Multi-environment checks** | Point one project at staging, then production, with `-e LOGIN_*` per environment |
| πŸŽ“ | **Training & internal enablement** | Recorded procedures for support teams, new hires and SOPs |
| 🧾 | **Compliance & change records** | Timestamped videos + screenshots of how a workflow behaves at each release |
| 🐞 | **Bug reproduction** | Describe the bug's path as a goal; get a video of exactly what happens |
| 🀝 | **Agencies & consultants** | One tool, many client apps β€” each client is its own project with its own login |

<details>
<summary><b>Who it's for</b></summary>

- **Technical writers / docs teams** β€” keep screenshots and steps current without re-shooting everything by hand.
- **Product & growth teams** β€” produce demo clips and onboarding content without a video tool subscription.
- **QA & test engineers** β€” express tests as goals, get evidence for free, stop maintaining brittle selectors.
- **Founders & small teams** β€” get a help center and a smoke test suite from the same few lines of YAML.
- **Developers** β€” script it from the CLI or CI with Docker; everything is plain files.

</details>

---

## πŸ†š How it compares

Jev Docs Agent is an **open-source, self-hosted alternative** that sits between demo builders, documentation tools and
test automation β€” it does a useful part of each, from one goal definition.

| | **Jev Docs Agent** | Interactive demo platforms<br><sub>Storylane, Navattic, Supademo, Arcade, HowdyGo, Consensus, Reprise, Demostack</sub> | Guide/doc capture<br><sub>Scribe, Tango, Guidde</sub> | Scripted E2E testing<br><sub>Playwright, Cypress, Selenium</sub> | Manual testing |
|---|:---:|:---:|:---:|:---:|:---:|
| Records itself (no human clicking) | βœ… | ❌ | ❌ | βœ… | ❌ |
| Defined by a goal in plain English | βœ… | β€” | β€” | ❌ code + selectors | βœ… test steps |
| Survives UI changes without edits | βœ… mostly | ❌ re-record | ❌ re-record | ❌ fix selectors | βœ… |
| Walkthrough video | βœ… webm / mp4 | βœ… | ⚠️ some | ⚠️ on failure | ❌ |
| Written user guide | βœ… AI-written | ⚠️ captions | βœ… | ❌ | ❌ |
| Pass / fail result | βœ… | ❌ | ❌ | βœ… | βœ… |
| Interactive click-through demo | ❌ | βœ… | ❌ | ❌ | ❌ |
| Precise assertions (exact values, API state) | ⚠️ visual goal checks | ❌ | ❌ | βœ… | βœ… |
| Self-hosted, open source, your data stays local | βœ… MIT | ❌ SaaS | ❌ SaaS | βœ… | βœ… |
| Cost | API usage only (cents) | per-seat SaaS | per-seat SaaS | free + engineer time | tester time |

### 🎞️ An open-source alternative to interactive demo platforms

Demo platforms are built for go-to-market teams: a person captures the product, the platform turns it into an
interactive tour or sandbox, and tracks how buyers engage. Jev Docs Agent automates the other half β€” **an AI agent
captures every flow by itself and produces videos, guides and a pass/fail result, again on every release.**

| Category | Platforms | Where Jev Docs Agent fits |
|---|---|---|
| **High-fidelity & full-funnel builders** | Storylane Β· Navattic Β· Supademo | βœ… Alternative for walkthrough *videos and guides* Β· 🀝 complement for interactive tours & ABM analytics |
| **Lightweight & fast product tours** | Arcade Β· HowdyGo | βœ… Alternative for feature videos in help articles & announcements Β· 🀝 complement for embedded click-throughs |
| **Enterprise & sales-engineering platforms** | Consensus · Reprise · Demostack | 🀝 Produces the feature videos and verifies flows · ❌ no sandboxes, app cloning or buyer intent |

**β†’ Full breakdown: [Jev Docs Agent vs. interactive demo platforms](docs/comparison.md)** β€” feature matrix, platform-by-platform
notes, a release workflow that uses both, and a decision guide.

**Use it instead of…**

- **Storylane / Supademo / Arcade / HowdyGo** β€” when the deliverable is *walkthrough videos and written guides* of real
  flows, regenerated on every release, rather than hand-built interactive tours. Keep a demo platform for clickable,
  branching tours, lead capture and buyer analytics.
- **Navattic / Consensus / Reprise / Demostack** β€” not as a replacement: they own ABM, buyer intent and sandboxes. Use
  the agent to produce the underlying videos and to flag which demos went stale after a release.
- **Scribe / Tango** β€” when you want the capture done *for* you: nobody has to click through the app.
- **Manual testing** β€” for repeatable happy-path checks and UAT evidence; keep humans for exploratory testing and
  judgment calls.
- **Playwright / Cypress scripts** β€” for smoke tests and flows that break often because of UI churn. Keep coded tests
  where you need exact assertions, data setup and millisecond-level reliability in CI. The two work well together: this
  project is built *on* Playwright.

> **Honest limits.** Goal-based checks are judged visually by a model, so they are excellent at "did the flow work?"
> and weaker at "is this number exactly 42.17?". It's not a load-testing or security-testing tool.


---

## βš™οΈ How it works

```mermaid
flowchart LR
    G["🎯 Goal<br/><i>'Order confirmation<br/>page is shown'</i>"] --> L
    subgraph L["Recording loop (per step)"]
        direction TB
        S["πŸ‘€ Read the page<br/>elements, text, popups"] --> J["🧠 Jev decides<br/>next element Β· value<br/>done? Β· confidence"]
        J --> A["πŸ–±οΈ Playwright acts<br/>click Β· type Β· choose Β· upload"]
        A --> C{"Stuck or unsure?"}
        C -- yes --> K["🧭 Claude coach<br/>looks at a screenshot,<br/>gives one tip"] --> S
        C -- no --> S
    end
    L --> O["πŸ“¦ video.webm Β· step_N.png<br/>actions.json Β· run_report.md"]
    O --> D["πŸ“ Claude writes the guide"] --> E["πŸ“€ HTML Β· PDF Β· ZIP Β· MP4"]
```

**[Jev](https://typesafe.ai)** is TypeSafe AI's *System One* model: instead of writing prose it returns **typed
decisions with calibrated confidence**. Every step the agent asks Jev several structured questions at once β€”
*which element next? what to type? did the last action work? is the goal done?* β€” so it's fast, cheap and knows when
it's unsure. When it is unsure, a **Claude coach** looks at a screenshot and gives one concrete tip. Safety rails sit
around all of it:

- 🚫 **`forbid_labels`** β€” buttons the agent may never click (payments, delete, sign out) unless a video explicitly allows them.
- πŸ”’ **Secrets stay secret** β€” passwords come from env files, are typed into fields but never written to logs, `actions.json` or tool replies.
- ⏱️ **Budgets** β€” max steps, max wait, stall detection and loop detection on every video.
- βœ… **Honest "done"** β€” a video only passes after at least one action *and* a confident goal check.

---

## πŸš€ Quick start

> **Prereqs:** Docker (or Python 3.12) and an [OpenRouter](https://openrouter.ai) key (or a
> [TypeSafe](https://typesafe.ai) key). The example uses [Sauce Demo](https://www.saucedemo.com), a public test shop.

```bash
git clone https://github.com/kaivalpatel6350/jev-docs-agent.git && cd jev-docs-agent
cp .env.example .env                                    # add OPENROUTER_API_KEY
cp projects/swaglabs/.env.example projects/swaglabs/.env  # Sauce Demo's public test login
```

<table>
<tr><th>🐳 Docker</th><th>🐍 Local Python</th></tr>
<tr><td>

```bash
docker build -t jev-docs-agent .

docker run --rm -v "$PWD/projects:/app/projects" \
  --env-file .env jev-docs-agent \
  python agent.py videos --project swaglabs
```

</td><td>

```bash
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
playwright install chromium

python agent.py videos --project swaglabs
```

</td></tr>
</table>

In about two minutes you'll have five videos and a report in `projects/swaglabs/out/`:

| Video | Goal (all the agent was told) | Result |
|---|---|---|
| `login` | Signed in: the Products page is shown | βœ… 3 actions |
| `sort-products` | Sorted by each option, ending on Price (high to low) | βœ… 3 actions |
| `add-to-cart` | Cart shows the product, then it's removed and the cart is empty | βœ… 4 actions |
| `checkout` | Order confirmation page shows "Thank you for your order!" | βœ… 8 actions |
| `logout` | Signed out through the menu; the login page is shown | βœ… 2 actions |

<p align="center">
  <img src="docs/assets/sort-products-step_4.png" width="32%" alt="Products sorted by price">
  <img src="docs/assets/checkout-step_8.png" width="32%" alt="Checkout overview">
  <img src="docs/assets/checkout-step_9.png" width="32%" alt="Order complete">
</p>

Then write and export the docs β€” from Claude Desktop (below) or the CLI:

```bash
python agent.py docs   --project swaglabs          # Claude writes the guides (uses your OpenRouter key)
python agent.py export --project swaglabs --mp4    # one HTML guide + a zip with MP4s
```

πŸ‘‰ See a generated result: **[docs/example-swag-labs-guide.md](docs/example-swag-labs-guide.md)**


---

## πŸ’¬ Drive it from Claude Desktop (MCP)

The MCP server lets Claude Desktop do everything β€” including writing `guides.yaml` for a brand-new app.

**1. Build the image**, then **2.** merge this into `~/Library/Application Support/Claude/claude_desktop_config.json`
(Windows: `%APPDATA%\Claude\claude_desktop_config.json`) and restart Claude Desktop:

```json
{
  "mcpServers": {
    "docs-agent": {
      "command": "docker",
      "args": ["run", "-i", "--rm",
               "-v", "/ABSOLUTE/PATH/TO/jev-docs-agent/projects:/app/projects",
               "--env-file", "/ABSOLUTE/PATH/TO/jev-docs-agent/.env",
               "-e", "HOST_PROJECTS_DIR=/ABSOLUTE/PATH/TO/jev-docs-agent/projects",
               "jev-docs-agent"]
    }
  }
}
```

**3. Just ask:**

> *"Create a docs project for https://app.acme.com. Make videos for signing in, creating an invoice and exporting a
> report. Record them, fix anything that fails, then write a how-to guide and export it as HTML and MP4."*

> *"Here's our user manual (attached) β€” make a video for every how-to in it and group them into guides."*

> *"Record the settings videos as the admin profile, then compare with the viewer profile."*

<details>
<summary><b>All 20 tools</b></summary>

| Area | Tools |
|---|---|
| Projects | `list_projects` Β· `create_project` Β· `get_project` Β· `update_settings` Β· `check_project` |
| Test logins | `get_credentials` Β· `set_credentials` Β· `remove_credentials_profile` |
| Goals | `add_video` Β· `remove_video` |
| Recording | `run_videos` (background job) Β· `job_status` Β· `stop_job` Β· `get_recording` (steps, screenshots, why it failed) |
| Docs | `add_doc` Β· `remove_doc` Β· `get_doc_brief` Β· `save_doc` Β· `get_doc` |
| Sharing | `export_project` (HTML guide Β· ZIP Β· MP4) |

When Claude Desktop writes the docs itself (`get_doc_brief` β†’ `save_doc`), no Claude API key is needed β€” only Jev's key
is used for recording. Every edit to `guides.yaml` keeps a `.bak`.

</details>

---

## πŸ“ Writing goals

```yaml
app_url: https://www.saucedemo.com
forbid_labels: [Logout, Reset App State, Delete Account, Purchase]
test_data:
  username: ${LOGIN_USERNAME}        # secret β†’ supplied from .env / docker -e
  password: ${LOGIN_PASSWORD}
  first_name: Jane                   # plain demo values Jev may type

videos:
  - name: login
    goal: "Signed in: the Products page (inventory list) is shown."
    start_path: /

  - name: checkout
    goal: "Order confirmation page shows 'Thank you for your order!'."
    start_after: login               # reuse the signed-in session
    start_path: /inventory.html
    hints:                           # optional β€” only where Jev needs help
      - "Fill First Name, Last Name, Zip/Postal Code from test data"

docs:
  - name: shopping-guide
    type: how-to guide
    audience: new customers
    videos: [login, checkout]
```

| Key | What it does |
|---|---|
| `goal` | What *finished* looks like, checkable on screen. One task per video. |
| `hints` | Optional steps. `**Label**` = exact button text, `'text'` = which row/section. |
| `start_after` / `start_path` | Reuse a previous video's session; open a specific page. |
| `allow` | `forbid_labels` this one video may click (e.g. `Logout` for a logout video). |
| `enabled: false` + `reason` | Never recorded (payments, real emails) β€” documented from your reference doc. |
| `reference_doc` | An existing manual (`.docx` / `.md`) whose wording and button names the docs should keep. |

**Tips:** make goals verifiable (*"the list shows INV-001 as Sent"* beats *"create an invoice"*), keep one task per
video, use demo accounts and synthetic data β€” screenshots are sent to the model.

---

## πŸ” Test logins

`guides.yaml` only names variables; values are supplied separately, so one project runs against any account or
environment. Precedence: **`docker -e` / shell β†’ `.env.<profile>` β†’ project `.env` β†’ root `.env`**.

| How | Where | Best for |
|---|---|---|
| *"Set the login for acme: qa@acme.com / …"* | `projects/acme/.env` | quick setup with demo accounts |
| Edit the file yourself | `projects/acme/.env` | real test accounts (never passes through chat) |
| *"Add an admin login"* | `projects/acme/.env.admin` (only what differs) | role-based walkthroughs |
| `docker run -e LOGIN_USERNAME=… -e LOGIN_PASSWORD=…` | process env | CI and other environments |

Pick per run: `run_videos(profile="admin")`, `--profile admin`, or `-e LOGIN_PROFILE=admin`.

---

## 🧰 CLI reference

```bash
python agent.py plan    --project <name>                  # free: validate config, credentials, run order, cost
python agent.py videos  --project <name> [--only a,b] [--profile admin]
python agent.py docs    --project <name> [--only a] [--dry]   # Claude writes docs (--dry: build requests only)
python agent.py improve --project <name> [--only a]       # Claude rewrites failed goals/hints and re-records
python agent.py export  --project <name> [--only a] [--mp4]
```

<details>
<summary><b>Project layout</b></summary>

```
agent.py              recording loop (Jev + Playwright), docs, improve, export CLI
mcp_server.py         20 MCP tools for Claude Desktop
exporter.py           HTML guide / ZIP / MP4 packaging
projects/<name>/
  guides.yaml         app_url, test_data, forbid_labels, videos (goals), docs
  .env, .env.<role>   test logins (git-ignored)
  out/                videos/<video>/{video.webm, step_N.png, actions.json}, docs/, exports/, run_report.md
```

</details>


---

## ❓ FAQ

<details>
<summary><b>What is Jev?</b></summary>

[Jev](https://typesafe.ai) is TypeSafe AI's first public *System One* model β€” built for decisions inside software rather
than chat. You send it structured questions (`Choice`, `Noul`, `Score`) and get typed answers with calibrated
confidence. That makes it a good fit for a browser agent that needs to pick one element out of hundreds, many times
per video, cheaply. It's available through the TypeSafe API and OpenRouter.
</details>

<details>
<summary><b>Do I need Claude?</b></summary>

Recording only needs Jev. Claude is used for the optional *coach* (when Jev is stuck), for `improve`, and for writing
docs from the CLI. If you use Claude Desktop, it writes the docs itself through MCP. One OpenRouter key covers Jev and
Claude.
</details>

<details>
<summary><b>What does it cost?</b></summary>

`python agent.py plan` estimates it before you run anything. The Sauce Demo example estimated ~33 Jev calls
(β‰ˆ $0.01). Coach calls and doc writing with Claude cost more than Jev calls; with Claude Desktop writing the docs they
come out of your Claude plan.
</details>

<details>
<summary><b>Does it work with any web app? What about SSO, MFA or CAPTCHAs?</b></summary>

Any app a browser can open. Username/password logins work out of the box; the session is reused across videos.
SSO redirects usually work if the test account doesn't need MFA. MFA codes and CAPTCHAs are not solved β€” use a test
account without them, or a test environment that disables them.
</details>

<details>
<summary><b>Is my data safe?</b></summary>

Everything runs on your machine or your own Docker host; outputs are plain files. Page text and screenshots are sent
to the model providers you configure (TypeSafe / OpenRouter / Anthropic), so use demo accounts and synthetic data.
Passwords are never written to logs, `actions.json` or MCP replies β€” but if your app *prints* a secret on screen, it
will appear in screenshots.
</details>

<details>
<summary><b>Why webm videos?</b></summary>

That's what Playwright records. `export --mp4` (or *"export as mp4"*) converts them to H.264 MP4 for PowerPoint,
Confluence, Notion or any player.
</details>

<details>
<summary><b>Can I run it in CI?</b></summary>

Yes β€” `docker run … python agent.py videos --project <name>` exits after writing `run_report.md` and `actions.json`
per video, with credentials from `-e` variables. Fail the build by checking each video's `status`.
</details>

---

## πŸ—ΊοΈ Roadmap

| Next | Theme | Highlights |
|---|---|---|
| **v0.2** | πŸŽ™οΈ Narrated & annotated | AI **voice-over** synced to each step Β· **captions** (SRT/VTT) Β· **step-by-step manuals** (DOCX/PDF) with highlighted screenshots Β· QA **test-case** format |
| **v0.3** | πŸš€ Share & verify | Self-hosted **interactive HTML tour** Β· trim login & idle time Β· **GitHub Action** + JUnit Β· visual change detection Β· multi-language |
| Later | πŸ”­ | Confluence / Notion / Docusaurus export Β· explore mode Β· test-case import Β· TOTP/MFA Β· mobile viewports Β· branding |

**β†’ Full plan with designs, status and effort: [ROADMAP.md](ROADMAP.md)**

> ### πŸ’‘ Have an idea?
> This project is shaped by its users. **[Share it in Ideas](https://github.com/kaivalpatel6350/jev-docs-agent/discussions/categories/ideas)**,
> πŸ‘ the [issues](https://github.com/kaivalpatel6350/jev-docs-agent/issues?q=is%3Aopen+label%3Aroadmap) you want most β€”
> priorities follow demand.

## 🀝 Contributing

Contributions of every size are welcome β€” ideas, bug reports, example projects against public demo apps, docs and code.

- 🌱 New here? Try a [good first issue](https://github.com/kaivalpatel6350/jev-docs-agent/issues?q=is%3Aopen+label%3A%22good+first+issue%22).
- πŸ“– Read **[CONTRIBUTING.md](CONTRIBUTING.md)** for setup, testing and the PR checklist.
- πŸ” Never commit `.env` files, real credentials or recordings of private apps.
- πŸ€— Please follow the [Code of Conduct](CODE_OF_CONDUCT.md).

## πŸ“„ License

[MIT](LICENSE) Β© 2026 Kaival Patel. Jev and TypeSafe are trademarks of TypeSafe AI; Claude is a trademark of Anthropic;
Storylane, Navattic, Supademo, Arcade, HowdyGo, Consensus, Reprise, Demostack, Scribe, Tango and Guidde are trademarks
of their respective owners and are mentioned only for comparison. This project is not affiliated with any of them. Sauce Demo is a public demo site by
Sauce Labs.

<div align="center">
<br>

**If this saves you a day of screenshots, give it a ⭐**

<sub>`jev` Β· `typesafe-ai` Β· `system-one` Β· `ai-agent` Β· `browser-automation` Β· `playwright` Β· `mcp` Β· `claude-desktop` Β· `documentation-generator` Β· `walkthrough-videos` Β· `e2e-testing` Β· `no-code-testing` Β· `supademo-alternative` Β· `storylane-alternative` Β· `arcade-alternative` Β· `navattic-alternative` Β· `interactive-demo` Β· `scribe-alternative` Β· `test-automation` Β· `open-source`</sub>

</div>

Maintenance

ActivityMaintained
ResponsivenessUnresponsive