# Changelog

## 0.11.0 — 2026-10-13
- Website: menus open on hover; one "why CrawlGenie exists" comparison (one platform instead of Browserbase + Firecrawl + TinyFish + Apify) with the detailed table folded underneath; chat bubble on every page (Ask CrawlGenie from the docs, or Message us → `POST /site/contact`, stored and e-mailed to `VESSEL_CONTACT_TO`); support address hello@crawlgenie.com in footer, legal pages and Organization schema; favicon, app icons, web manifest and social card from the new Spark G mark; meta descriptions within 160 characters.
- Dashboard: Token savings in the sidebar under Overview; the "+ Custom agent" button on Agents opens the create dialog again; Overview sessions table scrolls instead of cropping and shows Replay/Open without hovering; help-bot excerpts no longer split sentences at e-mail addresses.
- Public deployments: `/docs` and `/docs/<page>` are server-rendered HTML for visitors and crawlers (same markdown as the dashboard); app links opened while signed out redirect to `/login?next=…` and return after sign-in; unknown routes return a real 404 page; sign-out goes to the sign-in page; images and icons cache for a day.
- Plan ladder: monthly quotas for reads, searches and agent runs (REST and MCP), paid-only alerts/webhooks, scheduled routines, isolated tier, proxy pools, per-plan recording retention; Free resized to 120 browser-minutes with every product included.
- Plans: per-plan capacity (active watches, team members, memory documents, batch size) enforced with `402 plan_limit` + upgrade link; limits live in `public/pricing.json`.
- Dashboard: Get started checklist (separate from the onboarding wizard), behaviour-based recommendations, month strip on the Overview, session Pages/Console/Files tabs and expiry, tested setup prompt for coding agents, `/v1/insights`.
- Sign-in page: standalone `/start`, `/signup` and `/login` for public deployments (value slides, Google button), dashboard stays at `/app`.
- "Continue with Google" (OpenID Connect) with account linking by verified e-mail; `VESSEL_GOOGLE_CLIENT_ID/SECRET`.
- Vault: `{{totp:NAME}}` one-time codes (RFC 6238) for 2-factor logins.
- `VESSEL_PUBLIC_HOME`: marketing site at `/`; installer sets it with sign-up, public tools, log rotation and swap.

### Added
- **Web agents**: `schema` for structured results; `POST /v1/agent/batch` (one goal across many URLs or many goals) with a concurrency cap and
  `GET /v1/agent/batches/:id` for counts, results and usage.
- **Continuous reports for every watch**: `/v1/watches/:id/series` (metrics per run: counts, new rows, scores, column means) and
  `/v1/watches/:id/report` (7-day markdown or JSON: latest run, trend, alerts, new rows); trend sparklines on the watch page.
- **SEO + AIO report** agent (`seo_aio_report`), free public tools pages, in-app docs with the retrieval-only assistant.
- **Marketing site v2** on the "Graphite & Lime" theme (five theme directions in `/brand/themes.html`), repositioned on LLM token savings;
  web agents solution page; Enterprise private-deployment plan.

### Changed
- The product is no longer presented as open source; package licenses set to UNLICENSED and `private: true`. Code published before this
  commit remains under its original Apache-2.0 terms wherever it was copied.

## 0.10.0 — 2026-10-12

### Added
- **In-house documentation and help**: every server serves its docs at `/docs` (search, table of contents, raw `.md`, `/llms.txt`,
  `/llms-full.txt`) and an **Ask CrawlGenie** assistant that answers from the docs with retrieval only (`POST /help/ask`, public, no model).
  New pages: Concepts, Use cases by industry, Documents & media, Knowledge base, Troubleshooting, Signed agent identity; the Extractor
  library page is generated from the running catalogue. Dashboard links no longer point at GitHub.
- **Knowledge base** (`/v1/knowledge`, MCP `knowledge_add` / `knowledge_search`): collections of pages, documents, crawl output, watch rows
  and notes, chunked and indexed with SQLite FTS5 (BM25 + porter); questions return passages with sources and a token receipt. Dashboard page.
