JavaScript Promises are a powerful way of working with asynchronous code.
They make sequencing operations easy and offer a clear, predictable way to handle errors that might occur along the way.
Much has been written about the benefits of Promises and I won't try to repeat it here.

What I do hope to do is make Promises a slightly more natural part of the Node.js development experience.
In version 0.12.* (as well as in io.js), ES6 Promises are natively available.
But the standard set of modules (such as File System) still use their original callback-based design and there's a bit of a disconnect between how you might want to write something and how you're able to.
Fortunately, most of the Promise libraries that are already available include wrappers to convert callback-based functions into ones that return a Promise.
However, most of those libraries assume you'll be using their custom implementation of Promise (from the "olden days" when that was the only option).
And while different Promises/A+ implementations are meant to be interoperable, it seems silly to pull in a second Promise implementation when a perfectly good one is already available.

promise-ring is small, simple library with no dependencies that eases the use of native JavaScript Promises in projects without a Promise library.

Documentation is available in the README along with runnable samples demonstrating the use of each API.
It's all quite simple and exactly what you'd expect.
A bonus feature is the wrapAll function which makes it easier to work with modules that expose many different callback-based functions (such as the File System module; see below).

For an example of using promise-ring and Promises to simplify code, here is a typical callback-based snippet to copy a file onto itself: