Source: https://seerepo.com/r/bluesky-social/atproto/built
Markdown source: https://seerepo.com/r/bluesky-social/atproto/built.md
Description: atproto is a TypeScript repo built with Express, Expo, Vite, React, and TanStack. It reaches its data with kysely.

# What is atproto built with?

atproto is a TypeScript repo built with Express, Expo, Vite, React, and TanStack. It reaches its data with kysely, signs people in with jose, com.nimbusds:nimbus-jose-jwt, and @hcaptcha/react-hcaptcha, stores files in AWS S3, uses AI through lande, makes its content with sharp, nodemailer, and file-type, validates its data with Zod, @hapi/address, disposable-email-domains-js, and @standard-schema/spec, is tested with Jest, Vitest, and Puppeteer, deploys with @opentelemetry/semantic-conventions, pino, pino-http, OpenTelemetry, prom-client, and 2 more, and uses @aws-sdk/lib-storage, Postgres, Redis, SQLite, lru-cache, and 2 more. It has 385,793 written lines, with 556 test files.

Read on November 14, 2026, at commit 9f605e0.

Repository: https://github.com/bluesky-social/atproto

## Support (packages/api)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Jest**: 1 file

### Other

- **await-lock**: 1 file
- **http-terminator**: 1 file
- **tlds**: 1 file

## Backend (packages/aws)

### Data

- **@aws-sdk/lib-storage**: 1 file

### Services