- **Signed agent identity (Web Bot Auth)**: Ed25519 key per deployment, `/.well-known/http-message-signatures-directory`, `GET /v1/identity`,
  `policy.signedAgent` / workspace default; navigations carry RFC 9421 signatures (tag `web-bot-auth`) so sites can verify the agent.
- **Documents**: PDF `pages` ranges and table-to-columns reconstruction; ODT/ODS/ODP and RTF parsing; Google Docs/Sheets/Slides, Drive,
  Dropbox and GitHub blob links normalised to export/raw URLs in `/v1/parse`, `/v1/scrape`, `web_answer`, `web_research`.
- **Reading less**: `granularity: "sentence"` (highlights: matching sentences, table rows, code lines), `redactPII`, `cache: prefer|only`
  on `/v1/scrape`; `POST /v1/answer {urls, q}` and `web_research {urls}` for one question across several sources.
- **Extractors**: `auto_list` (repeated blocks without CSS), `pricing_page`, `github_issues`, `search_watch` (web-scale monitor: new results
  for a query), `brand_assets`, `llms_txt`, `page_media` (every file/video/image on a page with the next step); `css_extract` gained `scroll`.
- SDKs: `knowledge.*`, `help.*`, `answer()`, `identity()`, parse options (TypeScript); `knowledge_*`, `answer`, `help_ask`, `identity` (Python).
- Docker image ships `docs/` and `CHANGELOG.md`.

### Fixed
- Page-range PDF parses no longer trigger OCR because of the per-page word heuristic; pdf.js synthetic space runs no longer defeat column detection.

## 0.9.0 — 2026-10-12

### Added
- **Savings by surface**: every session is tagged with the channel that created it (REST API, MCP, tools API, dashboard,
  built-in agents, or the OAuth connector that holds the key, e.g. `connector:ChatGPT`); `GET /v1/stats/savings` returns
  `byChannel` and the Token savings page shows a per-surface table.
- **Image OCR** (PNG/JPEG/WEBP/GIF/BMP via `/v1/parse`), **YouTube transcripts** (`youtube_transcript` extractor and
  `web_answer` on a video URL: caption track → timestamped paragraphs, no speech model), Playground **drop zone** for local files.
- Security: cross-site consent submissions are refused, OAuth endpoints are rate-limited per IP, the OCR document handoff is
  one-time and same-origin only, the Chrome extension no longer requests host permissions. `scripts/ab-connector.sh`
  compares cost and answers of Claude Code's built-in web tools vs the CrawlGenie connector on the same tasks.
- **OAuth 2.1 for MCP connectors**: CrawlGenie is an authorization server (`/.well-known/oauth-authorization-server`,
  `/.well-known/oauth-protected-resource`, dynamic client registration, PKCE, consent page). ChatGPT, claude.ai,
  Claude Desktop, Cursor and Gemini CLI add CrawlGenie as a custom connector; tokens are revocable workspace keys.
  Verified end to end with the official MCP client over a public HTTPS tunnel and with Claude Code (`claude mcp add`).
- **Cheapest-read tools**: `web_answer` (URL or document + question → only the matching passages) and `web_research`
  (search → read → focus, one call) with a **token receipt** on every result; `maxTokens` budgets on snapshot / text /
  scrape / browser_snapshot (exact BPE truncation).
- **Documents**: OCR for scanned PDFs (pages rendered by a CrawlGenie browser with pdf.js, read by tesseract.js; auto when
  the text layer is empty, `ocr: force|off`), XLSX (sheets → markdown tables) and PPTX (slides) parsing; all routed
  automatically from `/v1/scrape` and `web_answer`.
- **Scrape** gained `actions` (click/scroll/type before extracting) and `changeTracking` (new / same / changed + diff
  per owner and URL, so agents skip unchanged pages). **Crawl** gained `/answer` (passages across all pages with
  sources) and `/export?format=jsonl|md|csv|pdf`.
