Changelog#
[0.5.1] - 2025-10-13#
Fixed#
Trait bounds (jacquard-common)
- Removed lifetime parameter from
XrpcRequesttrait, simplifying trait bounds - Lifetime now only appears on
XrpcEndpoint::Request<'de>associated type - Fixes issues with using XRPC types in async contexts like Axum extractors
Changed#
- Updated all workspace crates to 0.5.1 for consistency
jacquard-axumremains at 0.5.1 (unchanged)
jacquard-axum [0.5.1] - 2025-10-13#
Fixed#
- Axum extractor now sets the correct Content-Type header during error path.
[0.5.0] - 2025-10-13#
Added#
Agent convenience methods (jacquard)
- New
AgentSessionExttrait automatically implemented forAgentSession + IdentityResolver - Basic CRUD:
create_record(),get_record(),put_record(),delete_record() - Update patterns:
update_record()(fetch-modify-put),update_vec(),update_vec_item() - Blob operations:
upload_blob() - All methods auto-fill repo from session or URI parameter as relevant, and collection from type's
Collection::NSID
VecUpdate trait (jacquard)
VecUpdatetrait for fetch-modify-put patterns on array-based endpointsPreferencesUpdateimplementation for updating Bluesky user preferences- Enables simpler updates to preferences and other 'array of union' types
Typed record retrieval (jacquard-api, jacquard-common, jacquard-lexicon)
- Each collection generates
{Type}Recordmarker struct implementingXrpcResp Collection::Recordassociated type points to the markerget_record::<R>()returnsResponse<R::Record>with zero-copy.parse()- Response transmutation enables type-safe record operations
Examples
create_post.rs: Creating posts with Agent convenience methodsupdate_profile.rs: Updating profile with fetch-modify-putpost_with_image.rs: Uploading images and creating posts with embedsupdate_preferences.rs: Using VecUpdate for preferencescreate_whitewind_post.rs,read_whitewind_post.rs: Third-party lexiconsread_tangled_repo.rs: Reading git repo metadata from tangled.orgresolve_did.rs: Identity resolution examplespublic_atproto_feed.rs: Unauthenticated feed accessaxum_server.rs: Server-side XRPC handler
Documentation (jacquard)
- A whole host of examples added, as well as a lengthy explainer of the trait patterns.
[0.4.1] - 2025-10-13#
Added#
Collection trait improvements (jacquard-api)
- Generated
{Type}Recordmarker structs for all record types - Each implements
XrpcRespwithOutput<'de> = {Type}<'de>andErr<'de> = RecordError<'de> - Enables typed
get_recordreturningResponse<R::Record>
Changed#
- Minor improvements to derive macros (
jacquard-derive) - Identity resolution refinements (
jacquard-identity) - OAuth client improvements (
jacquard-oauth)
[0.4.0] - 2025-10-11#
Breaking Changes#
Zero-copy deserialization (jacquard-common, jacquard-api)
XrpcRequestnow takes a'delifetime parameter and requiresDeserialize<'de>- For raw data,
Response::parse_data()gives validated loosely-typed atproto data, whileResponse::parse_raw()gives the raw values, with minimal validation.
XRPC module moved (jacquard-common)
xrpc.rsis now top-level instead of undertypes- Import from
jacquard_common::xrpc::*notjacquard_common::types::xrpc::*
Response API changes (jacquard-common)
XrpcRequest::OutputandXrpcRequest::Errare associated types with lifetimes- Split response and request traits:
XrpcRequest<'de>for client,XrpcEndpointfor server - Added
XrpcRespmarker trait
Various traits (jacquard, jacquard-common, jacquard-lexicon, jacquard-oauth)
- Removed #[async_trait] attribute macro usage in favour of
impl Futurereturn types with manual bounds. - Boxing imposed by asyc_trait negatively affected borrowing modes in async methods.
- Currently no semver guarantees on API trait bounds, if they need to tighten, they will.
Added#
New crate: jacquard-axum
- Server-side XRPC handlers for Axum
ExtractXrpc<R>deserializes incoming requests (query params for Query, body for Procedure)- Automatic error responses
Lexicon codegen fixes (jacquard-lexicon)
- Union variant collision detection: when multiple namespaces have similar type names, foreign ones get prefixed (e.g.,
ImagesvsBskyImages) - Token types generate unit structs with
Displayinstead of being skipped - Namespace dependency tracking during union generation
generate_cargo_features()outputs Cargo.toml features with correct depssanitize_name()ensures valid Rust identifiers
Lexicons (jacquard-api)
Added 646 lexicon schemas. Highlights:
Core ATProto:
com.atproto.*com.bad-example.*for identity resolution
Bluesky:
app.bsky.*bluesky appchat.bsky.*chat clienttools.ozone.*moderation
Third-party:
sh.tangled.*- git forgesh.weaver.*- orual's WIP markdown blog platformpub.leaflet.*- longform publishingnet.anisota.*- gamified and calming take on blueskynetwork.slices.*- serverless atproto hostingtools.smokesignal.*- automationcom.whtwnd.*- markdown bloggingplace.stream.*- livestreamingblue.2048.*- 2048 gamecommunity.lexicon.*- community extensions (bookmarks, calendar, location, payments)my.skylights.*- media trackingsocial.psky.*- social extensionsblue.linkat.*- link boards
Plus 30+ more experimental/community namespaces.
Value types (jacquard-common)
RawDatatoDataconversion with type inferencefrom_data,from_raw_data,to_data, andto_raw_datato serialize to and deserialize from the loosely typed value data formats. Particularly useful for second-stage deserialization of type "unknown" fields in lexicons, such asPostView.record.
Changed#
generate_union()takes current NSID for dependency tracking- Generated code uses
sanitize_name()for identifiers more consistently - Added derive macro for IntoStatic trait implementation
Fixed#
- Methods to extract the output from an XRPC response now behave well with respect to lifetimes and borrowing.
- Now possible to use jacquard types in places like axum extractors due to lifetime improvements
- Union variants don't collide when multiple namespaces define similar types and another namespace includes them