Prerequisites: Node 18+, PNPM/NPM/Yarn, a Trigger.dev account, and a Browserbase API key.
1. Scaffold a fresh project
mkdir my-trigger-project && cd $_
npm init -y # or pnpm init / yarn init
Add required packages:
npm install @trigger.dev/sdk @trigger.dev/build puppeteer puppeteer-core
If you want TypeScript (recommended):
npm install -D typescript ts-node @types/node
npx tsc --init
2. Create trigger.config.ts
import { defineConfig, aptGet, puppeteer } from "@trigger.dev/build";
export default defineConfig({
project: "your_project_id", // grab from the Trigger dashboard
logLevel: "log",
build: {
extensions: [aptGet({ packages: ["mupdf-tools", "curl"] }), puppeteer()],
},
});
This installs MuPDF + Chrome in the build container so your tasks can run mutool
and Puppeteer.
cp .env.example .env.local && $EDITOR .env.local
Fill in:
TRIGGER_SECRET_KEY=tr_dev_***
BROWSERBASE_API_KEY=bb_***
BROWSERBASE_PROJECT_ID=proj_***
S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
S3_BUCKET=my-bucket
4. Add your first task src/trigger/puppeteer-log-title.ts
src/trigger/puppeteer-log-title.ts
import { task } from "@trigger.dev/sdk";
import puppeteer from "puppeteer";
export const logTitle = task({
id: "browserbase-title",
run: async () => {
const browser = await puppeteer.connect({
browserWSEndpoint: `wss://connect.browserbase.com?apiKey=${process.env.BROWSERBASE_API_KEY}`,
});
const page = await browser.newPage();
await page.goto("https://example.com");
const title = await page.title();
console.log({ title });
await browser.close();
},
});
You can export multiple tasks from this file or additional files in src/trigger/
—Trigger.dev will pick them up automatically.
5. Wire up a minimal server (Next.js, Express, or Bun)
If you’re using Next.js App Router, create app/api/route.ts
similar to the example in this repo. For a bare-bones Express server:
import express from "express";
import { TriggerClient } from "@trigger.dev/sdk";
import { createMiddleware } from "@trigger.dev/express";
const client = new TriggerClient({
id: "browserbase-quickstart",
apiKey: process.env.TRIGGER_SECRET_KEY!,
});
const app = express();
app.use(createMiddleware(client)); // mounts /api/trigger
app.listen(3000, () => console.log("Listening on :3000"));
Add a script to package.json
:
{
"scripts": {
"dev": "ts-node server.ts"
}
}
6. Run locally
Trigger opens a local tunnel so its cloud can call your tasks. You should see the task register in the dashboard.
7. Fire the task
curl -X POST http://localhost:3000/api/trigger -d '{"id":"browserbase-title"}'
Check Runs → browserbase-title in the dashboard; you’ll see the title printed and screenshots in Browserbase.
8. Deploy
npx trigger.dev@latest deploy
That’s it—your background browser automation now scales automatically in production.
Need something more advanced? Check out:
pdf-to-image.tsx
– converts multi-page PDFs to PNG and uploads to Cloudflare R2.
summarize-hn.tsx
– scrapes Hacker News, feeds articles to OpenAI, emails a summary.
Happy triggering! 🎯