Library / SDK
ramda/ramda avatar
ramda/ramda

Ramda puts the data last, and drops the default export after 0.25

:ram: Practical functional Javascript

24,051 stars1,457 forksJavaScriptMIT

At a glance

What is it?
Ramda is a functional library for JavaScript that curries every function and takes the data as the last argument. It ships no default export past version 0.25, and the immutability it helps you write is never enforced at runtime.
Who is it for?
Adopt Ramda when your team is willing to read its argument order before writing a line, and when currying earns its keep in the pipelines you actually build. Skip it if you need immutability enforced rather than encouraged.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 34 days ago.
What is it written in?
Mainly JavaScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • ramda/ramda24,051 ★ · +1
Star history
Repository2026-09-222026-11-14
ramda/ramda24.1k24.1k

1 Stars in the last 53 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

The data argument sits last, and that is the whole pipeline mechanism

Ramda's two mechanical claims are that every function is automatically curried and that the parameters are arranged to make currying convenient, with the data to be operated on supplied last. Everything else in the design follows from those two sentences.

A function that takes a predicate and then a collection can be handed the predicate alone, producing a function that still wants data. Feed that result into another partially applied function and you have a pipeline without naming an intermediate variable. Because the data never appears until the last call, each stage is written as data arriving from the left. The file states the goal plainly: functions built as sequences of simpler functions, each of which transforms the data and passes it along to the next.

The cost lands on the reader at autocomplete. Argument position is doing semantic work here, so a signature you misremember produces a function that silently returns something other than what you meant rather than throwing.

Immutability is enabled, never enforced, and performance outranks purity

Two sentences in the philosophy section set the real contract. Ramda does not enforce immutability, it enables that style to be as frictionless as possible. And a reliable and quick implementation wins over any notions of functional purity.

Read together, those mean no runtime guard stands between your code and a mutation. Nothing in the package throws when a value changes, and nothing records the before state for you. Purity is a property of how you call the library, not something the library checks. If a code review is your only enforcement, a regression that mutates a shared object passes every test that only asserts on return values.

The second sentence is the more surprising one for anyone arriving from a language where purity is non-negotiable. When the two goals conflict, this project resolves the conflict toward speed. A reader who assumed the functional framing implied immutability guarantees has misread the priorities.

Past version 0.25 there is no default export, so old import lines stop working

This is the sharpest upgrade edge in the package, and the file states it in its own heading. Ramda versions past 0.25 have no default export, so `import R from 'ramda'` no longer works. The replacement is `import * as R from 'ramda'`, or better, importing only the functions required via `import { functionName } from 'ramda'`.

js
import * as R from 'ramda'
import { functionName } from 'ramda'

Every tutorial, blog post and Stack Overflow answer written against Ramda 0.24 or earlier is now wrong at the first line. A second note compounds it for browser projects: to reach the ES6 module in a browser you have to provide the content of the es directory yourself and then import from `./node_modules/ramda/es/index.js`. Reading existing code that predates 0.25 means rewriting its import lines before you can judge whether the logic changed.

The project flags its own unpinned CDN tag as a risk

The browser install section offers pinned URLs first and then one unpinned variant, and the file attaches a warning to the unpinned one directly: using `latest` is taking a significant risk that the Ramda API changes could break your code.

html
<script src="//cdn.jsdelivr.net/npm/[email protected]/dist/ramda.min.js"></script>

So the project's own documentation declines to endorse the loose tag it just showed you. That consequence reaches further than a broken script tag, because a script tag failure surfaces as an undefined global in the browser console, not as a failed install. Note also that both the cdnjs and jsDelivr examples are pinned at 0.31.3 while package.json declares version 0.32.0, so a copy-paste from this file lands you one release behind the current one before you have changed anything.

Every script tag variant here, including the local `ramda.js` and `ramda.min.js` copies, adds the variable `R` to the browser's global scope, which means two Ramda versions on one page collide over a single name.

main, module, unpkg and exports send different consumers to different files

One package resolves four ways. `main` is `./src/index.js`, `module` is `./es/index.js`, and `unpkg` and `jsdelivr` both point at `dist/ramda.min.js`. The `exports` map repeats the split in modern form: the root entry resolves `require` to `./src/index.js` and `import` to `./es/index.js`, with `default` falling back to the src file. Pattern entries expose `./es/*`, `./src/*` and `./dist/*`.

That is a lot of surface for a library whose selling point is simplicity, and it has a practical consequence. A Node require, an ES module import and a CDN script tag are not loading the same artifact, so a bug that reproduces in one consumer path may not reproduce in another. The package sets `sideEffects` to false and ships only the `es`, `src` and `dist` directories, which tells a bundler it may drop unused exports, but the choice of which of the three builds you get is made by your resolver rather than by you.

