# Emma: a terminal assistant for finding and installing packages

> Emma is a command line assistant that searches the npm and yarn package indexes from your terminal, lets you mark packages with the space bar and installs the whole selection in one go. The client is a small TypeScript program, but the interesting part of the repository is the server behind it, with a Postgres service and a Heroku deployment.

**maticzav/emma-cli** — 📦 Terminal assistant to find and install node packages.

- Repository: https://github.com/maticzav/emma-cli
- Stars: 1,245 · Forks: 42
- Language: TypeScript
- License: not declared
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/maticzav-emma-cli

## A picker for the package registry

Emma is a command line assistant which helps you search and install packages more efficiently from your CLI. The one-line pitch in the README is: install the package you are looking for.

The mechanism is a search interface over the package registries, and the search is powered by the Algolia search API. The terminal is the whole user interface, and the interaction is designed around the fact that finding a package is a search problem rather than a memorisation problem.

The feature list describes four capabilities. Peek definitions means the right arrow key gives you the description of the selected package, or peeks at its README. Scroll infinitely means you can search all the packages from NPM and Yarn from within the terminal, which is the difference between searching a registry and searching everything in it. Build the stack means you can search for multiple packages and install them with one keystroke. And discover starters gives you a set of project starters you can select from to scaffold a new project.

That third feature is the reason to care about the tool at all. Installing a project of five packages normally means five commands, and picking the right five means reading five sets of metadata. In Emma you search once, mark the ones you want, and install them together.

The project is written in TypeScript, published to npm as emma-cli, and the licence is MIT with the copyright line naming Matic Zavadlal. The last push was on 2026-10-13 and the repository is not archived.

## The keys, and what happens to your flags

The API section is a short control list, and it is the whole interface:

```
Usage
  $ emma

Controls:
  - space: toggle dependencies
  - up/down: scroll the list
  - right/left: hide or show details
  - double right: show repo
```

Space toggles a package into the set you are building, which is the mechanic behind the one-keystroke stack install. Up and down scroll the list, and because the search covers all the packages rather than a first page, scrolling is how you move through a large result set. Right and left show or hide the details pane, so you can widen the list when you are scanning and open it when you are reading. Double right opens the repository, which is the escape hatch for when the metadata is not enough.

One line in that section matters more than it looks: all flags after emma are forwarded to the installer. So the tool is not a replacement for the package manager, it is a front end to it, and anything you would normally type after the install command still works.

Installing the tool gives you two global commands, ema and emma, so you can use whichever you remember. The two names are the same program with two entry points, which is a small convenience that matters for a tool you invoke dozens of times a day.

## Three ways in

There are three documented invocations, and they cover three different needs.

To use the tool without installing it, run it through npx:

```bash
npx emma-cli
```

To install it globally, the documented command is:

```bash
yarn global add emma-cli
```

And to scaffold a new project from the starters, the command is:

```bash
yarn create emma
```

That last one is the entry point for the starters feature, and it is the piece that would make a new project faster in a way the search alone does not.

The example in the README shows the intended flow. You type emma, the search prompt shows the term you are typing against the yarn package index, and the result list appears with the weekly download counts next to each package, sorted so that the most used ones are at the top. The selected row is marked, and the details pane shows the package metadata, the dependencies and devDependencies, and an installation section. Choosing the packages and pressing the install action produces a dependencies installed confirmation, and the session ends with the note that the search is powered by Algolia.

That download count column is the sort key that makes the tool usable at scale. When two packages have the same name, the one with sixteen million weekly downloads is almost always the one you want, and having that number next to the name removes a round trip to the registry page for every candidate.

## The client is small, the search service is the real project

The repository layout shows that Emma is a monorepo with a client and a server, and the server is the interesting half.

