Cursor Background Agent là feature tôi xài nhiều nhất khi đi ra ngoài, đồng thời cũng là chỗ tôi đốt nhiều tiền nhất cho dev tooling trong năm 2025. Một con dao hai lưỡi, một cách công bằng. Bài 2 (Claude Code BG mode và FleetView) đã đi qua cách tiếp cận local daemon của Claude Code. Cursor đẩy hẳn agent lên cloud VM riêng, một philosophy ngược chiều.

Hồi đầu 2025 Cursor BG còn beta gated sau paywall. Giữa 2025 mở cho mọi paid user. Tới 2026 đã trở thành phần lớn roadmap của Cursor, thậm chí công ty đổi tên nội bộ thành “Cloud Agents” để bao trùm cả Slack, Linear, GitHub issue trigger. Phần dưới đi qua kiến trúc VM, file config .cursor/environment.json, PR workflow, billing model 2026, và quan điểm thực dụng của tôi về khi nào nên dùng.

Cursor BG là gì, khác Claude Code BG ở đâu

Định nghĩa ngắn: một cloud VM tách biệt được Cursor spawn cho mỗi task, clone repo của bạn, chạy agent (Composer hoặc Claude), commit lên branch mới, mở PR. Bạn không cần laptop mở suốt thời gian chạy, không cần repo local, không cần Node/Python/Docker trên máy.

So với Claude Code BG, hai philosophy ngược chiều:

Đặc điểmClaude Code BGCursor Background Agent
Vị trí sandboxMáy local hoặc homelab của bạnCloud VM của Cursor
Repo cloneWorktree trong repo hiện tạiEphemeral checkout trên VM
NetworkLocal network của bạnInternet, có firewall config
Persistent stateCó (worktree còn sống)Không, VM kill sau khi PR mở
Trigger/bg trong session, FleetViewCtrl+E hoặc Slack/GitHub/Linear/Web
Cần internet localCó (gọi API model)Không (sau khi dispatch xong)
CostTrả model token thẳngPlan tier + metered credit
Multi-repoKhông hỗ trợCó (cross-repo coordination)

Trade-off lộ ra rõ. Cursor tốn tiền hơn, đổi lại không phải lo máy bạn có ngủ, mạng có rớt, có process khác chiếm RAM. Claude Code BG rẻ hơn nhưng phụ thuộc uptime máy bạn. Khi nào mỗi cái thắng, tôi để phần cuối bài.

Launch flow, bốn cửa vào

Cursor 1.0+ ecosystem cho bạn vào BG agent từ bốn cửa. Ctrl+E (hoặc Cmd+E trên Mac) trong editor Cursor mở panel, gõ mô tả task, chọn model (Composer 2.5, Claude 4.5, GPT-5), chọn branch base, bấm Send; Cursor dispatch task lên cloud, panel đóng, bạn quay lại làm việc. Cách thứ hai là Cursor Web tại cursor.com/agents, mở browser, login, tạo agent trực tiếp từ web UI, hữu ích khi đang ở máy không có Cursor desktop hoặc đang trên iPad. Cách thứ ba là Slack/GitHub/Linear integration: mention @Cursor trong Slack channel, gán issue cho Cursor user trong GitHub, assign Linear issue cho Cursor bot; mỗi integration cho một workflow khác (Slack ad-hoc, GitHub tracked work, Linear sprint planned). Cách thứ tư là TypeScript SDK release tháng 4 năm 2026:

import { CursorAgent } from "@cursor/sdk";

const agent = new CursorAgent({
  repo: "myorg/api-server",
  branch: "main",
  task: "Add rate limiting middleware, write tests",
  model: "claude-4.5-sonnet",
  spendLimit: 5.00
});

const result = await agent.run();
console.log(result.pullRequestUrl);

