secryst

n. coined from scrying + crystal — to gaze into an opaque script and see its hidden reading.

Reveal the hidden reading
of a script.

The vowels, phonemes, and word boundaries live in the reader’s mind — not on the page. Secryst is a family of local, deterministic runtimes that make a text speak: vocalization, diacritization, grapheme-to-phoneme. No cloud, no LLM, no telemetry.

Arabic · diacritization

قدر

قَدَر

qadar — fate, measure

Hebrew · vocalization

ספר

סֵפֶר

sefer — book

Khmer · phonemization

ភាសា

pheasaea

language

The scrying stone

One name, one job

Scrying is divination by gazing into an opaque medium — a crystal — to see what is concealed. Undiacritized Arabic, nikud-less Hebrew, unvocalized Khmer, unsegmented Thai are exactly such surfaces: the reading exists, the glyphs withhold it. Secryst holds the polished stone to the page.

The crystal is an ONNX model you hold in your hand: sha256-verified on load, cached locally, run in-process. Ruby, Python, and TypeScript crystals implement one contract and are diffed against each other on shared golden sets.

The crystal family

Three crystals, one contract

Ruby

gem 'secryst'

Pure-Ruby inference via ONNX; the original crystal, born here in 2020. The modernized v1 line rides PR #47.

github.com/secryst/secryst

Python

pip install secryst

The reference crystal: it generates the golden sets the others are diffed against. Byte-level ByT5 inference, IMF v1 loading, verified cache.

github.com/secryst/secryst-py

TypeScript

npm i @secryst/ml onnxruntime-node

Node crystal for the interscript-js ecosystem; onnxruntime-node stays an optional peer so index consumers stay light.

github.com/secryst/secryst-ts

The contract

interscript-ml

Standards get descriptive names; crystals get evocative ones. The interscript-ml contract defines what a hidden reading is — the models.yaml index, the IMF v1 model-zip format (member sha256s verified on load), and the golden sets. Every crystal resolves the same ids, verifies the same checksums, and must reproduce the same outputs.

        models.yaml  ·  IMF v1  ·  golden sets
        ┌──────────────────────────────────────┐
        │        the interscript-ml contract   │
        └──────┬───────────┬───────────┬───────┘
               │           │           │
          gem secryst  pip secryst  @secryst/ml
           (Ruby)       (Python)    (TypeScript)

Environment: SECRYST_INDEX (index URL or path) and SECRYST_CACHE (default ~/.cache/secryst). Cache hits are re-verified — a corrupt file never loads silently.

In the index

Models you can scry with

idwhat it reveals
khm-latn-1.0Khmer text → Latin reading
tha-g2p-baseThai → IPA phonemes
tha-g2p-smallThai → IPA phonemes (compact)
heb-diacHebrew consonants → full nikud
urd-diacUrdu → vocalized Urdu
urd-g2pUrdu → phonemes

Model ids resolve through the models.yaml index; more families (Arabic diacritization, Persian G2P) are in release preparation.

Relation

Of Interscript, not in it

Interscript defines interoperable transliteration maps. But maps assume vocalized input: undiacritized text cannot be transliterated unambiguously. Secryst is the phonological layer underneath — independent (a crystal serves any TTS or G2P use with zero interscript dependency), related by contract, diffed on goldens.

Interscript defines what a hidden reading is.
Secryst is how you reveal it, in-process.