Test the entry point your users actually load. Debugging the src build while production serves dist will send you looking for a bug that is not there.

Shrinking Ramda means a shell redirect, a build step, and a file you install by hand

If `sideEffects: false` is not enough and you want a genuinely smaller Ramda, the build system offers partial builds driven by command line flags. The example given names three functions and redirects the result into a custom file.

`npm run --silent partial-build compose reduce filter > dist/ramda.custom.js`

The cost is stated in the next line: this requires Node or io.js installed and Ramda's dependencies installed, so `npm install` has to run first. What comes out is a file in `dist`, not a package, so nothing installs it for you. You are now maintaining a derived artifact and the list of functions it contains, and any call you add later has to be rebuilt before it resolves. A plain `npm run build` is the supported path for regenerating `es` and `src` plus the two `dist` files; the partial build is the opt-in extra step.

This is the tradeoff: you trade a maintained build list for bytes, and nothing checks the list for you.

Tests need mocha or testem installed globally, and a headless run names PhantomJS

The testing instructions assume globally installed tools rather than project dependencies. For the console path you install mocha with `npm install -g mocha` and then call `mocha` from the project root. If you have already run `npm install`, `npm test` gives you the detailed output instead.

For browsers the file points at testem, again with `npm install -g testem`, and describes livereloading tests across browsers with results landing in your terminal. The headless option is narrower than it looks: the only browser named for a fully headless run is PhantomJS, via `testem -l phantomjs`. No other headless browser is listed, so a CI image without PhantomJS has to install it or pick a different path.

The Makefile tightens this further. Its `test` target depends on `dist/ramda.js` and then calls `npm test`, so a test run triggers a build first. Its release targets run a local `xyz` binary with `--increment` against `[email protected]:ramda/ramda.git`, which means the release path needs SSH access to the repository, not just a token.

The introductions are blog posts, and the only in-repo recipes live in the wiki

Teaching Ramda is not something this repository does. The section that introduces the library is a list of six third-party posts: Introducing Ramda by Buzz de Cafe, Why Ramda? and Favoring Curry by Scott Sauyet, Why Curry Helps by Hugh Jackson, a Brian Lonsdorf talk called Hey Underscore, You're Doing It Wrong!, and Randy Coulman's Thinking in Ramda series.

What the repository itself offers is a link to the API documentation on ramdajs.com and a link to a Cookbook in the GitHub wiki, described as functions built from Ramda that you may find useful. The top level of the repository holds `source/`, `test/`, `dist/`, `lib/`, `repl`, `mod.ts`, `rollup.config.js` and `scripts/`, which is a code drop rather than a tutorial.

The consequence for a reader is that the decision to adopt or reject this library is not answerable from the repository. You would be reading a hosted site and a wiki page, and a Cookbook in a wiki is editable by anyone with access, so treat individual recipes as community material rather than reviewed guidance.

Editorial conclusion

Adopt Ramda when your team is willing to read its argument order before writing a line, and when currying earns its keep in the pipelines you actually build. Skip it if you need immutability enforced rather than encouraged. First thing to verify: whether the functions you depend on changed shape at 0.25, since the default export disappeared there and tutorials written against older releases will not compile against the current package.

Frequently asked questions

What is Ramda?

It describes itself as a practical functional library for JavaScript programmers. Its functions are automatically curried and their parameters are arranged so the data to be operated on is supplied last, which is what makes functional pipelines easy to build.

How does Ramda compare with lodash?

The project positions itself against general-purpose functional-flavored toolkits that suit multiple paradigms, and says it has a more focused goal: a library designed specifically for a functional programming style that never mutates user data. That passage does not name lodash.

What are the alternatives to Ramda for JavaScript?

The README's introduction does not name alternative libraries. What it links instead is the API documentation on ramdajs.com and a Cookbook wiki page of functions built from Ramda, plus six third-party introduction posts.

What is the origin of the name Ramda?

The project explains it as a sheep joke: the name is short and not already taken, and it could as easily have been `eweda` except that would force the phrase eweda lamb. Lambs, ewes and rams are defined for non-English speakers, and the file leaves open whether ramda is a grown-up lambda.

Official sources

  1. License: MIT
  2. Project website
  3. ramda/ramda on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/ramda-ramda.svg)](https://hysenlabs.com/projects/ramda-ramda)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/ramda-ramda.svg)](https://hysenlabs.com/projects/ramda-ramda)

Was this useful?