A set of utilities for working with the AT Protocol in Elixir.

Changelog#

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.7.0 - 2026-01-07#

Breaking Changes#

  • Atex.OAuth.Plug now raises Atex.OAuth.Error exceptions instead of handling error situations internally. Applications should implement Plug.ErrorHandler to catch and gracefully handle them.
  • Atex.OAuth.Plug now saves only the user's DID in the session instead of the entire OAuth session object. Applications must use Atex.OAuth.SessionStore to manage OAuth sessions.
  • Atex.XRPC.OAuthClient has been overhauled to use Atex.OAuth.SessionStore for retrieving and managing OAuth sessions, making it easier to use with not needing to manually keep a Plug session in sync.

Added#

  • Atex.OAuth.SessionStore behaviour and Atex.OAuth.Session struct for managing OAuth sessions with pluggable storage backends.
    • Atex.OAuth.SessionStore.ETS - in-memory session store implementation.
    • Atex.OAuth.SessionStore.DETS - persistent disk-based session store implementation.
  • Atex.OAuth.Plug now requires a :callback option that is a MFA tuple (Module, Function, Args), denoting a callback function to be invoked by after a successful OAuth login. See the OAuth example for a simple usage of this.
  • Atex.OAuth.Permission module for creating AT Protocol permission strings for OAuth.
  • Atex.OAuth.Error exception module for OAuth flow errors. Contains both a human-readable message string and a machine-readable reason atom for error handling.
  • Atex.OAuth.Cache module provides TTL caching for OAuth authorization server metadata with a 1-hour default TTL to reduce load on third-party PDSs.
  • Atex.OAuth.get_authorization_server/2 and Atex.OAuth.get_authorization_server_metadata/2 now support an optional fresh parameter to bypass the cache when needed.

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.