SDK là cửa vào programmatic, dành cho ai muốn build workflow tự động hoá quanh background agent. Tôi đã setup một cron mỗi đêm spawn agent chạy dependency update PR, tốn $0.50 mỗi đêm và đỡ tôi 10 phút mỗi sáng. Sau vài tuần cron đó đã giúp project tôi không bị dependency drift, một win nhỏ nhưng bền.

Kiến trúc sandboxed VM

Mỗi agent gắn với một VM riêng. Cursor không share VM giữa nhiều agent, không reuse giữa lần chạy. Mỗi task là một VM fresh, kill sau khi PR mở.

VM mặc định chạy Ubuntu base, có git, ssh key Cursor tự sinh deploy key cho repo, và một số tool dev phổ biến. Nếu task cần tool đặc biệt (Postgres, Redis, Ruby phiên bản cụ thể, build tool nội bộ), bạn phải config qua .cursor/environment.json commit vào repo.

File .cursor/environment.json

File nằm trong repo, Cursor đọc khi spawn VM:

{
  "build": {
    "context": ".",
    "dockerfile": ".cursor/Dockerfile"
  },
  "install": "./scripts/setup.sh",
  "start": "npm run dev",
  "terminals": [
    {
      "name": "dev-server",
      "command": "npm run dev"
    },
    {
      "name": "test-watch",
      "command": "npm run test:watch"
    }
  ]
}

Các field chính:

  • build: trỏ tới Dockerfile riêng cho VM base. Nếu repo cần Node 22 thay vì Node 20 default, hoặc cần Postgres pre-install, đây là chỗ define.
  • install: script chạy ngay sau khi clone xong, thường là npm install, bundle install, pip install -r requirements.txt.
  • start: command chạy daemon hoặc dev server nếu agent cần test app live.
  • terminals: list terminal long-running mà agent có thể đọc output. Ví dụ test runner watch mode, log của dev server.

Quy tắc design tôi rút ra sau vài tháng dùng: Dockerfile cho system dependency, environment.json cho app dependency. Dockerfile pre-install thứ chậm để cache (compiler, system lib), environment.json install application package (cài nhanh, đổi thường xuyên).

Snapshot, caching, network

Cursor cache snapshot của VM sau khi install command chạy xong. Lần thứ hai cùng repo không cần install lại, VM khởi tạo trong ~30 giây thay vì ~3 phút. Snapshot invalidate khi .cursor/environment.json hoặc Dockerfile thay đổi. Tháng 5 năm 2026 Cursor release “Development Environments” feature kèm layer caching cho Dockerfile build, claim 70% nhanh hơn; thực tế tôi thấy build VM mất ~90 giây cho Node app trung bình, lần thứ hai cùng ngày chỉ ~20 giây.

Về sandboxing, VM không có quyền truy cập máy local của bạn, không có ssh key cá nhân, không có credential file. Mọi secret phải pass qua “Cursor Secrets” trong dashboard, inject thành env var tại runtime. Từ giữa 2026 Cursor thêm fine-grained network controls, bạn định nghĩa whitelist domain mà agent được phép gọi khi chạy sandboxed command. Mặc định agent có thể gọi mọi domain (cho npm install, pip install), nhưng restrict xuống chỉ npm registry, GitHub, package mirror nội bộ là cách tốt để tránh case agent vô tình gọi production API. Tôi học bài này sau khi một agent gọi nhầm một internal endpoint trong test (không phải production, may quá), nhưng đủ làm tôi bật network whitelist mặc định cho mọi project sau đó.

PR workflow, từ dispatch tới merge

