jabber
v1.6.0
Published
Pronounceable lorem ipsum alternative — fake words, names, emails and paragraphs, with zero dependencies.
Downloads
26,978
Maintainers
Readme
Jabber

Generate pronounceable fake words, names, emails and paragraphs that read like a real language — with zero dependencies. Unlike lorem ipsum, you can steer the output toward your own vocabulary with theme words.
Jabber builds words by alternating consonants and vowels, so everything it produces is
sayable — lisuda, qikan, mubo hiru yug — rather than repeating the same Latin
boilerplate on every page.

Try it live: CodeSandbox (JavaScript) · StackBlitz (TypeScript)
Why Jabber?
| | Jabber | lorem-ipsum | @faker-js/faker |
| --- | --- | --- | --- |
| Runtime dependencies | none | none | none |
| Unpacked size | 15.7 kB | 40 kB | 2.9 MB |
| Output | invented, pronounceable words | fixed Latin corpus | real words from locale data |
| Steer output to your own vocabulary | yes, via theme words | no | limited |
| Realistic structured data (addresses, dates, IBANs…) | no | no | yes |
Sizes are npm's reported unpacked size for lorem-ipsum 3.0.0 and @faker-js/faker 10.6.0 at the time of writing.
Reach for Jabber when you want filler text that looks like a language without looking
like every other lorem ipsum block, and when you want a fraction of it to be your own
domain vocabulary. Reach for faker when you need genuinely realistic structured data.
Installation
npm install jabberWorks in Node.js and in the browser. No runtime dependencies.
Quickstart
const Jabber = require("jabber");
const jabber = new Jabber();
jabber.createWord(6); // "lisuda"
jabber.createWord(5, true); // "Qikan"
jabber.createFullName(); // "Mr. Cepoz Jo"
jabber.createEmail(); // "[email protected]"
jabber.createParagraph(30);
// "Dupedo huyu lubil ducona belub qegorukup fad polisi mubo hiru yug. Mirucara cak
// falu cacunubuq juca. Hudur puki licucu kudabi lo re binu temuper zimemis yuc
// modutama tarab bogeraroda tolin."Importing
Jabber is written in TypeScript and ships its own type declarations. Every import style works:
// CommonJS
const Jabber = require("jabber");// TypeScript / ES modules
import Jabber from "jabber";
// or, equivalently
import Jabber = require("jabber");Upgrading from 1.5.x or earlier? Those builds used
export default, which compiles toexports.default, sorequire("jabber")returned{ default: [class Jabber] }andnew Jabber()threwTypeError: Jabber is not a constructor. As of 1.6.0require("jabber")returns the class directly.require("jabber").defaultstill resolves to the same class, so existing code keeps working.
Command line
No install needed — run it straight through npx:
npx jabber -w 9 # one 9-letter word
npx jabber -p 25 # a paragraph of 25 words
npx jabber -h # help| Flag | Description |
| --- | --- |
| -w <length> | Create a word of the given length |
| -p <words> | Create a paragraph of the given number of words |
| -h | Show help (also the default with no arguments) |
The CLI covers words and paragraphs. Names, emails, theme words and custom alphabets are available through the API.
API
new Jabber(themeWords?, themeWordDensity?, extraVowels?, extraConsonants?)
| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| themeWords | string[] | [] | Custom words that should appear in the output |
| themeWordDensity | number | 3 | Roughly 1 theme word per this many words |
| extraVowels | string | "" | Additional vowel characters |
| extraConsonants | string | "" | Additional consonant characters |
Methods
| Method | Returns | Description |
| --- | --- | --- |
| createWord(length, capitalize?, avoidThemeWords?) | string | A word of length characters. capitalize (default false) uppercases the first letter. avoidThemeWords (default false) forces a generated word even when theme words are configured. |
| createParagraph(words) | string | A paragraph of words words, split into sentences with capitalised openings and a trailing period. |
| createFullName(salutation?) | string | A two-part name. salutation (default true) prefixes a random Mr. or Ms. . Never uses theme words. |
| createEmail(customDomain?) | string | An address of the form word.word@domain. customDomain defaults to domain.com. Never uses theme words. |
const jabber = new Jabber();
jabber.createFullName(); // "Mr. Cepoz Jo"
jabber.createFullName(false); // "Dolano Bucigulabu"
jabber.createEmail(); // "[email protected]"
jabber.createEmail("jabber.io"); // "[email protected]"Theme words
Theme words make filler text look like it belongs to a subject instead of reading as pure nonsense. Pass them to the constructor with a density:
const themeWords = [
"Engagement",
"Impressions",
"Organic",
"Reach",
"Social graph",
];
const jabber = new Jabber(themeWords, 2);
jabber.createWord(6, true); // "Impressions"
jabber.createParagraph(25);
// "Social graph Social graph nucene toreveb. Impressions jokuzonak. Culubo. Nutibopuw
// Organic bedu Organic cocucajame Organic kucebuvi Engagement Engagement Impressions
// Impressions Impressions pepobanif muhor. Genejuja Reach nif mepumeluci."themeWordDensity is a 1-in-N chance per word, so lower means denser:
| Density | Chance any given word is a theme word |
| --- | --- |
| 1 | 100% — theme words only |
| 2 | 50% — every other word |
| 3 (default) | ~33% |
| 10 | 10% |
| 100 | 1% |
Two things to know:
- A returned theme word ignores the
lengthyou asked for —createWord(6)may hand back"Social graph". Theme words are used verbatim. - Pass
avoidThemeWordsas the third argument when you need a generated word regardless:jabber.createWord(6, false, true)→"padazu","lunora","durize". This is whycreateFullName()andcreateEmail()never contain theme words.
Custom alphabets
The built-in alphabet is English. Add characters to shift the flavour of the output — useful for mocking up interfaces in another language:
// extra vowels "äöü", extra consonant "ß"
const jabber = new Jabber([], 3, "äöü", "ß");
jabber.createWord(8);
// "türabikü", "locäweco", "zicaheca", "cejumaju", "cätäbuco"Characters are appended to the existing sets, so the more you add, the more often they appear relative to the defaults.
Notes and limitations
- Output is not reproducible. Jabber uses
Math.random()with no seeding, so every call differs. If you need stable values for snapshot tests, capture the output once and store it as a fixture. - Not cryptographically secure.
Math.random()is not a CSPRNG. Never use Jabber to generate passwords, tokens, secrets or identifiers that must be unguessable. - Words are not real words. That is the point, but it means the output will not pass a spellcheck and is unsuitable where real dictionary words are required.
Performance
Jabber is extremely light weight, which makes it very performant.

Contributing
Issues and pull requests are welcome at dejavu1987/jabber. See CONTRIBUTING.md for setup, project layout and pull request guidelines, and CODE_OF_CONDUCT.md for community expectations.
git clone https://github.com/dejavu1987/jabber.git
cd jabber
npm install
npm test # run the test suite
npm run test-coverage # run with a coverage report
npm run build # compile TypeScript to build/Contributors
Thank you to everyone who has put work into Jabber.
Avatar grid generated by contrib.rocks — it updates itself as new contributors land, and links through to the full contributors graph.
Special thanks to @Revadike, who spotted and fixed a formatting slip in these very docs (a333729) — small fixes to documentation are genuinely appreciated.
Routine dependency bumps are handled by Dependabot, which is why it appears in the commit log but not in the grid above.
Release history
See releases and tags for the full list.
- 1.6.0 —
require("jabber")now returns the class directly; dropped thecoverallsdependency chain and cleared allnpm auditfindings; the published package no longer shipssrc/or the test file - 1.5.2 – 1.5.3 — dependency updates
- 1.5.1 — TypeScript support (demo)
- 1.2.0 — added
createFullName,createEmailand theavoidThemeWordsflag
License
MIT © Anil Maharjan