The root package.json is a private workspace named emma, with Yarn workspaces covering packages/* and server, and Lerna as the monorepo tool. The build script is node scripts/build.js, the tests are Jest with ts-jest, and the coverage script calls codecov.

The server/ directory is the search backend. The Dockerfile in the repository root shows how it is assembled: it starts from the heroku/heroku:18 image, installs Node 13 and Yarn from their own package sources, copies the repository, runs yarn install, and then has a step labelled Build Photon that runs./scripts/generate.sh. The final command starts the built server through probot, running server/dist/index.js.

 The docker-compose.yml runs a Postgres service on postgres:10.3 with the credentials prisma, prisma and prisma, with the data on a named volume. The Prisma credentials line up with a Prisma-backed data layer.

So the shape is: a small terminal client that queries a search API, and a search service that indexes the package metadata so that the client can search across everything rather than paginating the registry. The Algolia search API is what the client talks to.

The rest of the tree is the supporting material: templates/ for the project starters, media/ for the demo images, a.circleci/ directory for the continuous integration badge,.huskyrc.json and.nvmrc and.yarnrc for the local toolchain, prettier.config.js, jest.config.js, renovate.json for the dependency updates, a Dockerfile and heroku.yml for the deployment, and a codecov.yml.

## The related project, and the age of the code

The README links one related project, ibrew, described as an interactive CLI to find and install homebrew packages. It is the same idea applied to a different ecosystem, which is a fair comparison: a package picker is useful wherever the registry's own search is bad.

The more important thing to note is the age of the code. The published releases are v2.0.1 from 2019-03-20, v2.0.2 from 2019-04-14 and v2.1.0 from 2019-05-03, and the root package.json pins the development toolchain to that era: TypeScript 3.7.2, Jest 24, ts-jest 24, ts-node 8.5.2, tslint 5.20.1, Prettier 1.19.1, husky 3.0.9 and lerna 3.18.4. The Dockerfile installs Node 13 and the base image is heroku/heroku:18, and the database is postgres:10.3.

The last push to the repository was on 2026-10-13, so somebody is still committing, but the released tool is from 2019 and the dependency tree is pinned to versions that predate most current Node releases. Expect to spend an afternoon bumping the toolchain before the project builds on a current machine, and expect the Heroku base image to be the first thing to replace.

The licence situation is worth a sentence too. The README states MIT with the copyright line naming the author, while the repository metadata does not list a licence at all, so the README is the statement to rely on.

The project is also funded through Open Collective, with backer and sponsor badges and a contributors graphic, which is a pattern from the era when this was written.

## Conclusion

Adopt Emma if you install packages often enough that scrolling through a flat npm search result list is a real cost, and you want the whole stack installed in one action rather than one command per package. Do not adopt it for a new project without checking the search service first, because the index is a server component that has to be running and current. Before you start, decide whether to use the hosted index or run your own, and note that the dependencies in the repository are from 2019, so expect to bump them before the tool will build on a current Node.

## FAQ

### What does Emma do in the terminal?

It is a command line assistant that helps you search and install packages more efficiently. You search the npm and yarn indexes, mark packages with the space bar, and install the whole selection at once, with the results carrying their download counts.

### How do I install and run Emma?

Run npx emma-cli to use it without installing, or yarn global add emma-cli to install it globally, which exposes two global commands, ema and emma. To scaffold a new project from the included starters, the command is yarn create emma.

### Which keys control Emma?

Space toggles a package into the set to install, up and down scroll the list, right and left hide or show the details pane, and double right opens the repository. All flags given after emma are forwarded to the installer.

### What is behind Emma's search?

The search is powered by the Algolia search API, and the repository contains a server/ workspace with a Build Photon step that runs the generate.sh script, and a docker-compose file running a Postgres database and a Dockerfile that starts the server through probot.

### Is Emma still maintained?

The repository is not archived and the last push was on 2026-10-13, but the published releases are from 2019, with v2.1.0 on 2019-05-03, and the development dependencies are pinned to that era, including TypeScript 3.7.2, Jest 24 and Node 13 in the Dockerfile. The licence is MIT per the README.

## Sources

- [Issues](https://github.com/maticzav/emma-cli/issues)
- [maticzav/emma-cli on GitHub](https://github.com/maticzav/emma-cli)
- [README](https://github.com/maticzav/emma-cli/blob/master/README.md)
- [Releases](https://github.com/maticzav/emma-cli/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/maticzav-emma-cli
