{"id":49146309,"url":"https://github.com/idiolect-dev/idiolect","last_synced_at":"2026-04-28T04:00:37.167Z","repository":{"id":352977618,"uuid":"1217455690","full_name":"idiolect-dev/idiolect","owner":"idiolect-dev","description":"Mutual intelligibility for schema idiolects.","archived":false,"fork":false,"pushed_at":"2026-04-27T01:29:10.000Z","size":992,"stargazers_count":6,"open_issues_count":19,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-27T03:02:29.960Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://idiolect.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/idiolect-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-21T22:50:48.000Z","updated_at":"2026-04-27T01:25:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"f3d332f8-264a-4a33-9970-69c8e7fc943b","html_url":"https://github.com/idiolect-dev/idiolect","commit_stats":null,"previous_names":["idiolect-dev/idiolect"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/idiolect-dev/idiolect","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiolect-dev%2Fidiolect","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiolect-dev%2Fidiolect/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiolect-dev%2Fidiolect/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiolect-dev%2Fidiolect/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/idiolect-dev","download_url":"https://codeload.github.com/idiolect-dev/idiolect/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idiolect-dev%2Fidiolect/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32365519,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"online","status_checked_at":"2026-04-28T02:00:07.250Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-22T04:03:33.947Z","updated_at":"2026-04-28T04:00:37.119Z","avatar_url":"https://github.com/idiolect-dev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\".github/assets/wordmark-dark.svg\"\u003e\n  \u003cimg src=\".github/assets/wordmark.svg\" alt=\"idiolect\" height=\"140\"/\u003e\n\u003c/picture\u003e\n\n\u003cp\u003e\u003cstrong\u003eMutual intelligibility for schema idiolects.\u003c/strong\u003e\u003c/p\u003e\n\n\u003cp\u003e\n  \u003ca href=\"https://github.com/idiolect-dev/idiolect/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"CI\" src=\"https://github.com/idiolect-dev/idiolect/actions/workflows/ci.yml/badge.svg\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/idiolect-dev/idiolect/actions/workflows/release.yml\"\u003e\u003cimg alt=\"Release\" src=\"https://img.shields.io/github/v/release/idiolect-dev/idiolect?sort=semver\u0026label=release\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://crates.io/crates/idiolect-records\"\u003e\u003cimg alt=\"idiolect-records on crates.io\" src=\"https://img.shields.io/crates/v/idiolect-records?label=idiolect-records\u0026color=orange\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@idiolect-dev/schema\"\u003e\u003cimg alt=\"@idiolect-dev/schema on npm\" src=\"https://img.shields.io/npm/v/@idiolect-dev/schema?color=red\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/idiolect-dev/idiolect/blob/main/LICENSE\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/github/license/idiolect-dev/idiolect?color=blue\"/\u003e\u003c/a\u003e\n  \u003cimg alt=\"rustc 1.95+\" src=\"https://img.shields.io/badge/rustc-1.95%2B-blue\"/\u003e\n\u003c/p\u003e\n\n\u003c/div\u003e\n\n---\n\nIdiolect turns the linguistic distinction between *idiolects*, *dialects*, and *languages* into an\noperating model. An idiolect is one party's choice of schemas, lenses, and\nconventions; a dialect is the bundle of idiolects a community treats as\ncanonical; and a language is the federated substrate over which idiolects and\ndialects meet, disagree, and slowly converge without a central arbiter.\n\nArchitectural primitives are signed, content-addressed records on\n[ATProto](https://atproto.com); and schemas and translations between\nschemas are [panproto](https://github.com/panproto/panproto) artifacts. The\nproject ships reference runtimes, including a CLI, an orchestrator daemon, an observer\ndaemon, a verification runtime, and a migration library, on top of a small,\nset of ten `dev.idiolect.*` lexicons.\n\n## Quickstart\n\n```sh\n# CLI: resolve a DID and fetch a record.\ncargo install --path crates/idiolect-cli\nidiolect resolve did:plc:example\nidiolect fetch at://did:plc:example/dev.idiolect.bounty/3l5\n\n# Talk to a local orchestrator.\nidiolect orchestrator stats\nidiolect orchestrator adapters --framework hasura\n\n# TypeScript: validate incoming records at an appview boundary.\nbun add @idiolect-dev/schema\n```\n\n```ts\nimport { NSIDS, isRecord, type Encounter } from \"@idiolect-dev/schema\";\n\nif (isRecord(NSIDS.encounter, payload)) {\n  const e: Encounter = payload;\n  console.log(e.kind);\n}\n```\n\n## Crates\n\n| Crate                          | What it is                                                                |\n| ------------------------------ | ------------------------------------------------------------------------- |\n| [`idiolect-records`][recs]     | Serde record types mirroring the `dev.idiolect.*` lexicons. Generated.    |\n| [`idiolect-codegen`][cg]       | Lexicon-driven Rust + TypeScript emitter. Drives the drift gate.          |\n| [`idiolect-lens`][lens]        | Resolve `PanprotoLens` records; run `apply_lens` / `apply_lens_put`.      |\n| [`idiolect-identity`][id]      | DID resolution (`did:plc` via plc.directory, `did:web` via well-known).   |\n| [`idiolect-indexer`][idx]      | Firehose consumer: `EventStream` + `RecordHandler` + `CursorStore`.       |\n| [`idiolect-oauth`][oauth]      | Panproto schema + store trait for atproto OAuth session state.            |\n| [`idiolect-observer`][obs]     | Fold encounter-family records into `dev.idiolect.observation` records.    |\n| [`idiolect-orchestrator`][orc] | Catalog + read-only HTTP query API over cataloged records.                |\n| [`idiolect-verify`][ver]       | Verification runners (`roundtrip-test`, `property-test`, `static-check`). |\n| [`idiolect-migrate`][mig]      | Schema diff (panproto-check) + lens-based record migration.               |\n| [`idiolect-cli`][cli]          | Command-line tool wrapping the library crates.                            |\n| [`@idiolect-dev/schema`][npm]      | TypeScript validators, types, and NSID constants (same lexicons).         |\n\n[recs]: crates/idiolect-records\n[cg]: crates/idiolect-codegen\n[lens]: crates/idiolect-lens\n[id]: crates/idiolect-identity\n[idx]: crates/idiolect-indexer\n[oauth]: crates/idiolect-oauth\n[obs]: crates/idiolect-observer\n[orc]: crates/idiolect-orchestrator\n[ver]: crates/idiolect-verify\n[mig]: crates/idiolect-migrate\n[cli]: crates/idiolect-cli\n[npm]: packages/schema\n\n## Architecture in one paragraph\n\nThe lexicons under `lexicons/dev/` are the single source of truth. Rust types\n(`idiolect-records`) and TypeScript validators (`@idiolect-dev/schema`) are\nderived via `idiolect-codegen`. CI rejects any PR whose generated output\ndisagrees with the lexicons. \n\nFour crates with a taxonomy of similarly-shaped items–the orchestrator's queries, \nthe observer's methods, the verifier's\nrunners, and the CLI's subcommands–each live behind a declarative JSON\nspec (`\u003ccrate\u003e-spec/`) validated against its own atproto-shaped lexicon.\nCodegen emits the wire-up while hand-written predicates and semantics supply\nthe business logic. \n\nRuntime state that must not federate (firehose cursors,\nOAuth tokens) rides the same panproto schema apparatus as everything else,\nflagged under `dev.idiolect.internal.*` so conformant firehose consumers\nskip it.\n\n## Install\n\nBinaries for every release are published to the\n[releases page](https://github.com/idiolect-dev/idiolect/releases), signed\nwith sigstore keyless. Container images for the daemons ship to\n`ghcr.io/idiolect-dev/orchestrator` and `ghcr.io/idiolect-dev/observer`. See\n[`docs/deployment.md`](docs/deployment.md) for operator-facing setup,\n[`docs/ci-cd.md`](docs/ci-cd.md) for artifact verification, and\n[`RELEASE.md`](RELEASE.md) for the release cadence.\n\n## Stack\n\n- **Rust:** edition 2024, toolchain 1.95, resolver 3, cargo-nextest.\n- **TypeScript:** bun 1.2, biome 2.3, tsc 5.7.\n- **Monorepo:** moon for polyglot task orchestration and toolchain pinning.\n\n## Getting started as a contributor\n\n```sh\n# One-off setup.\nmoon :setup\n\n# The common loops.\nmoon :build         # build everything\nmoon :test          # run every test\nmoon :lint          # fmt + clippy + biome + tsc\n\n# Regenerate after editing a lexicon or a spec.\ncargo run -p idiolect-codegen -- generate\n```\n\nBefore opening a PR, confirm `cargo fmt --all`, `cargo clippy --workspace\n--all-targets -- -D warnings`, `cargo test --workspace`, and `bun run lint\n\u0026\u0026 bun run typecheck \u0026\u0026 bun run test` all pass. CI runs the same commands\nplus a lexicon breaking-change gate against the PR's merge base.\n\n## Contributing\n\nIssue templates and the PR template under `.github/` are the canonical route\nfor reports and proposals. The project holds opinionated architectural\ncommitments; consult the [feature-request template](.github/ISSUE_TEMPLATE/feature.yml)\nif you are unsure whether a capability fits before opening.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidiolect-dev%2Fidiolect","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fidiolect-dev%2Fidiolect","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidiolect-dev%2Fidiolect/lists"}