Đây là điểm bán hàng cốt lõi của Cursor. Agent không touch local working tree của bạn, output luôn là một pull request. Flow chuẩn diễn ra theo thứ tự:

  1. Dispatch. Bạn gõ task qua Ctrl+E hoặc một trigger khác.
  2. VM spawn. Cursor tạo VM mới, clone repo (deploy key), checkout branch base bạn chọn.
  3. Install. VM chạy install command từ environment.json. Snapshot cache nếu có.
  4. Agent loop. Composer hoặc Claude chạy trong VM, đọc file, edit, chạy test, chạy lint. Output từng step xem live trong Cursor Web hoặc Cursor desktop “Agents” panel.
  5. Commit và push. Agent commit từng logical chunk lên branch mới (thường cursor/task-<hash> hoặc tên bạn đặt).
  6. PR draft. Agent declare done, một PR draft tạo trên GitHub, base branch là branch bạn chọn ban đầu.
  7. Review. Bạn nhận notification (Slack, GitHub, email, Cursor notification), mở PR, review diff, có thể comment trên PR, agent sẽ pick up comment và iterate nếu bạn enable.
  8. Merge. Bạn merge khi hài lòng. Cursor không tự merge, bạn vẫn là người gác cổng.

Một feature thú vị: remote desktop control. Cursor cho agent stream desktop từ VM về client của bạn, bạn xem nó browse Chromium headless để test UI thực tế. Hữu ích khi PR liên quan frontend, bạn không cần checkout branch về local chỉ để xem nó render. Lần đầu tôi thấy feature này tôi thực sự ấn tượng, thử ngay với một bug CSS responsive và agent đã tự reproduce trong viewport mobile.

Một phần khó chịu: không persistent state. Nếu agent fail giữa chừng, VM kill, log mất nhiều. Cursor có cải thiện logging trong 2026 (artifacts: screenshot, video, log dump), nhưng không sánh được với Claude Code BG nơi worktree còn nguyên cho bạn vào debug bằng tay. Cá nhân tôi đã mất 30 phút debug một agent fail bí ẩn, cuối cùng phải dispatch lại task với thêm log statement chỉ để biết nó chết ở step nào.

Billing model 2026

Cursor billing thay đổi nhiều lần trong năm. Tháng 5 năm 2026 cấu trúc:

PlanGiáCredit poolPhù hợp
Hobby (Free)050 premium request/thángTry out
Pro$20/tháng$20 credit (~225 Claude Sonnet request)Solo dev
Pro+$60/tháng$60 credit (3x Pro)Power user
Ultra$200/tháng$200 credit + ưu tiên capacityHeavy daily
Business$40/user/thángPooled creditTeam
EnterpriseLiên hệPooled credit, SSO, auditOrg

Background Agent đốt credit theo model token và luôn chạy Max Mode (không có option tắt). Pricing token tham khảo cho Composer 2.5 fast (default cho background agent): $3.00 input + $15.00 output mỗi triệu token. Claude 4.5 Sonnet, GPT-5 cũng có mức riêng. Khi dispatch task, bạn phải set spend limit cho task đó. Mặc định Cursor đề xuất $5. Task nhỏ (refactor một file, viết test cho một function) thường tốn $0.20 đến $0.80. Task lớn (refactor module, viết nguyên feature) có thể tốn $3 đến $10.

So với Claude Code BG: Claude Code bạn trả model API rate trực tiếp (Sonnet 4.5 ở $3 input, $15 output mỗi triệu token), không markup, không credit conversion. Cursor markup khoảng 20-30% trên token rate, đổi lại có VM infrastructure. Tôi nghĩ markup này hợp lý cho task tôi muốn rời máy local; nếu bạn ở nhà với homelab idle, markup không cần thiết.

Khi nào Cursor BG thắng

Bốn use case nó tỏa sáng. Đầu tiên là khi bạn đang ngồi quán café không có laptop tốt, từ iPad, Chromebook, hoặc máy mượn. Cursor Web cursor.com/agents cho bạn dispatch task mà không cần repo local. Tôi đã làm thử từ iPad qua Termius (giới hạn), sau chuyển sang Cursor Web đơn giản hơn nhiều. Đây là use case Cursor BG không có đối thủ.

