a collection of lightweight TypeScript packages for AT Protocol, the protocol powering Bluesky
atproto
bluesky
typescript
npm
1# atcute
2
3lightweight TypeScript packages for [AT Protocol](https://atproto.com), the protocol powering
4Bluesky.
5
6## quick start
7
8```sh
9npm install @atcute/client @atcute/bluesky
10```
11
12```ts
13import { Client, simpleFetchHandler } from '@atcute/client';
14import type {} from '@atcute/bluesky';
15
16const client = new Client({
17 handler: simpleFetchHandler({ service: 'https://public.api.bsky.app' }),
18});
19
20const { data } = await client.get('app.bsky.actor.getProfile', {
21 params: { actor: 'bsky.app' },
22});
23
24console.log(data.displayName);
25// -> Bluesky
26```
27
28for authenticated requests, see the [client docs](./packages/clients/client) or use the
29[OAuth browser client](./packages/oauth/browser-client) for web apps.
30
31## packages
32
33| Packages |
34| ----------------------------------------------------------------------------------------------------------- |
35| **Client packages** |
36| [`client`](./packages/clients/client): XRPC HTTP client |
37| [`firehose`](./packages/clients/firehose): XRPC subscription client |
38| [`jetstream`](./packages/clients/jetstream): Jetstream WebSocket client |
39| [`tap`](./packages/clients/tap): Tap WebSocket client |
40| [`cache`](./packages/clients/cache): normalized cache store |
41| **Server packages** |
42| [`xrpc-server`](./packages/servers/xrpc-server): XRPC web framework |
43| [`xrpc-server-bun`](./packages/servers/xrpc-server-bun): Bun WebSocket adapter |
44| [`xrpc-server-cloudflare`](./packages/servers/xrpc-server-cloudflare): Cloudflare Workers WebSocket adapter |
45| [`xrpc-server-deno`](./packages/servers/xrpc-server-deno): Deno WebSocket adapter |
46| [`xrpc-server-node`](./packages/servers/xrpc-server-node): Node.js WebSocket adapter |
47| **OAuth packages** |
48| [`oauth-browser-client`](./packages/oauth/browser-client): minimal OAuth client for SPAs |
49| [`oauth-node-client`](./packages/oauth/node-client): OAuth client for Node.js |
50| **Lexicon packages** |
51| [`lex-cli`](./packages/lexicons/lex-cli): generate TypeScript from lexicon schemas |
52| [`lexicon-doc`](./packages/lexicons/lexicon-doc): parse and author lexicon documents |
53| [`lexicon-resolver`](./packages/lexicons/lexicon-resolver): resolve lexicons from the network |
54| [`lexicons`](./packages/lexicons/lexicons): core types and schema validation |
55| **Lexicon definition packages** |
56| [`atproto`](./packages/definitions/atproto): `com.atproto.*` definitions |
57| [`bluemoji`](./packages/definitions/bluemoji): `blue.moji.*` definitions |
58| [`bluesky`](./packages/definitions/bluesky): `app.bsky.*`, `chat.bsky.*` definitions |
59| [`frontpage`](./packages/definitions/frontpage): `fyi.unravel.frontpage.*` definitions |
60| [`leaflet`](./packages/definitions/leaflet): `pub.leaflet.*` definitions |
61| [`lexicon-community`](./packages/definitions/lexicon-community): `community.lexicon.*` definitions |
62| [`microcosm`](./packages/definitions/microcosm): `blue.microcosm.*`, `com.bad-example.*` definitions |
63| [`ozone`](./packages/definitions/ozone): `tools.ozone.*` definitions |
64| [`pckt`](./packages/definitions/pckt): `blog.pckt.*` definitions |
65| [`tangled`](./packages/definitions/tangled): `sh.tangled.*` definitions |
66| [`whitewind`](./packages/definitions/whitewind): `com.whtwnd.*` definitions |
67| **Identity packages** |
68| [`identity`](./packages/identity/identity): handle, DID and DID document types |
69| [`identity-resolver`](./packages/identity/identity-resolver): handle and DID document resolution |
70| [`identity-resolver-node`](./packages/identity/identity-resolver-node): Node.js DNS-based handle resolver |
71| [`did-plc`](./packages/identity/did-plc): did:plc operation validation |
72| **Utility packages** |
73| [`car`](./packages/utilities/car): CAR archive codec |
74| [`cbor`](./packages/utilities/cbor): deterministic CBOR codec |
75| [`cid`](./packages/utilities/cid): content identifier codec |
76| [`crypto`](./packages/utilities/crypto): signing and verification |
77| [`mst`](./packages/utilities/mst): merkle search tree utilities |
78| [`multibase`](./packages/utilities/multibase): base32/base64 encoding |
79| [`repo`](./packages/utilities/repo): repository export reader |
80| [`tid`](./packages/utilities/tid): timestamp identifier codec |
81| [`varint`](./packages/utilities/varint): LEB128 varint codec |
82| **Bluesky-specific packages** |
83| [`bluesky-moderation`](./packages/bluesky/moderation): content moderation interpretation |
84| [`bluesky-richtext-builder`](./packages/bluesky/richtext-builder): rich text facet builder |
85| [`bluesky-richtext-parser`](./packages/bluesky/richtext-parser): parse rich text syntax |
86| [`bluesky-richtext-segmenter`](./packages/bluesky/richtext-segmenter): segment text by facets |
87| [`bluesky-search-parser`](./packages/bluesky/search-parser): search query tokenizer |
88| [`bluesky-threading`](./packages/bluesky/threading): atomic thread publishing |
89
90## contributing
91
92this monorepo uses [mise](https://mise.jdx.dev) for runtime versioning and pnpm for package
93management.
94
95```sh
96# install runtimes
97mise install
98
99# build all packages
100pnpm run -r build
101
102# pull latest lexicons and regenerate definitions
103pnpm run -r pull
104pnpm run -r generate
105```
106
107### package size reporting
108
109check bundle sizes with the `pkg-size-report` tool:
110
111> [!WARNING]
112> run `pnpm run -r build` first, otherwise measurements may be inaccurate.
113
114```sh
115pnpm pkg-size-report # show sizes (and diff if previously saved)
116pnpm pkg-size-report --save # save current sizes for comparison
117pnpm pkg-size-report --compare # show only changed packages
118```