- **Outcome-first UI**: five-step onboarding (role → goal → connect your agent → try three runs → map), Overview
  "Start from a goal" + vocabulary with token cost per concept + zero-token-runs KPI, a "Do something with this page"
  panel on every session (ask, read, extract tables, links, download, instruct an agent, keep), next-step actions on
  crawl and watch pages, Playground tabs for monitor and agent plus **Get code** (curl / Python / TypeScript) on every form.
- Homepage ROI calculator, Chrome extension scaffold (`integrations/chrome-extension`), docs/INTEGRATIONS.md,
  `scripts/mcp-oauth-client.mjs`, SDK `tools.definitions/call/executable`, Python `tools()/call_tool()`.

## 0.8.0 — 2026-10-12

### Added
- **Extractor store**: 59 built-in agents across 14 verticals (54 extractors + 5 monitors) (jobs, e-commerce, local & leads, reviews, social, news,
  SEO, finance, real estate, travel, research, government/legal/health, events, any site) — a declarative recipe engine
  (`html` / `json` / `feed` sources) plus hand-written extractors (schema.org structured data, website contacts,
  tech-stack fingerprint, YouTube search/channel, SEC EDGAR, PubMed, sitemap monitor, HN hiring, JSON API watcher).
  `GET /v1/extractors` (grouped by vertical), `POST /v1/extractors/{id}/run` (sync rows, `?format=csv`), MCP/tools
  `vessel_extract`, `GET /v1/watches/{id}/dataset` (rows merged across runs with first/last seen). Live-tested from a
  consumer IP without a proxy: 50 of 54 extractors return rows; Yelp and eBay are labelled "needs proxy" and say so at run time.
- **Question-focused reading**: `q=` on `/v1/sessions/{id}/text`, `/v1/scrape`, `/v1/parse` and the
  `browser_extract_text` tool returns only the passages that answer the question (BM25-style, no model) and reports
  the measured token saving.
- **Document parsing** without a browser: `POST /v1/parse` for PDF (pdf.js text layer), DOCX (own zip + WordprocessingML
  reader: headings, lists, tables → markdown) and text/CSV/JSON; `/v1/scrape` routes document URLs there automatically.
- **Search + read**: `GET /v1/search?content=true` attaches markdown of the top hits in one call.
- **Agent onboarding**: `GET /skill.md` (also `/agent-onboarding/SKILL.md`), dashboard **Setup for agents** page with
  copy-ready MCP / SDK / CLI snippets, and a client CLI (`npx vessel-browser-sdk vessel-cli …`).
- **Settings → General** (server-side, admin): workspace name, default and idle session timeouts (apply to new
  sessions), default blocked resources, webhook URL; API key reveal / copy / regenerate; `GET|PUT /v1/settings`.
- Self-hosted admins mint revocable API keys from the dashboard (implicit Workspace org); accent picker (cobalt, coral,
  amber, sapphire, rose); `POST /v1/tick` so scale-to-zero hosts or an external cron can run due watches/schedules;
  `deploy/github-actions/vessel-extract.yml` runs extractors on GitHub Actions for free; HOSTING.md free-tier table.

### Changed
- `VESSEL_SSRF_GUARD=false` is now honoured by direct fetches (JSON/feed/document sources), not only by navigation.
- Watch auto-names use any subject field (query, domain, subreddit…), not only URLs.

## 0.7.0 — 2026-10-12

### Added
- **Extractors** (Apify-style actors, no LLM): `css_extract` (any page → rows via CSS, pagination), `web_search_results`
  (rank tracking), `google_maps_places`, `trustpilot_reviews`, `indeed_jobs`, `amazon_products` (price-change alerts),
  `reddit_posts` (feeds + search, no login), `linkedin_company` (public card), `producthunt_today`, `g2_reviews`
  (needs a residential pool — reports the wall honestly). Rows are deduplicated across runs ("12 new rows"), exported with
  `GET /v1/watches/:id/runs/:runId/export?format=csv|json&only=all|new`. Dashboard: Agents → Extractors, generic table
  with "New only" + CSV/JSON; watch sheet gets proxy-pool / login-profile options. Playbook catalogue now carries `category`.
