Chromium page opener server

Usage no npm install needed!

<script type="module">
  import cpos from 'https://cdn.skypack.dev/cpos';


Build Status


With cpos you can start Chromium browser with socketIO server and emit messages from any socketIO client (browser for example) to open specific URL and return some data back like page load time or page screenshot.

cpos uses node-webkit.

Install it with npm install cpos


cpos requires libuv0 and xvfb-run. If you don't have libuv0, you can symlink libuv0 to libuv1. Example in Arch Linux: sudo ln -s /usr/lib/libudev.so /usr/lib/libudev.so.0


'use strict';

var cpos = require('cpos');
var io = require('socket.io-client');

var chromiumServer = new cpos.Server();

chromiumServer.listen(3000, 'localhost', function() {
    console.log('Chromium browser socketIO server has started');

    var client = io.connect('http://localhost:3000');
    client.on('connect', function() {

        client.emit('openURL', {'url': 'http://google.com'}, function(data) {
            console.log('Google takes %s milliseconds to load', data.pageLoadTimeMS);



Class: cpos.Server

server.listen(port, hostname, [callback])

Starts the node-webkit Chromium app using xvfb-run. The app itself starts socket.io server listening for openURL messages.

callback is called when the applications is ready to receive openURL requests.


Terminates the server.

socket.emit('openURL', options, callback);

available options are

  • url: url for opening
  • width: window width (default: 1280)
  • height: window height (default: 768)
  • capture: return screenshot as base64 encoded string (default: false)
  • timeout: max timeout in seconds when opening url (default: 15 seconds)

callback is called with

  • pageLoadTimeMS: page load time in milliseconds
  • screenshot: base64 encoded screenshot of the loaded page (only if capture is set to true)
  • loaded: True or False, false can be if the timeout is reached

openURL opens new tab in Chromium and after page has loaded the tab is closed and the callback is executed, which means you can open pages in parallel.

You can use node async to limit max parallel tasks.