manage many storj renter nodes with remote control capabilities

Usage no npm install needed!

<script type="module">
  import storjComplex from '';


Storj Complex">

Build Status Coverage Status NPM License

Manage many renter nodes with the same identity with remote control capabilities! Complete documentation can be found here.



Command Line Interface

npm install -g storj-complex


npm install storj-complex --save


Command Line Interface

storj-complex -c <path/to/config.json>


Set up a renter service and landlord to control it.

var complex = require('storj-complex');
var landlord = complex.createLandlord({ /* landlord config */ });
var renter = complex.createRenter({ /* renter config */ });

// Landlords boss around renters...
// Rather they control all renters connected to the same RabbitMQ
landlord.start(function(err) {
  // Landlord is connected and service listening for RPC commands

// Renters do what landlords tell them...
// Rather they listen for tasks and coordinate to appease their masters
renter.start(function(err) {
  // Renter is connected to the storj network and listening for work

// Landlords and Renters are ReadableStreams
// The pump out newline-terminated JSON strings for logging information

Create a client to issue RPC commands to the landlord:

var complex = require('storj-complex');
var client = complex.createClient({ /* options */ });
var contract = new storj.Contract({ /* contract data */ });

// The client mimics storj-lib's RenterInterface
client.getStorageOffer(contract, function(err, farmer, contract) {
  // Storage offer received and accepted for the supplied farmer

Generating an HD Key

Here are the detailed steps for creating an HD key for configuration:

// require necessary libs, get entropy, and create a key
const HDKey = require('hdkey');
const seed = require('crypto').randomBytes(64);
const hdkey = HDKey.fromMasterSeed(seed);

// to keep for other future uses

// deriving the key for complex use (detailed in sip32)
const complexKey = hdkey.derive("m/3000'/0'");

// this will output expected private key used in configs

// for this config value in complex
let options = {};
options.networkPrivateExtendedKey = complexKey.privateExtendedKey;

// this is the key used in contracts and contacts

The above has been simplified into a utility, and can be used via:

const {randomBytes} = require('crypto');
const {createComplexKeyFromSeed} = require('storj-lib').utils;
const complexKey = createComplexKeyFromSeed(randomBytes(64));

For more details see SIP32:


Storj Complex - Manage many renter nodes with remote control capabilities Copyright (C) 2016 Storj Labs, Inc

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see