• This repository has been archived on 12/Feb/2021
  • Stars
    star
    1,003
  • Rank 45,765 (Top 1.0 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 12 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

high level amazon s3 client for node.js

High Level Amazon S3 Client

Installation

npm install s3 --save

Features

  • Automatically retry a configurable number of times when S3 returns an error.
  • Includes logic to make multiple requests when there is a 1000 object limit.
  • Ability to set a limit on the maximum parallelization of S3 requests. Retries get pushed to the end of the parallelization queue.
  • Ability to sync a dir to and from S3.
  • Progress reporting.
  • Supports files of any size (up to S3's maximum 5 TB object size limit).
  • Uploads large files quickly using parallel multipart uploads.
  • Uses heuristics to compute multipart ETags client-side to avoid uploading or downloading files unnecessarily.
  • Automatically provide Content-Type for uploads based on file extension.
  • Support third-party S3-compatible platform services like Ceph

See also the companion CLI tool which is meant to be a drop-in replacement for s3cmd: s3-cli.

Synopsis

Create a client

var s3 = require('s3');

var client = s3.createClient({
  maxAsyncS3: 20,     // this is the default
  s3RetryCount: 3,    // this is the default
  s3RetryDelay: 1000, // this is the default
  multipartUploadThreshold: 20971520, // this is the default (20 MB)
  multipartUploadSize: 15728640, // this is the default (15 MB)
  s3Options: {
    accessKeyId: "your s3 key",
    secretAccessKey: "your s3 secret",
    region: "your region",
    // endpoint: 's3.yourdomain.com',
    // sslEnabled: false
    // any other options are passed to new AWS.S3()
    // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#constructor-property
  },
});

Create a client from existing AWS.S3 object

var s3 = require('s3');
var awsS3Client = new AWS.S3(s3Options);
var options = {
  s3Client: awsS3Client,
  // more options available. See API docs below.
};
var client = s3.createClient(options);

Upload a file to S3

var params = {
  localFile: "some/local/file",

  s3Params: {
    Bucket: "s3 bucket name",
    Key: "some/remote/file",
    // other options supported by putObject, except Body and ContentLength.
    // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
  },
};
var uploader = client.uploadFile(params);
uploader.on('error', function(err) {
  console.error("unable to upload:", err.stack);
});
uploader.on('progress', function() {
  console.log("progress", uploader.progressMd5Amount,
            uploader.progressAmount, uploader.progressTotal);
});
uploader.on('end', function() {
  console.log("done uploading");
});

Download a file from S3

var params = {
  localFile: "some/local/file",

  s3Params: {
    Bucket: "s3 bucket name",
    Key: "some/remote/file",
    // other options supported by getObject
    // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
  },
};
var downloader = client.downloadFile(params);
downloader.on('error', function(err) {
  console.error("unable to download:", err.stack);
});
downloader.on('progress', function() {
  console.log("progress", downloader.progressAmount, downloader.progressTotal);
});
downloader.on('end', function() {
  console.log("done downloading");
});

Sync a directory to S3

var params = {
  localDir: "some/local/dir",
  deleteRemoved: true, // default false, whether to remove s3 objects
                       // that have no corresponding local file.

  s3Params: {
    Bucket: "s3 bucket name",
    Prefix: "some/remote/dir/",
    // other options supported by putObject, except Body and ContentLength.
    // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
  },
};
var uploader = client.uploadDir(params);
uploader.on('error', function(err) {
  console.error("unable to sync:", err.stack);
});
uploader.on('progress', function() {
  console.log("progress", uploader.progressAmount, uploader.progressTotal);
});
uploader.on('end', function() {
  console.log("done uploading");
});

Tips

  • Consider increasing the socket pool size in the http and https global agents. This will improve bandwidth when using uploadDir and downloadDir functions. For example:

    http.globalAgent.maxSockets = https.globalAgent.maxSockets = 20;

API Documentation

s3.AWS

This contains a reference to the aws-sdk module. It is a valid use case to use both this module and the lower level aws-sdk module in tandem.

s3.createClient(options)

Creates an S3 client.

options:

  • s3Client - optional, an instance of AWS.S3. Leave blank if you provide s3Options.
  • s3Options - optional. leave blank if you provide s3Client.
  • maxAsyncS3 - maximum number of simultaneous requests this client will ever have open to S3. defaults to 20.
  • s3RetryCount - how many times to try an S3 operation before giving up. Default 3.
  • s3RetryDelay - how many milliseconds to wait before retrying an S3 operation. Default 1000.
  • multipartUploadThreshold - if a file is this many bytes or greater, it will be uploaded via a multipart request. Default is 20MB. Minimum is 5MB. Maximum is 5GB.
  • multipartUploadSize - when uploading via multipart, this is the part size. The minimum size is 5MB. The maximum size is 5GB. Default is 15MB. Note that S3 has a maximum of 10000 parts for a multipart upload, so if this value is too small, it will be ignored in favor of the minimum necessary value required to upload the file.

s3.getPublicUrl(bucket, key, [bucketLocation])

  • bucket S3 bucket
  • key S3 key
  • bucketLocation string, one of these:
    • "" (default) - US Standard
    • "eu-west-1"
    • "us-west-1"
    • "us-west-2"
    • "ap-southeast-1"
    • "ap-southeast-2"
    • "ap-northeast-1"
    • "sa-east-1"

You can find out your bucket location programatically by using this API: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getBucketLocation-property

returns a string which looks like this:

https://s3.amazonaws.com/bucket/key

or maybe this if you are not in US Standard:

https://s3-eu-west-1.amazonaws.com/bucket/key

s3.getPublicUrlHttp(bucket, key)

  • bucket S3 Bucket
  • key S3 Key

Works for any region, and returns a string which looks like this:

http://bucket.s3.amazonaws.com/key

client.uploadFile(params)

See http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

params:

  • s3Params: params to pass to AWS SDK putObject.
  • localFile: path to the file on disk you want to upload to S3.
  • (optional) defaultContentType: Unless you explicitly set the ContentType parameter in s3Params, it will be automatically set for you based on the file extension of localFile. If the extension is unrecognized, defaultContentType will be used instead. Defaults to application/octet-stream.

The difference between using AWS SDK putObject and this one:

  • This works with files, not streams or buffers.
  • If the reported MD5 upon upload completion does not match, it retries.
  • If the file size is large enough, uses multipart upload to upload parts in parallel.
  • Retry based on the client's retry settings.
  • Progress reporting.
  • Sets the ContentType based on file extension if you do not provide it.

Returns an EventEmitter with these properties:

  • progressMd5Amount
  • progressAmount
  • progressTotal

And these events:

  • 'error' (err)
  • 'end' (data) - emitted when the file is uploaded successfully
    • data is the same object that you get from putObject in AWS SDK
  • 'progress' - emitted when progressMd5Amount, progressAmount, and progressTotal properties change. Note that it is possible for progress to go backwards when an upload fails and must be retried.
  • 'fileOpened' (fdSlicer) - emitted when localFile has been opened. The file is opened with the fd-slicer module because we might need to read from multiple locations in the file at the same time. fdSlicer is an object for which you can call createReadStream(options). See the fd-slicer README for more information.
  • 'fileClosed' - emitted when localFile has been closed.

And these methods:

  • abort() - call this to stop the find operation.

client.downloadFile(params)

See http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property

params:

  • localFile - the destination path on disk to write the s3 object into
  • s3Params: params to pass to AWS SDK getObject.

The difference between using AWS SDK getObject and this one:

  • This works with a destination file, not a stream or a buffer.
  • If the reported MD5 upon download completion does not match, it retries.
  • Retry based on the client's retry settings.
  • Progress reporting.

Returns an EventEmitter with these properties:

  • progressAmount
  • progressTotal

And these events:

  • 'error' (err)
  • 'end' - emitted when the file is downloaded successfully
  • 'progress' - emitted when progressAmount and progressTotal properties change.

client.downloadBuffer(s3Params)

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property

  • s3Params: params to pass to AWS SDK getObject.

The difference between using AWS SDK getObject and this one:

  • This works with a buffer only.
  • If the reported MD5 upon download completion does not match, it retries.
  • Retry based on the client's retry settings.
  • Progress reporting.

Returns an EventEmitter with these properties:

  • progressAmount
  • progressTotal

And these events:

  • 'error' (err)
  • 'end' (buffer) - emitted when the file is downloaded successfully. buffer is a Buffer containing the object data.
  • 'progress' - emitted when progressAmount and progressTotal properties change.

client.downloadStream(s3Params)

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property

  • s3Params: params to pass to AWS SDK getObject.

The difference between using AWS SDK getObject and this one:

  • This works with a stream only.

If you want retries, progress, or MD5 checking, you must code it yourself.

Returns a ReadableStream with these additional events:

  • 'httpHeaders' (statusCode, headers) - contains the HTTP response headers and status code.

client.listObjects(params)

See http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjects-property

params:

  • s3Params - params to pass to AWS SDK listObjects.
  • (optional) recursive - true or false whether or not you want to recurse into directories. Default false.

Note that if you set Delimiter in s3Params then you will get a list of objects and folders in the directory you specify. You probably do not want to set recursive to true at the same time as specifying a Delimiter because this will cause a request per directory. If you want all objects that share a prefix, leave the Delimiter option null or undefined.

Be sure that s3Params.Prefix ends with a trailing slash (/) unless you are requesting the top-level listing, in which case s3Params.Prefix should be empty string.

The difference between using AWS SDK listObjects and this one:

  • Retries based on the client's retry settings.
  • Supports recursive directory listing.
  • Makes multiple requests if the number of objects to list is greater than 1000.

Returns an EventEmitter with these properties:

  • progressAmount
  • objectsFound
  • dirsFound

And these events:

  • 'error' (err)
  • 'end' - emitted when done listing and no more 'data' events will be emitted.
  • 'data' (data) - emitted when a batch of objects are found. This is the same as the data object in AWS SDK.
  • 'progress' - emitted when progressAmount, objectsFound, and dirsFound properties change.

And these methods:

  • abort() - call this to stop the find operation.

client.deleteObjects(s3Params)

See http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#deleteObjects-property

s3Params are the same.

The difference between using AWS SDK deleteObjects and this one:

  • Retry based on the client's retry settings.
  • Make multiple requests if the number of objects you want to delete is greater than 1000.

Returns an EventEmitter with these properties:

  • progressAmount
  • progressTotal

And these events:

  • 'error' (err)
  • 'end' - emitted when all objects are deleted.
  • 'progress' - emitted when the progressAmount or progressTotal properties change.
  • 'data' (data) - emitted when a request completes. There may be more.

client.uploadDir(params)

Syncs an entire directory to S3.

params:

  • localDir - source path on local file system to sync to S3
  • s3Params
    • Prefix (required)
    • Bucket (required)
  • (optional) deleteRemoved - delete s3 objects with no corresponding local file. default false
  • (optional) getS3Params - function which will be called for every file that needs to be uploaded. You can use this to skip some files. See below.
  • (optional) defaultContentType: Unless you explicitly set the ContentType parameter in s3Params, it will be automatically set for you based on the file extension of localFile. If the extension is unrecognized, defaultContentType will be used instead. Defaults to application/octet-stream.
  • (optional) followSymlinks - Set this to false to ignore symlinks. Defaults to true.
function getS3Params(localFile, stat, callback) {
  // call callback like this:
  var err = new Error(...); // only if there is an error
  var s3Params = { // if there is no error
    ContentType: getMimeType(localFile), // just an example
  };
  // pass `null` for `s3Params` if you want to skip uploading this file.
  callback(err, s3Params);
}

Returns an EventEmitter with these properties:

  • progressAmount
  • progressTotal
  • progressMd5Amount
  • progressMd5Total
  • deleteAmount
  • deleteTotal
  • filesFound
  • objectsFound
  • doneFindingFiles
  • doneFindingObjects
  • doneMd5

And these events:

  • 'error' (err)
  • 'end' - emitted when all files are uploaded
  • 'progress' - emitted when any of the above progress properties change.
  • 'fileUploadStart' (localFilePath, s3Key) - emitted when a file begins uploading.
  • 'fileUploadEnd' (localFilePath, s3Key) - emitted when a file successfully finishes uploading.

uploadDir works like this:

  1. Start listing all S3 objects for the target Prefix. S3 guarantees returned objects to be in sorted order.
  2. Meanwhile, recursively find all files in localDir.
  3. Once all local files are found, we sort them (the same way that S3 sorts).
  4. Next we iterate over the sorted local file list one at a time, computing MD5 sums.
  5. Now S3 object listing and MD5 sum computing are happening in parallel. As each operation progresses we compare both sorted lists side-by-side, iterating over them one at a time, uploading files whose MD5 sums don't match the remote object (or the remote object is missing), and, if deleteRemoved is set, deleting remote objects whose corresponding local files are missing.

client.downloadDir(params)

Syncs an entire directory from S3.

params:

  • localDir - destination directory on local file system to sync to
  • s3Params
    • Prefix (required)
    • Bucket (required)
  • (optional) deleteRemoved - delete local files with no corresponding s3 object. default false
  • (optional) getS3Params - function which will be called for every object that needs to be downloaded. You can use this to skip downloading some objects. See below.
  • (optional) followSymlinks - Set this to false to ignore symlinks. Defaults to true.
function getS3Params(localFile, s3Object, callback) {
  // localFile is the destination path where the object will be written to
  // s3Object is same as one element in the `Contents` array from here:
  // http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjects-property

  // call callback like this:
  var err = new Error(...); // only if there is an error
  var s3Params = { // if there is no error
    VersionId: "abcd", // just an example
  };
  // pass `null` for `s3Params` if you want to skip downloading this object.
  callback(err, s3Params);
}

Returns an EventEmitter with these properties:

  • progressAmount
  • progressTotal
  • progressMd5Amount
  • progressMd5Total
  • deleteAmount
  • deleteTotal
  • filesFound
  • objectsFound
  • doneFindingFiles
  • doneFindingObjects
  • doneMd5

And these events:

  • 'error' (err)
  • 'end' - emitted when all files are downloaded
  • 'progress' - emitted when any of the progress properties above change
  • 'fileDownloadStart' (localFilePath, s3Key) - emitted when a file begins downloading.
  • 'fileDownloadEnd' (localFilePath, s3Key) - emitted when a file successfully finishes downloading.

downloadDir works like this:

  1. Start listing all S3 objects for the target Prefix. S3 guarantees returned objects to be in sorted order.
  2. Meanwhile, recursively find all files in localDir.
  3. Once all local files are found, we sort them (the same way that S3 sorts).
  4. Next we iterate over the sorted local file list one at a time, computing MD5 sums.
  5. Now S3 object listing and MD5 sum computing are happening in parallel. As each operation progresses we compare both sorted lists side-by-side, iterating over them one at a time, downloading objects whose MD5 sums don't match the local file (or the local file is missing), and, if deleteRemoved is set, deleting local files whose corresponding objects are missing.

client.deleteDir(s3Params)

Deletes an entire directory on S3.

s3Params:

  • Bucket
  • Prefix
  • (optional) MFA

Returns an EventEmitter with these properties:

  • progressAmount
  • progressTotal

And these events:

  • 'error' (err)
  • 'end' - emitted when all objects are deleted.
  • 'progress' - emitted when the progressAmount or progressTotal properties change.

deleteDir works like this:

  1. Start listing all objects in a bucket recursively. S3 returns 1000 objects per response.
  2. For each response that comes back with a list of objects in the bucket, immediately send a delete request for all of them.

client.copyObject(s3Params)

See http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property

s3Params are the same. Don't forget that CopySource must contain the source bucket name as well as the source key name.

The difference between using AWS SDK copyObject and this one:

  • Retry based on the client's retry settings.

Returns an EventEmitter with these events:

  • 'error' (err)
  • 'end' (data)

client.moveObject(s3Params)

See http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property

s3Params are the same. Don't forget that CopySource must contain the source bucket name as well as the source key name.

Under the hood, this uses copyObject and then deleteObjects only if the copy succeeded.

Returns an EventEmitter with these events:

  • 'error' (err)
  • 'copySuccess' (data)
  • 'end' (data)

Examples

Check if a file exists in S3

Using the AWS SDK, you can send a HEAD request, which will tell you if a file exists at Key.

See http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#headObject-property

var client = require('s3').createClient({ /* options */ });
client.s3.headObject({
  Bucket: 's3 bucket name',
  Key: 'some/remote/file'
}, function(err, data) {
  if (err) {
    // file does not exist (err.statusCode == 404)
    return;
  }
  // file exists
});

Testing

S3_KEY=<valid_s3_key> S3_SECRET=<valid_s3_secret> S3_BUCKET=<valid_s3_bucket> npm test

Tests upload and download large amounts of data to and from S3. The test timeout is set to 40 seconds because Internet connectivity waries wildly.

More Repositories

1

libsoundio

C library for cross-platform real-time audio input and output
C
1,933
star
2

groovebasin

Music player server with a web-based user interface.
JavaScript
1,851
star
3

poop

Performance Optimizer Observation Platform
Zig
882
star
4

naught

Zero downtime deployment for your Node.js server using builtin cluster API
JavaScript
793
star
5

jamulator

(unmaintained) recompiling NES roms into native executables
Go
388
star
6

tetris

A simple tetris clone written in zig programming language.
Zig
381
star
7

libgroove

streaming audio processing library
C
290
star
8

HellOS

"hello world" x86 kernel example
Zig
262
star
9

node-diacritics

remove diacritics from strings ("ascii folding") - Node.js module
JavaScript
259
star
10

waveform

simultaneously transcode and generate visuals for an audio file
C
251
star
11

clashos

multiplayer arcade game for bare metal Raspberry Pi 3 B+
Zig
216
star
12

genesis

Genesis Digital Audio Workstation
C++
176
star
13

chem

2d canvas-based rapid prototyping game engine
JavaScript
176
star
14

swig-email-templates

Node.js module for rendering emails with swig templates and email-friendly inline CSS using boost.
JavaScript
162
star
15

node-groove

bindings to libgroove - music player backend library
C++
157
star
16

node-mv

Like `fs.rename`, but works across devices, and works with directories. Think of the unix utility `mv`.
JavaScript
155
star
17

ffmpeg

FFmpeg Zig package
C
137
star
18

zig-window

window client library
C++
116
star
19

sdl-zig-demo

SDL2 hello world in zig
Zig
115
star
20

node-waveform

simultaneously transcode audio and generate visuals - Node.js module
C
101
star
21

zig-vulkan-triangle

simple triangle displayed using vulkan, xcb, and zig
Zig
98
star
22

node-s3-cli

command line utility to go along with node s3 module
JavaScript
97
star
23

malcheck

Test your code with malcheck to make sure it handles out of memory conditions correctly.
C
96
star
24

zig-wasi

Minimal WASI interpreter
C
91
star
25

zasm

multi-target assembler and disassembler
Zig
90
star
26

mpd.js

Connect to a music player daemon server, send commands, emit events.
JavaScript
89
star
27

PyDaw

python library to mess with Digital Audio Workstations. FL Studio project files (.flp) supported.
C++
87
star
28

node-flp

FL Studio project file parser for node.js
JavaScript
77
star
29

node-tmx-parser

node.js module to parse and load tiled map editor maps (see mapeditor.org)
JavaScript
71
star
30

node-astar

Generic A* algorithm for node.js
JavaScript
67
star
31

node-sox

(unmaintained) node.js interface to the sox audio utility
JavaScript
61
star
32

zig-async-demo

Comparing concurrent code example programs between other languages and Zig
Zig
55
star
33

mcserve

wraps minecraft server and gives you a web interface
JavaScript
54
star
34

StaticHttpFileServer

Zig module for serving a directory of files from memory via HTTP
Zig
49
star
35

zig-general-purpose-allocator

work-in-progress general purpose allocator intended to be eventually merged into Zig standard library. live streamed development
Zig
46
star
36

autodoc

Zig Documentation Generator
Zig
45
star
37

liblaxjson

C library for parsing JSON config files
C
33
star
38

node-perlin-noise

perlin noise generator for node.js
JavaScript
33
star
39

lua-in-the-browser

using zig to build lua for webassembly
C
32
star
40

node-fd-slicer

safely create multiple ReadStream or WriteStream objects from the same file descriptor
JavaScript
30
star
41

flag2struct

simple CLI tool for converting zig source code using flags-style declarations to packed structs
Zig
29
star
42

rucksack

texture packer and resource bundler
C
28
star
43

mime

zig package for mapping extensions to mime types
Zig
28
star
44

connect-sse

connect middleware for server sent events (EventSource)
JavaScript
27
star
45

PyWaveform

Python library to create an image of a song's waveform
C
26
star
46

zig-stage1

Exploring replacing Zig's stage1 compiler with pure C code that outputs pure C code
C
25
star
47

xml

Tokenize XML
Zig
24
star
48

libavfilter-example

small example of using libavfilter to filter audio
C
23
star
49

node-plan

(unmaintained, deprecated, abandoned) Execute a complicated dependency graph of tasks with smooth progress events.
JavaScript
20
star
50

connect-static

static file server middleware for connect. loads files once at startup and saves gzipped versions in memory
JavaScript
19
star
51

dotfiles

linux yo
Nix
18
star
52

pyedsdk

Python library to control cameras via EDSDK
C
18
star
53

groove-rs

rust bindings to libgroove - streaming audio processing library
Rust
16
star
54

node-pend

dead-simple optimistic async helper in javascript
JavaScript
16
star
55

evo

specification, reference implementation, and examples of Evo, the programming language made for being the DNA of genetic algorithms
Zig
15
star
56

mediablast

(unmaintained, deprecated, abandoned) open source media processing server
JavaScript
14
star
57

purgatory

escape from the circles of hell - 7 hour game jam
JavaScript
14
star
58

browserify-lite

browserify, minus some of the advanced features and heavy dependencies
JavaScript
14
star
59

pillagers

Real time strategy game with space physics
JavaScript
12
star
60

hackerrank

my solutions to hackerrank puzzles
Go
11
star
61

connect-nocache

connect middleware to insert no cache headers
JavaScript
11
star
62

andrewkelley.me

my personal site
HTML
11
star
63

pulseaudio

pulseaudio with the build system replaced by zig
C
11
star
64

SIMD-test

exploring SIMD optimization
C
10
star
65

truthfinder

TruthFinder.org website
Python
10
star
66

mc-bot-server

(unmaintained) server that spins up minecraft bots
JavaScript
9
star
67

zig-mandelbrot-gl

mandelbrot set in zig
Zig
9
star
68

node-yawl

yet another websockets library for Node.js
JavaScript
8
star
69

clashproto

prototyping the game for andrewrk/clashos
Zig
8
star
70

planet-evo

evolution simulation software
C++
8
star
71

advent-of-code

https://adventofcode.com
Zig
8
star
72

node-music-library-index

node module to build a searchable javascript object model given track metadata objects
JavaScript
7
star
73

github-popularity-contest

see who has the most collective stars
JavaScript
7
star
74

node-human-size

tiny node.js module to get human readable file size from byte count
JavaScript
7
star
75

libmp3lame

libmp3lame with the build system replaced by zig
C
7
star
76

node-stream-counter

node.js module to keep track of how many bytes have been written to a stream
JavaScript
7
star
77

mpd

a fork of mpd to add library management, better search, and a sophisticated dynamic playlist
C
7
star
78

boost

Inline CSS into your HTML source
JavaScript
6
star
79

Secure-WordVault

(unmaintained, deprecated, abandoned) Enables you to store sensitive information in a portable manner
C++
6
star
80

dominion

Node.js module and command line program to play Dominion, the card game by Donald X. Vaccarino.
JavaScript
6
star
81

TrenchBowl

simple music player UI to demonstrate libgroove
C++
6
star
82

node-spritesheet

node.js module: given a list of image files, create a spritesheet using cairo
JavaScript
6
star
83

chem-cli

html5 canvas game engine optimized for rapid development - command line interface
JavaScript
5
star
84

face-the-music

indie speed run game jam
JavaScript
5
star
85

ruff

little tool to help my dad quickly find info in a .csv file
C++
5
star
86

gbremote

Groove Basin remote control command line app and Node.js module
JavaScript
5
star
87

planetarius

Ludum Dare 30 Entry. networked multiplayer arcade shooter
JavaScript
5
star
88

archerbot

mineflayer bot that engages you in a gentlemanly duel
JavaScript
5
star
89

holocaust

html5 video game - rebuild society after a nuclear holocaust ravages the world
JavaScript
4
star
90

Camlift-Controller

Controls a Canon camera and operates a motorized lift
Visual Basic
4
star
91

swig-dummy-context

given a swig template, create a dummy context which is useful for template composing tools
JavaScript
4
star
92

node-passthrough-truncate

truncate the last N bytes of a stream - Node.js module
JavaScript
3
star
93

scrabble

Scrabble solving AI
3
star
94

spacefight

vaporware 3D space-dogfighting simulator game
C++
3
star
95

math3d-rs

computer-graphics matrix calculations for dummies like me
Rust
3
star
96

lemming-js

PyWeek #12 entry ported to JavaScript with chem
JavaScript
3
star
97

pypowerusb

Python library to control a PowerUSB
C
3
star
98

opengl-multi-window-test

see if multiple windows in opengl causes a framerate issue
C
3
star
99

disinfecticide

A game about controlling a disease outbreak.
JavaScript
2
star
100

socketio-ssl-test

test whether we can use socket.io with xhr requests securely on an insecure page
JavaScript
2
star