- **[AWS S3](https://seerepo.com/uses/aws-s3)**: 1 file · [packages/aws/src/s3.ts, line 2](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/aws/src/s3.ts#L2)

## Support (packages/aws)

### Testing

- **Vitest**: 1 file

### Other

- **[aws-sdk](https://seerepo.com/uses/aws-sdk)**: 2 files
- **@noble/curves**: 1 file
- **multiformats**: 1 file

## Backend (packages/bsky)

### The base

- **[Express](https://seerepo.com/uses/express)**: 17 files · [in packages/pds/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/package.json)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 1 file · [packages/ozone/src/db/index.ts, line 15](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/ozone/src/db/index.ts#L15)
- **[Redis](https://seerepo.com/uses/redis)**: 1 file · [packages/bsky/src/redis.ts, line 2](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/bsky/src/redis.ts#L2)

### Data access

- **[kysely](https://seerepo.com/uses/kysely)**: 109 files

### Sign-in

- **[jose](https://seerepo.com/uses/jose)**: 1 file

## Support (packages/bsky)

### Content

- **[sharp](https://seerepo.com/uses/sharp)**: 2 files

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 4 files
- **@hapi/address**: 2 files
- **disposable-email-domains-js**: 2 files

### Testing

- **Vitest**: 111 files

### Deploy

- **[@opentelemetry/semantic-conventions](https://seerepo.com/uses/opentelemetry-semantic-conventions)**: 1 file
- **[pino](https://seerepo.com/uses/pino)**: 1 file
- **[pino-http](https://seerepo.com/uses/pino-http)**: 1 file

### Other

- **connectrpc**: 37 files
- **@bufbuild/protobuf**: 14 files
- **uint8arrays**: 5 files
- **http-errors**: 3 files
- **undici**: 3 files
- **@growthbook/growthbook**: 2 files
- **http-terminator**: 2 files
- **OpenTelemetry**: 2 files
- **@noble/curves**: 1 file
- **compression**: 1 file
- **cors**: 1 file
- **murmurhash**: 1 file
- **p-queue**: 1 file
- **structured-headers**: 1 file

## Backend (packages/bsync)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 1 file · [packages/ozone/src/db/index.ts, line 15](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/ozone/src/db/index.ts#L15)

### Data access

- **[kysely](https://seerepo.com/uses/kysely)**: 17 files

## Support (packages/bsync)

### Deploy

- **[@opentelemetry/semantic-conventions](https://seerepo.com/uses/opentelemetry-semantic-conventions)**: 1 file
- **[pino-http](https://seerepo.com/uses/pino-http)**: 1 file

### Tools

- **get-port**: 5 files

### Other

- **connectrpc**: 14 files
- **OpenTelemetry**: 2 files
- **@bufbuild/protobuf**: 1 file
- **http-terminator**: 1 file

## Support (packages/common-web)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 2 files

## Support (packages/common)

### Testing

- **Vitest**: 4 files

### Deploy

- **[pino](https://seerepo.com/uses/pino)**: 1 file

### Other

- **uint8arrays**: 2 files
- **multiformats**: 1 file

## Support (packages/crypto)

### Other

- **uint8arrays**: 10 files
- **noble**: 8 files

## Backend (packages/dev-env)

### The base

- **[Express](https://seerepo.com/uses/express)**: 1 file · [in packages/pds/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/package.json)

## Support (packages/dev-env)

### Tools

- **get-port**: 1 file

### Other

- **uint8arrays**: 4 files
- **http-terminator**: 2 files
- **multiformats**: 1 file
- **undici**: 1 file

## Support (packages/did)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 3 files

## Backend (packages/identity)

### The base

- **[Express](https://seerepo.com/uses/express)**: 1 file · [in packages/pds/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/package.json)

## Support (packages/identity)

### Testing

- **Jest**: 3 files

### Tools

- **get-port**: 2 files

### Other

- **cors**: 1 file

## Support (packages/internal/did-resolver)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

## Support (packages/internal/fetch-node)

### Testing

- **Vitest**: 4 files

### Other

- **ipaddr.js**: 2 files

## Support (packages/internal/fetch)

### Testing

- **Vitest**: 2 files

## Support (packages/internal/handle-resolver)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 1 file

## Backend (packages/internal/opentelemetry-node)

### Data

- **[SQLite](https://seerepo.com/uses/sqlite)**: 1 file · [packages/pds/src/db/db.ts, line 2](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/src/db/db.ts#L2)

## Support (packages/internal/opentelemetry-node)

### Testing

- **Vitest**: 5 files

### Deploy

- **OpenTelemetry**: 5 files

### Tools

- **import-in-the-middle**: 1 file

### Other

- **[opentelemetry](https://seerepo.com/uses/opentelemetry)**: 5 files

## Support (packages/internal/rolldown-plugin-bundle-manifest)

### Tools

- **Rolldown**: 1 file

### Other

- **mime**: 1 file

## Backend (packages/internal/simple-store-memory)

### Data

- **[lru-cache](https://seerepo.com/uses/lru-cache)**: 1 file

## Support (packages/internal/simple-store)

### Testing

- **Vitest**: 2 files

## Support (packages/internal/xrpc-utils)

### Testing

- **Vitest**: 1 file

## Support (packages/lex-cli)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Tools

- **ts-morph**: 4 files
- **commander**: 1 file
- **Prettier**: 1 file

### Other

- **chalk**: 1 file

## Support (packages/lex/lex-builder)

### Testing

- **Vitest**: 3 files

### Tools

- **ts-morph**: 3 files
- **Prettier**: 1 file
- **yargs**: 1 file

## Support (packages/lex/lex-cbor)

### Testing

- **Vitest**: 5 files

### Other

- **cborg**: 1 file

## Support (packages/lex/lex-client)

### Testing

- **Vitest**: 1 file

## Support (packages/lex/lex-data)

### Testing

- **Vitest**: 17 files

### Other

- **multiformats**: 5 files
- **core-js**: 3 files
- **unicode-segmenter**: 1 file

## Support (packages/lex/lex-document)

### Testing

- **Vitest**: 3 files

## Support (packages/lex/lex-installer)

### Testing

- **Vitest**: 4 files

### Tools

- **Prettier**: 1 file
- **yargs**: 1 file

## Support (packages/lex/lex-json)

### Testing

- **Vitest**: 6 files

## Support (packages/lex/lex-password-session)

### Testing

- **Vitest**: 2 files

## Support (packages/lex/lex-resolver)

### Testing

- **Vitest**: 1 file

## Support (packages/lex/lex-rpc)

### Testing

- **Vitest**: 7 files

## Support (packages/lex/lex-schema)

### Validation

- **[@standard-schema/spec](https://seerepo.com/uses/standard-schema-spec)**: 2 files

### Testing

- **Vitest**: 42 files

## Support (packages/lex/lex-server)

### Testing

- **Vitest**: 5 files

### Other

- **http-terminator**: 1 file
- **ws**: 1 file

## Support (packages/lex/lex)

### Testing

- **Vitest**: 14 files

## Support (packages/lexicon-resolver)

### Testing

- **Vitest**: 2 files

## Support (packages/lexicon)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 3 files

### Other

- **multiformats**: 4 files

## Backend (packages/oauth/jwk-jose)

### Sign-in

- **[jose](https://seerepo.com/uses/jose)**: 1 file

## Support (packages/oauth/jwk)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 5 files

### Other

- **multiformats**: 1 file

## Support (packages/oauth/oauth-client-browser)

### Other

- **core-js**: 3 files

## Frontend (packages/oauth/oauth-client-expo)

### The base

- **[Expo](https://seerepo.com/uses/expo)**: 1 file

## Backend (packages/oauth/oauth-client-expo)

### Data

- **react-native-mmkv**: 2 files

### Sign-in

- **com.nimbusds:nimbus-jose-jwt**: 2 files

## Support (packages/oauth/oauth-client-expo)

### Other

- **core-js**: 2 files
- **expo-web-browser**: 1 file
- **react-native-url-polyfill**: 1 file

## Support (packages/oauth/oauth-client)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 3 files

### Other

- **multiformats**: 2 files
- **core-js**: 1 file

## Frontend (packages/oauth/oauth-provider-ui)

### The base

- **[Vite](https://seerepo.com/uses/vite)**: [in packages/oauth/oauth-provider-ui/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/oauth/oauth-provider-ui/package.json)
- **[React](https://seerepo.com/uses/react)**: 104 files · [in packages/oauth/oauth-provider-ui/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/oauth/oauth-provider-ui/package.json)
- **[TanStack](https://seerepo.com/uses/tanstack)**: 15 files

### Styles

- **[Tailwind CSS](https://seerepo.com/uses/tailwind-css)**
- **[class-variance-authority](https://seerepo.com/uses/class-variance-authority)**: 6 files
- **[tailwind-merge](https://seerepo.com/uses/tailwind-merge)**: 1 file

### Interface

- **[Base UI](https://seerepo.com/uses/base-ui)**: 18 files
- **[react-error-boundary](https://seerepo.com/uses/react-error-boundary)**: 3 files

### Icons

- **[Lucide](https://seerepo.com/uses/lucide)**: 36 files

## Backend (packages/oauth/oauth-provider-ui)

### Sign-in

- **@hcaptcha/react-hcaptcha**: 1 file

## Support (packages/oauth/oauth-provider-ui)

### Testing

- **Vitest**: 5 files

### Other

- **lingui**: 93 files
- **@tanstack/react-query**: 9 files
- **clsx**: 4 files
- **ua-parser-js**: 1 file

## Backend (packages/oauth/oauth-provider)

### Data

- **[Redis](https://seerepo.com/uses/redis)**: 1 file · [packages/bsky/src/redis.ts, line 2](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/bsky/src/redis.ts#L2)

### Sign-in

- **[jose](https://seerepo.com/uses/jose)**: 4 files

## Support (packages/oauth/oauth-provider)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 40 files
- **@hapi/address**: 1 file
- **disposable-email-domains-js**: 1 file

### Testing

- **Vitest**: 9 files

### Other

- **http-errors**: 6 files
- **hapi**: 3 files
- **cookie**: 1 file

## Support (packages/oauth/oauth-resolver)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 1 file

## Support (packages/oauth/oauth-scopes)

### Testing

- **Vitest**: 12 files

## Support (packages/oauth/oauth-types)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 42 files

## Backend (packages/ozone)

### The base

- **[Express](https://seerepo.com/uses/express)**: 6 files · [in packages/pds/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/package.json)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 1 file · [packages/ozone/src/db/index.ts, line 15](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/ozone/src/db/index.ts#L15)

### Data access

- **[kysely](https://seerepo.com/uses/kysely)**: 126 files

### AI

- **lande**: 1 file

## Support (packages/ozone)

### Testing

- **Jest**: 20 files

### Deploy

- **[prom-client](https://seerepo.com/uses/prom-client)**: 6 files
- **@opentelemetry/instrumentation-pg**: 1 file
- **[pino-http](https://seerepo.com/uses/pino-http)**: 1 file

### Other

- **ws**: 3 files
- **p-queue**: 2 files
- **compression**: 1 file
- **cors**: 1 file
- **http-terminator**: 1 file
- **multiformats**: 1 file
- **structured-headers**: 1 file
- **uint8arrays**: 1 file
- **undici**: 1 file

## Backend (packages/pds)

### The base

- **[Express](https://seerepo.com/uses/express)**: 12 files · [in packages/pds/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/package.json)

### Data

- **@opentelemetry/instrumentation-ioredis**: 1 file
- **[Redis](https://seerepo.com/uses/redis)**: 1 file · [packages/bsky/src/redis.ts, line 2](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/bsky/src/redis.ts#L2)
- **[SQLite](https://seerepo.com/uses/sqlite)**: 1 file · [packages/pds/src/db/db.ts, line 2](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/src/db/db.ts#L2)

### Data access

- **[kysely](https://seerepo.com/uses/kysely)**: 33 files

### Sign-in

- **[jose](https://seerepo.com/uses/jose)**: 3 files

## Support (packages/pds)

### Content

- **[nodemailer](https://seerepo.com/uses/nodemailer)**: 3 files
- **[file-type](https://seerepo.com/uses/file-type)**: 1 file

### Validation

- **@hapi/address**: 2 files
- **disposable-email-domains-js**: 2 files
- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Jest**: 11 files
- **Puppeteer**: 4 files

### Deploy

- **@opentelemetry/instrumentation-aws-sdk**: 1 file
- **[pino](https://seerepo.com/uses/pino)**: 1 file
- **[pino-http](https://seerepo.com/uses/pino-http)**: 1 file

### Tools

- **get-port**: 1 file

### Other

- **p-queue**: 4 files
- **uint8arrays**: 3 files
- **undici**: 2 files
- **@noble/curves**: 1 file
- **compression**: 1 file
- **cors**: 1 file
- **express-async-errors**: 1 file
- **http-terminator**: 1 file
- **OpenTelemetry**: 1 file
- **strtok3**: 1 file
- **ws**: 1 file

## Support (packages/repo)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 2 files

## Support (packages/sync)

### Other

- **p-queue**: 1 file

## Support (packages/syntax)

### Testing

- **Vitest**: 10 files

## Backend (packages/tap)

### The base

- **[Express](https://seerepo.com/uses/express)**: 1 file · [in packages/pds/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/package.json)

## Support (packages/tap)

### Testing

- **Vitest**: 5 files

### Other

- **ws**: 2 files
- **http-terminator**: 1 file

## Support (packages/ws-client)

### Testing

- **Vitest**: 9 files

### Other

- **http-terminator**: 1 file
- **ws**: 1 file

## Backend (packages/xrpc-server)

### The base

- **[Express](https://seerepo.com/uses/express)**: 3 files · [in packages/pds/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/package.json)

## Support (packages/xrpc-server)

### Testing

- **Jest**: 1 file
- **[jose](https://seerepo.com/uses/jose)**: 1 file

### Other

- **ws**: 2 files
- **@noble/curves**: 1 file
- **body-parser**: 1 file
- **http-errors**: 1 file
- **mime-types**: 1 file
- **multiformats**: 1 file
- **rate-limiter-flexible**: 1 file

## Support (packages/xrpc)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

## Support (services/ozone)

### Deploy

- **[prom-client](https://seerepo.com/uses/prom-client)**: 2 files

## Other repos with a similar stack

- [payloadcms/payload](https://seerepo.com/r/payloadcms/payload/built): @aws-sdk/lib-storage, AWS S3, Postgres, Redis, SQLite, Vite, React, TanStack, Zod, jose, sharp, pino, @standard-schema/spec, react-error-boundary, nodemailer, file-type · [Compare](https://seerepo.com/compare/bluesky-social/atproto/vs/payloadcms/payload)
- [ruvnet/ruflo](https://seerepo.com/r/ruvnet/ruflo/built): Express, Postgres, SQLite, Vite, React, Zod, jose, sharp, pino, Tailwind CSS, class-variance-authority, tailwind-merge, Lucide, prom-client, file-type · [Compare](https://seerepo.com/compare/bluesky-social/atproto/vs/ruvnet/ruflo)
- [calcom/cal.diy](https://seerepo.com/r/calcom/cal.diy/built): Postgres, Redis, lru-cache, React, TanStack, Zod, kysely, jose, sharp, Tailwind CSS, class-variance-authority, tailwind-merge, Base UI, Lucide, nodemailer · [Compare](https://seerepo.com/compare/bluesky-social/atproto/vs/calcom/cal.diy)
- [paperclipai/paperclip](https://seerepo.com/r/paperclipai/paperclip/built): AWS S3, Express, Postgres, Vite, React, Zod, sharp, pino, pino-http, Tailwind CSS, class-variance-authority, tailwind-merge, Base UI, Lucide · [Compare](https://seerepo.com/compare/bluesky-social/atproto/vs/paperclipai/paperclip)
- [TryGhost/Ghost](https://seerepo.com/r/TryGhost/Ghost/built): Express, lru-cache, Vite, React, Zod, jose, sharp, Tailwind CSS, class-variance-authority, tailwind-merge, react-error-boundary, Lucide, nodemailer, file-type · [Compare](https://seerepo.com/compare/bluesky-social/atproto/vs/TryGhost/Ghost)
- [CherryHQ/cherry-studio](https://seerepo.com/r/CherryHQ/cherry-studio/built): @aws-sdk/lib-storage, SQLite, lru-cache, Vite, React, TanStack, Zod, sharp, Tailwind CSS, class-variance-authority, tailwind-merge, react-error-boundary, Lucide, file-type · [Compare](https://seerepo.com/compare/bluesky-social/atproto/vs/CherryHQ/cherry-studio)

## Frequently asked questions

### What language is atproto written in?

atproto is written in TypeScript, with 385,793 written lines.

### What framework does atproto use?

atproto is built with Express, Expo, Vite, React, and TanStack.

The proof: [in packages/pds/package.json](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/pds/package.json)

### What does atproto sign people in with?

atproto signs people in with jose, com.nimbusds:nimbus-jose-jwt, and @hcaptcha/react-hcaptcha.

### Does atproto use AI?

Yes. atproto uses AI through lande.

### What services does atproto use?

atproto stores files in AWS S3 and uses @aws-sdk/lib-storage, Postgres, Redis, SQLite, lru-cache, react-native-mmkv, and @opentelemetry/instrumentation-ioredis.

The proof: [packages/aws/src/s3.ts, line 2](https://github.com/bluesky-social/atproto/blob/9f605e0fb117173dea8b5c1e9d6ad13bd6995c7f/packages/aws/src/s3.ts#L2)

### Does atproto have tests?

Yes. atproto has 556 test files and is tested with Jest, Vitest, and Puppeteer.

### Which repos have a stack like atproto's?

The ones that share most of its stack: payloadcms/payload, ruvnet/ruflo, and calcom/cal.diy.

## What is your repo built with?

Any public repo, with no account: https://seerepo.com/r/owner/repo/built, with the owner and name it has on GitHub.
