# oji: an interactive terminal tool for assembling text emoticons

> oji is a small Node command line program that walks you through building a text emoticon part by part, with inquirer prompting for each component and clipboardy and opn handling the copy and open steps. It is MIT licensed, its last release dates to 2018, and the way to extend it is a folder of text files in your home directory.

**xxczaki/oji** — (◕‿◕) Text Emoticons Maker

- Repository: https://github.com/xxczaki/oji
- Website: https://npmjs.com/package/oji
- Stars: 736 · Forks: 20
- Language: JavaScript
- License: MIT
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/xxczaki-oji

## A guided assembler rather than a symbol reference

oji is a text emoticons maker published to npm under the name oji, with the repository description describing it as a text emoticon maker and the package manifest giving the same tagline. The README's usage instruction is one sentence: just type oji to start the interactive emoticon creator, and it claims to work on every platform. The word that carries the design here is interactive. Rather than documenting a table of faces to copy from, the program walks the user through the parts of a face, one prompt at a time, and assembles the result. The topics attached to the repository give a sense of the vocabulary it uses, including kaomoji and lenny face alongside the general emoji and emoticon terms, and the dependency on inquirer, the terminal prompt library, is the clearest evidence for how the interaction is built. For someone who has seen kaomoji and never worked out which characters produce which shape, that guided path is the entire value proposition, and the whole program fits in a handful of files: a bin directory for the CLI entry point and a lib directory for the logic.

## Installing and running it

Installation is a single global npm install, which the README presents under its installation heading with the command:

```bash
npm i -g oji
```

There is nothing else to configure. The package manifest registers the executable through a bin entry that points at ./bin/cli, and it sets preferGlobal to true, which tells npm the package expects a global installation rather than a local dependency in a project. The manifest also lists the author as Antoni Kepinski and the licence as MIT, and the README carries a MIT license section of its own, so the reuse terms for the code are clear. The npm page for the package is what the repository points to as its homepage. One detail worth noting is that the manifest declares no engines field, so npm will not warn you when the version of Node you have is newer than anything the package was written against, which leaves the compatibility question for you to check at install time rather than at resolution time.

## Extending it with a ~/.oji folder of text files

The extension mechanism is the most useful thing in the README, and it is documented under a heading about making the tool your own. You can add custom characters for each part by creating an optional ~/.oji directory in your root path, and add new characters to each section by creating a file named ~/.oji/{file}.txt with one of the corresponding filenames. Nine section names are listed: arms_symmetric, arms_left, bodies_symmetric, bodies_left, cheeks, eyes, mouths_noses, bodies_right and arms_right. The naming makes the internal structure legible. A symmetric section supplies a left and right variant that mirror each other, while the left and right variants let a user pick an asymmetric shape, and the mouth and nose characters share one section because the two features are drawn together. Because the extension is plain files in a known directory rather than a plugin API, you can add a character without touching JavaScript, which is the same reason the extension has no versioning or validation layer. The README does not document the file format beyond the filenames, so the format has to be inferred from the tool's own output.

## The dependency list is the design in miniature

The manifest lists six runtime dependencies, and each one tells you something about how the program behaves. chalk at version 2 handles coloured terminal output, log-symbols at version 2 provides the success and error symbols, inquirer at version 6 is the prompt framework the interactive flow is built on, clipboardy at version 1 handles copying the finished emoticon to the system clipboard, and opn at version 5 opens a file or URL with the default system handler. That last pair is the one most likely to surprise on a modern desktop, since clipboardy 1 and opn 5 predate the current versions of those packages and carry dependencies that later releases replaced for Node compatibility. The library behind the picker is therefore old in absolute terms, and a team adopting oji today inherits that era of the ecosystem whether they want it or not. The development side is minimal: xo is the only dev dependency, and the test script runs xo, so what passes as a test suite is a linter check in the XO style rather than a set of behavioural tests.

## Where this is the wrong tool

