Change Log
Version 0.0.71
19.08.2026
⚡ Jetstream 56k -> 111k events/s, Firehose 22.7k -> 31.1k frames/s. Same bytes in, byte-identical models out (Apple M1)
Speed up Jetstream 2x and Firehose 1.4x by @MarshalX in #709
Speed up the docs build 3.8x and fix the build warnings by @MarshalX in #715
Narrow the type of
is_record_typewithTypeGuardby @MarshalX in #713Deprecate
AtUri.httpin favor of the correctly namedAtUri.hrefby @MarshalX in #714Fix JSON serialization of blobs decoded from DAG-CBOR by @MarshalX in #708
Fix ignored constraints of array items in codegen by @MarshalX in #711
Fix unions failing the whole response on an unknown
$typeby @MarshalX in #712
Version 0.0.70
18.08.2026
🛩️ Jetstream v2 support: live tail with dict-zstd compression (~65% less bandwidth) and full network replay via snapshot() and replay()
Add
atproto_jetstreampackage with Jetstream v2 live tail support by @MarshalX in #704Add dict-zstd compression to the Jetstream client by @MarshalX in #705
Add Jetstream network replay:
snapshot()andreplay()over the archive by @MarshalX in #706Allow SDK usage with cryptography up to v50 by @MarshalX in #699
Upgrade ruff, mypy, and pyright and adopt new ruff default rules by @MarshalX in #701
Migrate to PEP 735 dependency groups and static project.dependencies by @MarshalX in #700
Fix lexicon_parse_dir failing on lexicons in subdirectories by @jacoblapenna in #696
Fix TID validation rejecting valid TIDs starting with a-j by @jacoblapenna in #695
Fix websockets compat job on Windows by invoking the venv interpreter directly by @MarshalX in #702
Fix Firehose reliability: fatal network errors, stalled backoff, and hanging stop() by @MarshalX in #703
Version 0.0.69
24.06.2026
⚡ Speed up imports by loading generated models lazily: 12x faster load time (2.6s → 0.21s), 6x lower memory usage (375MB → 57MB)
Add CHANGES.md update automation using GitHub Actions by @MarshalX in #686
Add network mocking for identity resolver tests by @MarshalX in #680
Add caching and bump actions for CI/CD pipelines by @MarshalX in #681
Speed up imports by loading generated models lazily by @MarshalX in #679
Improve errors visibility in update_lexicons GHA workflow by @MarshalX in #682
Fix
update_lexiconscodegen failing due to lazy-loading regression by @MarshalX in #683
Version 0.0.68
10.06.2026
Version 0.0.67
28.05.2026
Add Standard.site lexicon entrypoints by @MarshalX in #673
Version 0.0.66
28.05.2026
Add support for Standard.site long-form publishing lexicons!
Add
LexPermissionandLexPermissionSetsupport to the lexicon parser. Fix model generator with reserved Python keywords by @MarshalX in #648Fix codegen to support namespaces with both records and child namespaces by @MarshalX in #668
Update lexicons by @MarshalX in #649, #650, #651, #653, #655, #661, #662, #665, #666, #667, #669, #670
Version 0.0.65
08.12.2025
Version 0.0.64
01.12.2025
⚡ The underlying lib for CAR decoding got a x2 speed boost for your custom feeds and firehose in general! Update it now with pip install -U libipld. More info and benchmarks: libipld v3.3.0 release notes
Add
leewayargument toverify_jwtfunction by @MarshalX in #638Add caching to model building functions and fix record model name resolution in refs by @MarshalX in #633
Update quickstart documentation to clarify base API URLs by @paulopperman in #635
Fix pydantic field warnings for optional fields with constraints by @zzstoatzz in #630
Version 0.0.63
22.10.2025
Breaking changes
Drop support for Python 3.8 by @zzstoatzz in #605
Notes:
Since we updated
websocketslib to v15, which uses the new async client, differences in stability are possible. Please report your findings!Since we updated
pydanticlib, new strange warnings coming from it are possible. Please report your findings!
What’s Changed
Update
websocketsto v15 by @zzstoatzz in #605Fix
httpxdeprecation warnings by @zzstoatzz in #614Fix
pydanticfield warnings for optional fields with constraints by @zzstoatzz in #627
Version 0.0.62
17.08.2025
❗ Next release will drop Python 3.8 support
Version 0.0.61
19.04.2025
Note: this release fixes the session refreshing issue broken by 0.0.60.
Version 0.0.60
11.04.2025
Note: session refreshing was broken in this version. Please use 0.0.61 instead.
Add message reaction to the example of Direct Messages by @MarshalX in #595
Add
include_pinsargument toget_author_feedmethod ofClientby @maratsh in #583Add
auth_factor_tokenargument to theloginmethod to support Email 2FA by @MarshalX in #593Improve
AtUriby adding relative URIs support andmakemethod by @MarshalX in #592Improve a way to configure
HTTPXclient (timeouts, SSL, retry policies, etc.) by @MarshalX in #594Allow overriding of
Content-Typeheader by @MarshalX in #579Allow digits in the
NSID; fix edge cases for string format validation by @zzstoatzz in #572Update lexicons by @MarshalX in #562, #570, #567, #587, #591
Fix lexicon parsing for nested objects; apply a limited scope of types for properties of params by @MarshalX in #574
Fix models code generator with an empty union type by @MarshalX in #584
Fix the issue of session refreshing on session creation in Client by @betaprior in #582
Version 0.0.59
23.02.2025
Add support for the repository
#syncmessage in the subscribe repos firehose by @MarshalX in #556Add
chat.*andtools.*models to the main menu of documentation by @MarshalX in #551Allow SDK usage with
cryptographyv44 and v45 by @MarshalX in #554Fix segfault in CAR decoding (firehose subscription) by @MarshalX in #552
Fix descriptions of array items in generated models by @MarshalX in #534
Update lexicons by @MarshalX in #555, #537, #539, #540, #546, #548
Version 0.0.58
25.01.2025
Add the ability to send an aspect ratio with
send_videoby @yamamotura in #521Automatically reconnect firehose clients after a period of inactivity (timeout for recv) by @p1timmy in #520
Allow sync
on_session_changecallbacks in an async client by @MarshalX in #531Update lexicons fetched from c0a75d3 committed 2025-01-21T18:49:02Z by @MarshalX in #529
Fix session sharing with all cloned client instances by @MarshalX in #531
Fix types for image aspect ratios in
send_imageandsend_imagesby @MarshalX in #531
Version 0.0.57
20.01.2025
Add opt-in strict string format validation by @zzstoatzz in #451
Add documentation for string formats; fix
at-identifierformat by @zzstoatzz in #491Add an example to quote a post with an image by @zzstoatzz in #484
Fix grammar in the README by @ErikPohl444 in #492
Fix typo in the word
REFRESHby @tveastman in #500Update lexicons by @MarshalX in #490, #502, #503, #508, #516
Version 0.0.56
05.12.2024
Add ability to send aspect ratio with
send_imageandsend_imagesby @palmer-cl in #480Add new
add_user_to_listadvanced example by @MarshalX in #435Update lexicons by @MarshalX in #481, #485, #458, #452, #429, #442
Fix typo in item of
SessionEvent:'creat'->'create'by @zzstoatzz in #439Fix
clone()andwith_...()methods forAsyncClientby @MarshalX in #457Fix link to API docs for rate-limits in
atproto_client/auth.mdby @questionlp in #464
Version 0.0.55
24.10.2024
Version 0.0.54
13.09.2024
Add support for
known_valuesandenumof string properties in objects by @MarshalX in #391Fix string definitions which use
know_valuesfield as closed enum by @MarshalX in #389Fix model field default value generating in cases when this is the only one constraint by @MarshalX in #393
Fix response parsing for JSON content type by @MarshalX in #397
Version 0.0.53
10.09.2024
⚡ Thanks to libipld 2.0.0 firehose performance should increase approximately by 30%! No changes from you are required! Check more detailed benchmark results here
Version 0.0.52
01.09.2024
Version 0.0.51
31.08.2024
Version 0.0.50
30.08.2024
Use
jiterinstead of the built-injsonmodule to improve performance by @MarshalX in #360Update docs example to fix empty blocks of commit by @MarshalX in #363
Bump
certififrom 2024.2.2 to 2024.7.4 by @dependabot in #355Bump
zippfrom 3.18.1 to 3.19.1 by @dependabot in #356Bump
setuptoolsfrom 69.5.1 to 70.0.0 by @dependabot in #357Update lexicons by @MarshalX in #358, #359, #364, #366, #367
Version 0.0.49
04.07.2024
Breaking changes for Direct Messages. Now you must create a client with a chat proxy. See the updated documentation.
Add automatically switching to PDS endpoint after login and session resume by @MarshalX in #344
Add atproto proxy and atproto labelers support by @MarshalX in #345 and #351
Add
BlobRefrepresentation conversations by @MarshalX in #348Fix
BlobRefcreation for JSON representation by @MarshalX in #340Bump urllib3 from 2.2.1 to 2.2.2 by @dependabot in #346
Update lexicons by @MarshalX in #352, #350, #349, #347, #339, #337
Version 0.0.48
01.06.2024
Version 0.0.47
22.05.2024
💬 Just shipped: Bluesky Direct Messages!
Breaking changes
Many of these changes were backward compatible for a few months with proper warnings.
Delete deprecated record models called
Maininstead ofRecordby @MarshalX in #323Delete deprecated
subjectargument of.like()and.repost()methods by @MarshalX in #325
What’s Changed
Version 0.0.46
20.03.2024
Version 0.0.45
14.03.2024
Content labeling (moderation) is here! This update brings labeling data-stream support as well ozone.tools API!
Version 0.0.44
05.03.2024
Version 0.0.43
22.02.2024
🎉 New lexicon introduces Account Migration between PDS. More info: ACCOUNT_MIGRATION.md
Version 0.0.42
17.02.2024
Add
send_ogp_link_card.py(Open Graph protocol) example by @OhkuboSGMS in #273Update lexicons fetched from 8c94979 committed 2024-02-16T02:12:39Z by @MarshalX in #279
Bump cryptography from 41.0.7 to 42.0.2 by @dependabot in #280
Fix pyright for pydantic aliases via
alias_generatorby @MarshalX in #277Fix
filterargument ofget_author_feedmethod in #278
Version 0.0.41
09.02.2024
Version 0.0.40
04.02.2024
Syntax sugar for records is here! Check out how simple work with basic operations is:
from atproto import AtUri, Client, models
client = Client()
client.login('my-username', 'my-password')
# get records list
posts = client.app.bsky.feed.post.list(client.me.did, limit=10)
for uri, post in posts.records.items():
print(uri, post.text)
# get specific record
post = client.app.bsky.feed.post.get(client.me.did, AtUri.from_str(uri).rkey)
print(post.value.text)
# create new record
post_record = models.AppBskyFeedPost.Record(text='test record namespaces', created_at=client.get_current_time_iso())
new_post = client.app.bsky.feed.post.create(client.me.did, post_record)
print(new_post)
# delete record
deleted_post = client.app.bsky.feed.post.delete(client.me.did, AtUri.from_str(new_post.uri).rkey)
print(deleted_post)
⚠️ Record models have been renamed from “Main” to “Record”. Backward compatibility is provided but will be removed soon! ⚠️ Internals of High-Level Clients have been migrated to new syntax sugar. It could affect you because returned models are changed but the fields are the same.
Version 0.0.39
02.02.2024
⚠️ Using strong references in .like() and .repost() methods are deprecated. Use URI and CID arguments instead.
Use .like() and .repost() methods without strong reference by @MarshalX in #255
Improve URL detection in auto_hyperlinks example by @editor-syntax in #250
Update lexicons fetched from f023494 committed 2024-01-30T22:19:36Z by @MarshalX in #259
Add docs codegen check to GitHub Actions Workflow by @MarshalX in #260
Version 0.0.38
26.01.2024
Version 0.0.37
12.01.2024
🎉 Welcome in 2024! User-specific custom feeds are here! This is a massive update with a lot of new implementations including Service JWT, signature validation, DID Keys, AtProtoData, and more! Huge docs restructuring is here too: atproto.blue
Code snippet: Authorized Custom Feed (user-specific results)
SDK:
Implement AtprotoData and DID key formatting and parsing by @MarshalX in #227
Add tests for auth flow in custom feeds by @MarshalX in #236
Describe JWT payload according to RFC 7519 by @MarshalX in #235
Update lexicons fetched from 51fcba7 committed 2024-01-09T23:29:07Z by @MarshalX in #238
Docs:
Version 0.0.36
23.12.2023
The AT Protocol Identity package has been implemented! It allows the resolution of DIDs and Handles using various techniques like DNS, HTTP, and PLC directory. Abstract and in-memory caching has been brought too. And as always, it provides both sync and async interfaces. Check the docs below!
Version 0.0.35
21.12.2023
❗Breaking changes: SDK was split into many packages. This affects imports in your codebase. Read more
Version 0.0.34
17.12.2023
Make SDK more backward and forward-compatible with protocol by @MarshalX in #207
Add plenty of new high-level methods by @MarshalX in #208
Breaking changes:
unlikenow accepts AT URI instead ofrecord_keyandprofile_identify
New methods:
get_postget_postsget_post_threadget_likesget_reposted_byget_timelineget_author_feedunrepostAKAdelete_reportfollowunfollowAKAdelete_followget_followsget_followersget_profileget_profilesmuteunmuteresolve_handleupdate_handleupload_blob
Migrate lexicon parser from dacite to pydantic; enable ruff ANN by @MarshalX in #206
Removed exceptions:
UnknownPrimitiveTypeErrorUnknownDefinitionTypeError
Renamed fields:
schema->schema_maxLength->max_length… and all other camelCase names now in snake_case
Version 0.0.33
13.12.2023
Version 0.0.32
11.12.2023
Version 0.0.31
02.12.2023
Version 0.0.30
06.11.2023
Add Python 3.12; migrate from black to ruff format by @MarshalX in #177
Async Firehose Client: block on make message handler call, add on error callback by @DXsmiley in #157
Downgrade sphinxext-opengraph to clean up the tree of dependencies (including vulnerable) by @MarshalX in #179
Update lexicons fetched from 46b108c committed 2023-10-26T22:29:51Z by @MarshalX in #178
Update lexicons fetched from 772736a committed 2023-11-02T20:16:26Z by @MarshalX in #182
Fix type hint of OnMessageCallback (Firehose client) by @MarshalX in #183
Version 0.0.29
28.09.2023
Version 0.0.28
16.09.2023
Add
update_paramsmethod to firehose clients to fix utilizing the old state on reconnecting by @MarshalX in #149Add the ability to export and import session string by @MarshalX in #154
Add the ability to pass
base_urito Firehose clients by @MarshalX in #155Update lexicons fetched from 9879ca9 committed 2023-09-14T20:24:48Z by @MarshalX in #150
Version 0.0.27
13.09.2023
Version 0.0.26
08.09.2023
All models have been migrated to Pydantic v2. Fields constraints have been added. Decoding of DAG-CBOR, CID and CAR files has been migrated to the brand-new library libipld. This library is powered by Rust and is much faster than the previous implementation. Pydantic v2 also uses Rust in the core. This leads to a significant performance boost.
Firehose catch up benchmark:
The previous SDK version: 700 commits in 5 seconds.
After migration to Pydantic v2: 2650 commits in 5 seconds.
After migration to libipld: 20000 commits in 5 seconds.
Using pydantic v2 and libipld with multiprocessing: 30000 commits in 5 seconds.
The new release gives a 40x performance boost! But the cost is a lot of breaking changes.
Example of firehose consumer with multiprocessing: process_commits.py
Test stand for benchmarks: MacBook Pro 2021, Apple M1 Pro, 32 GB RAM, 450mbps connection speed, Python 3.8
❗Breaking changes
Python 3.7.0 has been dropped. The minimum supported version is now Python 3.7.1.
Camel cased fields are gone. Use snake case instead. For example,
createdAtis nowcreated_at.Root namespace has been fixed from
bskytoapp. For example,Client().bsky.feed.get_likesis nowClient().app.bsky.feed.get_likes.Using similar model instances as strong refs is not allowed anymore. Use
models.create_strong_refhelper function to convert refs (example).Creating model instances using positional arguments is no longer supported. Use keyword arguments instead. For example, thant’s not possible anymore
models.ComAtprotoIdentityResolveHandle.Params('marshal.dev'). Usemodels.ComAtprotoIdentityResolveHandle.Params(handle='marshal.dev')instead.Fields that conflict with reserved Pydantic names has _ (underscore) suffix. For example,
validationis nowvalidation_.DotDicthas been moved tomodels.dot_dict.Inheritance of base models has been changed. Please check new base classes.
Inheritance of
DotDicthas been changed. Please check the new base class.BlobRefmodel doesn’t containto_dict()method anymore.CIDclass has been reimplemented using libipld lib. It supports much less API._typefield of models has been renamed topy_type. Now it’s constant.leb128module has been removed.Type hint of
CIDhas been changed toCIDType.Type hint of
DotDicthas been changed toDotDictType.multiformatsanddag-cbordependencies have been removed.These reference classes have been removed:
ResponseReffromget_profile. Usemodels.AppBskyActorDefs.ProfileViewDetailedinstead.ResponseReffromget_moderation_action. Usemodels.ComAtprotoAdminDefs.ActionViewDetailinstead.ResponseReffromget_moderation_report. Usemodels.ComAtprotoAdminDefs.ReportViewDetailinstead.ResponseReffromget_record. Usemodels.ComAtprotoAdminDefs.RecordViewDetailinstead.ResponseReffromget_repo. Usemodels.ComAtprotoAdminDefs.RepoViewDetailinstead.ResponseReffromresolve_moderation_reports. Usemodels.ComAtprotoAdminDefs.ActionViewinstead.ResponseReffromreverse_moderation_action. Usemodels.ComAtprotoAdminDefs.ActionViewinstead.ResponseReffromtake_moderation_action. Usemodels.ComAtprotoAdminDefs.ActionViewinstead.ResponseReffromcreate_app_password. Usemodels.ComAtprotoServerCreateAppPassword.AppPasswordinstead.
These exceptions have been removed:
UnexpectedFieldError. UseModelErrorinstead.MissingValueError. UseModelErrorinstead.ModelFieldError. UseModelErrorinstead.WrongTypeError. UseModelErrorinstead.CBORDecodingError. UseDAGCBORDecodingErrorinstead.
New Features
Unit tests for model serialization and deserialization.
Nested dictionaries support in
DotDictmodels.DotDictmodels now support__getitem__and__setitem__methods.create_strong_refhelper function to convert ref-like models to strong refs.Fields constraints for models. Now you can see the max items count for the image array, max string length, etc.
Better documentation of models.
Minor Changes
Fixed nesting of
DotDictmodels.Fixed serialization of
Uniontypes.Fixed serialization of
Literaltypes.Fixed sending proper datetime values to the server.
Fixed printing tracebacks in the Firehose async client.
Fixed chaining of firehose exceptions.
Fixed locked and outdated
typing-extensionsdependency.Fixed passing of arguments to
ClientBase.
Version 0.0.25
30.08.2023
🔥 Bsky made breaking changes in models of firehose. This release fixes it
Version 0.0.24
15.08.2023
Version 0.0.23
23.07.2023
Version 0.0.22
23.07.2023
release has been yanked
Version 0.0.21
21.07.2023
Version 0.0.20
19.07.2023
Version 0.0.19
18.07.2023
Version 0.0.18
16.07.2023
Version 0.0.17
06.07.2023
Version 0.0.16
01.07.2023
Version 0.0.15
23.06.2023
Version 0.0.14
10.06.2023
Update lexicons fetched from 8857fb0 committed 2023-06-09T13:21:09Z by @MarshalX in #68
Bump requests from 2.30.0 to 2.31.0 by @dependabot in #69
Version 0.0.13
03.06.2023
Version 0.0.12
01.06.2023
Version 0.0.11
30.05.2023
Version 0.0.10
27.05.2023
Update lexicons fetched from 743eaf1 committed 2023-05-26T00:04:10Z by @MarshalX in #44
Add Ruff; init tests; fix code style and type hints by @MarshalX in #45
Move docs dependencies to separated group by @MarshalX in #46
Update lexicons fetched from c62964b committed 2023-05-26T00:22:05Z by @MarshalX in #49
Version 0.0.9
25.05.2023
Version 0.0.8
23.05.2023
Version 0.0.7
20.05.2023
Version 0.0.6
19.05.2023
Version 0.0.5
17.05.2023
Version 0.0.4
12.05.2023
Version 0.0.3
08.05.2023
Version 0.0.2
06.05.2023
The first public release.