Thứ hai là refactor lớn cần test environment đầy đủ, kiểu feature đụng vào Postgres, Redis, Stripe webhook. Setup environment local mất công, agent local có thể không có dependency đủ. Cursor VM có Dockerfile pre-config đủ thứ, agent chạy thật trong môi trường giống prod.

Thứ ba là khi bạn không muốn agent có access local machine. Code có credential file, có production deployment access; tách agent ra cloud VM không có credential local là tầng bảo vệ thứ hai. Quan điểm cá nhân: với side project tôi không lo (credential trong .env và không có gì giá trị), với code công ty tôi nghiêm khắc hơn.

Thứ tư là cross-repo change. Cursor BG hỗ trợ multi-repo (frontend, backend, infra), spawn cùng task touch cả ba. Claude Code không có concept tương đương (mỗi BG session anchor một repo). Tôi không dùng feature này thường xuyên nhưng khi cần thì không có gì thay thế.

Khi nào tôi tránh

Cá nhân tôi tránh Cursor BG ở vài tình huống. Task cần debug iterative dài là rõ nhất: nếu biết task cần xem log nhiều, sửa nhiều lần, vào VM check thủ công, Cursor không thân thiện vì VM kill sau PR. Worktree Claude Code local cho bạn vào shell, đọc log, gdb, mọi thứ.

Code nhạy cảm không thể rời máy là điều kiện thứ hai. Có công ty cấm code ra cloud không kiểm soát. Cursor Enterprise có self-hosted VM option nhưng tốn. Hobby/Pro tier dùng VM của Cursor, có audit trail nhưng vẫn là third party.

Điều kiện thứ ba: mạng local tốt và máy mạnh. Homelab 32GB RAM idle phần lớn thời gian, vì sao trả tiền cho VM của người khác. Claude Code BG ở homelab free về infra, chỉ trả model token. Điều kiện thứ tư: task quá ngắn. Một edit 5 phút không đáng spin up VM mất 30-90 giây boot; Composer inline trong Cursor nhanh hơn nhiều.

Gotchas tôi đã vấp

Docker-in-Docker khó. Nếu app của bạn build Docker image như một phần của test, VM Cursor mặc định không cho Docker daemon. Workaround có (DinD config trong Dockerfile, mount socket) nhưng rất finicky.

Debian InRelease not valid yet. Một bug nổi tiếng: VM Cursor đôi khi spawn với thời gian sai (clock skew), apt-get fail với “InRelease not valid yet”. Fix bằng --allow-unauthenticated hoặc cấu hình ntp sync trong Dockerfile.

Secret leak qua artifact. Nếu agent có quyền dùng secret (API key inject env var), một bug nhỏ trong agent có thể echo $SECRET vào log, log lưu trong artifact, artifact public cho bạn. Audit log của Cursor giúp, nhưng không thay thế được việc bạn scope secret minimal.

Snapshot stale. Nếu bạn đổi dependency trong package.json mà quên đổi environment.json hash, Cursor có thể dùng snapshot cũ. Symptom: agent fail với “module not found” cho package bạn vừa add. Fix: invalidate snapshot manually qua dashboard. Tôi mất 20 phút lần đầu gặp bug này vì tưởng Cursor build hỏng.

Spend limit reset behavior. Spend limit set per-task, không per-month. Nếu bạn fire 20 task trong một ngày, mỗi task $5, theory $100 max. Thực tế Cursor có hard cap account level nhưng đặt cao. Đặt alert ở dashboard, đừng để bị bất ngờ cuối tháng.

Một câu trước khi sang bài 4

Cursor BG có một niche rõ ràng: khi bạn rời homelab, khi task cần environment đầy đủ, khi cross-repo. Với mọi thứ khác trên máy cá nhân của tôi, Claude Code BG vẫn là default. Đó là quan điểm sau một năm dùng cả hai. Bài 4 tôi đi sang Devin, OpenHands, Replit Agent, ba platform đứng riêng ngoài “editor có BG mode”.

Tham khảo