···2233## [0.5.0] - 2025-10-13
4455-### Breaking Changes
66-77-**AgentSession trait** (`jacquard`)
88-- Removed `async fn` in favour of `impl Future` return types for better trait object compatibility
99-- Methods now return `impl Future` instead of being marked `async fn`
1010-1111-**XRPC improvements** (`jacquard-common`)
1212-- Simplified response transmutation for typed record retrieval
1313-- `Response::transmute()` added for zero-cost response type conversion
1414-1515-**jacquard-axum**
1616-- Removed binary target (`main.rs`), now library-only
1717-185### Added
196207**Agent convenience methods** (`jacquard`)
···229- **Basic CRUD**: `create_record()`, `get_record()`, `put_record()`, `delete_record()`
2310- **Update patterns**: `update_record()` (fetch-modify-put), `update_vec()`, `update_vec_item()`
2411- **Blob operations**: `upload_blob()`
2525-- All methods auto-fill repo from session and collection from type's `Collection::NSID`
2626-- Simplified bounds on `update_record` - no HRTB issues, works with all record types
1212+- All methods auto-fill repo from session or URI parameter as relevant, and collection from type's `Collection::NSID`
27132814**VecUpdate trait** (`jacquard`)
2915- `VecUpdate` trait for fetch-modify-put patterns on array-based endpoints
3030-- `PreferencesUpdate` implementation for updating user preferences
3131-- Enables type-safe updates to preferences, saved feeds, and other array endpoints
1616+- `PreferencesUpdate` implementation for updating Bluesky user preferences
1717+- Enables simpler updates to preferences and other 'array of union' types
32183333-**Typed record retrieval** (`jacquard-api`, `jacquard-common`)
1919+**Typed record retrieval** (`jacquard-api`, `jacquard-common`, `jacquard-lexicon`)
3420- Each collection generates `{Type}Record` marker struct implementing `XrpcResp`
3521- `Collection::Record` associated type points to the marker
3622- `get_record::<R>()` returns `Response<R::Record>` with zero-copy `.parse()`
···4228- `post_with_image.rs`: Uploading images and creating posts with embeds
4329- `update_preferences.rs`: Using VecUpdate for preferences
4430- `create_whitewind_post.rs`, `read_whitewind_post.rs`: Third-party lexicons
4545-- `read_tangled_repo.rs`: Reading git repo metadata from tangled.sh
3131+- `read_tangled_repo.rs`: Reading git repo metadata from tangled.org
4632- `resolve_did.rs`: Identity resolution examples
4733- `public_atproto_feed.rs`: Unauthenticated feed access
4834- `axum_server.rs`: Server-side XRPC handler
49355050-### Changed
5151-5252-**Code organization** (`jacquard-lexicon`)
5353-- Refactored monolithic `codegen.rs` into focused modules:
5454- - `codegen/structs.rs`: Record and object generation
5555- - `codegen/xrpc.rs`: XRPC request/response generation
5656- - `codegen/types.rs`: Type alias and union generation
5757- - `codegen/names.rs`: Identifier sanitization and naming
5858- - `codegen/lifetime.rs`: Lifetime propagation logic
5959- - `codegen/output.rs`: Module and feature generation
6060- - `codegen/utils.rs`: Shared utilities
6161-- Improved code navigation and maintainability
62366337**Documentation** (`jacquard`)
6464-- Added comprehensive trait-level docs for `AgentSessionExt`
6565-- Updated examples to use new convenience methods
6666-6767-### Fixed
6868-6969-- `update_record` now works with all record types without lifetime issues
7070-- Proper `IdentityResolver` bounds on `AgentSessionExt`
3838+- A whole host of examples added, as well as a lengthy explainer of the trait patterns.
71397240## [0.4.1] - 2025-10-13
7341
···11+[](https://crates.io/crates/jacquard) [](https://docs.rs/jacquard)
22+13# Jacquard
2433-A suite of Rust crates for the AT Protocol. [Docs](https://docs.rs/jacquard/latest/jacquard/)
55+A suite of Rust crates intended to make it much easier to get started with atproto development, without sacrificing flexibility or performance.
66+77+[Jacquard is simpler](https://whtwnd.com/nonbinary.computer/3m33efvsylz2s) because it is designed in a way which makes things simple that almost every other atproto library seems to make difficult.
88+99+It is also designed around zero-copy/borrowed deserialization: types like [`Post<'_>`](https://tangled.org/@nonbinary.computer/jacquard/blob/main/crates/jacquard-api/src/app_bsky/feed/post.rs) can borrow data (via the [`CowStr<'_>`](https://docs.rs/jacquard/latest/jacquard/cowstr/enum.CowStr.html) type and a host of other types built on top of it) directly from the response buffer instead of allocating owned copies. Owned versions are themselves mostly inlined or reference-counted pointers and are therefore still quite efficient. The `IntoStatic` trait (which is derivable) makes it easy to get an owned version and avoid worrying about lifetimes.
410511## Goals and Features
612···814- Batteries-included, but easily replaceable batteries.
915 - Easy to extend with custom lexicons using code generation or handwritten api types
1016 - Straightforward OAuth
1111- - stateless options (or options where you handle the state) for rolling your own
1212- - all the building blocks of the convenient abstractions are available
1313-- lexicon Value type for working with unknown atproto data (dag-cbor or json)
1414-- order of magnitude less boilerplate than some existing crates
1515-- use as much or as little from the crates as you need
1717+ - Stateless options (or options where you handle the state) for rolling your own
1818+ - All the building blocks of the convenient abstractions are available
1919+ - Server-side convenience features
2020+- Lexicon Data value type for working with unknown atproto data (dag-cbor or json)
2121+- An order of magnitude less boilerplate than some existing crates
2222+- Use as much or as little from the crates as you need
2323+16241725## Example
1826···75837684## Component crates
77857878-Jacquard is broken up into several crates for modularity. The correct one to use is generally `jacquard` itself, as it re-exports the others.
8686+Jacquard is broken up into several crates for modularity. The correct one to use is generally `jacquard` itself, as it re-exports most of the others.
7987- `jacquard`: Main crate [](https://crates.io/crates/jacquard) [](https://docs.rs/jacquard)
8088- `jacquard-common`: Foundation crate [](https://crates.io/crates/jacquard-common) [](https://docs.rs/jacquard-common)
8181-- `jacquard-api`: Autogenerated API bindings [](https://crates.io/crates/jacquard-api) [](https://docs.rs/jacquard-api)
8289- `jacquard-axum`: Axum extractor and other helpers [](https://crates.io/crates/jacquard-axum) [](https://docs.rs/jacquard-axum)
9090+- `jacquard-api`: Autogenerated API bindings [](https://crates.io/crates/jacquard-api) [](https://docs.rs/jacquard-api)
8391- `jacquard-oauth`: atproto OAuth implementation [](https://crates.io/crates/jacquard-oauth) [](https://docs.rs/jacquard-oauth)
8492- `jacquard-identity`: Identity resolution [](https://crates.io/crates/jacquard-identity) [](https://docs.rs/jacquard-identity)
8593- `jacquard-lexicon`: Lexicon parsing and code generation [](https://crates.io/crates/jacquard-lexicon) [](https://docs.rs/jacquard-lexicon)
···919992100Highlights:
931019494-- A ton of new lexicons included in `jacquard-api`
9595-- `jacquard-axum` Axum extractor and a number of improvements to lifetimes and (de)serialization required to make that work (thanks [@thoth.ptnote.dev](https://tangled.org/@thoth.ptnote.dev) for helping provide feedback and sample code to test against)
9696-- `from_data`, `from_raw_data`, `to_data`, and `to_raw_data` to serialize to and deserialize from the loosely typed value data formats (think `serde_json::from_value` and company). Particularly useful for second-stage deserialization of type "unknown" fields in lexicons, such as `PostView.record`.
9797-- better API code generation
102102+- `AgentSessionExt` trait with a host of convenience methods for working with records and preferences
103103+- Improvements to the `Collection` trait, code generation, and addition of the `VecUpdate` trait to enable that
104104+- A bunch of examples, both in the docs and in the repository
105105+- More lexicons in the generated API bindings.
9810699107## Development
100108