Comet puts an assistant in your browser. Put one in a cloud browser that works on a schedule
#What Comet does
Perplexity launched Comet on July 9, 2025. It's a web browser with Perplexity's search built in and an assistant in a sidebar. The Comet Assistant can summarize emails and calendar events, manage tabs and navigate web pages for the user, with the page they're viewing as context. At launch it was open to subscribers of the $200-a-month Max plan and people invited from a waitlist. (TechCrunch)
#The pattern
A browsing agent is most useful in a browser that's already signed in to your accounts. Comet does that by living in the browser you use. The other option is a browser in the cloud that stays signed in. It works when your laptop is closed, can run on a schedule, and reports back when it's done. That suits recurring research: a morning digest of a dashboard, a weekly price check, a report from an inbox.
#Build it with Burrowbox: schedules and event webhooks
A Burrowbox machine has one persistent browser. Sign in once (yourself, through an interactive live view, or with vault credentials and browser_login), and its cookies survive stops and restarts. Create the machine with "browser": "full" (Chromium); that's the mode that keeps logins across restarts. Burrowbox wakes the machine on a schedule and tells your server when it's ready. Your server runs the agent and turns the machine off again. Burrowbox isn't involved with Perplexity.
#1. Wake the machine every weekday morning
The scheduled job starts the machine if it's off and opens the dashboard in its signed-in browser. Cron times are in UTC.
curl -X POST https://burrowbox.dev/api/machines/$MACHINE_ID/schedules \
-H "Authorization: Bearer $BURROWBOX_KEY" -H "Content-Type: application/json" \
-d '{
"name": "Morning digest",
"cron": "0 7 * * mon-fri",
"action": { "type": "tool", "tool": "browser_navigate", "arguments": { "url": "https://analytics.example.com/overview" } },
"wakeIfStopped": true
}'
# The response includes the next three run times in "upcoming".
#2. Get told when it ran
Register an event webhook. Burrowbox signs each event and retries failed deliveries with backoff.
curl -X POST https://burrowbox.dev/api/event-webhooks \
-H "Authorization: Bearer $BURROWBOX_KEY" -H "Content-Type: application/json" \
-d '{"url": "https://api.example.com/burrowbox/events", "events": ["run.succeeded", "run.failed"]}'
# → { "id": "…", "secret": "whsec_…" } (the secret is shown once)
#3. Verify the event, run the agent, turn the machine off
// npm i express ai @ai-sdk/mcp
import crypto from "node:crypto";
import express from "express";
import { generateText, isStepCount } from "ai";
import { createMCPClient } from "@ai-sdk/mcp";
const BB = "https://burrowbox.dev";
const auth = { Authorization: `Bearer ${process.env.BURROWBOX_KEY}` };
function verify(rawBody, header, secret, toleranceSeconds = 300) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
const ok = parts.v1 && parts.v1.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
return ok && Math.abs(Date.now() / 1000 - Number(parts.t)) <= toleranceSeconds;
}
const app = express();
app.post("/burrowbox/events", express.raw({ type: "application/json" }), async (req, res) => {
if (!verify(req.body, req.get("Burrowbox-Signature") ?? "", process.env.BURROWBOX_WHSEC)) return res.sendStatus(400);
res.sendStatus(200); // answer within 10 s, then do the work
const event = JSON.parse(req.body);
if (event.type !== "run.succeeded") return;
const id = event.data.machine.id;
const machine = await fetch(`${BB}/api/machines/${id}`, { headers: auth }).then((r) => r.json());
const mcp = await createMCPClient({
transport: { type: "http", url: machine.mcpUrl, headers: { Authorization: `Bearer ${machine.mcpToken}` } },
});
try {
const { text } = await generateText({
model: "anthropic/claude-sonnet-5.5",
tools: await mcp.tools(),
stopWhen: isStepCount(20),
prompt: "The browser is on the analytics overview. Read it with browser_snapshot and write a 5-bullet digest of what changed since yesterday.",
});
await sendDigest(text); // email, Slack, …
} finally {
await mcp.close();
await fetch(`${BB}/api/machines/${id}/stop`, { method: "POST", headers: auth }); // state kept, billing drops to storage
}
});
app.listen(3000);
Events can arrive more than once, so deduplicate on event.id before sending anything. run.failed events include the first 2,000 characters of the run's output, which is useful for alerts.
#What it costs
The machine runs only between the schedule waking it and your handler stopping it. A few minutes a day on a tiny machine ($0.07 an hour) comes to well under a dollar a month, plus $0.72 a month to store it while it's off. See Billing.
Create an account to try it.
#Sources
- TechCrunch, Perplexity launches Comet: https://techcrunch.com/2025/07/09/perplexity-launches-comet-an-ai-powered-web-browser/
- AI SDK, MCP tools: https://ai-sdk.dev/docs/ai-sdk-core/mcp-tools
- AI SDK, tool calling and stop conditions: https://ai-sdk.dev/docs/ai-sdk-core/tools-and-tool-calling
- Burrowbox docs, Scheduled jobs & webhooks: https://burrowbox.dev/docs/automations
- Burrowbox docs, Event webhooks: https://burrowbox.dev/docs/events