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 →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.
Write to /persist, DenkOps mounts a durable disk there that keeps your data across restarts and redeploys.