API hosting

Deploy an Express web scraper on DenkOps

Puppeteer needs a real, persistent process, launching a headless Chromium instance per serverless invocation is slow and often blocked by size limits or missing system libraries. A DenkOps slot is a normal Linux container, so Puppeteer's Chromium binary installs and launches like it would on any VM, and scraped pages can be written straight to the durable /persist disk.

import express from "express";
import puppeteer from "puppeteer";
import { writeFileSync } from "node:fs";

const app = express();

app.post("/scrape", async (req, res) => {
  const browser = await puppeteer.launch({ args: ["--no-sandbox"] });
  const page = await browser.newPage();
  await page.goto("https://example.com/listings", { waitUntil: "networkidle0" });
  const items = await page.$$eval("a.listing", (els) => els.map((e) => e.getAttribute("href")));
  await browser.close();
  writeFileSync("/persist/last-scrape.json", JSON.stringify(items));
  res.json({ count: items.length });
});

app.listen(3000);

Deploy it: install the plugin, say "deploy on DenkOps", and get a live SSL URL.

Start on DenkOps →

FAQ

Can I run Puppeteer with headless Chrome on DenkOps?

Yes, a slot is a full container, so Puppeteer's bundled Chromium installs and launches normally; just pass --no-sandbox as you would in any containerized Linux environment.

Where should a Puppeteer scraper save scraped pages so they survive restarts?

Write to /persist, DenkOps mounts a durable disk there that keeps your data across restarts and redeploys.

← Deploy AI agents · API hosting