• v0.8.0 104173c804

    v0.8.0
    All checks were successful
    CI / pds-integration (pull_request) Successful in 26s
    CI / build-and-test (pull_request) Successful in 55s
    Release / release (push) Successful in 1m5s
    Sync Closures to GitHub / sync-closure (pull_request) Successful in 6s
    Stable

    Grandiras released this 2026-10-05 14:20:07 +00:00 | 0 commits to main since this release

    A catch-up and performance release. The Spaces implementation follows the permissioned-data alpha of 2026-10-01 — HTTP message signatures instead of DPoP, short-lived key-bound credentials, repoRev/spaceRev sequencing and credential revocation — and the public Lexicons follow upstream as of 2026-10-02. Identity resolution is faster (DNS-preferred handles, a handle cache, HTTP/2), the request, firehose and DID document paths allocate less, and the code base is about 1,100 lines smaller.

    Upgrading from 0.7? The migration guide (docs/migrating-to-0.8.md) lists every breaking change below with what to do about it.

    Breaking changes

    • New optional parameters sit before limit — on GetTimelineAsync, GetListFeedAsync, GetQuotesAsync, CreateQueueAsync and UpdateQueueAsync; live report stats are a LiveStats. Migration: name positional limit/cursor arguments (#210)
    • Spaces type is spaceType — createSpace and listSpaces take spaceType on the wire; CreateSimpleSpaceRequest.Type and the type parameters of CreateSpaceAsync and ListSpacesAsync are renamed. Migration: rename them (#211)
    • Spaces requests are signed with HTTP message signatures, not DPoP — a credential binds to a P-256 key (cnf.kid); each request carries Authorization: Atproto-Space, Atproto-Space-Audience and a signature. Migration: remove DPoPProofValidator, ProofLifetime and PublicBaseUrl (#212)
    • Space credentials last ten minutes — at most an hour, with jti and iat required, and SpaceCredentialProvider renews by the real expiry. Migration: SpaceServerOptions.CredentialLifetime now defaults to 10 minutes; set it to keep another value (#212)
    • Spaces: repoRev, spaceRev, listRepos checkpoints — Rev is RepoRev; the authority sequences writes with a spaceRev, listRepos pages by it, and RecordWriteAsync returns it. Migration: rename .Rev, return SpaceWriteSequence? from your store, migrate the EF schema, restart syncers from null (#213)
    • ISpaceRepoHost gains HostsAccountAsync — a repo host says whether an account is hosted there, so it can tell which revocations are addressed to it. Migration: implement it, and migrate the EF schema for AtProtoSpaceCredentialRevocations (#214)

    Added

    • Lexicons synced with upstream main — since/StartCursor for polling the timeline and list feeds, sort for quotes, a post's position in its author's thread, queue recommendedLabels, and the new report statistics (#210)
    • Ozone.Inbox — AppealActionedSubjectAsync lets an account appeal a moderation action against it or its content (tools.ozone.inbox) (#210)
    • SpaceHttpSignature signs and verifies space request signatures; refusals are SpaceSignatureException, BadSpaceSignature and BadSpaceAudience (#212)
    • Spaces credential revocation — notifyCredentialRevoked: repo hosts record (space, jti) for 3610 s and refuse the credential with CredentialRevoked; authorities revoke with SpaceCredentialRevoker, with stores in memory and EF Core (#214)
    • Spaces write retry and syncer catch-up — NotifyWriteInBackground retries with backoff; notifyWrite answers FutureRev and ignores a stale repoRev; SpaceSyncer.ListChangedReposAsync and NeedsCatchUp resume from a spaceRev checkpoint (#213)
    • atproto-lexgen knows the space-ref format — a space-ref string is generated as SpaceUri (with using ATProtoNet.Spaces;), and SpaceUri is emitted back as space-ref (#211)
    • Handle answers are cached — HandleResolver remembers a handle's DID for IdentityResolverOptions.HandleCacheTtl (5 minutes; zero disables), so re-verifying a DID's handle no longer costs a lookup each time; ResolveUncachedAsync still looks it up afresh (#197)

    Changed

    • Handle resolution prefers DNS — a DNS TXT answer is returned at once instead of waiting for the handle's web host, as the handle spec recommends; the HTTPS well-known counts only when DNS has none, and no longer fails a DNS answer it disagrees with (#193)
    • Identity fetches and XRPC calls use HTTP/2 — DID document, PLC, well-known, DNS-over-HTTPS and XRPC requests ask for HTTP/2 and fall back to 1.1, so concurrent requests to one host share a connection (#194, #197)
    • Less allocation on hot paths — JSON request bodies are serialized once with a Content-Length, DPoP proofs reuse the parsed URI, DID document entries are parsed once per document, and firehose, label and archive decoding reuse their buffer and build no string per key or value (#194, #195, #200)
    • A smaller code base — the Lexicon clients, auth and server layers, Spaces server, EF Core stores and streaming consumers lose duplication and boilerplate, with no change to the public API or behaviour (#196, #204, #207)
    • Dependencies updated — the packages build against .NET 10.0.12 (System.Formats.Cbor, the Microsoft.Extensions abstractions, EF Core) and Aspire 13.6 (#219)
    Downloads