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

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.

3. Configure .env.local

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:

server.ts
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

pnpm dev

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! 🎯