- Web search falls back DuckDuckGo → **Brave** → Bing (Brave serves full snippets to a headless browser without a key).

### Changed
- **Interception-free policy enforcement.** Playwright request interception turned out to be a bot signal on its own
  (Reddit: CAPTCHA with a pass-through `route('**/*')`, normal page without it). Trackers, blocked domains,
  image/font/media/CSS blocks and literal private hosts are now enforced through Chromium's URL blocklist via CDP;
  interception is used only for allowlists, byte budgets, script/XHR blocks or the new `policy.strictNetwork: true`.
  Blocked-request metering unchanged (`usage.requestsBlocked`).
- Extractors retry navigation once on connection resets and survive hydration redirects (Trustpilot, LinkedIn).

## 0.6.0 — 2026-10-12

### Added
- **Crawl / map / batch-scrape / extract** (Firecrawl-shaped): `POST /v1/crawl` (site crawl with limits, include/exclude globs,
  robots.txt, N browser workers, job status + paginated pages), `POST /v1/batch-scrape`, `POST /v1/map` (sitemaps + links),
  `POST /v1/extract` (prompt + JSON Schema → structured data via the caller's own LLM key; OpenAI-compatible, Anthropic, Gemini),
  `GET /v1/llm`. Markdown reader upgraded with readability-style main-content selection, boilerplate removal and page metadata.
- Dependency-free LLM client (`src/llm/client.ts`) shared by extract and the upcoming agent runner.
- **Team invites** by link (`/v1/invites`, `/auth/join`, members list) — no email provider required; dashboard "API keys & team".
- **Web search** through CrawlGenie's own browser (`GET /v1/search`, tool `browser_search`), DuckDuckGo with Bing fallback, no API key.
- **Built-in agents (no API key)**: change monitor, new-posts digest, price & stock tracker, SEO audit, broken-link checker — stateful watches with diffs, cron schedules and per-watch webhooks (`/v1/playbooks`, `/v1/watches`); dashboard **Agents** gallery + watch pages with rendered diffs/reports.
- **Exact token metering**: every observation counted with the o200k tokenizer (read / full tree / HTML); `/v1/stats/savings`, `POST /v1/measure`; dashboard **Token savings** page with price-model selector and a live "Measure any URL" check.
- **Agent**: `POST /v1/agent/run` — natural-language tasks executed by a built-in observe→act loop with the caller's own model key (OpenAI-compatible/Anthropic/Gemini); per-step thoughts, usage and observation tokens; dashboard **Agent** page with live steps and result.
- **Auto-deploy**: `deploy/install.sh` now adds watchtower — every green push to main is live on the VM within ~5 minutes (docs/DEPLOY.md “How changes go live”).
- **Schedules**: cron-triggered routine runs with timezone support, per-schedule webhooks, run history and a preview endpoint; dashboard **Schedules** page with presets.
- Dashboard **Crawls & extract** pages (job list, live progress, per-page markdown viewer, JSON download, Extract dialog).
- `scripts/task-tokens.mjs`: whole-task benchmark with a real BPE tokenizer (gpt-tokenizer, dev dependency); results in docs/COMPARISON.md — 22.7× vs HTML, 4.0× vs full tree over 18 observations.
- Strict query booleans (`?delta=false` was treated as true before).

## 0.5.0 — 2026-10-12

### Added
- **Plans & billing**: Free / Pro / Team (override with `VESSEL_PLANS`), monthly browser-minute and concurrency limits enforced per workspace (`402 plan_minutes_exhausted` with an upgrade link), `GET /plans`, `GET /v1/billing`, admin `POST /v1/admin/orgs/:id/plan` and `GET /v1/admin/orgs`. **Stripe** via Payment Links (`VESSEL_STRIPE_LINKS`) + signed webhook `POST /billing/stripe/webhook` (`VESSEL_STRIPE_WEBHOOK_SECRET`): checkout upgrades the org, cancellation downgrades. Dashboard **Billing** page, plan badge and usage meter in the sidebar.
- **Off-site backups**: `VESSEL_BACKUP_URL=s3://KEY:SECRET@host/bucket/prefix` (R2/S3/B2/MinIO…), hourly `VACUUM INTO` → gzip → AES-256-GCM (`VESSEL_BACKUP_KEY`) → upload, retention `VESSEL_BACKUP_KEEP`; `GET /v1/admin/backups`, `POST /v1/admin/backup`, `POST /v1/admin/restore` (staged, applied at next start). Dependency-free SigV4 client.
- **Stealth** (`stealth: true` by default): webdriver flag, chrome.*, plugins, languages, permissions, WebGL vendor, hardware hints, outer size — closes the deterministic headless tells (not a CAPTCHA solver).
- **Playground** tab on the session page: go to URL, click/fill by ref, or run raw action JSON; results and the next snapshot inline.
- Bot-wall detection now samples visible text when the interactive tree is tiny (catches "Access is temporarily restricted"-style walls such as G2's).
- Bare domains accepted everywhere a URL is (`example.com` → `https://example.com`); validation errors name the field.
- Copy-session-id buttons, one-click 60-second demo on Get started, dashboard assets served `no-cache`.


## 0.4.0 — 2026-10-12

### Added
- **Cloud mode** (`VESSEL_SIGNUP=true`): sign-up/sign-in in the dashboard (`/auth/*`, scrypt passwords, signed cookies), organisations with a concurrent-session quota (`VESSEL_ORG_MAX_SESSIONS`), **API keys minted in the dashboard** (`/v1/keys`, shown once, SHA-256 at rest). Every session, profile, routine, secret and approval is tagged with its organisation and invisible to others — including over MCP, the tools API, SSE, live view and CDP. Env keys remain admins.
- **Server-side scripts**: `POST /v1/sessions/:id/script { code }` runs a Playwright snippet on the node with `page`/`context` in scope (logs, return value, timeout, recorded as a step). Gated by `VESSEL_ALLOW_SCRIPTS` (default off when sign-up is on).
- Docs: `docs/HOW-IT-WORKS.md` (owner walkthrough: inputs, flows, how to test end to end) and `docs/HOSTING.md` (which platforms can run CrawlGenie and why, with sources).
- Dashboard: auth card, **API keys** page, workspace + sign-out in the sidebar.


## 0.3.0 — 2026-10-11

### Added
- **Secrets vault**: `PUT/GET/DELETE /v1/secrets/:name`; agents write `{{secret:name}}` in `fill`/`type` (and `browser_type`), the server substitutes the value at execution. Key- and domain-scoped, AES-256-GCM at rest with `VESSEL_SECRET_KEY`. New MCP/HTTP tool `browser_list_secrets`.
- **Challenge detection**: `snapshot.challenge` (`cloudflare|captcha|access_denied|bot_wall` + hint), `challenge` recorder event, `session.challenge` webhook, ⚠ prefix on tool results.
- **One-shot endpoints**: `POST /v1/scrape` (markdown/text/html/snapshot/links, optional screenshot+pdf), `GET /v1/screenshot`, `GET /v1/pdf`.
- **File uploads**: `POST /v1/sessions/:id/files` (raw bytes, ≤64 MB) and `upload` actions by `{ id }`.
- **Extensions** on the isolated tier (`extensions: [...]` from `VESSEL_EXTENSIONS_DIR`).
- **Helm chart** (`deploy/helm/vessel`): StatefulSet nodes with PVCs, optional router Deployment and Ingress.
- `scripts/challenge.mjs` — honest "does it open?" sample across popular sites; 10-site token benchmark in docs.
- `/v1/stats` now reports `version` and `mode`.
- SDKs: `secrets`, `scrape`, `uploadFile`/`files` (TS + Python).
- Dashboard **Secrets** page (add / rotate / delete, domain scoping, copy placeholder) and a challenge banner on the session Snapshot panel.
- GitHub Pages landing site live at https://theshariq.github.io/CrawlGenie/.

### Changed
- **Dashboard design system v3**: ink-black primary actions, single cobalt accent reserved for meaning, cool neutral canvas, grouped sidebar with node status, page headers, Stripe-style stat strip and tables with hover actions, SVG area chart for tokens saved, browser-window frame around the live view, dark code blocks with copy, segmented controls and switches, redesigned new-session sheet, Get started and API & tools pages.

## 0.2.0 — 2026-10-11

### Added
- **Delta snapshots** (`snapshotOptions.delta`, session `snapshotDefaults`): only lines changed since the last observation of the same page; falls back to the full tree on large changes or ref renumbering.
- **Observation-token metering** per session: `observationTokens`, `observationTokensRaw`, `tokenSavingsPct`, `estimatedSavingsUsd` (`VESSEL_TOKEN_PRICE_PER_M`), shown on the dashboard.
- **Tools API** `GET /v1/tools?format=openai|anthropic|gemini|json` and `POST /v1/tools/:name` — the MCP tool surface for any function-calling model, no MCP client needed.
- **MCP 2026-07-28** via the v2 TypeScript SDK (per-request Streamable HTTP; 2025-era clients served statelessly). Tool results are stamped with `session_id`.
- **Proxy pools** (`VESSEL_PROXY_POOLS` / `data/proxies.json`): static rotation, template providers with `{session}`/`{country}` placeholders, sticky identities, failure cooldown, `GET /v1/proxies` health; per-session `proxy: { pool, country, sticky }`.
- **Webhooks** (`VESSEL_WEBHOOK_URL`): `approval.pending`, `approval.resolved`, `session.closed`.
- **Retention** (`VESSEL_RETENTION_DAYS`, `POST /v1/admin/prune`).
- **`assert` action** (text/notText/selector/url/title) so routines double as monitors.
- **OpenAPI 3.1** at `/openapi.json`, generated from the request schemas.
- **Python SDK** (`packages/python`, dependency-free) and TS SDK updates (`routines`, `proxies`, token usage).
- **Dashboard** rebuilt as a single-page app: overview KPIs (tokens/$ saved), unified session page (live + time-travel scrubber + snapshot/timeline/approvals/usage), routines with run/param forms and save-as-routine, approvals inbox, profiles, API & tools, settings; light theme by default, command palette, keyboard shortcuts, mobile layout.
- **Security**: CORS allowlist (`VESSEL_CORS_ORIGINS`), security headers, per-IP failed-auth rate limit (`VESSEL_AUTH_RATE_LIMIT`).
- **CI**: Linux typecheck/tests/bench, Docker build + non-root smoke test, GHCR publish on green main. Soak (`scripts/soak.mjs`) and token (`scripts/tokens.mjs`) benchmarks.

### Changed
- `approvals.mode: 'all'` gates only state-changing actions (not wait/scroll/hover/tab list).
- Snapshots bypass the action queue while an approval is pending, so reviewers can see the page.
- Interactive snapshot filter drops table/list wrappers, nameless clickables and separators; `[cursor=pointer]` only kept on generic nodes.
- Docker image now builds on `node:24-bookworm-slim` (node:sqlite requires ≥ 22.13).
- zod 4.

## 0.1.0 — 2026-10-11
Initial release: pooled/isolated sessions, interactive accessibility snapshots with refs, policy + SSRF guard + approval gates, flight recorder with fork/rewind, profiles with exclusive locks, routines with self-healing replay, live view with takeover, MCP, raw CDP relay, dashboard, TS SDK, Docker, docs, 30 tests.
