Catalog PyPI
PACKAGE EXPLORERView in registry

aeid

PyPI

Abjad Encoded ID – 128-bit IDs encoded as 32 consonant-only ASCII characters

Versions collected1
Direct dependencies3From release 0.1.0
Last observed20 Oct, 20:20 UTC

README

Version 0.1.0 documentation

AEID: Abjad Encoded ID

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

Why?

ProblemAEID Solution
LLMs hallucinate ID characters32-char redundancy enables LCS-based error recovery
Alphanumeric IDs form English wordsVowel-free alphabet makes word formation impossible
Non-Latin scripts destabilize LLM outputASCII-only, no language switching
Rare characters waste tokensAll 256 byte-pairs are single BPE tokens

Install

pip install aeid                # core
pip install aeid[pydantic]      # + Pydantic support

Usage

AEID class (extends ULID)

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

Low-level functions

from aeid import encode, decode, resolve

encode(0x019b1381a1f2887b8df25f5cb1866caa)
# "BCNRCFMCPCWDMMLRMTWDHWHSRCMKKSPP"

decode("BCNRCFMCPCWDMMLRMTWDHWHSRCMKKSPP")
# 0x019b1381a1f2887b8df25f5cb1866caa

# LCS-based error recovery
resolve(corrupted_id, candidate_list)

Pydantic

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"}

Encoding

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.

Specification

License

MIT

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.06 Mar 20263

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

ACCESSIBLE
nonogaki/aeid

Shared repository data · GitHub

License detected in repository
MIT
License branch / ref
main
Last push
1 Jun 2026
Archived
No
Contributor identities
— · partial collection

Public sponsor counts have not been collected. These signals belong to the repository owner.

Downloads & popularity

0count
Gauge · observed snapshots23 Oct 2026
10.50
2026-10-23: 0 · observed 2026-10-23T18:51:31.2189402Z
23 Oct23 Oct

github · 1 observations shown. Missing days are unknown.

View observed values
Date / source periodValueObserved at
2026-10-2302026-10-23T18:51:31.2189402Z

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 20:20 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:ee749e85214a090e78ad10ae2763f49f04a1eb6c3c68413dfca5824b2b6e1779