Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
03445ee
update group chat lexicons (#4876)
rafaeleyng Apr 22, 2026
17c394d
Version packages (#4878)
github-actions[bot] Apr 22, 2026
6467208
Add documentation for requestLock throwing errors (#4879)
ThisIsMissEm Apr 22, 2026
5d3e248
Fix `/.well-known/change-password` page (#4880)
matthieusieben Apr 23, 2026
877e629
pds: use entryway mock server for tests (#4757)
devinivy Apr 24, 2026
087515e
Improve oauth client sign-in options (#4896)
matthieusieben Apr 29, 2026
5af5def
Version packages (#4881)
github-actions[bot] Apr 29, 2026
3f1cb53
update chat lexicons and permission-set (#4903)
rafaeleyng May 4, 2026
16c1c9b
Version packages (#4904)
github-actions[bot] May 4, 2026
2879b56
update chat lexicons (#4906)
rafaeleyng May 5, 2026
02b8b32
Blur media on account level adult labels (#4769)
whyrusleeping May 5, 2026
4a74b49
Version packages (#4907)
github-actions[bot] May 5, 2026
5f37211
Update age assurance config (#4908)
estrattonbailey May 5, 2026
65a4b31
:sparkles: Add expiring tags in ozone (#4894)
foysalit May 6, 2026
583928d
Version packages (#4909)
github-actions[bot] May 6, 2026
450f26a
Add `associatedRecord` to external embed record (#4912)
estrattonbailey May 7, 2026
352ad55
Version packages (#4913)
github-actions[bot] May 7, 2026
d05b76c
:sparkles: Ozone report based queue system (#4661)
foysalit May 8, 2026
44352e6
Version packages (#4918)
github-actions[bot] May 8, 2026
733d557
update courier proto (#4919)
rafaeleyng May 8, 2026
907edfa
Improve lex SDK JSDoc (#4888)
matthieusieben May 11, 2026
6ccfa49
Fix "impossible" comparison in serviceAuth (#4892)
essential-randomness May 11, 2026
8ffae17
update chat lexicons (#4924)
rafaeleyng May 11, 2026
2fd8d62
increase string preview in validation error (#4925)
rafaeleyng May 11, 2026
4502df1
update chat lexicons (#4926)
rafaeleyng May 11, 2026
2440d55
Version packages (#4920)
github-actions[bot] May 11, 2026
15b5a8f
Remove path prefix for XRPC router in README and nodejs files (#4891)
essential-randomness May 11, 2026
7b8c5d6
Add devEngines config for node and pnpm (#4905)
ds-boyce May 11, 2026
18d3114
update chat lexicons (#4932)
rafaeleyng May 12, 2026
0533a5f
trigger actions (#4933)
rafaeleyng May 12, 2026
5d9f96c
Version packages (#4934)
github-actions[bot] May 12, 2026
7cfff18
Use pnpm publish in CI to avoid devEngines conflict with npm (#4928)
devinivy May 12, 2026
dda6194
Fix CI publish devEngines conflict with changeset publish (#4938)
devinivy May 13, 2026
04d727c
add tests for account manager (#4844)
matthieusieben May 13, 2026
cb13878
update chat lexicons (#4945)
rafaeleyng May 15, 2026
38bc2fa
update chat lexicons (#4946)
rafaeleyng May 15, 2026
ea4184b
Replace associatedRecord with associatedRecords on external embed (#4…
estrattonbailey May 17, 2026
d8b2374
Make `options` required for `Client.get` (#4948)
matthieusieben May 18, 2026
e60137c
Version packages (#4939)
github-actions[bot] May 18, 2026
f01c59f
Upgrade packages to node v22+ (#4929)
devinivy May 19, 2026
908bece
Upgrade packages to TypeScript 6 (#4930)
devinivy May 19, 2026
6873011
Add .js import extensions, upgrade test suites, update test snapshots…
devinivy May 19, 2026
c459153
Switch to ESM: type: module, Node16 resolution, CJS interop (#4943)
devinivy May 19, 2026
affb50c
tidy changesets
devinivy May 19, 2026
5cca6ef
tidy changesets
devinivy May 19, 2026
c633327
Version packages (#4952)
github-actions[bot] May 19, 2026
20c5cc1
Fix imports from `iso-datestring-validator` (#4955)
matthieusieben May 19, 2026
54419a6
Version packages (#4956)
github-actions[bot] May 19, 2026
25e0233
Add applyWrites() method to Lex SDK Client (#4895)
matthieusieben May 19, 2026
e6c6343
Improve support for `ArrayBufferLike`-backed `Uint8Array` data (#4954)
matthieusieben May 19, 2026
53b1e07
Fix compilation of protobuf files (#4960)
matthieusieben May 19, 2026
efcc13d
Migrate services to dd-trace v5 for ESM tracing (#4961)
devinivy May 19, 2026
7f7bb09
Add bsync protos to pds, bsky, ozone service dockerfiles to fix build…
devinivy May 19, 2026
37c6fe6
Update chat lexicons (#4963)
rafaeleyng May 19, 2026
008158b
Fix concurrency issue in `@atproto/sync` tests (#4970)
matthieusieben May 20, 2026
571582e
Remove proto buf generated code from version control (#4964)
matthieusieben May 20, 2026
3ea8e1f
Un-track codegen code from "lexicon-resolver" (#4965)
matthieusieben May 20, 2026
53818bb
Fix test flackyness due to seeding the database talking a long time (…
matthieusieben May 20, 2026
8eb0662
Remove lex-cli generated files from git (#4968)
matthieusieben May 20, 2026
fb1b403
Fix lex SDK files being non tree-shakable (#4972)
matthieusieben May 20, 2026
4801600
Sync: getCursor bugfix (#4973)
dholms May 20, 2026
18b2aaf
Version packages (#4957)
github-actions[bot] May 20, 2026
2c958f8
Integrate `site.standard` lexicons and record hydration + new `getEmb…
estrattonbailey May 20, 2026
5b43753
Update chat lexicons (#4975)
rafaeleyng May 20, 2026
5625907
Version packages (#4976)
github-actions[bot] May 20, 2026
482767c
Improve bundling size of lex-client (#4980)
matthieusieben May 21, 2026
314df62
Always add `#__PURE__` annotations to function calls (#4979)
matthieusieben May 21, 2026
57ecbda
Log rate limiter error in the context of the HTTP `req` (#4969)
matthieusieben May 21, 2026
3aae4fe
Remove need for inference when computing XRPC method derived types (#…
matthieusieben May 21, 2026
1259646
Make the generation of the `$defs` namespace optional by default (#4983)
matthieusieben May 21, 2026
5bdb4ad
Add `default` export of "main" schema in the namespace file (#4984)
matthieusieben May 21, 2026
ef69a53
Remove un-necessary lines from .gitignore file (#4966)
matthieusieben May 21, 2026
604e16d
Ensure fields are always present on viewExternalSource (#4985)
estrattonbailey May 21, 2026
734ecd4
Version packages (#4982)
github-actions[bot] May 21, 2026
37bff2b
PDS: bump request JSON size limit on record methods (#4989)
dholms May 21, 2026
7fecf13
Update chat lexicons (#4987)
rafaeleyng May 21, 2026
0c057be
steering readmes toward lex client (#4977)
axfelix May 21, 2026
86bb63e
Update chat lexicons (#4991)
rafaeleyng May 21, 2026
eaf1a51
Version packages (#4990)
github-actions[bot] May 22, 2026
64f5148
Add email verification and update capability to account manager (#4883)
matthieusieben May 22, 2026
753ac51
Improve Standard Site validation (#4995)
estrattonbailey May 22, 2026
9378a82
Add associatedProfiles to app.bsky.embed.getEmbedExternalView (#4993)
blackmichael May 22, 2026
4984994
Update chat lexicons (#4998)
rafaeleyng May 22, 2026
c787822
Version packages (#4994)
github-actions[bot] May 22, 2026
126ac1e
Update chat lexicons (#4999)
rafaeleyng May 22, 2026
92ed125
Add more Standard Site logging, ensure `associatedProfiles` is return…
estrattonbailey May 22, 2026
622d365
Fix OAuth service-proxying audience for combined `did#serviceId` scop…
devinivy May 24, 2026
a357aca
Merge branch 'eurosky-main' into merge-2026-05-26
Spotchi May 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .changeset/calm-groups-limit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@atproto/api": patch
---

update chat lexicons
5 changes: 5 additions & 0 deletions .changeset/chatty-icons-agree.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@atproto/bsky': patch
---

Ensure `associatedProfiles` is returned for Standard Site external embed views
5 changes: 5 additions & 0 deletions .changeset/crisp-bridges-dream.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@atproto/pds': patch
---

Fix OAuth service-proxying audience check to use combined `did#serviceId` form, matching the shape of granted `rpc:` scopes.
5 changes: 5 additions & 0 deletions .changeset/plain-rivers-glow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@atproto/oauth-scopes': minor
---

**BREAKING:** Remove the `AtprotoAudience` and `isAtprotoAudience` re-exports. They are superseded by `AtprotoDidRefAbsolute` and `isAtprotoDidRefAbsolute`, also re-exported from this package.
5 changes: 5 additions & 0 deletions .changeset/quiet-bridges-hum.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@atproto/did': minor
---

**BREAKING:** Remove `AtprotoAudience` and `isAtprotoAudience`. They are superseded by `AtprotoDidRefAbsolute` and `isAtprotoDidRefAbsolute`. Adds the related `DidRefAbsolute` and `DidRefRelative` types and predicates.
5 changes: 5 additions & 0 deletions .changeset/quiet-rivers-dance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@atproto/pds': patch
---

`getServiceAuth` now accepts the combined `did#serviceId` form for its `aud` parameter, in addition to the bare DID form.
20 changes: 15 additions & 5 deletions .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"caughtErrorsIgnorePattern": "^_|^err$|^error$",
"ignoreRestSiblings": true
}
],
Expand All @@ -62,21 +63,21 @@
},
"overrides": [
{
"files": ["jest.config.js"],
"files": ["jest.config.cjs"],
"env": { "commonjs": true }
},
{
"files": ["vite.config.js", "vite.config.cjs", "vite.config.mjs"],
"env": { "node": true }
},
{
"files": ["jest.setup.js"],
"files": ["test.setup.ts"],
"env": { "jest": true }
},
{
"files": ["*.js", "*.cjs"],
"files": ["*.js", "*.cjs", "*.cts"],
"rules": {
"@typescript-eslint/no-var-requires": "off"
"@typescript-eslint/no-require-imports": "off"
}
},
{
Expand All @@ -85,12 +86,21 @@
"n/no-extraneous-import": [
"error",
{ "allowModules": ["@atproto/dev-env"] }
],
"@typescript-eslint/no-unused-vars": [
"error",
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"caughtErrorsIgnorePattern": "^_|^err$|^error$",
"ignoreRestSiblings": true
}
]
}
}
],
"settings": {
"node": { "version": ">=18.7.0" },
"node": { "version": ">=22" },
"import/internal-regex": "^@atproto(?:-labs)?/",
"import/parsers": { "@typescript-eslint/parser": [".ts", ".tsx"] },
"import/resolver": {
Expand Down
11 changes: 0 additions & 11 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,13 +1,2 @@
# buf
packages/bsky/src/proto/** linguist-generated=true
packages/bsync/src/proto/** linguist-generated=true

# codegen
packages/api/src/client/** linguist-generated=true
packages/ozone/src/lexicon/** linguist-generated=true

# @atproto/lex
packages/lexicon-resolver/src/lexicons/** linguist-generated=true

# i18n
packages/oauth/oauth-provider-ui/src/locales/**/messages.po linguist-generated=true
2 changes: 1 addition & 1 deletion .github/workflows/publish.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
uses: changesets/action@v1
id: changesets
with:
publish: pnpm release
publish: pnpm run publish:ci
version: pnpm run version-packages
commit: 'Version packages'
title: 'Version packages'
39 changes: 33 additions & 6 deletions .github/workflows/repo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ name: Repository CI

on:
pull_request:
branches:
- '*'

concurrency:
group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}'
Expand All @@ -24,22 +22,51 @@ jobs:
env:
PUPPETEER_SKIP_DOWNLOAD: true

# lex-cli code generation can be a bottleneck. The "prebuild" script in
# the "api" and "ozone" packages only re-runs lex-cli when needed: if the
# generated output is missing, or if any lexicon JSON has a newer mtime
# than the generated files. We cache the generated output keyed on the
# content of the lexicon JSONs (plus the package.json files that define
# the codegen command), so unchanged lexicons restore from cache.
#
# However, on a cache hit we have to fix mtimes by hand.
# `actions/checkout` writes every checked-out file (including
# lexicons/**/*.json) with mtime = checkout time, while `actions/cache`
# restores files with their original archived mtime (older). Without
# intervention, every lexicon JSON looks "newer" than the restored
# generated files and the prebuild script would re-run lex-cli even though
# nothing has changed. Touching the restored files brings their mtime to
# "now", so the prebuild's `find -newer` check correctly reports no newer
# lexicons.
- uses: actions/cache@v4
id: lex-cli-cache
with:
path: |
packages/api/src/client
packages/ozone/src/lexicon
key: lex-cli-${{ hashFiles('lexicons/**/*.json', 'packages/api/package.json', 'packages/ozone/package.json') }}
- if: steps.lex-cli-cache.outputs.cache-hit == 'true'
run: find packages/api/src/client packages/ozone/src/lexicon -exec touch {} +

- run: pnpm build

- uses: actions/upload-artifact@v4
with:
# Preserve the result of codegen and build steps.
name: dist
retention-days: 2
path: |
packages/*/dist
packages/*/*/dist
packages/*/src/proto
packages/*/src/lexicons
packages/lex/*/src/lexicons
packages/lex/*/tests/lexicons
packages/oauth/oauth-client-browser-example/src/lexicons
packages/oauth/*/src/lexicons
packages/oauth/*/src/locales/*/messages.ts
packages/api/src/client
packages/api/src/moderation/const/labels.ts
packages/bsky/src/lexicons
packages/pds/src/lexicons
packages/sync/src/lexicons
packages/ozone/src/lexicon

changeset:
name: Changeset
Expand Down
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,5 @@
"prettier.semi": false,
"prettier.singleQuote": true,
"prettier.trailingComma": "es5",
"typescript.tsdk": "node_modules/typescript/lib"
"js/ts.tsdk.path": "node_modules/typescript/lib"
}
29 changes: 15 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,19 @@ This repository contains Bluesky's reference implementation of AT Protocol, and

**TypeScript Packages:**

| Package | Docs | NPM |
| ----------------------------------------------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------- |
| `@atproto/api`: client library | [README](./packages/api/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/api)](https://www.npmjs.com/package/@atproto/api) |
| `@atproto/common-web`: shared code and helpers which can run in web browsers | [README](./packages/common-web/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/common-web)](https://www.npmjs.com/package/@atproto/common-web) |
| `@atproto/common`: shared code and helpers which doesn't work in web browsers | [README](./packages/common/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/common)](https://www.npmjs.com/package/@atproto/common) |
| `@atproto/crypto`: cryptographic signing and key serialization | [README](./packages/crypto/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/crypto)](https://www.npmjs.com/package/@atproto/crypto) |
| `@atproto/identity`: DID and handle resolution | [README](./packages/identity/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/identity)](https://www.npmjs.com/package/@atproto/identity) |
| `@atproto/lexicon`: schema definition language | [README](./packages/lexicon/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/lexicon)](https://www.npmjs.com/package/@atproto/lexicon) |
| `@atproto/repo`: data storage structure, including MST | [README](./packages/repo/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/repo)](https://www.npmjs.com/package/@atproto/repo) |
| `@atproto/syntax`: string parsers for identifiers | [README](./packages/syntax/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/syntax)](https://www.npmjs.com/package/@atproto/syntax) |
| `@atproto/xrpc`: client-side HTTP API helpers | [README](./packages/xrpc/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/xrpc)](https://www.npmjs.com/package/@atproto/xrpc) |
| `@atproto/xrpc-server`: server-side HTTP API helpers | [README](./packages/xrpc-server/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/xrpc-server)](https://www.npmjs.com/package/@atproto/xrpc-server) |
| Package | Docs | NPMX |
| ----------------------------------------------------------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
| `@atproto/api`: client library | [README](./packages/api/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/api)](https://npmx.dev/package/@atproto/api) |
| `@atproto/common-web`: shared code and helpers which can run in web browsers | [README](./packages/common-web/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/common-web)](https://npmx.dev/package/@atproto/common-web) |
| `@atproto/common`: shared code and helpers which doesn't work in web browsers | [README](./packages/common/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/common)](https://npmx.dev/package/@atproto/common) |
| `@atproto/crypto`: cryptographic signing and key serialization | [README](./packages/crypto/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/crypto)](https://npmx.dev/package/@atproto/crypto) |
| `@atproto/identity`: DID and handle resolution | [README](./packages/identity/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/identity)](https://npmx.dev/package/@atproto/identity) |
| `@atproto/lex`: modern type-safe client library with codegen | [README](./packages/lex/lex/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/lex)](https://npmx.dev/package/@atproto/lex) |
| `@atproto/lexicon`: schema definition language | [README](./packages/lexicon/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/lexicon)](https://npmx.dev/package/@atproto/lexicon) |
| `@atproto/repo`: data storage structure, including MST | [README](./packages/repo/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/repo)](https://npmx.dev/package/@atproto/repo) |
| `@atproto/syntax`: string parsers for identifiers | [README](./packages/syntax/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/syntax)](https://npmx.dev/package/@atproto/syntax) |
| `@atproto/xrpc`: client-side HTTP API helpers | [README](./packages/xrpc/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/xrpc)](https://npmx.dev/package/@atproto/xrpc) |
| `@atproto/xrpc-server`: server-side HTTP API helpers | [README](./packages/xrpc-server/README.md) | [![NPM](https://img.shields.io/npm/v/@atproto/xrpc-server)](https://npmx.dev/package/@atproto/xrpc-server) |

**TypeScript Services:**

Expand All @@ -36,12 +37,12 @@ Go programming language source code is in [bluesky-social/indigo](https://github

## Developer Quickstart

We recommend [`nvm`](https://github.com/nvm-sh/nvm) for managing Node.js installs. This project requires Node.js version 18. `pnpm` is used to manage the workspace of multiple packages. You can install it with `npm install --global pnpm`.
We recommend [`nvm`](https://github.com/nvm-sh/nvm) for managing Node.js installs. This project requires Node.js version 22 or later. `pnpm` is used to manage the workspace of multiple packages. You can install it with `npm install --global pnpm`.

There is a Makefile which can help with basic development tasks:

```shell
# use existing nvm to install node 18 and pnpm
# use existing nvm to install node 22 and pnpm
make nvm-setup

# pull dependencies and build all local packages
Expand Down
2 changes: 1 addition & 1 deletion jest.config.js → jest.config.cjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/** @type {import('jest').Config} */
module.exports = {
projects: ['<rootDir>/packages/*/jest.config.js'],
projects: ['<rootDir>/packages/*/jest.config.cjs'],
}
7 changes: 7 additions & 0 deletions jest.varint-shim.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Shim for varint that works around cjs-module-lexer not detecting
// comma-first style exports (which prevents Jest ESM interop from
// exposing named exports in SyntheticModule).
const _varint = require('./node_modules/.pnpm/varint@6.0.0/node_modules/varint/index.js')
exports.encode = _varint.encode
exports.decode = _varint.decode
exports.encodingLength = _varint.encodingLength
100 changes: 99 additions & 1 deletion lexicons/app/bsky/embed/external.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@
"type": "blob",
"accept": ["image/*"],
"maxSize": 1000000
},
"associatedRefs": {
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.repo.strongRef"
},
"description": "StrongRefs (uri+cid) of the Atmosphere records that backed this view."
}
}
},
Expand All @@ -44,7 +52,97 @@
"uri": { "type": "string", "format": "uri" },
"title": { "type": "string" },
"description": { "type": "string" },
"thumb": { "type": "string", "format": "uri" }
"thumb": { "type": "string", "format": "uri" },
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When the external content was created, if available. Example: a publication date, for an article."
},
"updatedAt": {
"type": "string",
"format": "datetime",
"description": "When the external content was updated, if available."
},
"readingTime": {
"type": "integer",
"description": "Estimated reading time in minutes, if applicable and available."
},
"labels": {
"type": "array",
"items": { "type": "ref", "ref": "com.atproto.label.defs#label" }
},
"source": { "type": "ref", "ref": "#viewExternalSource" },
"associatedRefs": {
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.repo.strongRef"
},
"description": "StrongRefs (uri+cid) of the Atmosphere records that backed this view."
},
"associatedProfiles": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.actor.defs#profileViewBasic"
},
"description": "Profiles of the owners of the Atmosphere records that backed this view."
}
}
},
"viewExternalSource": {
"type": "object",
"description": "The source of an external embed, such as a standard.site publication.",
"required": ["uri", "title"],
"properties": {
"uri": {
"type": "string",
"format": "uri",
"description": "URI of the source, if available. Example: the https:// URL of a site.standard.publication record."
},
"icon": {
"type": "string",
"format": "uri",
"description": "Fully-qualified URL where an icon representing the source can be fetched. For example, CDN location provided by the App View."
},
"title": { "type": "string" },
"description": { "type": "string" },
"theme": {
"type": "ref",
"ref": "#viewExternalSourceTheme"
}
}
},
"viewExternalSourceTheme": {
"type": "object",
"description": "The theme colors of an external source, such as a site.standard.publication. These colors may be used when rendering an embed from that source.",
"properties": {
"backgroundRGB": {
"type": "ref",
"ref": "#colorRGB"
},
"foregroundRGB": {
"type": "ref",
"ref": "#colorRGB"
},
"accentRGB": {
"type": "ref",
"ref": "#colorRGB"
},
"accentForegroundRGB": {
"type": "ref",
"ref": "#colorRGB"
}
}
},
"colorRGB": {
"type": "object",
"description": "RGB color definition, inspired by site.standard.theme.color#rgb",
"required": ["r", "g", "b"],
"properties": {
"r": { "type": "integer", "minimum": 0, "maximum": 255 },
"g": { "type": "integer", "minimum": 0, "maximum": 255 },
"b": { "type": "integer", "minimum": 0, "maximum": 255 }
}
}
}
Expand Down
Loading