Basepura is an encoding scheme that converts integers into human-readable strings while preventing accidental offensive words in Latin alphabet languages. This npm package provides a dependency-free TypeScript implementation.
Standard base-N encoding schemes (Base32, Base36, Base64 etc.) can inadvertently generate offensive substrings when creating public-facing identifiers. Crockford's Base32 partially addresses this but still permits problematic words like twat and merde. Removing vowels is insufficient as obscenities like zmrd (fucker in Czech/Slovak) and acronyms like BDSM remain possible. Digits also enable leetspeak variants (sh1t, 0rg4sm).
Basepura uses a carefully selected character set to minimize offensive word generation. The encoding has been verified against offensive terms in over 20 languages.
BCDGHJKLNPQRSTWZbcdghjklnpqrstwz (32 characters)
| Characters | Reason for exclusion |
|---|---|
A, a |
fag, twat... |
E, e |
sex, merde... |
F, f |
WTF, af... |
I, i |
clit, dick... |
M, m |
BDSM, zmrd... |
O, o |
homo, sodomy... |
U, u |
fuck, cunt... |
V, v |
Resemble U, u |
X, x |
xxx, shxt... |
Y, y |
dirty, doggy... |
npm i basepura
import { encode, decode, isBasepura } from 'basepura';
// Encoding a bigint
const numberToEncode = 12345678901234567890n;
const encodedString = encode(numberToEncode);
console.log(`Encoded ${numberToEncode} to: ${encodedString}`);
// Encoded 12345678901234567890n to: QkjJPcgjcwDkd
// Validating a string
const validString = 'QkjJPcgjcwDkd';
const invalidString = 'Hello123';
console.log(`Is ${validString} valid Basepura? ${isBasepura(validString)}`);
// Is QkjJPcgjcwDkd valid Basepura? true
console.log(`Is ${invalidString} valid Basepura? ${isBasepura(invalidString)}`);
// Is Hello123 valid Basepura? false
// Decoding a string
const stringToDecode = 'QkjJPcgjcwDkd';
const decodedNumber = decode(stringToDecode);
console.log(`Decoded ${stringToDecode} to: ${decodedNumber}`);
// Decoded QkjJPcgjcwDkd to: 12345678901234567890n
// Handling errors
try {
decode('Invalid');
} catch (e) {
console.error(e);
// RangeError: Invalid character in input.
}
try {
encode(-1n);
} catch (e) {
console.error(e);
// RangeError: Input must be a non-negative integer.
}MIT