• This repository has been archived on 17/Aug/2019
  • Stars
    star
    177
  • Rank 215,985 (Top 5 %)
  • Language
    JavaScript
  • Created over 11 years ago
  • Updated over 5 years ago

Reviews

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

Repository Details

A node.js (and client-library) implementation of the Flickr API with oauth API key authentication and API method proxying

THIS PROJECT HAS BEEN ARCHIVED, YOU ALMOST CERTAINLY WANT TO USE THE Flickr-SDK PACKAGE INSTEAD


A Node.js and browser Flickr API library

With oauth authentication for Flickr API keys if you're using it server-side (authenticated calls from the browser are too insecure to support for the moment, and will throw an error).

You also get API route proxying so you can call the Flickr methods through your own server and get Flickr responses back for free. Super handy!

Quick start guide:

You don't want to read this entire README.md, so just find what you want to do in this handy quick start guide right here at the start of the README, and off you go!

In the browser with client-side credentials:

Script-load the browser/flickrapi.dev.js library for development work, and use the browser/flickrapi.js library in production.

You can access Flickr by creating an API instance as:

var flickr = Flickr.tokenOnly({
  api_key: "1234ABCD1234ABCD1234ABCD1234ABCD"
});

Then query Flickr using the API as described over at http://www.flickr.com/services/api - for instance, to search for all photographs that text-match the terms "red panda", you call:

