Changelog

View Source

All notable changes to atex will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.9.1 - 2026-04-17

Fixed

  • Fix a problem with error struct generation with some lexicons in deflexicon.

0.9.0 - 2026-04-16

Breaking Changes

  • Atex.NSID is now a struct (%Atex.NSID{authority, name, fragment}). Public functions now accept and return structs. You can use new/1, new!/1 or the new ~NSID"" for constructing from a NSID string.

Added

  • Atex.Repo module for building, mutating, signing, serialising, and loading AT Protocol repositories. Also supports lazily streaming from a CAR binary for efficient processing of large repository exports.
  • Atex.XRPC.UnauthedClient module for running unauthenticated XRPC fetches on public APIs or PDSes.
  • Atex.Lexicon.Resolver module for resolving published lexicons by NSID, following the publication and resolution spec.
  • mix atex.lexicons.resolve task for resolving one or more lexicons by NSID and writing to a JSON file.
  • Sigils for Atex.AtURI and Atex.TID, ~AT"at://..." and ~TID"..." respectively.
  • /logout route for Atex.OAuth.Plug to revoke the current session, as well as Atex.OAuth.Plug.revoke_session/2 to revoke a conn's session programmaticly (e.g. from a session management dashboard).
  • deflexicon now generates structs for errors defined by queries and procedures, under a Errors submodule.
  • deflexicon generated models now have a coerce_error/1 function that takes in a map and tries to convert it to one of its known error structs.
  • Atex.XRPC.Error struct for wrapping XRPC error responses, including both known errors (with typed error_struct) and unknown errors.

Fixed

  • Fix issue when trying to validate OAuth authorisation codes in localhost mode on PDS implementations that are more strict than the Bluesky reference implementation.

0.8.0 - 2026-03-29

Breaking Changes

  • The Atex.IdentityResolver config key has been replaced with a flat config option. Update your config from:

      config :atex, Atex.IdentityResolver,
        directory_url: "https://plc.directory"

    to:

      config :atex,
        plc_directory_url: "https://plc.directory"
  • Atex.Config.IdentityResolver has been renamed to Atex.Config.

  • Atex.IdentityResolver.DIDDocument has been renamed to Atex.DID.Document.

  • Replace existing Atex.DID.Document.new/1 method with the method previously named from_json/1.

Added

Fixed

  • Fix a problem where generated %<LexiconId>.Params structs could not be passed to an XRPC call due to not having the Enumerable protocol implemented.
  • Correctly generate Input/Output submodules with from_json methods for queries and procedures that use ref or union types.

0.7.1 - 2026-02-06

Breaking Changes

  • Included Com.Atproto.* lexicon modules have been removed and put into atex_atproto instead.

Added

  • The PLC directory used for identity resolution can now be configured. See Atex.Config.IdentityResolve for more information. (Thanks @hexmani.ac!)
  • Add an extra optional opts parameter to some Atex.OAuth functions, to allow for better integration with other ecosystems. (Thanks @lekkice.moe!)

0.7.0 - 2026-01-07

Breaking Changes

Added

Changed

  • mix atex.lexicons now adds @moduledoc false to generated modules to stop them from automatically cluttering documentation.
  • Atex.IdentityResolver.Cache.ETS now uses ConCache instead of ETS directly, with a 1-hour TTL for cached identity information.

0.6.0 - 2025-11-25

Breaking Changes

  • deflexicon now converts all def names to be in snake_case instead of the casing as written the lexicon.

Added

  • deflexicon now emits structs for records, objects, queries, and procedures.
  • Atex.XRPC.get/3 and Atex.XRPC.post/3 now support having a lexicon struct as the second argument instead of the method's name, making it easier to have properly checked XRPC calls.
  • Add pre-transpiled modules for the core com.atproto lexicons.

0.5.0 - 2025-10-11

Breaking Changes

  • Remove Atex.HTTP and associated modules as the abstraction caused a bit too much complexities for how early atex is. It may come back in the future as something more fleshed out once we're more stable.
  • Rename Atex.XRPC.Client to Atex.XRPC.LoginClient

Added

  • Atex.OAuth module with utilites for handling some OAuth functionality.
  • Atex.OAuth.Plug module (if Plug is loaded) which provides a basic but complete OAuth flow, including storing the tokens in Plug.Session.
  • Atex.XRPC.Client behaviour for implementing custom client variants.
  • Atex.XRPC now supports using different client implementations.
  • Atex.XRPC.OAuthClient to make XRPC calls on the behalf of a user who has authenticated with ATProto OAuth.

0.4.0 - 2025-08-27

Added

  • Atex.Lexicon module that provides the deflexicon macro, taking in a JSON Lexicon definition and converts it into a series of schemas for each definition within it.
  • mix atex.lexicons for converting lexicon JSON files into modules using deflexicon easily.

0.3.0 - 2025-06-29

Changed

  • Atex.XRPC.Adapter renamed to Atex.HTTP.Adapter.

Added

  • Atex.HTTP module that delegates to the currently configured adapter.
  • Atex.HTTP.Response struct to be returned by Atex.HTTP.Adapter.
  • Atex.IdentityResolver module for resolving and validating an identity, either by DID or a handle.
    • Also has a pluggable cache (with a default ETS implementation) for keeping some data locally.

0.2.0 - 2025-06-09

Added

  • Atex.TID module for manipulating ATProto TIDs.
  • Atex.Base32Sortable module for encoding/decoding numbers as base32-sortable strings.
  • Basic XRPC client.

0.1.0 - 2025-06-07

Initial release.