Skip to content
A Node.js wrapper for libgphoto2
C++ CoffeeScript Python Other
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
src Fix v8 deprecation warnings Apr 10, 2019
.npmignore #60 Added test folder to .npmignore Jan 19, 2015
package-lock.json Update all dependencies to most recent versions, with minimal compati… Nov 26, 2018
package.json Update all dependencies to most recent versions, with minimal compati… Nov 26, 2018


Build Status NPM version

Become a Patron

A Node.js wrapper for libgphoto2. Useful for remote controlling of DSLRs and other digital cameras supported by gphoto2.

The included test application currently allows you to

  • receive a live preview of your camera (if supported). Tested with an EOS 550D on a 2010 iMac at ~17 fps using Chrome (Safari doesn't work and FF is slow as hell).
  • query a list of available configuration options
  • query the values of specific configuration options

The test suite can be run using npm test. There's also a small test application (npx coffee examples/ which runs on http://localhost:1337 and allows to change camera settings and to take pictures.


  • Node.js: any version supported by nodejs/nan
  • NPM: ~5.6.0
  • Nan: ~2.8.0
  • libgphoto2: ~2.5.x - via brew install libgphoto2, apt-get install libgphoto2-dev or download and build from
  • pkg-config | dpkg (used for dependency checking)
  • clang compiler

Test/dev prerequisites

  • async
  • coffee-script
  • mocha
  • pre-commit
  • should
  • sinon
  • superagent

Test-server prerequisites

  • express
  • jade
  • underscore


After installing the dependencies, just install using:

npm install gphoto2

If it fails, please thoroughly check the output - link errors usually indicate missing dependencies. Also, the script tries to detect wether libgphoto2 is correctly installed - if this check fails although you properly installed it, please report :)


This example only shows how to achieve certain tasks, it's not meant to be executed without any asynchronous control flow logic.

var fs = require('fs');
var gphoto2 = require('gphoto2');
var GPhoto = new gphoto2.GPhoto2();

// Negative value or undefined will disable logging, levels 0-4 enable it.
GPhoto.on('log', function (level, domain, message) {
  console.log(domain, message);

// List cameras / assign list item to variable to use below options
GPhoto.list(function (list) {
  if (list.length === 0) return;
  var camera = list[0];
  console.log('Found', camera.model);

  // get configuration tree
  camera.getConfig(function (er, settings) {

  // Set configuration values
  camera.setConfigValue('capturetarget', 1, function (er) {

  // Take picture with camera object obtained from list()
  camera.takePicture({download: true}, function (er, data) {
    fs.writeFileSync(__dirname + '/picture.jpg', data);

  // Take picture and keep image on camera
    download: true,
    keep: true
  }, function (er, data) {
    fs.writeFileSync(__dirname + '/picture.jpg', data);

  // Take picture without downloading immediately
  camera.takePicture({download: false}, function (er, path) {

  // Take picture and download it to filesystem
    targetPath: '/tmp/foo.XXXXXX'
  }, function (er, tmpname) {
    fs.renameSync(tmpname, __dirname + '/picture.jpg');

  // Download a picture from camera
    cameraPath: '/store_00020001/DCIM/100CANON/IMG_1231.JPG',
    targetPath: '/tmp/foo.XXXXXX'
  }, function (er, tmpname) {
    fs.renameSync(tmpname, __dirname + '/picture.jpg');

  // Get preview picture (from AF Sensor, fails silently if unsupported)
    preview: true,
    targetPath: '/tmp/foo.XXXXXX'
  }, function (er, tmpname) {
    fs.renameSync(tmpname, __dirname + '/picture.jpg');


This project uses Semantic versioning.


You can’t perform that action at this time.