Observed since 20 Oct, 20:20 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Abjad Encoded ID – 128-bit IDs encoded as 32 consonant-only ASCII characters
Consonant-only encoding for 128-bit identifiers (ULID/UUID), designed for LLM contexts.
AEID encodes 128-bit values as 32-character ASCII strings using only 16 consonant letters (B C D F G H K L M N P R S T V W). No vowels means no accidental English words, eliminating semantic bias when LLMs handle IDs.
ULID: 01KC9R38FJH1XRVWJZBJRRCV5A
AEID: BCNRCFMCPCWDMMLRMTWDHWHSRCMKKSPP
| Problem | AEID Solution |
|---|---|
| LLMs hallucinate ID characters | 32-char redundancy enables LCS-based error recovery |
| Alphanumeric IDs form English words | Vowel-free alphabet makes word formation impossible |
| Non-Latin scripts destabilize LLM output | ASCII-only, no language switching |
| Rare characters waste tokens | All 256 byte-pairs are single BPE tokens |
pip install aeid # core
pip install aeid[pydantic] # + Pydantic support
from aeid import AEID
# Generate
a = AEID() # new with current timestamp
a = AEID.from_str("BCNRCFMCPCWDMMLRMTWDHWHSRCMKKSPP") # from AEID string
a = AEID.from_str("01KC9R38FJH1XRVWJZBJRRCV5A") # from ULID string
# Convert
str(a) # "BCNRCFMC..." AEID (32 chars)
a.ulid_str # "01KC9R38..." ULID (26 chars)
a.datetime # datetime(...) timestamp
a.to_uuid() # UUID(...)
int(a) # 128-bit integer
# All ULID factory methods work
AEID.from_datetime(dt)
AEID.from_timestamp(time.time())
AEID.from_uuid(uuid_obj)
AEID.from_int(value)
AEID.parse(any_format) # auto-detect AEID/ULID/hex/bytes/int
from aeid import encode, decode, resolve
encode(0x019b1381a1f2887b8df25f5cb1866caa)
# "BCNRCFMCPCWDMMLRMTWDHWHSRCMKKSPP"
decode("BCNRCFMCPCWDMMLRMTWDHWHSRCMKKSPP")
# 0x019b1381a1f2887b8df25f5cb1866caa
# LCS-based error recovery
resolve(corrupted_id, candidate_list)
from pydantic import BaseModel
from aeid import AEID
class Record(BaseModel):
id: AEID
r = Record(id="BCNRCFMCPCWDMMLRMTWDHWHSRCMKKSPP") # validates AEID
r = Record(id="01KC9R38FJH1XRVWJZBJRRCV5A") # validates ULID too
r.model_dump_json() # {"id": "BCNRCFMCPCWDMMLRMTWDHWHSRCMKKSPP"}
Each byte is mapped to a 2-character pair using a 256-entry lookup table:
byte value -> ALPHABET[high nibble] + ALPHABET[low nibble]
0x00 -> BB, 0x01 -> BC, ... 0xFF -> WW
16 bytes (128 bits) produce 32 characters. The encoding preserves sort order: lexicographic order of AEID strings matches the numeric order of the underlying values.
MIT
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 6 Mar 2026 | 3 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Public sponsor counts have not been collected. These signals belong to the repository owner.
github · 1 observations shown. Missing days are unknown.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-23 | 0 | 2026-10-23T18:51:31.2189402Z |
Observed since 20 Oct, 20:20 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:ee749e85214a090e78ad10ae2763f49f04a1eb6c3c68413dfca5824b2b6e1779