flickr.photos.search({
  text: "red+panda"
}, function(err, result) {
  if(err) { throw new Error(err); }
  // do something with result
}

All calls are asynchronous, and the callback handling function always has two arguments. The first, if an error occurs, is the error generated by Flickr; the second, if the call succeeds, is the result sent back from Flickr, as plain JavaScript object.

Note: this is not secure. People will be able to see your API key, and this is pretty much the worst idea(tm), so you probably want to use this library...

In the browser, securely via proxied API calls:

Script-load the browser/flickrapi.dev.js library for development work, and use the browser/flickrapi.js library in production, but don't use your API key. Instead, point to your server as a flickr API proxy:

var flickr = new Flickr({
  endpoint: "http//yourhostedplace/services/rest/"
});

To make this work, have flickapi running on your server with a proxy route enabled, and you'll be able to make use of all the Flickr API calls, without having to put your credentials anywhere in your client-side source code.

Proxy mode is explained below, but is essentially a one-liner add to your regular connect/express app.

As a module in a (larger) Node.js program

Install like any other package:

$> npm install flickrapi --save

After that, you have two choices, based on whether you want to authenticate or not. Both approaches require an API key, but using OAuth2 authentication means you get access to the full API, rather than only the public API.

To suppress the progress bars in stdout you can include a progress attribute when initializing:

var Flickr = require('flickrapi');
var flickr = Flickr.tokenOnly({ // or Flickr.authenticate
    api_key: "1234ABCD1234ABCD1234ABCD1234ABCD",
    progress: false
});

No authentication, public API only

var Flickr = require("flickrapi"),
    flickrOptions = {
      api_key: "API key that you get from Flickr",
      secret: "API key secret that you get from Flickr"
    };

Flickr.tokenOnly(flickrOptions, function(error, flickr) {
  // we can now use "flickr" as our API object,
  // but we can only call public methods and access public data
});

Authenticated, full Flickr API access

var Flickr = require("flickrapi"),
    flickrOptions = {
      api_key: "API key that you get from Flickr",
      secret: "API key secret that you get from Flickr"
    };

Flickr.authenticate(flickrOptions, function(error, flickr) {
  // we can now use "flickr" as our API object
});

As flickrapi internally uses the request module, you can also pass default options for request that are accepted by request.defaults() as documented in the request module

var Flickr = require("flickrapi"),
    flickrOptions = {
      api_key: "API key that you get from Flickr",
      secret: "API key secret that you get from Flickr",
      requestOptions: {
        timeout: 20000,
        /* other default options accepted by request.defaults */
      }
    };

Flickr.tokenOnly(flickrOptions, function(error, flickr) {
  // we can now use "flickr" as our API object,
  // but we can only call public methods and access public data
});

The end.

That's it, that's all the quickstart guiding you need. For more detailed information, keep reading. If you just wanted to get up and running, then the preceding text should have gotten you there!


What to do now that you have the library loaded

Call some API functions

calling API functions is then a matter of calling the functions as they are listed on http://www.flickr.com/services/api, so if you wish to get all your own photos, you would call:

flickr.photos.search({
  user_id: flickr.options.user_id,
  page: 1,
  per_page: 500
}, function(err, result) {
  // result is Flickr's response
});

Call functions that don't require authentication, authenticated anyway

Simply add an authenticated: true pair to your function call. Compare:

flickr.people.getPhotos({
  api_key: ...
  user_id: <your own ID>
  page: 1,
  per_page: 100
}, function(err, result) {
  /*
    This will give public results only, even if we used
    Flickr.authenticate(), because the function does not
    *require* authentication to run. It just runs with
    fewer permissions.
  */
});

To:

flickr.people.getPhotos({
  api_key: ...
  user_id: <your own ID>
  authenticated: true,
  page: 1,
  per_page: 100
}, function(err, result) {
  /*
    This will now give all public and private results,
    because we explicitly ran this as an authenticated call
  */
});

Proxy the Flickr API

If your app is a connect or express app, you get Flickr API proxying for free.

Simply use the .proxy() function to set everything up and then call your own API route in the same way you would call the Flickr API, minus the security credentials, since the servers side Flickr api object already has those baked in.

As an example, the test.js script for node-flickrapi uses the following code to set up the local API route:

var express = require("express");

Flickr.authenticate(FlickrOptions, function(error, flickr) {
  var app = express();
  app.configure(function() {
    ...
    flickr.proxy(app, "/service/rest");
    ...
  });
  ...
});

This turns the /service/rest route into a full Flickr API proxy, which the browser library can talk to, using POST operations.

To verify your proxy route works, simply use cURL in the following fashion:

curl -X POST -H "Content-Type: application/json"
             -d '{"method":"flickr.photos.search", "text":"red+pandas"}'
             http://127.0.0.1:3000/service/rest/

Note that the proxy is "open" in that there is no explicit user management. If you want to make sure only "logged in users" get to use your API proxy route, you can pass an authentication middleware function as third argument to the .proxy function:

function authenticator(req, res, next) {
  // assuming your session management uses req.session:
  if(req.session.authenticated) {
    return next();
  }
  next({status:403, message: "not authorised to call API methods"});
}

flickr.proxy(app, "/service/rest/", authenticator);

Upload photos to Flickr

If you're running the code server-side, and you've authenticated with Flickr already, you can use the Flickr.upload function to upload individual photos, or batches of photos, to your own account (or, the account that is tied to the API key that you're using).

Flickr.authenticate(FlickrOptions, function(error, flickr) {
  var uploadOptions = {
    photos: [{
      title: "test",
      tags: [
        "happy fox",
        "test 1"
      ],
      photo: __dirname + "/test.jpg"
    },{
      title: "test2",
      tags: "happy fox image \"test 2\" separate tags",
      photo: __dirname + "/test.jpg"
    }]
  };

  Flickr.upload(uploadOptions, FlickrOptions, function(err, result) {
    if(err) {
      return console.error(error);
    }
    console.log("photos uploaded", result);
  });
});

For the list of available upload properties, see the Flickr Upload API page.

Download data from Flickr

You can use this module to very easily download all your Flickr content, using the built in downsync function:

var Flickr = require("flickrapi"),
    flickrOptions = { ... };
Flickr.authenticate(flickrOptions, flickrapi.downsync());

That's all you need to run. The package will generate a data directory with your images in ./data/images (in several sizes), and the information architecture (metadata, sets, collections, etc) in ./data/ia.

If you want this in a different directory, you can pass the dir as an argument to the downsync function:

var Flickr = require("flickrapi"),
    flickrOptions = { ... };
Flickr.authenticate(flickrOptions, flickrapi.downsync("userdata/me"));

This will now create a ./data for the flickr API information, but also a ./userdata/me/ directory that contains the images and ia dirs with your personal data.

Downloading shortcut: one-step downsyncing

If you just want to immediately downsync all your data right now, simply use the test.js application with the --downsync runtime argument: add your Flickr API key information to the .env file and then run:

$> node test --downsync

Run through the authentication procedure, and then just wait for it to finish. Once it's done, you should have a local mirror of all your Flickr data.

(Re)syncing with Flickr in your code

(Re)syncing is a mostly a matter or running the downsync function again. This will update anything that was updated or added on Flickr, but will not delete anything from your local mirror that was deleted from Flickr unless specifically told to do so, by passing a second argument (internally known as the "removeDeleted" flag in the code) to the downsync function call:

var Flickr = require("flickrapi"),
    flickrOptions = { ... };
Flickr.authenticate(flickrOptions, flickrapi.downsync("userdata/me", true));

If true, this will delete local files that were removed on Flickr (e.g. photos that you didn't like anymore, etc). If false, or omitted, no pruning of the local mirror will be performed.

Use your Flickr data in another application

If you downloaded all your Flickr data, you can use these in your own node apps by "dry loading" Flickr:

var Flickr = require("flickrapi"),
    flickrData = Flickr.loadLocally();

This will give you an object with the following structure:

{
  photos: [photo objects],
  photo_keys: [photo.id array, sorted on publish date],
  photosets: [set objects],
  photoset_keys: [set.id array, sorted on creation date],
  collections: [collection objects],
  collection_keys: [collection.id array, sorted on title],
}

Not sure what these objects look like? head over to your ./data/ia directory and just open a .json file in your favourite text editor.

The loadLocally function can take two arguments, namely a location where the ia data can be found, and an options object. If you want to pass in an options object you must supply a location, too.

flickrData = Flickr.loadLocally("./userdata", {
  loadPrivate: false
});

Currently the options object only has one meaningful property, loadPrivate, which determines whether or not photos and photosets that are marked "not public" in Flickr show up in the photo_keys and photoset_keys lists.

An example of a first run

Fetching Flickr's most up to date API definitions

On first run, the package will fetch all known methods from Flickr, and cache them for future use. This can take a bit, as there are a fair number of methods, but is inconsequential on subsequent package loading.

Authenticate your API key with Flickr

On first run, the authentication function will notice that there are no access_token and access_token_secret values set, and will negotiate these with Flickr using their oauth API, based on the permissions you request for your API key.

By default, the only permissions are "read" permissions, but you can override this by adding a permissions property to the options object:

  • permissions: "read" will give the app read-only access (default)
  • permissions: "write" will give it read + write access
  • permissions: "delete" will give it read, write and delete access

Note that you cannot make use of the upload functions unless you authenticate with write or delete permissions.

An example run

Running the app will show output such as the following block:

$> node app
{ oauth_callback_confirmed: 'true',
  oauth_token: '...',
  oauth_token_secret: '...' }
prompt: oauth_verifier: _

Once the app reaches this point it will open a browser, allowing you to consent to the app accessing your most private of private parts. On Flickr, at least. If you agree to authorize it, you will get an authorisation code that you need to pass so that the flickrapi can negotiate access tokens with Flickr.

Doing so continues the program:

$> node app
{ oauth_callback_confirmed: 'true',
  oauth_token: '...',
  oauth_token_secret: '...' }
prompt: oauth_verifier: 123-456-789

Add the following variables to your environment:

export FLICKR_USER_ID="12345678%40N12"
export FLICKR_ACCESS_TOKEN="72157634942121673-3e02b190b9720d7d"
export FLICKR_ACCESS_TOKEN_SECRET="99c038c9fc77673e"

These are namespaced environment variables, which works really well with env packages like habitat, so if you're going to use a namespace-aware enviroment parser, simply add these variables to your environment, or put them in an .env file and then parse them in.

If you would prefer to use plain process.env consulting, remove the FLICKR_ namespace prefix, and then pass process.env as options object.

Alternatively, if you don't mind hardcoding values (but be careful never to check that code in, because github gets mined by bots for credentials) you can put them straight into your source code:

var FlickrOptions = {
      api_key: "your API key",
      secret: "your API key secret",
      user_id: "...",
      access_token: "...",
      access_token_secret: "..."
    }

The flickrapi package will now be able to authenticate with Flickr without constantly needing to ask you for permission to access data.

Using your own OAuth callback endpoint

By default the oauth callback is set to "out-of-band". You can see this in the .env file as the FLICK_CALLBACK="oob" parameter, but if this is omitted the code falls back to oob automatically. For automated processes, or if you don't want your uers to have to type anything in a console, you can override this by setting your own oauth callback endpoint URL.

Using a custom callback endpoint, the oauth procedure will contact the indicated endpoint with the authentication information, rather than requiring your users to manually copy/paste the authentication values.

Note your users will still need to authenticate the app from a browser!

To use a custom endpoint, add the URL to the options as the callback property:

var options = ...;
options.callback: "http://.../...";
Flickr.authenticate(options, function(error, flickr) {
  ...
}

You can make your life easier by using an environment variable in the .env file rather than hardcoding your endpoint url:

export FLICKR_CALLBACK="http://..."

The callback URL handler will at its minimum need to implement the following middleware function:

function(req, res) {
  res.write("");
  options.exchange(req.query);
}

However, having the response tell the user that authorisation was received and that they can safely close this window/tab is generally a good idea.

If you wish to call the exchange function manually, the object expected by options.exchange looks like this:

{
  oauth_token: "...",
  oauth_verifier: "..."
}

Advanced topics

If all you wanted to know was how to use the flickrapi library, you can stop reading. However, there's some more magic built into the library that you might be interested in, in which case you should totally keep reading.

Custom authentication: browserless, noAPI, and silent

There are a number of special options that can be set to effect different authentication procedures. Calling the authenticate function with an options object means the following options can also be passed:

options = {
  ...

  // console.logs the auth URL instead of opening a browser for it.
  nobrowser: true,

  // only performs authentication, without building the Flickr API.
  noAPI: true,

  // suppress the default console logging on successful authentication.
  silent: true,

  // suppress writing progress bars to stdout
  progress: false

  ...
}

If you use the noAPI option, the authentication credentials can be extracted from the options object inside the callback function that you pass along. The options.access_token and options.access_token_secret will contain the result of the authentication procedure.

(Re)compiling the client-side library

If, for some reason, you want to (re)compile the client-side library, you can run the

$> node compile

command to (re)generate a flickrapi.js client-side library, saved to the browser directory. This generates a sparse library that will let you call all public methods (but currently not any method that requires read-private, write, or delete permissions), but will not tell you what's wrong when errors occur.

If you need the extended information, for instance in a dev setting, use

$> node compile dev

to generate a flickrapi.dev.js library that has all the information needed for developing work; simply use this during development and use the flickrapi.js library in production.

Note that no min version is generated; For development there is no sense in using one, and the savings on the production version are too small to matter (it's only 10kb smaller). If your server can serve content gzipped, the minification will have no effect on the gzipped size anyway (using gzip, the plain library is ~4.5kb, with the dev version being ~30kb).

The options object

Once you have a Flickr API object in the form if the flickr variable, the options can be found as flickr.options so you don't need to pass those on all the time. This object may contain any of the following values (some are quite required, others are entirely optional, and some are automatically generated as you make Flickr API calls):

api_key

your API key.

secret

your API key secret.

###user_id your user id, based on your first-time authorisation.

###access_token the preauthorised Flickr access token.

###access_token_secret its corresponding secret.

###oauth_timestamp the timestamp for the last flickr API call.

###oauth_nonce the cryptographic nonce that request used.

###force_auth

true or false (defaults to false) to indicate whether to force oauth signing for functions that can be called both key-only and authenticated for additional data access (like the photo search function)

###retry_queries if used, Flickr queries will be retried if they fail.

###afterDownsync optional; you can bind an arg-less callback function here that is called after a downsync() call finishes.

###permissions optional 'read', 'write', or 'delete'. defaults to 'read'.

###nobrowser

optional boolean, console.logs the auth URL instead of opening a browser window for it.

###noAPI optional boolean, performs authentication without building the Flickr API object.

###silent optional boolean, suppresses the default console logging on successful authentication.

###progress optional boolean, suppresses writing progress bars to stdout if set to false

###requestOptions adds ability to pass default options for request module

More Repositories

1

BezierInfo-2

The development repo for the Primer on Bézier curves, https://pomax.github.io/bezierinfo
HTML
2,328
star
2

react-onclickoutside

An onClickOutside wrapper for React components
JavaScript
1,818
star
3

bezierjs

A nodejs and client-side library for (cubic) Bezier curve work
JavaScript
1,650
star
4

bezierinfo

A Primer on Bezier Curves
HTML
733
star
5

lib-font

This library adds a new Font() object to the JavaScript toolbox, similar to new Image() for images
JavaScript
725
star
6

nrGrammar

The Nihongo Resources grammar book: "An Introduction to Japanese; Syntax, Grammar & Language"
TeX
327
star
7

Pjs-2D-Game-Engine

Processing.js 2D Game Engine
JavaScript
83
star
8

mahjong

Proper mahjong. In Javascript. Because I love this "game".
JavaScript
75
star
9

js-svg-path

A parser that turns SVG path strings into a JS object you can mess with.
JavaScript
62
star
10

music-theory-js

For when you need to do music theory things. In javascript. Don't look at me you know what you need this for.
JavaScript
60
star
11

fontmetrics.js

A JavaScript library that extends the Canvas2D context.measureText(<String>) with additional typographical metrics
JavaScript
56
star
12

svg-path-reverse

This is a JavaScript SVG path to "something" converter, turning a path into hookable graphics instructions for arbitrary conversion
JavaScript
56
star
13

CFF-glyphlet-fonts

Making tiny fonts, because making tiny fonts.
JavaScript
50
star
14

react-component-visibility

For when your components need to know whether users can see them or not
JavaScript
47
star
15

PHP-Font-Parser

This is a PHP code library for parsing TTF/OTF fonts from file.
PHP
45
star
16

A-binary-parser-generator

This project aims to create a tool that can turn a spec file into a parser skeleton for binary data files such as OpenType fonts, PNG images, etc.
JavaScript
38
star
17

nihongoresources.com

A repository of nihongoresources.com related materials.
CSS
37
star
18

Usered

A minimal PHP user authentication system
PHP
36
star
19

midi-with-node

Turn your browser into a MIDI device through the magic of Nodejs, easymidi, and socket.io
JavaScript
31
star
20

photoshop-paths-to-SVG

This is a photoshop "jsx" script that turns all paths in the active document into a single SVG file for use in something else.
JavaScript
30
star
21

node-jp-conjugations

A Japanese verb conjugator and unconjugator
JavaScript
30
star
22

arduino-midi-recorder

Let's build an Arduino-based MIDI recorder!
C++
26
star
23

react-positionable-component

A <Positionable> React component to turn arbitrary content into easy to CSS transform content
JavaScript
22
star
24

socketless

A framework and methodology for writing web socket RPC programs, without writing a single line of web socket or RPC code.
JavaScript
20
star
25

flickrmirror

Mirror your Flickr account to your HD. Then write a new site based on it.
JavaScript
17
star
26

the-cff-table

A markdown conversion of the Adobe Tech notes 5176 and 5177 as a stub for "what the OpenType chapter on the CFF table should look like", for specifically-for-OpenType-only CFF blocks.
17
star
27

RGBAnalyse

An RGB-HC histogram library for same-origin images
JavaScript
16
star
28

EasyPageComments

A simple instant-comments-section for pages based on PHP at the server, and _optionally_ JavaScript at the front end
PHP
16
star
29

LUT-builder

A web based LUT builder for OBS 64x64x64 LUTs
JavaScript
15
star
30

custom-graphics-element

Because what if you could just... write graphics sketches? On the web? Like, directly?
JavaScript
15
star
31

lightroom-catalog-helper

A lightroom catalogue helper utility
JavaScript
15
star
32

node-jp-conversion

Japenese input conversion, turning any string into {kanji, katakana, hiragana, romaji} where possible.
JavaScript
15
star
33

pomax.github.io

My blog, hosted via github
Mathematica
14
star
34

react-formbuilder

A relatively easy to use form builder (single or multipage), with error reporting and lots of room for customization
JavaScript
14
star
35

ucharclasses

A XeLaTeX package that lets you insert arbitrary code between characters from different unicode blocks
TeX
14
star
36

WebGLdraw

LDraw .dat to .obj converter for rendering LEGO using WebGL
JavaScript
13
star
37

Minimal-font-generator

This bit of JavaScript generates fonts that implement a single character, as a zero-width glyph.
JavaScript
13
star
38

msfs-simconnect-api-wrapper

A JavaScripty wrapper around node-simconnect
JavaScript
13
star
39

css-node-graph

A React based, pure CSS graphing thing (note: just graphs. Not charts or plots)
JavaScript
11
star
40

pocketknife

A small JS tookit -- like jQuery, but smaller, not backward compatible, and without the powerhouse functions.
JavaScript
10
star
41

terminal-menu-program

Terminal menu programs, using retro ansi terminal menus for serious 80s technicolor business
JavaScript
10
star
42

filebrowser_s3

an AWS S3 fix for Mezzanine's media manager
Python
9
star
43

tex2utf

A UTF8 massaging of the `tex2mail` utility, found on https://ctan.org/pkg/tex2mail
Perl
9
star
44

CSSmacros

Start writing CSS with macros ("constants" or "set-once variables"), because sometimes classes and/or just elements doesn't cut it
JavaScript
8
star
45

KeyTrap.js

Trap keyboard events in HTML elements to prevent default browser actions (backspace, cursor, etc)
JavaScript
7
star
46

cff-opcode-fonts

OTF fonts for testing CFF opcode support
7
star
47

are-we-flying

Writing auto-pilots in JavaScript for MSFS
JavaScript
7
star
48

webpack-block-loader

A webpack loader for doing generic block-processing. You provide the delimiters and processor, block-loader will find your data and pass it through your processor.
JavaScript
7
star
49

mini-daw

A web based mini-DAW implementation (using the Web Audio and Web MIDI APIs)
JavaScript
7
star
50

Mike-s-Mahjong

A Java implementation of Mahjong (the real game, not the solitaire nonsense)
Java
6
star
51

arctic-redpoll

A JavaScript Tree library
JavaScript
6
star
52

three-point-perspective

Implementing strict three point perspective is ridiculous. You'll never need it. Let's do it anyway.
6
star
53

quick-glyph-maker

A quick glyph maker that I need for writing a blog post on fonts
JavaScript
5
star
54

pagemixer

Like an in-browser dev tools for normal people to play with
JavaScript
5
star
55

FlickrFindr

a javascript flickr search module
JavaScript
5
star
56

Inkcyclopedia

A simple inkcyclopedia based on (at least) 228 ink sample tests
JavaScript
5
star
57

inkdb.org

React overhaul of inkcyclopedia.org
JavaScript
5
star
58

use-models-for-data

Work with your data through well-defined, always-consistent models, instead of rando plain JS objects
JavaScript
4
star
59

processing-bezier-master

Master repo for a generic Processing sketch for Bezier curve work.
Processing
4
star
60

inkdb-data

Open Source Fountain Pen Ink Data
JavaScript
4
star
61

ReactRoutedExample

An example app using React and React Router 2, with webpack bundling, watching, and server-side page generation.
JavaScript
4
star
62

node-type2-charstring

A simple converter for Type2 charstrings in human readable and byte form
JavaScript
4
star
63

console-plot

Add plotting to the browser console, because data viz is life.
JavaScript
3
star
64

mjscoring.js

html5 mahjong scoring app (work in progress)
JavaScript
3
star
65

gh-weblog

A simple weblog that runs entirely off of gh-pages
CSS
3
star
66

simple-cff-builder

A simple CFF builder with global subroutines and human readable charstring input for generating test fonts.
JavaScript
3
star
67

walking-bass

A walking bass generator.
JavaScript
3
star
68

react-circletree

A circle tree component for React applications
JavaScript
3
star
69

reddit-image-catch-up

Catch up on all your favourite image subreddits with one call.
JavaScript
3
star
70

node-jp-giongo

A Japanese onomatopoeia and mimesis module for node.js
JavaScript
3
star
71

node-kanji-relations

A node.js module for getting parent/child grapheme relations for Japanese kanji
JavaScript
3
star
72

mathparser

A math parser for Processing - give it a string, it gives back an evaluator
JavaScript
2
star
73

processing-stubs

Code that I constantly end up writing when using Processing
Processing
2
star
74

socketless-demo

Demos for the socketless library, https://github.com/Pomax/socketless
JavaScript
2
star
75

nrAPI

nihongoresources REST API
JavaScript
2
star
76

canonical-cubic-curve

Canonical cubic curve analysis based on the 1989 paper "A Geometric Characterization of Parametric Cubic Curves"
Processing
2
star
77

php-MJ-Scoring

MJ scoring JS/PHP script/page thingy
PHP
1
star
78

mox-server

A tiny express server that will host mox (emulated S3) data as text/html content
JavaScript
1
star
79

JSON-object-traverse

JS "mix in" to add string based route traversal to a JS object
JavaScript
1
star
80

node-rtltr-for-less

An automatic rtl/ltr extension for less-middleware
JavaScript
1
star
81

Cursive-swash-typeface

I'm desiging a cursive, swashed typeface, and will try to implement it as OTF. We'll see how that goes
1
star
82

Bookstyle

Making text files look pretty and paginated for your reading pleasure. In HTML
1
star
83

NRAPI-React

A React UI implementation for api.nihongoresources.com
JavaScript
1
star
84

Sheet-slicer

A sheet slicer using react and tiny REST API server
JavaScript
1
star
85

Twitter-Personal-Feed-Curator

For bulk deleting about a thousand tweets at a time.
JavaScript
1
star
86

noodle-doodle

What I'd like to see in a piano roll/sequencer when it comes to keyboard usability
JavaScript
1
star
87

Online-stack-validator

This project offers an online stack validator for programming code, analysing matched pairs
JavaScript
1
star