Several boundaries are visible in the repository itself. There is no programmatic API for generating an emoticon from code, so oji cannot be embedded in a generator, a chat bot or a build step; it is an interactive terminal program and that is all. The extension point is likewise local to the machine, since the custom characters live in a single home directory and are not shared through the package. The dependency set assumes a desktop with a clipboard and a file opener, which rules out a bare container or a headless CI runner. The maintenance picture is the clearest limit of all. The last push to the repository was on 2026-04-30, and the tagged releases are 3.2.1 from 2018-05-19, 3.2.0 from 2018-04-18 and 3.1.0 from 2018-03-10, while the manifest itself declares version 3.2.3. In other words, the source tree, the published releases and the manifest version do not line up, and the newest thing on npm is several years behind the source. The project is not archived, and the repository still carries the usual community files such as CONTRIBUTING.md, ISSUE_TEMPLATE.md and CODE_OF_CONDUCT.md, but the cadence of actual releases stopped in 2018.

## The alternative is a text file and a keyboard shortcut

The honest comparison here is not with another package but with the practice oji automates. Copying a face from a reference page means opening a browser tab, finding the character set, and pasting pieces together by hand, and the result is a string you then have to copy out of the browser into wherever it is going. oji replaces that with a terminal session, and its clipboardy and opn dependencies mean the finished emoticon can be placed on the clipboard or opened without leaving the session, which is the difference between a tool you use once and one you keep in your workflow. The in-repo alternative is even simpler: the custom part files are plain text, so a team that prefers to own the character set outright can keep a shared list of eyes and mouths in its own repository and paste from there, losing the picker but gaining version control and no runtime dependency at all. Given that oji's only output is a short text string, that trade is worth weighing on its merits rather than assumed.

## Conclusion

oji is a fun, low-risk fit for someone who wants a guided way to build text emoticons without memorising a symbol table, and for a team that wants a small internal tool with a documented extension point rather than a large dependency. It is the wrong tool for a production pipeline, for a project that needs a stable API surface, and for anyone who expects an actively developed package, since the last push to the repository was on 2026-04-30 while the newest tagged release is 3.2.1 from 2018-05-19 and the manifest itself reads 3.2.3, so the published and source versions have drifted apart. Verify first that the npm i -g oji install still runs on your Node version, since the manifest declares no engines field and pins dependency majors from an earlier era, and confirm that the ~/.oji files you add are plain text with one character per line before you expect the picker to show them.

## FAQ

### How do I install and run oji?

Install it globally with npm i -g oji, then just type oji to start the interactive emoticon creator. The package manifest maps the command to ./bin/cli and sets preferGlobal to true.

### How do I add my own characters to oji?

Create an optional ~/.oji directory in your home path and add a file named ~/.oji/{file}.txt for each section you want to extend. The listed section names are arms_symmetric, arms_left, bodies_symmetric, bodies_left, cheeks, eyes, mouths_noses, bodies_right and arms_right.

### What licence is oji released under?

MIT. The README has a License section stating MIT and the package manifest declares the same licence.

### What is the latest release of oji?

The tagged releases are 3.2.1 from 2018-05-19, 3.2.0 from 2018-04-18 and 3.1.0 from 2018-03-10, while the package manifest in the repository declares version 3.2.3 and the last push to the repository was on 2026-04-30.

### Does oji require a specific Node version?

The package manifest declares no engines field, so npm does not check a Node version at install time. Its dependencies are pinned to majors from an earlier era, including chalk 2, clipboardy 1, inquirer 6 and opn 5.

## Sources

- [License: MIT](https://github.com/xxczaki/oji/blob/master/LICENSE)
- [Project website](https://npmjs.com/package/oji)
- [README](https://github.com/xxczaki/oji/blob/master/README.md)
- [Releases](https://github.com/xxczaki/oji/releases)
- [xxczaki/oji on GitHub](https://github.com/xxczaki/oji)

---

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