idiolect

idiolect is a federated runtime for cross-schema interoperability on ATProto. It uses panproto as its schema and lens substrate. Records are signed and content-addressed; translations between records are lenses with formal get / put laws; and the sociotechnical layer above the lenses (recommendations, beliefs, verifications, deliberations) is itself a small set of ATProto lexicons (dev.idiolect.*).

The name comes from linguistics:

  • An idiolect is one party's choice of schemas, lenses, and conventions.
  • A dialect is the bundle of idiolects a community treats as canonical.
  • A language is the federated substrate over which idiolects and dialects meet, disagree, and slowly converge without a central arbiter.

This documentation covers the runtime; not the reasons it exists. For the underlying theory, see the project README and the deliberation lexicons.

Where to start

The documentation follows the Diátaxis structure:

  • The Tutorial walks through one example end to end: install, fetch a record, validate, apply a lens, run a verification, publish a recommendation. Read this first if you have not used idiolect before.
  • The Guides are task-oriented. Each guide answers a question of the form "how do I do X?". Reach for these when you know what you want to accomplish.
  • The Concepts explain the underlying model: the idiolect-dialect-language frame, the dev.idiolect.* lexicon family, lens semantics, the vocabulary knowledge graph, the observer protocol, and the lexicon-evolution policy. Read these when you want to understand why something is the way it is.
  • The Reference is the per-symbol detail: one page per crate, one page per lexicon, the CLI surface, the HTTP query API, and the stability policy.

Architecture

flowchart TB
    subgraph sources["Source of truth"]
        LEX["lexicons/dev/idiolect/*.json"]
        SPEC["*-spec/ (orchestrator, observer, verify, cli)"]
    end

    subgraph codegen["Codegen"]
        CG["idiolect-codegen<br/>emit · check · check-compat"]
    end

    subgraph emitted["Emitted surfaces"]
        RECS["idiolect-records (Rust)"]
        NPM["@idiolect-dev/schema (TS)"]
    end

    subgraph runtime["Runtime"]
        PDS[("ATProto PDS<br/>+ firehose")]
        IDX["idiolect-indexer"]
        ORC["idiolect-orchestrator"]
        OBS["idiolect-observer"]
        VER["idiolect-verify"]
        MIG["idiolect-migrate"]
        LENS["idiolect-lens"]
    end

    LEX --> CG
    SPEC --> CG
    CG --> RECS
    CG --> NPM

    PDS -->|commits| IDX
    IDX --> ORC
    IDX --> OBS
    OBS -->|observation records| PDS
    LENS -->|reads/writes records| PDS
    LENS --> MIG
    LENS --> VER

Lexicons under lexicons/dev/idiolect/ are the single source of truth. Rust types and TypeScript validators are derived from them. Three downstream crates carry a taxonomy of similarly-shaped items (the orchestrator's queries, the observer's methods, the verifier's runners). Each lives behind a declarative JSON spec in <crate>-spec/; codegen emits the wire-up, including the CLI dispatcher that fronts the orchestrator's queries.

Stability

idiolect is pre-1.0. Releases in the 0.x series may include arbitrary breaking changes between minor versions. Pin to an exact version if you depend on this project, and read the changelog before bumping. See Stability and versioning.