npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ircg/pgs

v1.28.2

Published

PDF Generation SDK for IRCG

Readme

@ircg/pgs

Server-side SDK for IRCG PDF Generation. PGS renders an allowlisted HTTPS URL and returns an ephemeral PDF stream.

import { PGSClient } from '@ircg/pgs'
import { writeFile } from 'node:fs/promises'

const pgs = new PGSClient({ apiKey: process.env.IRCG_PGS_API_KEY! })
const result = await pgs.generate({
	fileName: 'invoice.pdf',
	timeoutSeconds: 10,
	url: 'https://example.com/invoice/123',
})
if (result.error) throw new Error(result.error.message)
await writeFile('invoice.pdf', Buffer.from(await result.response.arrayBuffer()))

Dry run

Dry-run mode returns a minimal valid PDF without making an HTTP request or consuming credits:

const pgs = new PGSClient({ apiKey: 'unused', dryRun: true })
const result = await pgs.generate({ fileName: 'invoice.pdf', url: 'https://example.com/invoice/123' })

if (!result.error) console.log(result.billing, (await result.response.arrayBuffer()).byteLength)

Both generate() and generateUnsafe() return a streamable synthetic PDF. This mode exercises the SDK integration but does not load the URL or validate authentication, allowlists, timeouts or other server-side rendering rules. It does apply the public fileName format and returns Cache-Control: no-store, matching the production response contract.

By default, PGS uses a 10-second timeout, screen CSS, waits for a stable network, generates A4 pages and includes background graphics. timeoutSeconds accepts an integer from 5 to 60. Use mediaType, waitUntil and pdfOptions to override the appearance and readiness settings for print-specific documents or faster captures. The timeout stops a stalled load and caps the maximum possible charge at timeoutSeconds × 3 credits, so choose it according to the page's expected load time.

Do not place a PGS API key in browser JavaScript. PGS does not store generated PDFs. A failed render consumes credits only when the rendering infrastructure reports billable browser time; inspect result.error.details for billing metadata. PGS does not currently accept an idempotency key or replay a generated binary, so do not automatically retry generate() calls. Free and paid subscriptions use the same render timeout. A free subscription reserves timeoutSeconds × 3 credits before rendering and returns the unused portion afterward; paid subscriptions do not reserve credits in advance. In both cases, the final charge corresponds only to the measured billable seconds.