A better Rust ATProto crate
1# Changelog 2 3## [0.9.1] - 2025-11-04 (`jacquard-identity`) 4 5### Fixed 6 7- slingshot resolver no longer spuriously warns when cross-validating handles 8 9## [0.9.0] - 2025-11-03 10 11### Added 12 13**Runtime schema validation** (`jacquard-lexicon`) 14- `SchemaValidator` for validating `Data` values against lexicon schemas 15- CID-based validation caching for efficient repeated validation 16- `ValidationResult` with structural and constraint error separation 17- Comprehensive error types: `StructuralError` (type mismatches, missing fields, union errors) and `ConstraintError` (length, grapheme, numeric bounds) 18- `ValidationPath` for precise error location reporting 19- Ref cycle detection with configurable max depth 20- Support for validating partial/malformed data without full deserialization 21 22**Value query DSL** (`jacquard-common`) 23- Pattern-based querying of nested `Data` structures 24- `data.query(pattern)` with expressive syntax: 25 - `field.nested` - exact path navigation 26 - `[..]` - wildcard over collections (array elements or object values) 27 - `field..nested` - scoped recursion (find nested within field, expect one) 28 - `...field` - global recursion (find all occurrences anywhere) 29- `QueryResult` enum with `Single`, `Multiple`, and `None` variants 30- `QueryMatch` with path tracking for multiple results 31- Iterator support via `.values()`, `.first()`, `.single()`, `.multiple()` 32 33**Data value enhancements** (`jacquard-common`) 34- `get_at_path()` for simple path-based field access on `Data` and `RawData` 35- Path syntax: `embed.images[0].alt` for navigating nested structures 36- `type_discriminator()` helper methods for AT Protocol union discrimination 37- Returns `$type` field value for objects with type discriminators 38- Added on `Data`, `Object`, and `RawData` types 39- Collection helper methods: `get()`, `contains_key()`, `len()`, `is_empty()`, `iter()`, `keys()`, `values()` 40- Index operator support: `obj["key"]` and `arr[0]` 41 42**Lexicon resolution** (`jacquard-identity`) 43- `LexiconResolver` for fetching lexicon schemas from AT Protocol services 44- Resolves lexicons from PDS instances and lexicon hosts 45- `resolve_lexicon()` fetches and parses lexicon schemas 46- `resolve_lexicon_raw()` fetches raw schema JSON 47- New example: `resolve_lexicon.rs` 48 49**Identity resolver caching** (`jacquard-identity`) 50- Optional `cache` feature with configurable in-memory caching 51- `JacquardResolver::with_cache()` constructor for cached resolver 52- Separate TTLs for handle→DID, DID→doc, and lexicon resolution 53 54**XRPC client improvements** (`jacquard-common`, `jacquard`, `jacquard-oauth`) 55- `set_options()` and `set_endpoint()` methods on `XrpcClient` trait 56- Default no-op implementations for stateless clients 57- Enables runtime reconfiguration of stateful clients 58- Better support for custom endpoint and option overrides 59 60**Lexicon schema generation from Rust types** (`jacquard-derive`, `jacquard-lexicon`) 61- New `#[derive(LexiconSchema)]` macro for generating lexicon schemas from Rust structs 62- New `#[lexicon_union]` attribute macro for lexicon union types (tagged enums) 63- Automatic schema generation for custom lexicons without writing JSON manually 64- Field-level attributes: `ref` for explicit type references, `union` for union fields 65- Fragment support for multi-def lexicons via `fragment = "..."` attribute 66- Generates `LexiconDoc` at compile time for runtime validation 67- Enables type-safe custom lexicon development 68 69**Lexicon codegen improvements** (`jacquard-lexicon`, `jacquard-api`) 70- Vendored in an implementation of the typed builder pattern from `bon` to **substantially** improve compile times 71- Feature-gated heavy code generation features so `jacquard-api` and other consumers of the validation capabilities don't pay the `syn` tax as badly. 72- LexiconSchema trait generated implementations for runtime validation 73 74**Session store improvements** (`jacquard`) 75- Improved trait bounds for `SessionStore` implementations 76- Better ergonomics for credential session types 77- Memory-based credential session helpers 78 79**New crate: `jacquard-lexgen`** 80- Lexicon code generation tooling extracted from `jacquard-lexicon` 81- Separates binary/CLI tools from library code 82- Contains lexicon fetching and code generation binaries 83- `jacquard-lexicon` remains as pure library for lexicon parsing, code generation, and validation 84 85**Examples** 86- `app_password_create_post.rs`: App password authentication example 87 88### Changed 89 90**Feature gating** (`jacquard-identity`) 91- Better conditional compilation for platform-specific features 92- Improved WASM target support 93 94**Dependency updates** 95- Updated to latest lexicons from atproto/bluesky 96- Added workspace dependencies: sha2, multihash, dashmap, cid 97- Various minor dependency version updates 98 99### Fixed 100 101**File auth store** (`jacquard`) 102- Fixed serialization/deserialization bugs in `FileAuthStore` implementation 103 104**Packaging** (`jacquard-lexgen`) 105- Added Nix flake apps for lexicon tools 106 107## [0.8.0] - 2025-10-23 108 109### Breaking Changes 110 111**Error type refactor** (`jacquard-common`, `jacquard-identity`, `jacquard-oauth`, `jacquard`) 112- Better error messages with contextual information and help text 113- Breaking: Error variant names and structures changed across all crates 114 115### Added 116 117**New crate: `jacquard-repo`** 118- AT Protocol repository primitives for working with atproto data structures 119- **MST (Merkle Search Tree)**: Immutable, deterministic tree operations with proper fanout 120 - Optimized block allocation (4.5% oversupply, validated against retr0id's test suite) 121 - Diff operations with protocol limit enforcement 122 - Cursor-based traversal 123- **Commits**: 124 - Proof generation and validation for Sync v1 and v1.1 Relay protocol 125- **CAR I/O**: 126 - Proof CAR validation with MST path verification 127- **Storage**: Pluggable block storage abstraction 128 - `MemoryBlockStore`: In-memory storage for testing 129 - `FileBlockStore`: Persistent file-based storage 130 - `LayeredBlockStore`: Layered read-through cache (memory over file, etc.) 131 132### Changed 133 134- Dependency updates (upgraded various crypto and serialization dependencies) 135- Documentation improvements throughout 136- Made handle parsing a bit more permissive for a common case ('handle.invalid' when someone has a messed up handle), added a method to confirm syntactic validity (the correct way to confirm validity is resolve_handle() from IdentityResolver, and comparing to the DID document). 137 138## [0.7.0] - 2025-10-19 139 140### Added 141 142**Bluesky-style rich text utilities** (`jacquard`) 143- Rich text parsing with automatic facet detection (mentions, links, hashtags) 144- Compatible with Bluesky, with the addition of support for markdown-style links (`[display](url)` syntax) 145- Embed candidate detection from URLs and at-URIs 146 - Record embeds (posts, lists, starter packs, feeds) 147 - External embeds with optional OpenGraph metadata fetching 148- Configurable embed domains for at-URI extraction (default: bsky.app, deer.social, blacksky.community, catsky.social) 149- Overlap detection and validation for facet byte ranges 150 151**Moderation/labeling client utilities** (`jacquard`) 152- Trait-based content moderation with `Labeled` and `Moderateable` traits 153- Generic moderation decision making via `moderate()` and `moderate_all()` 154- User preference handling (`ModerationPrefs`) with global and per-labeler overrides 155- `ModerationIterExt` trait for filtering/mapping moderation over iterators 156- `Labeled` implementations for Bluesky types (PostView, ProfileView, ListView, Generator, Notification, etc.) 157- `Labeled` implementations for community lexicons (net.anisota, social.grain) 158- `fetch_labels()` and `fetch_labeled_record()` helpers for retrieving labels via XRPC 159- `fetch_labeler_defs()` and `fetch_labeler_defs_direct()` for fetching labeler definitions 160 161**Subscription control** (`jacquard-common`) 162- `SubscriptionControlMessage` trait for dynamic subscription configuration 163- `SubscriptionController` for sending control messages to active WebSocket subscriptions 164- Enables runtime reconfiguration of subscriptions (e.g., Jetstream filtering) 165 166**Lexicons** (`jacquard-api`) 167- teal.fm alpha lexicons for music sharing (fm.teal.alpha.*) 168 - Actor profiles with music service status 169 - Feed generation from play history 170 - Statistics endpoints (top artists, top releases, user stats) 171 172**Examples** 173- Updated `create_post.rs` to demonstrate richtext parsing with automatic facet detection 174- New `moderated_timeline.rs` to demonstrate fetching timeline with labelers enabled and applying moderation decisions 175 176### Fixed 177 178**Data deserialization** (`jacquard-common`) 179- Fixed `Option<Vec<T>>` deserialization from `Data` values 180- Implemented explicit `deserialize_option` for `Data` and `RawData` deserializers 181- Properly handles null vs present array values when deserializing into optional fields 182 183 184## [0.6.0] - 2025-10-18 185 186### Added 187 188**HTTP streaming support** (`jacquard-common`, `jacquard`) 189- `HttpClientExt` trait for streaming HTTP requests/responses 190- `send_http_streaming()` for streaming response bodies 191- `send_http_bidirectional()` for streaming both request and response 192- `StreamingResponse` wrapper type with parts + `ByteStream` 193- `XrpcResponseStream<R>` for typed XRPC streaming responses 194- `ByteStream` / `ByteSink` platform-agnostic stream wrappers (uses n0-future) 195- `StreamError` concrete error type with kind enum (Transport, Closed, Protocol) 196- Native support via reqwest's `bytes_stream()` and `Body::wrap_stream()` 197- WASM compatibility via n0-future (no Send bounds required) 198 199 200**WebSocket subscription support** (`jacquard-common`) 201- Full XRPC WebSocket subscription infrastructure 202- `SubscriptionResp` trait for defining subscription message/error types 203- `XrpcSubscription` trait for subscription parameters 204- `SubscriptionStream<S>` typed wrapper with automatic message decoding 205- `SubscriptionClient` stateful trait + `TungsteniteSubscriptionClient` implementation 206- `SubscriptionExt` for stateless subscription calls 207- Support for both JSON and DAG-CBOR message encodings 208- Custom path support via `CUSTOM_PATH` constant for non-XRPC endpoints 209- WebSocket integration into `Agent` struct (agents can now subscribe) 210- `into_stream()`, `into_raw_data_stream()`, `into_data_stream()` methods for different deserialization modes 211 212**Framed DAG-CBOR message decoding** (`jacquard-common`, `jacquard-api`, `jacquard-lexicon`) 213- Two-stage deserialization for AT Protocol event streams (header + body) 214- `EventHeader` struct and `parse_event_header()` function 215- `decode_framed()` methods generated for all DAG-CBOR subscription message enums 216- `decode_message()` override in `SubscriptionResp` trait for custom decoding 217- `UnknownEventType` variant in `DecodeError` for unknown discriminators 218- Fixes "TrailingData" errors when consuming subscribeRepos and subscribeLabels 219 220**Jetstream support** (`jacquard-common`) 221- Full typed support for Jetstream JSON firehose 222- `JetstreamMessage` enum with `Commit`, `Identity`, `Account` variants 223- `JetstreamCommit`, `JetstreamIdentity`, `JetstreamAccount` detail structs 224- `CommitOperation` enum for create/update/delete operations 225- `JetstreamParams` with filtering options (collections, DIDs, cursor, compression) 226- Uses proper AT Protocol types (`Did`, `Handle`, `Datetime`, `Data`) 227 228**Zstd compression** (`jacquard-common`) 229- Optional `zstd` feature for Jetstream message decompression 230- Automatic detection and decompression of zstd-compressed binary frames 231- Includes official Bluesky Jetstream zstd dictionary 232- Transparent fallback to uncompressed when zstd unavailable 233- Works across all JSON stream methods (`into_stream()`, `into_raw_data_stream()`, `into_data_stream()`) 234 235**Typed AT URI wrapper** (`jacquard-common`, `jacquard-api`, `jacquard-lexicon`) 236- `AtUri<'a>` newtype wrapper for `at://` URIs with proper validation 237- Generated `fetch_uri()` method on all record types for fetching by AT URI 238- `AtUri::from_parts()` constructor for building URIs from components 239- Proper Display and FromStr implementations 240 241**Memory-based credential session helpers** (`jacquard`) (ty [@vielle.dev](https://tangled.org/@vielle.dev)) 242 243**Axum improvements** (`jacquard-axum`) 244- `XrpcError` now implements `IntoResponse` for better error handling 245- Proper typed error responses without manual conversion 246- Better integration with Axum's response system 247 248**Examples** 249- `subscribe_repos.rs`: Subscribe to PDS firehose with typed DAG-CBOR messages 250- `subscribe_jetstream.rs`: Subscribe to Jetstream with typed JSON messages and optional compression 251- `stream_get_blob.rs`: Download blobs using HTTP streaming 252- `app_password_example.rs`: App password authentication example (ty [@vielle.dev](https://tangled.org/@vielle.dev)) 253 254**CID deserialization improvements** (`jacquard-common`) 255- Fixed `Cid` type to properly deserialize CBOR tag 42 via `IpldCid::deserialize` 256- Separate handling for JSON (string) vs CBOR (tag 42) formats 257- `CidLink` correctly delegates to `Cid` for both formats 258 259### Changed 260 261**Default features** (`jacquard-common`) 262- Added `zstd` to default features for better Jetstream experience 263- Jetstream compression enabled by default when using the full feature set 264 265**Generated code** (`jacquard-lexicon`, `jacquard-api`) 266- All DAG-CBOR subscriptions (subscribeRepos, subscribeLabels) now use framed decoding 267- Generated `decode_framed()` implementations match on event type discriminator 268- Override `decode_message()` in trait impls to use framed decoding 269- All record types now have `fetch_uri()` and `fetch_record()` methods generated 270 271**Dependencies** (`jacquard-axum`) (ty [@thoth.ptnote.dev](https://tangled.org/@thoth.ptnote.dev)) 272- Disabled default features for `jacquard` dependency to reduce bloat 273 274### Fixed 275 276**Blob upload** (`jacquard`) (ty [@vielle.dev](https://tangled.org/@vielle.dev) for reporting this one) 277- Fixed `upload_blob()` authentication issues 278- Properly authenticates while allowing custom Content-Type headers 279 280**XRPC client** (`jacquard-common`, `jacquard-oauth`, `jacquard`) 281- Added `send_with_options()` method for per-request option overrides 282- Stateful clients can now override options while preserving internal auth 283 284 285--- 286 287## `jacquard-api` [0.5.5], `jacquard-lexicon` [0.5.4] - 2025-10-16 288 289### Fixed 290 291- events.smokesignal.invokeWebhook lexicon now generates valid code 292- lexicon code generation now uses `Data` for blank objects, rather than naming and then failing to generate a struct 293 294## [0.5.4] - 2025-10-16 295 296### Added 297 298**Initial streaming client support** (`jacquard-common`) 299- First primitives for streamed requests and responses 300 301**`send_with_options()` method on XrpcClient** (`jacquard-common`, `jacquard-oauth`, `jacquard`) 302- allows setting custom options per request in stateful client 303- updated oauth and credential session clients to use it 304- implementations should generally override provided auth with own internal auth 305 306**Prelude providing common traits into scope** 307 308### Fixed 309 310**`AgentSessionExt::upload_blob()` failed to authenticate** (`jacquard`) 311- new `XrpcClient::send_with_options()` method now allows properly overriding the content-type header while still handling auth internally 312 313## [0.5.3] - 2025-10-15 314 315### Added 316 317**Experimental WASM Support** (`jacquard-common`, `jacquard-api`, `jacquard-identity`, `jacquard-oauth`) 318- Core crates now compile for `wasm32-unknown-unknown` target 319- Traits use `trait-variant` to conditionally exclude `Send` bounds on WASM 320- Platform-specific trait method implementations for methods with `Self: Sync` bounds 321- DNS-based handle resolution remains gated behind `dns` feature (unavailable on WASM) 322- HTTPS well-known and PDS resolution work on all platforms 323 324### Fixed 325 326**OAuth client** (`jacquard-oauth`) 327- Fixed tokio runtime detection for non-WASM targets 328- Conditional compilation for tokio-specific features 329 330 331--- 332 333## [0.5.2] - 2025-10-14 334 335### Added 336 337**Value type deserialization** (`jacquard-common`) 338- `from_json_value()`: Deserialize typed data directly from `serde_json::Value` without borrowing 339- `from_data_owned()`, `from_raw_data_owned()`: Owned deserialization helpers 340- `Data::from_json_owned()`: Parse JSON into owned `Data<'static>` 341- `IntoStatic` implementation for `RawData` enabling owned conversions 342- Re-exported value types from crate root for easier imports 343- `Deserializer` trait implementations for `Data<'static>` and `RawData<'static>` 344- Owned deserializer helpers: `OwnedArrayDeserializer`, `OwnedObjectDeserializer`, `OwnedBlobDeserializer` 345 346**Service Auth** (`jacquard-axum`, `jacquard-common`) 347- Full service authentication implementation for inter-service JWT verification 348- `ExtractServiceAuth` Axum extractor for validating service auth tokens 349- Axum service auth middleware 350- JWT parsing and signature verification (ES256, ES256K) 351- Service auth claims validation (issuer, audience, expiration, method binding) 352- DID document resolution for signing key verification 353 354**XrpcRequest derive macro** (`jacquard-derive`) 355- `#[derive(XrpcRequest)]` for custom XRPC endpoints 356- Automatically generates response marker struct and trait implementations 357- Supports both client-side (`XrpcRequest`) and server-side (`XrpcEndpoint`) with `server` flag 358- Simplifies defining custom XRPC endpoints outside of generated API 359 360**Builder integration** (`jacquard-derive`) 361- `#[lexicon]` macro now detects `bon::Builder` derive 362- Automatically adds `#[builder(default)]` to `extra_data` field when Builder is present 363- Makes `extra_data` optional in generated builders 364 365### Fixed 366 367**String deserialization** (`jacquard-common`) 368- All string types (Did, Handle, Nsid, etc.) now properly handle URL-encoded values 369- `serde_html_form` correctly decodes percent-encoded characters during deserialization 370- Fixes issues with DIDs and other identifiers containing colons in query parameters 371 372**Axum extractor** (`jacquard-axum`) 373- Removed unnecessary URL-decoding workaround (now handled by improved string deserialization) 374- Added comprehensive tests for URL-encoded query parameters 375- Cleaner implementation with proper delegation to serde 376 377### Changed 378 379**Dependencies** 380- Moved `clap` to dev-dependencies in `jacquard` (only used in examples) 381- Moved `axum-macros` and `tracing-subscriber` to dev-dependencies in `jacquard-axum` (only used in examples) 382- Removed unused dependencies: `urlencoding` (jacquard, jacquard-axum), `uuid` (jacquard-oauth), `serde_with` (jacquard-common) 383- Removed `fancy` feature from `jacquard` (design smell for library crates) 384- Moved various proc-macro crate dependencies to dev-dependencies in `jacquard-derive` 385 386**Development tooling** 387- Improved justfile with dynamic example discovery 388- `just examples` now auto-discovers all examples 389- `just example <name>` auto-detects package without manual configuration 390- Better error messages when examples not found 391 392**Documentation** (`jacquard`, `jacquard-common`) 393- Improved lifetime pattern explanations 394- Better documentation of zero-copy deserialization approach 395- Links to docs.rs for generated documentation 396 397--- 398 399## [0.5.1] - 2025-10-13 400 401### Fixed 402 403**Trait bounds** (`jacquard-common`) 404- Removed lifetime parameter from `XrpcRequest` trait, simplifying trait bounds 405- Lifetime now only appears on `XrpcEndpoint::Request<'de>` associated type 406- Fixes issues with using XRPC types in async contexts like Axum extractors 407 408### Changed 409 410- Updated all workspace crates to 0.5.1 for consistency 411- `jacquard-axum` remains at 0.5.1 (unchanged) 412 413--- 414 415## `jacquard-axum` [0.5.1] - 2025-10-13 416 417### Fixed 418 419- Axum extractor now sets the correct Content-Type header during error path. 420 421--- 422 423## [0.5.0] - 2025-10-13 424 425### Added 426 427**Agent convenience methods** (`jacquard`) 428- New `AgentSessionExt` trait automatically implemented for `AgentSession + IdentityResolver` 429- **Basic CRUD**: `create_record()`, `get_record()`, `put_record()`, `delete_record()` 430- **Update patterns**: `update_record()` (fetch-modify-put), `update_vec()`, `update_vec_item()` 431- **Blob operations**: `upload_blob()` 432- All methods auto-fill repo from session or URI parameter as relevant, and collection from type's `Collection::NSID` 433 434**VecUpdate trait** (`jacquard`) 435- `VecUpdate` trait for fetch-modify-put patterns on array-based endpoints 436- `PreferencesUpdate` implementation for updating Bluesky user preferences 437- Enables simpler updates to preferences and other 'array of union' types 438 439**Typed record retrieval** (`jacquard-api`, `jacquard-common`, `jacquard-lexicon`) 440- Each collection generates `{Type}Record` marker struct implementing `XrpcResp` 441- `Collection::Record` associated type points to the marker 442- `get_record::<R>()` returns `Response<R::Record>` with zero-copy `.parse()` 443- Response transmutation enables type-safe record operations 444 445**Examples** 446- `create_post.rs`: Creating posts with Agent convenience methods 447- `update_profile.rs`: Updating profile with fetch-modify-put 448- `post_with_image.rs`: Uploading images and creating posts with embeds 449- `update_preferences.rs`: Using VecUpdate for preferences 450- `create_whitewind_post.rs`, `read_whitewind_post.rs`: Third-party lexicons 451- `read_tangled_repo.rs`: Reading git repo metadata from tangled.org 452- `resolve_did.rs`: Identity resolution examples 453- `public_atproto_feed.rs`: Unauthenticated feed access 454- `axum_server.rs`: Server-side XRPC handler 455 456 457**Documentation** (`jacquard`) 458- A whole host of examples added, as well as a lengthy explainer of the trait patterns. 459 460## [0.4.1] - 2025-10-13 461 462### Added 463 464**Collection trait improvements** (`jacquard-api`) 465- Generated `{Type}Record` marker structs for all record types 466- Each implements `XrpcResp` with `Output<'de> = {Type}<'de>` and `Err<'de> = RecordError<'de>` 467- Enables typed `get_record` returning `Response<R::Record>` 468 469### Changed 470 471- Minor improvements to derive macros (`jacquard-derive`) 472- Identity resolution refinements (`jacquard-identity`) 473- OAuth client improvements (`jacquard-oauth`) 474 475--- 476 477## [0.4.0] - 2025-10-11 478 479### Breaking Changes 480 481**Zero-copy deserialization** (`jacquard-common`, `jacquard-api`) 482- `XrpcRequest` now takes a `'de` lifetime parameter and requires `Deserialize<'de>` 483- For raw data, `Response::parse_data()` gives validated loosely-typed atproto data, while `Response::parse_raw()` gives the raw values, with minimal validation. 484 485**XRPC module moved** (`jacquard-common`) 486- `xrpc.rs` is now top-level instead of under `types` 487- Import from `jacquard_common::xrpc::*` not `jacquard_common::types::xrpc::*` 488 489**Response API changes** (`jacquard-common`) 490- `XrpcRequest::Output` and `XrpcRequest::Err` are associated types with lifetimes 491- Split response and request traits: `XrpcRequest<'de>` for client, `XrpcEndpoint` for server 492- Added `XrpcResp` marker trait 493 494**Various traits** (`jacquard`, `jacquard-common`, `jacquard-lexicon`, `jacquard-oauth`) 495- Removed #[async_trait] attribute macro usage in favour of `impl Future` return types with manual bounds. 496- Boxing imposed by asyc_trait negatively affected borrowing modes in async methods. 497- Currently no semver guarantees on API trait bounds, if they need to tighten, they will. 498 499### Added 500 501**New crate: `jacquard-axum`** 502- Server-side XRPC handlers for Axum 503- `ExtractXrpc<R>` deserializes incoming requests (query params for Query, body for Procedure) 504- Automatic error responses 505 506**Lexicon codegen fixes** (`jacquard-lexicon`) 507- Union variant collision detection: when multiple namespaces have similar type names, foreign ones get prefixed (e.g., `Images` vs `BskyImages`) 508- Token types generate unit structs with `Display` instead of being skipped 509- Namespace dependency tracking during union generation 510- `generate_cargo_features()` outputs Cargo.toml features with correct deps 511- `sanitize_name()` ensures valid Rust identifiers 512 513**Lexicons** (`jacquard-api`) 514 515Added 646 lexicon schemas. Highlights: 516 517Core ATProto: 518- `com.atproto.*` 519- `com.bad-example.*` for identity resolution 520 521Bluesky: 522- `app.bsky.*` bluesky app 523- `chat.bsky.*` chat client 524- `tools.ozone.*` moderation 525 526Third-party: 527- `sh.tangled.*` - git forge 528- `sh.weaver.*` - orual's WIP markdown blog platform 529- `pub.leaflet.*` - longform publishing 530- `net.anisota.*` - gamified and calming take on bluesky 531- `network.slices.*` - serverless atproto hosting 532- `tools.smokesignal.*` - automation 533- `com.whtwnd.*` - markdown blogging 534- `place.stream.*` - livestreaming 535- `blue.2048.*` - 2048 game 536- `community.lexicon.*` - community extensions (bookmarks, calendar, location, payments) 537- `my.skylights.*` - media tracking 538- `social.psky.*` - social extensions 539- `blue.linkat.*` - link boards 540 541Plus 30+ more experimental/community namespaces. 542 543**Value types** (`jacquard-common`) 544- `RawData` to `Data` conversion with type inference 545- `from_data`, `from_raw_data`, `to_data`, and `to_raw_data` to serialize to and deserialize from the loosely typed value data formats. Particularly useful for second-stage deserialization of type "unknown" fields in lexicons, such as `PostView.record`. 546 547### Changed 548 549- `generate_union()` takes current NSID for dependency tracking 550- Generated code uses `sanitize_name()` for identifiers more consistently 551- Added derive macro for IntoStatic trait implementation 552 553### Fixed 554 555- Methods to extract the output from an XRPC response now behave well with respect to lifetimes and borrowing. 556- Now possible to use jacquard types in places like axum extractors due to lifetime improvements 557- Union variants don't collide when multiple namespaces define similar types and another namespace includes them 558 559---