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---