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

@fwd/render

v0.0.1

Published

A Node.js library that generates Images from HTML

Downloads

9

Readme

A Node.js library that generates images from HTML

🏠 Homepage

Description

This module exposes a function that generates images (png, jpeg) from HTML. It uses puppeteer in headless mode to achieve it. Additionally, it embarks Handlebars to provide a way to add logic in your HTML.

Install

npm install @fwd/render
# or
yarn add @fwd/render

Usage

Simple example


const render = require('@fwd/render')

render({
  output: './image.png',
  html: '<html><body>Hello world!</body></html>'
}).then(() => console.log('The image was created successfully!'))

TypeScript support

Types are included in the package. Enable the esModuleInterop compiler flag then change all references of require with import statements and you should be good to go:

import render from '@fwd/render'

Options

List of all available options:

| option | description | type | required | |-------------------------|-------------------------------------------------------------------------------------------------|----------------------------|-------------| | output | The ouput path for generated image | string | optional | | html | The html used to generate image content | string | required | | type | The type of the generated image | jpeg or png (default: png) | optional | | quality | The quality of the generated image (only applicable to jpg) | number (default: 80) | optional | | content | If provided html property is considered an handlebars template and use content value to fill it | object or Array | optional | | waitUntil | Define when to consider markup succeded. Learn more. | string or Array (default: networkidle0) | optional | | puppeteerArgs | The puppeteerArgs property let you pass down custom configuration to puppeteer. Learn more. | object | optional | | transparent | The transparent property lets you generate images with transparent background (for png type). | boolean | optional | | encoding | The encoding property of the image. Options are binary (default) or base64. | string | optional |

Setting output image resolution

@fwd/render takes a screenshot of the body tag's content. If you want to set output image's resolution you need to set its dimension using CSS like in the following example.

const render = require('@fwd/render')

render({
  output: './image.png',
  html: `<html>
    <head>
      <style>
        body {
          width: 2480px;
          height: 3508px;
        }
      </style>
    </head>
    <body>Hello world!</body>
  </html>
  `
}).then(() => console.log('The image was created successfully!'))

Example with Handlebars

Handlerbars is a templating language. It generates HTML from a template and an input object. In the following example we provide a template to @fwd/render and a content object to fill the template.

const render = require('@fwd/render')

render({
  output: './image.png',
  html: '<html><body>Hello {{name}}!</body></html>',
  content: { name: 'you' }
}).then(() => console.log('The image was created successfully!'))

Handlebars provides a lot of expressions to handle common use cases like conditions or loops.

Dealing with images

If you want to display an image which is stored remotely do it as usual. In case your image is stored locally I recommend having your image in base64. Then you need to pass it to the template with the content property. Here is an example:

const render = require('@fwd/render')
const fs = require('fs');

const image = fs.readFileSync('./image.jpg');
const base64Image = new Buffer.from(image).toString('base64');
const dataURI = 'data:image/jpeg;base64,' + base64Image

render({
  output: './image.png',
  html: '<html><body><img src="{{imageSource}}" /></body></html>',
  content: { imageSource: dataURI }
})

Using the buffer instead of saving to disk

If you don't want to save the image to disk and would rather do something with it immediately, you can use the returned value instead! The example below shows how you can generate an image and send it back to a client via using express.

const server = require('@fwd/server');
const render = require('@fwd/render');

server.get(`/api/tweet/render`, async function(req, res) {
  const image = await render({
    html: '<html><body><div>Check out what I just did! #cool</div></body></html>'
  });
  res.writeHead(200, { 'Content-Type': 'image/png' });
  res.end(image, 'binary');
});
server.start()

Generating multiple images

If you want to generate multiple images in one call you must provide an array to the content property.

Saving to disk

To save on the disk you must provide the output property on each object in the content property.

render({
  html: '<html><body>Hello {{name}}!</body></html>',
  content: [
    { name: 'Pierre', output: './image1.png' }, 
    { name: 'Paul', output: './image2.png' }, 
    { name: 'Jacques', output: './image3.png' }
  ]
}).then(() => console.log('The images were created successfully!'))

Using buffers

If you don't want to save the images to disk you can use the returned value instead. It returns an array of Buffer objects.

const images = await render({
  html: '<html><body>Hello {{name}}!</body></html>',
  content: [
    { name: 'Pierre' }, 
    { name: 'Paul' }, 
    { name: 'Jacques' }
  ]
})

Author

👤 Forward Miami

🤝 Contributing

Contributions, issues and feature requests are welcome!Feel free to check issues page.

Show your support

Give a ⭐️ if this project helped you!

📝 License

Copyright © 2020 Forward Miami. This project is Apache--2.0 licensed.