# Version History

## 3.1.0 - 2026-07-29

### Added

#### idunno.Bluesky

* Added support for the new `SearchStarterPacksV2` API endpoint. This endpoint is currently feature gated.
* Added a Starter Pack property to the `Notification` class, which is present when the notification is for a follow originating from a starter pack. See [Hydrate starter pack info for follow notifications](https://github.com/bluesky-social/atproto/pull/5263).
* Added an optional `Sort` parameter to the `GetFollowers` and `GetFollows` methods, which allows sorting by "latest" or "top". See [Add sort order to follows endpoints](https://github.com/bluesky-social/atproto/pull/5257).
* Added description field to trending topics. See [Add description field to trending topics](https://github.com/bluesky-social/atproto/pull/5254).

## 3.0.0 - 2026-07-11

### Added

#### idunno.AtProto

* Added error classes for known error messages.
  * `AccountNotFound`
  * `AccountTakedown`
  * `AuthenticationRequired`
  * `AuthFactorTokenRequired`
  * `BadExpiration`
  * `BlobNotFound`
  * `BlockNotFound`
  * `ConsumerTooSlow`
  * `DidDeactivated`
  * `DidNotFound`
  * `DuplicateCreate`
  * `ExpiredToken`
  * `FutureCursor`
  * `HandleNotAvailable`
  * `HandleNotFound`
  * `HeadNotFound`
  * `HostBanned`
  * `HostNotFound`
  * `IncompatibleDidDoc`
  * `InvalidEmail`
  * `InvalidInviteCode`
  * `InvalidPasscode`
  * `InvalidRequest`
  * `InvalidSwap`
  * `InvalidToken`
  * `MethodNotImplemented`
  * `RecordNotFound`
  * `RepoDeactivated`
  * `RepoNotFound`
  * `RepoSuspended`
  * `RepoTakenDown`
  * `TokenRequired`
  * `UnresolvableDid`
  * `UnsupportedDomain`
  * `XrpcNotSupported`
* Added `MapError` property to `AtProtoHttpResult<TResult>` which is an `IList<Func<AtErrorDetail?, AtErrorDetail?>>`
  to allow mapping for the generic `AtErrorDetail` type to a more specific derived error type.

#### idunno.Bluesky

* Added `BlueskyHttpClient` which derives from `AtProtoHttpClient` and adds the Bluesky specified error mapping.
* Added error classes for known error messages.
  * `AccountSuspended`
  * `ActorNotFound`
  * `BadQueryString`
  * `BlockedActor`
  * `BlockedSubject`
  * `ConversationLocked`
  * `EnabledJoinLinkAlreadyExists`
  * `FollowRequired`
  * `InsufficientRole`
  * `InvalidCode`
  * `InvalidConversation`
  * `LinkDisabled`
  * `MemberLimitReached`
  * `MessageDeleteNotAllowed`
  * `MessagesDisabled`
  * `NewAccountCannotCreateGroup`
  * `NoJoinLink`
  * `NotFollowedBySender`
  * `OwnerCannotLeave`
  * `ReactionInvalidValue`
  * `ReactionLimitReached`
  * `ReactionMessageDeleted`
  * `ReactionNotAllowed`
  * `RecipientNotFound`
  * `UserForbidsGroups`
  * `UserKicked`
* Added `Embed.EmbeddedGallery` and `Embed.Gallery.GalleryImage` types to support the new [image gallery format](https://github.com/bluesky-social/atproto/pull/4827).
  Note that `GalleryImage` requires an aspect ratio, unlike the `EmbeddedImage` type.
* Added new overloads to `BlueskyAgent.Post` to support `EmbeddedGallery` content.
  If you pass more than 4 `EmbeddedImage` items to `Post()`, it will attempt to convert them an `EmbeddedGallery`. Your `EmbeddedImage`
  instances must have an aspect ratio for this to work, otherwise an exception will be thrown.
  You can use [Magick.NET](https://github.com/dlemstra/Magick.NET), [ImageSharp](https://github.com/SixLabors/ImageSharp) or other image processing libraries to calculate the aspect ratio of your images if needed.
* Added new overloads to `PostBuilder` to support `EmbeddedGallery` content.
  If you use the `+` operator to add more than 4 `EmbeddedImage` items to a `PostBuilder`, it will attempt to convert them to `EmbeddedGallery` format. Your `EmbeddedImage`
  instances must have an aspect ratio for this to work, otherwise an exception will be thrown.
  You can use [Magick.NET](https://github.com/dlemstra/Magick.NET), [ImageSharp](https://github.com/SixLabors/ImageSharp) or other image processing libraries to calculate the aspect ratio of your images if needed.
* Added support for group conversation APIs, including
  * `AddMembersToGroup`
  * `ApproveJoinGroupRequest`
  * `CreateGroup`
  * `CreateJoinGroupLink`
  * `DisableJoinGroupLink`
  * `EditGroup`
  * `EditJoinGroupLink`
  * `EnableJoinGroupLink`
  * `GetJoinGroupLinkPreviews`
  * `ListJoinGroupRequests`
  * `ListMutualGroups`
  * `RejectJoinGroupRequest`
  * `RemoveGroupMembers`
  * `RequestJoinGroup`
  * `UpdateJoinGroupRequestsRead`
  * `WithdrawJoinGroupRequest`
* Added support for locking conversations with `LockConversation` and unlocking conversations with `UnlockConversation`.
* Added Animated GIF support with `BlueskyAgent.UploadAnimatedGif()`
* Expanded video support with a new overload to `BlueskyAgent.UploadVideo()` which accepts a MIME type parameter to allow for more video formats.
* Added `GetStarterPacksWithMembership` to allow the authenticated user to search their starter packs and see which ones a specified actor is a member of.
* Added `SearchPostsV2` to allow searching for posts with more advanced filtering options.

### Fixed

#### idunno.AtProto

* Added error handling inside `AtProtoAgent.ResolveHandle()` to swallow exceptions from DNS and HTTP lookup.
  Errors are logged as Debug log messages and the method will return null if errors are encountered.

#### idunno.Bluesky

* Added missing `Like` settings to `Notification.Preferences`.

### Changed

#### idunno.AtProto.Types

* Added comparison operators to `TimestampIdentifier` to allow for equality comparisons and sorting.

#### idunno.Bluesky

* `GetUnreadConversationCounts` now has an optional `includeGroupChats` parameter, which defaults to `true`, to include or exclude group conversations in the unread counts.

## Breaking Changes

#### idunno.Bluesky

* Corrected case of `AllowSubscriptions` property on `ActivitySubscriptions`.
* Changed `BlueskyAgent.GetRelationships()` to accept `AtIdentifier` instead of `Did` types for the `actor` and `others` parameters.
  This allows for more flexibility in specifying the subject and actor, as they can now be provided as either a DID or a handle, and matches the API definition.
* Changed return type of `BlueskyAgent.GetRelationships()` to `RelationshipMap`.
* `MessageViewBase` has had its properties removed, and is now an empty class.
  The `Id`, `Revision`, and `SentAt` properties have been moved to the derived classes `MessageView`, `DeletedMessageView` and `SystemMessageView`. This was
  necessary to support the new `MessageBeforeUserJoinedGroupView` type, which does not have these properties.
* `Notifications.PreferenceTypes.ChatPreference` has been marked obsolete.
  Use `GetChatNotificationPreferences` and `SetChatNotificationPreferences` with `Chat.Notifications.Preferences` instead.
* Marked `BlueskyAgent.UploadVideo()` without the MIME type parameter as obsolete, as it only supports MP4 video files. Use the new overload with the MIME type parameter instead.

## 2.0.0 - 2026-06-02

### Added

#### idunno.AtProto.Types

* Moved the atproto `Blob` type from idunno.AtProto.
* Added the atproto `CidLink` type.
* Added the atproto `Bytes` type and associated JSON converter.

#### idunno.Bluesky

* Added classes for Germ Network lexicon.
* Added classes for Standard.Site lexicon.
* Added `Labels` property to `StatusView` to represent labels associated with a status. See [[APP-1775] Hydrate labels for actor statuses](https://github.com/bluesky-social/atproto/pull/4555)
* Added `OpenGraphEmbeddedCardGenerator` to generate embedded records from Open Graph metadata, and documented its use.
* Added `StandardSiteEmbeddedCardGenerator` to generate embedded records from [standard.site](https://standard.site), and documented its use.

### Changed

#### idunno.Bluesky

* `BlueskyAgent.Post(Post post)` now extracts facets from the post text by default, as promised in documentation. You can use the `extractFacets` parameter to control this behavior.
* Updated `EmbeddedExternalView` to support the new [Standard Site integration](https://github.com/bluesky-social/atproto/discussions/4978).
* Updated `EmbeddedExternal` to support the new [Standard Site integration](https://github.com/bluesky-social/atproto/discussions/4978).
* Updated `ProfileViewBasic` to add properties for [Germ integration](https://github.com/bluesky-social/atproto/pull/4415).
* Updated `VerificationView` to add properties for [Fix app.bsky.actor.getProfile verifier data](https://github.com/bluesky-social/atproto/pull/5016)

### Breaking Changes

#### idunno.AtProto

* Moved `Blob` type to `idunno.AtProto.Types`.
* Moved `BlobReference` type and renamed to `CidLink` in `idunno.AtProto.Types`.

#### idunno.Bluesky

* Moved various external Embedded content classes to their own files and namespaces. This is a breaking change if you are using these classes directly, rather than through the utility methods on `BlueskyAgent`.
* Removed previously marked obsolete `BlueskyAgent.SetLiveStatus` method. Update your code to use `BlueskyAgent.CreateLiveStatus` instead.
* Removed previously marked obsolete `BlueskyAgent.SetStatus` method. Update your code to use `BlueskyAgent.CreateStatus` instead.
* Removed previously marked obsolete `SelfLabelNames` class. Update your code to use `SelfLabelValues` instead.
* `CreateLiveStatus` now requires a description.

## 1.8.3 - 2026-05-16

### Added

#### idunno.Bluesky

* Added validation to `PostBuilder` to check its internal state before converting to a post.
  You can call `IsValid()` to check if the `PostBuilder` is coherent and enumerate through `ValidationErrors()` to
  see the errors that are present.
* Added some more helpers to `PostBuilder`, including `Add` overloads for self labels,
  `ContainsGraphicMedia`, `ContainsNudity`, `ContainsPorn` and `ContainsSexualContent` for setting individual self labels.
* Added `.ReplyTo()` to `PostBuilder` for replying to a post or a thread.
* Added `.Quote()` to `PostBuilder` for adding a quote of another post to the post content.
* Added various `Add` overloads to `PostBuilder` for adding content to the post body, including hash tags, links and mentions.

### Changed

#### idunno.Bluesky

* Updated `PostBuilder` to allow for replies to quote other posts. Fixes [#343](https://github.com/blowdart/idunno.Bluesky/issues/343), thank you [OatmealDome](https://github.com/OatmealDome).

## 1.8.2 - 2026-05-11

### Added

#### idunno.Bluesky

* Added support for `GetListsWithMembership()`, which enumerates the lists created by the authenticated user, and includes membership information about the specified actor in those lists.

### Changed

#### idunno.Bluesky

* Updated `EmbeddedExternal` to include option `AssociatedRecord` property. See [Add associatedRecord to external embed record](https://github.com/bluesky-social/atproto/pull/4915)

## 1.8.1 - 2026-04-23

### Changed

* Updated OpenTelemetry dependencies to address [CVE-2026-40894 - OpenTelemetry dotnet: Excessive memory allocation when parsing OpenTelemetry propagation headers](https://nvd.nist.gov/vuln/detail/CVE-2026-40894)

## 1.8.0 - 2026-04-04

### Added

#### idunno.AtProto

* Added metrics in `AtProtoHttpClientMetrics` including request duration, request count and failure count.
* Added metrics in `DidPlcDirectory` including request duration, request count and failure count.
* Added extensions for `OpenTelemetry.Metrics`: `AddAtProtoHttpClientMetrics`, `AddAtProtoDirectoryMetrics`, and `AddAtProtoJetStreamMetrics`.
* Added new constructor overloads for `AtProtoHttpClient` to allow for use with `MetricsFactory`.
* Added `Throttled` to `AccountStatus` in Jetstream account events.
* Added `MaxMessageSize` to `JetStreamOptions` to guard against a malicious jetstream server sending overly large messages.
* Added optional validation callbacks to `AtProtoAgent.BuildOAuthLoginUri` to allow for validation of the discovered PDS and authorization server URIs.
* Added default validation function to disallow loopback and private IP ranges in discovered URIs, to mitigate SSRF attacks.
* Added override on `ToString()` on `AtProtoCredential` to return a redacted string in case of accidental logging.
* Added default SSRF protections to `AtProtoAgent`, `AtProtoHttpClient` and `AtProtoJetStream` with [idunno.Security.Ssrf](https://github.com/blowdart/idunno.Security.Ssrf/blob/main/src/idunno.Security.Ssrf/).
  This can be disabled by passing your own `HttpClient` when creating an agent, or into `AtProtoHttpClient`.
* Added `AllowLoopback` parameter to `BuildOAuth2LoginUri` to allow loopback addresses in discovered URIs for testing and development purposes. This is disabled by default.

### idunno.AtProto.Types

* Added == and != operations to `Cid`.

### idunno.Bluesky

* Added `Bot` property to `Profile` record to set or unset the profile self label
  indicating a bot account, see [[APP-1928] add bot/automated account badge and self-labeling settings](https://github.com/bluesky-social/social-app/pull/10008/)
* Added `SelfLabels` property to `ProfileViewBasic` which returns a list of self labels applied to a profile,
  which can be used in conjunction with `SelfLabelValues` to check if a profile has applied any self labels to itself,
  including the `Bot` self label and `DiscourageShowingToLoggedOutUser` self label. e.g.

  ```c#
  var profile = await agent.GetProfile("beans.monster");
  if (profile.Result.SelfLabels.Contains(SelfLabelValues.Bot))
  {
      // 🤖 - Do some action because the profile self identifies as a bot.
  }
  ```
* Added `SelfLabels` property to `PostView`.
* Added `SelfLabelValues` class.
* Added `Bot` and `DiscourageShowingToLoggedOutUser` to `SelfLabelValues`.
* Added `JsonPolymorphic` attributes to individual records to remove the extraneous `ExtensionData` entries.
* Added `CreateStatus`, `GetStatus` and `UpdateStatus` to `BlueskyAgent`.
* Added a setter to `DurationMinutes` on `Status` and setters to `ExternalProperties` to allow for updating of an existing profile status.

### Documentation

* Added documentation for metrics.
* Added documentation for setting a status on a profile.

### Changed

#### idunno.AtProto

* Changed `AtJetStreamIdentity` class to make `Handle` property nullable.
* Add version to `JetstreamMetrics`
* Made `JetStream.MeterName` and `JetStream.MeterVersion` properties public to allow for easy OTEL configuration.
* Fixed OAuth logout.
* Changed `JetStreamMetrics` from `public` to `internal` because it is not intended for public use.
* Remove `[Serializable]` from `AtProtoCredential`.
* Exclude `Credential` in `CredentialException` from serialization because it may contain sensitive information.

#### idunno.AtProto.Types

* Updated DID validation regex to align with [specs: allow digits in DID method](https://github.com/bluesky-social/atproto-website/issues/292).

#### idunno.Bluesky

* Updated `SuggestedActors` to include `RecIdStr`, see [Add recIdStr to suggested follows by actor](https://github.com/bluesky-social/atproto/pull/4644)
* Added setter to `Notification.Declaration.AllowSubscriptions` for easy updating of the value.
* Mark `SetStatus` as obsolete in favor of `CreateStatus` and `UpdateStatus`.
  This allows for better handling of the case where a profile does not have an existing status,
  and clearer intent when updating an existing status.
* Marked `SelfLabelNames` as obsolete in favor of `SelfLabelValues`, as the new name is more correct.

#### idunno.AtProto

## 1.7.0 - 2026-03-12

### ⚠️Security Advisory - [CVE-2026-26127 - .NET Denial of Service](https://github.com/dotnet/announcements/issues/384)

* A transitive dependency of `idunno.AtProto` and `idunno.AtProto.OAuthCallback`, `Microsoft.Bcl.Memory`
  had a Denial of Service security vulnerability,
  [CVE-2026-26127](https://github.com/dotnet/announcements/issues/384)

  v1.7.0 updates the dependencies on `Duende.IdentityModel.OidcClient` and
  `Duende.IdentityModel.OidcClient.Extensions` which have
  updated their dependency on `Microsoft.Bcl.Memory` to 10.0.4, resolving the vulnerability.

  All previous versions of the library are now marked as vulnerable to CVE-2026-26127.
  Please update to v1.7.0 or later to resolve this vulnerability.

## 1.6.0 - 2026-02-21

### Added

#### idunno.AtProto

* Added `AccessTokenException`, which will be thrown if a supplied access token is not valid for a service.
* Added `GetRawRecord` to `AtProtoAgent` and `AtProtoServer`.

#### idunno.AtProto.Types

* Added `Self` property to `RecordKey` which returns a `RecordKey` with the value of `self`.

#### idunno.Bluesky

* Added support for drafts, including `Draft` record, `CreateDraft()`, `GetDraft()`, `ListDrafts()`, `DeleteDraft()` and `PublishDraft()`.
* Added `Post(DraftWithId)` to create a post from a draft.

### Fixed

#### idunno.Bluesky

* Fixed `DeleteLike()` to use the correct collection when validating the `uri` parameter.

#### Documentation

* Removed erroneous references to `CreatePost()`, thanks [shiftkey](https://github.com/shiftkey)

### Changed

#### idunno.AtProto

* `GetRecord<T>` and `ListRecords<T>` will now attempt to resolve the PDS hosting the record if a service is not specified.
* `GetRecord`, `CreateRecord`, `DeleteRecord`, `PutRecord`, `ListRecords` and `ApplyWrites` methods on `AtProtoServer` will now
  throw `AccessTokenException` if any specified credentials have not been issued by the specified service.
* Removed `Type` property from `Blob`.
* Removed `Type` property from `SelfLabels`.

#### idunno.Bluesky

* Removed `Type` property from `Facet`.

### Breaking Changes

#### idunno.AtProto

* The overloads for `ListRecords<T>` that requires authentication will ignore any service parameter passed to it.

#### idunno.Bluesky

* Switched `RemainingDailyVideos` and `RemainingDailyBytes` in `UploadLimits` to `long?`

## 1.5.0 - 2026-02-02

### Added

#### idunno.AtProto

* Added `TypeResolver` static class.
* Added `TimestampIdentifier` to `SourceGenerationContext.`

#### idunno.AtProto.Types

* Added new constructor on `TimeStampIdentifier` to create from a `RecordKey`.
* Added `TimeStampIdentifierJsonConverter` for `TimeStampIdentifier`.
* Added explicit and implicit conversions between `TimeStampIdentifier` and `RecordKey`.
* Added tests for `TimeStampIdentifier` serialization and deserialization.

#### idunno.Bluesky

* Added `TypeResolver` static class.
* Added support for `GetActorStarterPacks()`, addresses [#288](https://github.com/blowdart/idunno.Bluesky/issues/288), thank you [j-childers](https://github.com/j-childers)
* Added `FeedItem` record to represent feeds added in a `StarterPack` record.
* Added `Presentation` property to `EmbeddedVideo` and `EmbeddedVideoView` to for video presentation hints.
* Added `VideoPresentationKnowValues` static class with known presentation values for videos.

### Changed

#### idunno.Bluesky

* Added `Status` property to `ProfileViewBasic`, `ProfileView` and `ProfileViewDetailed` to represent live streaming status for a profile, if any.
* Changed `Description` property in `ListView` to be nullable to match the API, fixes [#289](https://github.com/blowdart/idunno.Bluesky/issues/289)
* `EmbeddedVideo` and `EmbeddedVideoView` include the optional `Presentation` property. See [Add presentation to video embed as a hint to the client about how to display the video](https://github.com/bluesky-social/atproto/pull/4581).
* `EmbeddedVideo` and `EmbeddedVideoView` constructors updated to take optional `presentation` parameter.

### Breaking Changes

#### idunno.AtProto

* `BlobReferences` now enforces that the link property is a CID.

#### idunno.Bluesky

* Changed `StarterPack` `Feeds` property to be a list of `FeedItem`, fixes [#288](https://github.com/blowdart/idunno.Bluesky/issues/288)
* Changed `StarterPack` constructor to take a list of `FeedItem` for feeds parameter, fixes [#288](https://github.com/blowdart/idunno.Bluesky/issues/288)
* Changed `EmbeddedVideo` and `EmbeddedVideoView` to include the optional `Presentation` property.
* `EmbeddedVideo` constructor overload that took a single `Caption` parameter has been removed. Use the constructor that takes an `ICollection` of `Caption`.

## 1.4.0 - 2026-18-01

### Added

#### idunno.AtProto
* Add public `AtProtoJsonSerializerOptions` to enable easier creation of `JsonSerializerOptions` with chained resolvers
for custom `AtProtoRecord` classes.
* Add `ToAccessCredentials` and `ToAccessTokenCredential` methods to `Session`.

#### idunno.Bluesky

* Add "cashtag" facet detection to the default facet extractor. See [Add cashtag support for stock ticker discussions](https://github.com/bluesky-social/social-app/pull/9689)
* Add `SetLiveStatus` to indicate if a user is live streaming, and `SetStatus` and `DeleteStatus` to set and delete a user's status.
* Add `BlueskyJsonSerializerOptions` to enable easier creation of `JsonSerializerOptions` with chained resolvers

### Fixed

#### idunno.AtProto

* Fix `PutRecord<TRecord>(AtProtoRepositoryRecord<TRecord>)` to use the record CID for `swapRecord`, not the `swapCommit`.

### Changed

#### idunno.AtProto

* Update `Value` property on `AtRepositoryRecord` to be settable.

## 1.3.0 - 2026-01-10

### Added

#### idunno.AtProto

* Add non-generic version of `AtProtoHttpClient` to allow for "raw" get/post operations.
* Add `AccessTokenCredential` to wrap an access jwt for which no refresh token is available.
* Add `Resolution` class with static methods to resolve DIDs for handles,and DidDocuments and PDS URIs for handles and DIDs without needing to instantiate a client.
* Add `GetGraphemeLength` extension method on `string` to get the grapheme length of a string.

### Documentation

* Add documentation for using the raw client.
* Add documentation on using your own record types with typed client, and an approach to mapping a lexicon definition to a C# POCO.

### Changed

#### idunno.AtProto

* Bump `ZstdSharp.Port` from 0.8.6 to 0.8.7.

#### idunno.Bluesky

* Change `DeleteRepost` to accept either a repost AT-URI, or the AT-URI of the original post.
* Change access modifiers on the constructors for `Facet` and `PostBuilderFacetFeature` to `public`.

## 1.2.0 - 2025-12-27

### Added

#### idunno.AtProto

* Add .NET 10 support
* Add support for configuration binding and options in DI.
* Add `OAuthLoginState` to `SourceGenerationContext`.
* Expose `ValidationRegex` constants on `Did` and `Handle`.
* Add optional parameter `uriExtraParameters` to `BuildOAuth2LoginUri`.
* Add optional parameter `stateExtraProperties` to `BuildOAuth2LoginUri`.

#### idunno.AtProto.OAuthCallback

* Add .NET 10 support

### idunno.AtProto.Types

* Create common ATProto types `idunno.AtProto.Types` package.

#### idunno.Bluesky

* Add .NET 10 support
* Add support for configuration binding and options in DI.

### Changed

#### idunno.AtProto

* Update 3rd party dependencies.
* Fix `AtProtoAgent.RefreshCredentials()` to attempt a refresh if the access token has expired and there is a refresh token available.
* Update OAuth code for `IdentityModel.OidcClient.Extensions` version 7.0.0.

#### idunno.AtProto.OAuthCallback

* Update 3rd party dependencies.

### idunno.Bluesky

* Update 3rd party dependencies.
* Add Uri and Cid to statusView on profile responses. See [[APP-1750] Add uri and cid to statusView on profile responses](https://github.com/bluesky-social/atproto/pull/4516).

### Breaking Changes

#### idunno.AtProto

* Move common ATProto types to `idunno.AtProto.Types` package.
* The `AtProtoAgent` constructor can now take an `ClaimsPrincipal` or `ClaimsIdentity`.
  This means you must now use named parameters to call the desired constructor, e.g.
  ```c#
  using var agentWithoutLogging =
    new AtProtoAgent(service: new("https://bsky.social"));
  {
  }
  ```

#### idunno.Bluesky

* Add block information to `Graph.Relationship`, see [bsky: Expand getRelationships to include blocks](https://github.com/bluesky-social/atproto/pull/4418).
* Add `contactMatch` to `NotificationReason`, see [bsky: Add contact-match notification type](https://github.com/bluesky-social/atproto/pull/4436)
* Add `DeclaredAgePreference` to `Preferences`, see [[APP-1672] Add new read-only #declaredAgePref](https://github.com/bluesky-social/atproto/pull/4432)

## 1.1.0 - 2025-09-30

### Added

#### idunno.Bluesky

* Add support for pronouns and website in `Profile` and its associated views.
* Add support for some of the more useful unspecced APIs
  * `GetAgeAssuranceState()`
  * `GetPopularFeedGenerators()`
  * `GetSuggestedStarterPacks()`
  * `GetSuggestedUsers()`
  * `GetTaggedSuggestions()`
  * `GetTrendingTopics()`
  * `GetTrends()`
* Add support for Tags in `ReplyTo()` and `Quote()` methods.
* Expose `FacetExtractor` on `BlueskyAgent`.

### Fixed

#### idunno.AtProto

* Calling logout on an agent which is authenticated via OAuth no longer causes a DPoP error on the AtProto API.

### Breaking Changes

#### idunno.Bluesky

* The constructor for `Profile()` which takes requires values for all parameters now includes a pronouns and website parameter.

## 1.0.0 - 2025-09-17

### Added

#### idunno.Bluesky

* Add support for Tags in `Post()` methods.

## 0.9.9 - 2025-09-11

* Bump System.Text.Json from 9.0.8 to 9.0.9.

## 0.9.8 - 2025-09-08

### Added

#### idunno.AtProto

* Added extra validation to `Cid`.

#### idunno.Bluesky

* Bookmark support, `CreateBookmark()`, `DeleteBookmark()`, `GetBookmarks()` and the `BookmarkCount` property on `PostView`.

### Fixed

#### idunno.AtProto

* Fixed `TimeStampIdentifier` generation to generate correct values.

### Breaking Changes

#### idunno.AtProto

* Moved `WebSocketOptions` from `idunno.AtProto.JetStream` to `idunno.AtProto`.
* Renamed `JetstreamOptions.MaximumMessageSize` to `JetstreamOptions.BufferSize`.

## 0.9.7- 2025-07-11

### Added

#### idunno.Bluesky

* Added new overloads to `agent.Like()` and `agent.Repost()` that take a `FeedViewPost` which check if you are acting on a repost.
* Added new overloads to `agent.Like()` and `agent.Repost()` that take a `PostView`.
* Added new optional `Via` parameter to `Record.Like` and `Record.Repost` constructors that take a `StrongReference` to a repost record,
  to enable [notifications of likes and reposts of reposts](https://bsky.social/about/blog/07-02-2025-more-notification-control).
* Added new property `DisconnectedGracefully` to `JetStream`.
* Added a `RawNotificationReason` property to `Notification` for when the notification reason can't be parsed into a `NotificationReason`.
* Added the ability to declare an account's declaration for who can subscribe to notifications about their activity, `agent.SetNotificationDeclaration()`.
* Added the ability to get and set notification preferences, `agent.GetNotificationPreferences()` and `agent.SetNotificationPreferences`.
* Added the activity subscription support, `agent.ListActivitySubscriptions()`, `agent.SetActivitySubscription()`

### Fixed

#### idunno.Bluesky

* Passing a DateTime to `JetStream.ConnectAsync()` sends the current cursor when opening a socket to the JetStream.
* Added `Deleted` to the JetStream `AccountStatus` enum.
* Added new notification reasons to `NotificationReason`.
 
#### Documentation

* Added details on a reconnect/retry strategy for the `JetStream`.

### Breaking Changes

#### idunno.Bluesky

* Moved `Actions.Like`, `Actions.Repost`, `Actions.Block` and `Actions.Follow` into the `Record` namespace.
* `Notification` has a new property, `RawReason`, which contains the over the wire reason for a notification as a string.
  The `Reason` property can now be `Unknown` in cases where the notification raw reason does not map to a `NotificationReason`.
* Added new notification reasons to `NotificationReason` for `Verified`, `Unverified`, `LikeViaRepost`, `RepostViaRepost` and `SubscribedPost`

## 0.9.6 - Unreleased

* Various dependency bumps

## 0.9.5 - 2025-06-10

### Added

#### idunno.Bluesky

* Add optional parameter, `embeddedPost` to `SendMessage` to allow for embedding of posts in direct messages.
* Add live status to profile views

### Fixed

#### idunno.Bluesky

* Fix serialization exception in `SendMessage`. Fixes [#169](https://github.com/blowdart/idunno.Bluesky/issues/169)

## 0.9.4 - 2025-05-30

### Fixed

#### idunno.Bluesky

* Fix cursor pagination in `GetFollowers`, `GetBlocks`, `GetFollows`, `GetKnownFollowers`, `GetListBlocks`, `GetListMutes`, `GetList`, `GetLists`, and `ListConversations`.

## 0.9.3 - 2025-05-30

### Fixed

#### idunno.AtProto

* Properly restore service uri when credentials are refreshed from a stored state. Fixes [#164](https://github.com/blowdart/idunno.Bluesky/issues/164)

## 0.9.2 - 2025-05-29

### Added

#### idunno.AtProto

* Enable trimming for .NET 9.0 projects

#### idunno.AtProto.OAuthCallback

* Enable trimming for .NET 9.0 projects

#### idunno.Bluesky

* Enable trimming for .NET 9.0 projects


## 0.9.1 - 2025-05-21

### Added

#### idunno.AtProto

* Add new overrides for `Login` to accept Handles and Dids.
* Add `ClientState`, `MessageLastRecieved` and `FaultCount` properties to `AtProtoJetstream` to enable health monitoring.
* Add metrics to `AtProtoJetStream`.

#### idunno.Bluesky

* Add `ExtractFacets()` to `PostBuilder` to enable auto-detection in `ReplyTo()`.
* Add new `ReplyTo()` overload to `BlueskyAgent`.
* Exposed `BlueskyServer.JsonSerializationOptions` so bots can deserialize payloads into Bluesky records with AOT support.

## 0.9.0 - 2025-05-11

### Added

#### idunno.AtProto

* New `AtProtoJetstream` class for consuming the jetstream.

#### Docs

* Add Jetstream docs
* Add guidance for writing a simple scheduled post bot.

#### Samples

* Add Jetstream sample
* Add bot sample

### Breaking Changes

#### idunno.AtProto

* Grand renaming
  * `AtProtoRecord` is renamed to `AtProtoRepositoryRecord`
  * `AtProtoRecordValue` is renamed to `AtProtoRecord`
  * `AtProtoReferencedObject` is renamed to `AtProtoRepositoryObject`
  * `CreateRecord<TRecordValue>` is now `CreateRecord<TRecord>` and the `recordValue` parameter is renamed to `record`
  * `GetRecord<T>` is now `GetRecord<TRecord>` and returns `AtProtoRepositoryRecord<TRecord>`.
  * `ListRecords<TRecordValue>` is now `ListRecord<TRecord>`
  * `PutRecord<TRecordValue>` is now `PutRecord<TRecord>` and the `recordValue` parameter is renamed to `record`
  * `AtProtoRepositoryRecord<T>` added to wrap the responses from `GetRecord<T>`

#### idunno.Bluesky

* Grand renaming
  * `BlueskyRecordValue` is renamed to `BlueskyRecord`
  * `BlueskyTimestampedRecordValue` is renamed to `BlueskyTimestampedRecord`
  * `LabelerDeclarationRecord` is renamed to `ReferencedLabelerDeclaration`
  * `LabelerDeclarationRecordValue` is renamed to `LabelerDeclaration`
  * `PostRecord` is renamed to `ReferencedPost`
  * `ProfileRecord` is renamed to `ReferencedProfile`
  * `ProfileRecordValue` is renamed to `Profile`
  * `StarterPackRecordValue` is renamed to `StarterPack`
  * `VerificationRecord` is renamed to `ReferencedVerification`
  * `VerificationRecordValue` is renamed to `Verification`
  * `BlockRecordValue` is renamed to `Block`
  * `FollowRecordValue` is renamed to `Follow`
  * `LikeRecordValue` is renamed to `Like`
  * `RepostRecordValue` is renamed to `Repost`
  * `CreateBlueskyRecord<TRecordValue>` is now `BlueskyRecord<TRecord>` and the `recordValue` parameter is renamed to `record`
  * `GetPostGate()` and `GetThreadGate` now use `AtProtoRepositoryRecord<T>` internally.
  * `ReferencedLabelerDeclaration` deleted in favor of `AtProtoRepositoryRecord<LabelerDeclaration>`
  * `ReferencedPost` deleted deleted in favor of `AtProtoRepositoryRecord<Post>`.
  * `ReferencedProfile` deleted deleted in favor of `AtProtoRepositoryRecord<Profile>`.
  * `ReferencedVerification` deleted deleted in favor of `AtProtoRepositoryRecord<Verification>`.

## 0.8.0 - 2025-05-01

### Added

#### idunno.Bluesky

* Add list management APIs and documentation.

## 0.7.0 - 2025-04-26

### Added

#### idunno.AtProto

* Added overload to UploadBlob that takes a filename.

#### Docs

* Added simple tutorial docs with the same topic as the official sdk docs

### Fixed

#### idunno.Bluesky

* Correct how DeleteLike() works so it takes the ATUri of the post to delete the like from.

### Breaking Changes

#### idunno.Bluesky

* Aligned some method and parameter names to be closed to the official SDK.

## 0.6.1 - 2025-04-23

### Fixed

#### idunno.AtProto

* Fix DPoP nonce handling for resource providers.

#### idunno.Bluesky

* Update `BlueskyTimestampedRecordValue` to use UTC DateTimeOffsets.
* Add `CreateBlueskyRecord` to make manually creating known Bluesky records easier.
* Make `VerificationRecordValue` public so everyone can create vanity verification records for [Jerry Chen](https://bsky.app/profile/did:plc:vc7f4oafdgxsihk4cry2xpze).

### Breaking Changes

#### idunno.AtProto

* Change `CreateRecord` record parameter name from `record` to `recordValue` to more accurately reflect what the parameter type.

## 0.6.0 - 2025-04-21

### Added

#### idunno.Bluesky

* Add support for verification, `VerificationView` is added to `ProfileViewBasic`, `ProfileView` and `ProfileViewDetailed`.

## 0.5.0 - 2025-04-21

### Fixed

#### idunno.Bluesky

* Fix [direct message support](https://github.com/blowdart/idunno.Bluesky/issues/135).

### Added

#### idunno.AtProto

* Add support for JSON source generation.
* Add builder for `AtProtoAgent`.
* Add support for `CreateModerationReport()`.
* Removed previously marked obsolete `RefreshSession()`, use `RefreshCredentials()` instead.

#### idunno.Bluesky

* Add support for JSON source generation.
* Add builder for `BlueskyAgent.`
* Wire up `at-proxy` support for Bluesky API endpoints due to upcoming [automatic forwarding deprecation](https://docs.bsky.app/blog/2025-protocol-roadmap-spring).
* Add support for adding and reading reactions to and from direct messages.
* Add support for `GetLabelerDeclaration()` and `GetLabelerServices()`.
* Add support for `CreateModerationReport()`, including well-known constants.

### Breaking Changes

#### idunno.AtProto

* Repo operations now return `*Result` records (`ApplyWritesCreateResult`, `ApplyWritesDeleteResult`, `ApplyWritesUpdateResult`, `CreateRecordResult`, `PutRecordResult`). 
  If you are using unwrapped repo operations you will need to update your type declarations, if not using `var`.

#### idunno.Bluesky

* Mirror `idunno.AtProto` return types.

## 0.4.1 - 2025-03-17

### Fixed

#### idunno.Bluesky

* Fix video uploading code, sample and documentation.

## 0.4.0 - 2025-02-18

### Added

#### idunno.Bluesky

* Support for user thread gate and post gate preference settings.

## 0.3.0 - 2025-02-15

### Added

#### idunno.AtProto

* OAuth support.

### Breaking Changes

* Agent constructors no longer take parameters directly. Use the appropriate options class instead.

  For example

  ```c#
  using (var agent = new BlueskyAgent(
    proxyUri: proxyUri,
    loggerFactory: loggerFactory))
  ```

  becomes

  ```c#
  using (var agent = new BlueskyAgent(
    new BlueskyAgentOptions()
    {
      LoggerFactory = loggerFactory,

      HttpClientOptions = new HttpClientOptions()
      {
        ProxyUri = proxyUri
      }
    }))
  ```

* Authentication has be reworked to support OAuth.
  * `agent.Login(Credentials)` has been removed.
     Use `agent.Login(Login(string identifier, string password, string? authFactorToken = null)` instead.

* The `Session` property on an agent has been removed.

  `Credentials` can be accessed by the `Credentials` property.

  The DID for the authenticated user, if any, can be accessed by the `Did` property.

* The agent events for changes in session state have been replaced with events for changes in authentication state.

  The `SessionChanged` event has been removed, replaced by the `Authenicated` event.

  The `SessionEnded` event has been removed, replaced by the `Unauthenticated` events.

  Event arguments have changed to support OAuth credentials. If you are saving authentication state please see the AgentEvents sample for details.

* `RefreshToken()` has been removed, to manually refresh the agent credentials use `agent.RefreshCredentials()`.

#### idunno.AtProto.OAuthCallback

* Local HTTP server for testing OAuth authentication.

## 0.2.1 - 2025-01-05

### Added

#### idunno.AtProto

* Extra logging in token refresh

### Fixed

#### idunno.AtProto

* Fixed incorrect JWT DateTime comparison - thank you [alexmg](https://github.com/alexmg).
* Fixed json deserialization errors in `GetSessionResponse`.

#### Samples

* Added catch in Samples.SessionEvents when a bad token is being set on purpose - thank you [peteraritchie](https://github.com/peteraritchie).

## 0.2.0 - 2024-12-27

### Added

#### idunno.AtProto

* Add support for `GetServiceAuth()`.

#### idunno.Bluesky

* Add support for video.

## 0.1.3 - 2024-12-22

### Added

#### idunno.Bluesky

* Add self labels for posts.
* *Breaking* - Consolidation of record value classes.

### Fixed

#### idunno.Bluesky

* Fixed facet positioning.

### Breaking changes

#### idunno.Bluesky

*  Consolidation of record value classes.

### Docs

* Add Profile editing sample.

## 0.1.2 - 2024-12-19

### Added

#### idunno.Bluesky

* Adds Profile editing.

### Fixed

#### idunno.Bluesky

* Fixed positioning bug for `PostBuilder` facets.
* Removed incorrect link length check.

## 0.1.1 - 2024-12-14

### Fixed

#### idunno.AtProto

* Fixed bug when making requests a personal PDS timed out after authentication.

## 0.1.0 - 2024-12-12

### Added

#### idunno.AtProto

* PDS authentication and session management.
* List, Create, Get, Put, Delete records.
* Blob uploads.
* Handle and PDS resolution.

#### idunno.Bluesky

* Viewing feeds.
* Viewing a user's timeline and notifications.
* Viewing threads.
* Creating and deleting posts.
* Gating threads and posts.
* Likes, quotes, and reposts.
* Viewing user profiles.
* Following and unfollowing users.
* Muting and blocking users.
* Sending, receiving, and deleting messages.

