diff --git a/docs/.vscode/spellright.dict b/docs/.vscode/spellright.dict
index f285211ebfd..42c44bdce01 100644
--- a/docs/.vscode/spellright.dict
+++ b/docs/.vscode/spellright.dict
@@ -2,10 +2,14 @@ abi
audius
blockhash
ciphertexts
+ddex
delegater
delegaters
docusaurus
erc
+ern
+ern3
+ern4
esque
eth
ethereum
@@ -19,15 +23,20 @@ gravatar
img
io
ioredis
+isrc
+iswc
js
jwt
mainnet
+metadatas
metamask
multisig
+nft
nodejs
nonpayable
npm
oauth
+oauthed
off-chain
on-chain
onclick
@@ -53,6 +62,7 @@ typehash
undelegate
unrepost
unstake
+upc
userbase
wei
whitepaper
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
index c80a3a69c0f..45f716c0c17 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -2,7 +2,7 @@
## Dev
-```
+```sh
npm install
npm run prepare:translations
npm start
@@ -10,13 +10,13 @@ npm start
To develop on cloudflare pages and test the whole stack, run:
-```
+```sh
npm run pages:dev
```
## Build
-```
+```sh
npm run build
```
@@ -26,16 +26,16 @@ Running the following commands will create a public test site to view your chang
To deploy to docs.audius.org, ensure the commands are run from the `main` branch.
-```
+```sh
npm run build
npm run pages:deploy
```
## Translate
-```
+```sh
npm run prepare:translations
```
-This will write translations to the i18n folder.
-If you modify markdown files while running the local dev server, you will need to prepare the translations as /i18n/en is the default entrypoint.
+This will write translations to the i18n folder. If you modify markdown files while running the
+local dev server, you will need to prepare the translations as /i18n/en is the default entrypoint.
diff --git a/docs/docs/distributors/introduction/overview.mdx b/docs/docs/distributors/introduction/overview.mdx
new file mode 100644
index 00000000000..d0cc7e10b19
--- /dev/null
+++ b/docs/docs/distributors/introduction/overview.mdx
@@ -0,0 +1,54 @@
+---
+id: overview
+title: Distributing Content to Audius
+pagination_label: Distributing Content to Audius
+sidebar_label: Overview
+description: Audius Protocol Documentation
+---
+
+import useBaseUrl from '@docusaurus/useBaseUrl'
+
+:::tip Looking for how to accept deliveries from your label or distributor?
+
+Come back soon and check the [Audius Support Page](https://support.audius.co) for more information.
+
+:::
+
+Audius supports bulk content ingestion via the DDEX standard.
+
+Providers, labels & partners with their own delivery infrastructure should reference the following
+documentation for guidance on how to send and administer content on Audius.
+
+If you're looking to build your own ingestion tooling, get started with the
+[Audius SDK](/developers/sdk/overview).
+
+## What is DDEX
+
+Digital Data Exchange (or "DDEX") is an international standards-setting organization that was formed
+in 2006 to develop standards that enable companies to communicate information along the digital
+supply chain more efficiently by:
+
+- Developing standard message and file formats (XML or flat-file)
+- Developing choreographies for specific business transactions
+- Developing communication protocols (SFTP or based on web services)
+- Working with industry bodies to create a more efficient supply chain
+
+:::info More Information
+
+- Learn more on the official DDEX Website here: [https://ddex.net/](https://ddex.net/)
+- Looking for a deeper technical dive? Checkout the DDEX knowledge base here:
+ [https://kb.ddex.net/](https://kb.ddex.net/)
+
+:::
+
+---
+
+## Open Source
+
+All DDEX ingestion code & libraries are open source and available on
+[GitHub](https://github.com/AudiusProject/audius-protocol/tree/main/packages/ddex).
+
+You may clone and self-operate your own Audius compatible DDEX ingestion server, which provides a
+web interface to deliver files, manage uploads, and track success. Under the hood, DDEX ingestion
+uses the [Audius SDK](/developers/sdk/overview) to process and upload tracks and is available in a
+[self-service](/distributors/self-serve/overview) manner.
diff --git a/docs/docs/distributors/self-serve/overview.mdx b/docs/docs/distributors/self-serve/overview.mdx
new file mode 100644
index 00000000000..5c2480afb6e
--- /dev/null
+++ b/docs/docs/distributors/self-serve/overview.mdx
@@ -0,0 +1,18 @@
+---
+id: overview
+title: Overview
+pagination_label: Overview
+sidebar_label: Overview
+description: Audius Protocol Documentation
+---
+
+import useBaseUrl from '@docusaurus/useBaseUrl'
+
+---
+
+:::info
+
+Content can be ingested into the Audius network by directly operating your own DDEX ingestion
+server. More details soon.
+
+:::
diff --git a/docs/docs/distributors/self-serve/run-a-ddex-server.mdx b/docs/docs/distributors/self-serve/run-a-ddex-server.mdx
new file mode 100644
index 00000000000..49fc639ec9e
--- /dev/null
+++ b/docs/docs/distributors/self-serve/run-a-ddex-server.mdx
@@ -0,0 +1,41 @@
+---
+id: run-a-ddex-server
+title: Running a DDEX Ingestion Server
+pagination_label: Running a Server
+sidebar_label: Running a Server
+description: Audius Protocol Documentation
+---
+
+import useBaseUrl from '@docusaurus/useBaseUrl'
+
+:::info Coming Soon!
+
+Under construction. Please use as your own risk! 🚧
+
+Check back soon for updates on how to run and operate own DDEX Ingestion Server.
+
+:::
+
+## Instructions
+
+1. Provision a new machine following. We recommend:
+
+- Ubuntu
+- 8 CPUs
+- 16 to 32GB Memory
+
+2. Visit [audius-docker-compose](https://github.com/AudiusProject/audius-docker-compose) and run the
+ install script to set up your Audius environment on your provisioned machine.
+
+3. Follow the instructions in the
+ [audius-protocol](https://github.com/AudiusProject/audius-protocol/tree/main/packages/ddex)
+ repository to set the appropriate environment variables
+
+4. Start the DDEX Ingestion Server
+
+```
+audius-cli launch ddex
+```
+
+Your server will now be available at localhost:80 and is exposed via self-signed SSL on :443 if
+`DDEX_URL` is set.
diff --git a/docs/docs/distributors/specification/deal-types.mdx b/docs/docs/distributors/specification/deal-types.mdx
new file mode 100644
index 00000000000..789abd299ee
--- /dev/null
+++ b/docs/docs/distributors/specification/deal-types.mdx
@@ -0,0 +1,432 @@
+---
+id: deal-types
+title: Deal Types
+pagination_label: Deal Types
+sidebar_label: Deal Types
+description: Support for Deal Types
+---
+
+import useBaseUrl from '@docusaurus/useBaseUrl'
+
+:::info Further Reading
+
+Checkout the
+[DDEX ERN3 Knowledge Base]()
+for more information.
+
+:::
+
+The following `Deal` types are supported for distribution to Audius. `Deal` types provided outside
+of the provided list will be ignored.
+
+If your use case extends beyond the supported `Deal` types outlined below, please contact
+`support@audius.co`.
+
+---
+
+## Tracks
+
+Audius accepts the following DDEX `Deal`s for **track** releases:
+
+### Free To Stream
+
+1. `CommercialModelType`: `FreeOfChargeModel`
+2. `UseType`: `Stream` or `OnDemandStream`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: N/A
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ FreeOfChargeModel
+
+ OnDemandStream
+
+ Worldwide
+
+ 2023-09-02
+
+
+
+```
+
+### Pay Gated Stream
+
+`CommercialModelType`: `PayAsYouGoModel` 2. `UseType`: `Stream` or `OnDemandStream` 3. `PriceType`:
+not supported 4. `WholesalePricePerUnit`: any nonzero USD amount 5. `ValidityPeriod` 1. `StartDate`:
+any 6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ PayAsYouGoModel
+
+ OnDemandStream
+
+ Worldwide
+
+ 1.0
+ ...
+
+
+ 2023-09-02
+
+
+
+```
+
+### Follow Gated Stream
+
+1. `CommercialModelType`: `UserDefined` (`FollowGated`)
+2. `UseType`: `Stream` or `OnDemandStream`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: N/A
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ UserDefined
+
+ OnDemandStream
+
+ Worldwide
+
+ 2023-09-02
+
+
+
+```
+
+### NFT Gated Stream
+
+1. `CommercialModelType`: `UserDefined` (`NFTGated`)
+2. `UseType`: `Stream` or `OnDemandStream`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: N/A
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+7. `Conditions` (custom XML specific to Audius)
+
+ 1. For Ethereum NFTs:
+
+ ```xml
+
+ eth
+ // The Ethereum address of the NFT contract
+ // The standard followed by the NFT - either "ERC-721" or "ERC-1155"
+ // The name of the NFT
+ // The slug of the NFT collection. E.g. if your collection is located at https://opensea.io/collection/example-nft, the slug is "example-nft".
+ // Optional: URL to the image representing the NFT
+ // Optional: URL to an external resource providing more details about the NFT
+
+ ```
+
+ ii. For Solana NFTs:
+
+ ```xml
+
+ sol
+ // The address of the NFT on the Solana blockchain
+ // The name of the NFT
+ // Optional: URL to the image representing the NFT
+ // Optional: URL to an external resource providing more details about the NFT
+
+ ```
+
+```xml
+
+
+ UserDefined
+
+ OnDemandStream
+
+ Worldwide
+
+ 2023-09-02
+
+
+ eth
+ 0xAbCdEfGhIjKlMnOpQrStUvWxYz
+ ERC-721
+ Example NFT
+ example-nft
+ https://www.example.com/nft-image.png
+ https://www.example.com/nft-details
+
+
+
+```
+
+### $AUDIO Tip Gated Stream
+
+1. `CommercialModelType`: `UserDefined` (`TipGated`)
+2. `UseType`: `Stream` or `OnDemandStream`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: N/A
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ UserDefined
+
+ OnDemandStream
+
+ Worldwide
+
+ 2023-09-02
+
+
+
+```
+
+### Free To Download
+
+:::info Downloadable content is streamable.
+
+If you can download it, you can stream it.
+
+:::
+
+1. `CommercialModelType`: `FreeOfChargeModel`
+2. `UseType`: `Stream` or `OnDemandStream`, `PermanentDownload`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: N/A
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ FreeOfChargeModel
+
+ OnDemandStream
+ PermanentDownload
+
+ Worldwide
+
+ 2023-09-02
+
+
+
+```
+
+### Pay Gated Download
+
+:::info Downloadable content is streamable.
+
+If you can download it, you can stream it.
+
+:::
+
+1. `CommercialModelType`: `PayAsYouGoModel`
+2. `UseType`: `Stream` or `OnDemandStream`, `PermanentDownload`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: any USD amount
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ PayAsYouGoModel
+
+ OnDemandStream
+ PermanentDownload
+
+ Worldwide
+
+ 1.0
+ ...
+
+
+ 2023-09-02
+
+
+
+```
+
+### Follow Gated Download
+
+:::info Downloadable content is streamable.
+
+If you can download it, you can stream it.
+
+:::
+
+1. `CommercialModelType`: `UserDefined` (`FollowGated`)
+2. `UseType`: `Stream` or `OnDemandStream`, `PermanentDownload`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: N/A
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ UserDefined
+
+ OnDemandStream
+ PermanentDownload
+
+ Worldwide
+
+ 2023-09-02
+
+
+
+```
+
+---
+
+## Albums
+
+Audius accepts the following DDEX `Deal`s for **album** releases
+
+### Free To Stream
+
+1. `CommercialModelType`: `FreeOfChargeModel`
+2. `UseType`: `Stream` or `OnDemandStream`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: N/A
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ FreeOfChargeModel
+
+ OnDemandStream
+
+ Worldwide
+
+ 2023-09-02
+
+
+
+```
+
+### Pay Gated Stream
+
+1. `CommercialModelType`: `PayAsYouGoModel`
+2. `UseType`: `Stream` or `OnDemandStream`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: any nonzero USD amount
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ PayAsYouGoModel
+
+ OnDemandStream
+
+ Worldwide
+
+ 1.0
+ ...
+
+
+ 2023-09-02
+
+
+
+```
+
+### Free To Download
+
+:::info Downloadable content is streamable.
+
+If you can download it, you can stream it.
+
+:::
+
+1. `CommercialModelType`: `FreeOfChargeModel`
+2. `UseType`: `Stream` or `OnDemandStream`, `PermanentDownload`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: N/A
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ FreeOfChargeModel
+
+ OnDemandStream
+ PermanentDownload
+
+ Worldwide
+
+ 2023-09-02
+
+
+
+```
+
+### Pay Gated Download
+
+:::info Downloadable content is streamable.
+
+If you can download it, you can stream it.
+
+:::
+
+1. `CommercialModelType`: `PayAsYouGoModel`
+2. `UseType`: `Stream` or `OnDemandStream`, `PermanentDownload`
+3. `PriceType`: not supported
+4. `WholesalePricePerUnit`: any USD amount
+5. `ValidityPeriod`
+ 1. `StartDate`: any
+6. `TerritoryCode`: `Worldwide`
+
+```xml
+
+
+ PayAsYouGoModel
+
+ OnDemandStream
+ PermanentDownload
+
+ Worldwide
+
+ 1.0
+ ...
+
+
+ 2023-09-02
+
+
+
+```
+
+---
+
+## ERN4 Support
+
+:::info Coming Soon
+
+Support for ERN4 is coming coming soon.
+
+Checkout the
+[DDEX ERN4 Knowledge Base]()
+for information in the meantime.
+
+:::
diff --git a/docs/docs/distributors/specification/metadata.mdx b/docs/docs/distributors/specification/metadata.mdx
new file mode 100644
index 00000000000..8aad26d7b17
--- /dev/null
+++ b/docs/docs/distributors/specification/metadata.mdx
@@ -0,0 +1,338 @@
+---
+id: metadata
+title: Supported Metadata Mapping
+pagination_label: Metadata Mapping
+sidebar_label: Metadata Mapping
+description: Audius SDK to DDEX Metadata Mapping
+---
+
+import useBaseUrl from '@docusaurus/useBaseUrl'
+
+:::info The following is provided based on [ERN3.8](/distributors/specification/deal-types)
+
+Please note that exact DDEX fields will depend on the specific ERN version.
+
+:::
+
+---
+
+## General Metadata Mapping
+
+### Required Fields
+
+The following metadata fields are required for content to be listed on Audius and are examined and
+pulled from a DDEX delivery in cascading precedence.
+
+#### coverArtFile
+
+:::note
+
+The `coverArtFile` maps to two DDEX Fields
+
+:::
+
+- `/ResourceList/Image/ImageDetailsByTerritory[TerritoryCode="Worldwide"]/TechnicalImageDetails/File/FilePath`
+- `/ResourceList/Image/ImageDetailsByTerritory[TerritoryCode="Worldwide"]/TechnicalImageDetails/File/FileName`
+
+#### releaseDate
+
+1. `/DealList/ReleaseDeal/Deal/ValidityPeriod/StartDate`
+2. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/ReleaseDate`
+3. `/ReleaseList/Release/GlobalOriginalReleaseDate`
+
+#### userId
+
+:::note
+
+Not technically an Audius SDK metadata field, but uploaded as part of the track/album
+
+:::
+
+1. checks each artist name (in order) against Audius database of OAuthed display names, and uses the
+ first match
+
+---
+
+### Optional Fields
+
+The following fields are optional for content to be listed on Audius and are examined and pulled
+from a DDEX delivery in cascading precedence.
+
+#### ddexReleaseIds
+
+1. `/ReleaseList/Release/ReleaseId`
+
+:::note
+
+The following fields are parsed and preserved from this field:
+
+`PartyId`, `CatalogNumber`, `ICPN`, `GRid`, `ISAN`, `ISBN`, `ISMN`, `ISRC`, `ISSN`, `ISTC`, `ISWC`,
+`MWLI`, `SICI`, and `ProprietaryId`
+
+:::
+
+#### description
+
+The DDEX standard includes a `MarketingComments` field that is rarely used, but is available.
+
+---
+
+### Unused Fields
+
+The following Audius SDK Fields are not used by DDEX and have no mapping.
+
+#### child elements of `/ReleaseList/Release/`
+
+The following child elements are parsed and stored in the separate DDEX server. Audius does not
+store these child fields and they are not used.
+
+- `ReferenceTitle/TitleText`
+- `ReferenceTitle/SubTitle`
+
+#### child elements of `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/`
+
+The following child elements are parsed and stored in the separate DDEX server. Audius does not
+store these child fields and they are not used.
+
+- `Title[@TitleType='DisplayTitle']/TitleText` (used in albums/EPs but not single tracks)
+- `Title[@TitleType='DisplayTitle']/SubTitle`
+- `Title[@TitleType='FormalTitle']/TitleText`
+- `Title[@TitleType='FormalTitle']/SubTitle`
+
+#### child elements of `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/ResourceGroup/`
+
+The following child elements are parsed and stored in the separate DDEX server. Audius does not
+store these child fields and they are not used.
+
+- `SequenceNumber`
+- `ResourceGroupContentItem/ResourceType`
+- `ResourceGroupContentItem/ReleaseResourceReference`
+- `ResourceGroupContentItem/IsInstantGratificationResource`
+
+---
+
+## Track Metadata Mapping
+
+### Required Fields
+
+The following fields are required for content to be listed on Audius and are examined and pulled
+from a DDEX delivery in cascading precedence.
+
+#### genre
+
+1. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/Genre/SubGenre`
+2. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/Genre/GenreText`
+3. `/ResourceList/SoundRecording/SoundRecordingDetailsByTerritory[TerritoryCode="Worldwide"]/Genre/SubGenre`
+4. `/ResourceList/SoundRecording/SoundRecordingDetailsByTerritory[TerritoryCode="Worldwide"]/Genre/GenreText`
+
+#### title
+
+1. `/ResourceList/SoundRecording/ReferenceTitle/TitleText`
+
+:::note
+
+Subtitle is currently ignored/unused in the both the SoundRecording and release and are stored in
+the separate DDEX server but not in the Audius network.
+
+:::
+
+#### trackFile
+
+This is the actual audio file, not technically an Audius SDK metadata field, but uploaded in the
+same SDK function. Note that this DDEX field is a relative path to the file within the delivery
+
+:::note
+
+The `trackFile` maps to two DDEX Fields
+
+:::
+
+- `/ResourceList/SoundRecording/SoundDetailsByTerritory[TerritoryCode="Worldwide"]/TechnicalSoundRecordingDetails/File/FilePath`
+- `/ResourceList/SoundRecording/SoundDetailsByTerritory[TerritoryCode="Worldwide"]/TechnicalSoundRecordingDetails/File/FileName`
+
+---
+
+### Optional Fields
+
+The following fields are optional for content to be listed on Audius and are examined and pulled
+from a DDEX delivery in cascading precedence.
+
+#### artists
+
+The `/PartyName/FullName` child element is used as the artist’s name and the `SequenceNumber`
+attribute to preserve order
+
+1. `/ResourceList/SoundRecording/SoundRecordingDetailsByTerritory[TerritoryCode="Worldwide"]/DisplayArtist`
+2. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/DisplayArtist`
+
+#### copyrightLine
+
+This is only used if both `year` _AND_ `text` are non-empty. The child elements that are parsed are:
+`Year` and `CLineText`
+
+1. `/ResourceList/SoundRecording/SoundRecordingDetailsByTerritory[TerritoryCode="Worldwide"]/CLine`
+2. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/CLine`
+3. `/ReleaseList/Release/CLine`
+
+#### indirectResourceContributors
+
+:::note
+
+The following children elements are parsed and stored in Audius: `PartyName`/`FullName`,
+`SequenceNumber`, and `IndirectResourceContributorRole`
+
+:::
+
+1. `/ResourceList/SoundRecording/SoundDetailsByTerritory[TerritoryCode="Worldwide"]/IndirectResourceContributor`
+
+#### isrc
+
+1. `/ResourceList/SoundRecording/SoundRecordingId/ISRC`
+
+#### iswc
+
+1. `/ReleaseList/Release/ReleaseId/ISWC`
+
+#### parentalWarningType
+
+1. `/ResourceList/SoundRecording/SoundRecordingDetailsByTerritory[TerritoryCode="Worldwide"]/ParentalWarningType`
+2. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/ParentalWarningType`
+
+#### previewStartSeconds
+
+Preview length is 30 seconds starting at the `previewStartSeconds` into the track’s audio, even if a
+longer or shorter duration is given. does not support using an external file for the preview
+
+1. `/ResourceList/SoundRecording/SoundDetailsByTerritory[TerritoryCode="Worldwide"]/TechnicalSoundRecordingDetails/PreviewDetails/StartPoint`
+2. only when
+ `/ResourceList/SoundRecording/SoundDetailsByTerritory[TerritoryCode="Worldwide"]/TechnicalSoundRecordingDetails/IsPreview`
+ is true
+
+#### producerCopyrightLine
+
+1. `/ResourceList/SoundRecording/SoundRecordingDetailsByTerritory[TerritoryCode="Worldwide"]/PLine`
+2. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/PLine`
+3. `/ReleaseList/Release/PLine`
+
+:::note
+
+This is only used if both `year` _AND_ `text` are non-empty. The child elements that are parsed are:
+`Year` and `CLineText`
+
+:::
+
+#### resourceContributors
+
+1. `/ResourceList/SoundRecording/SoundDetailsByTerritory[TerritoryCode="Worldwide"]/ResourceContributor`
+
+:::note
+
+The following children elements are parsed and stored in Audius: `PartyName`/`FullName`,
+`SequenceNumber`, and `ResourceContributorRole`
+
+:::
+
+#### rightsController
+
+1. `/ResourceList/SoundRecording/SoundDetailsByTerritory[TerritoryCode="Worldwide"]/RightsController`
+
+:::note
+
+The following children elements are parsed and stored in Audius: `PartyName`/`FullName`,
+`RightsShareUnknown`, and `RightsControllerRole`
+
+:::
+
+---
+
+## Album Metadata Mapping
+
+### Required Fields
+
+The following fields are required for content to be listed on Audius and are examined and pulled
+from a DDEX delivery in cascading precedence.
+
+#### albumName
+
+1. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/Title[@TitleType='DisplayTitle']/TitleText`
+
+:::note
+
+Subtitle is currently ignored/unused in the both the SoundRecording and release and are stored in
+the separate DDEX server but not in the Audius network.
+
+:::
+
+#### genre
+
+1. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/Genre/SubGenre`
+2. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/Genre/GenreText`
+
+#### trackFiles
+
+This is an array of audio files which the album is comprised of, not technically an Audius SDK
+metadata field, but uploaded as part of the album.
+
+1. each `/ReleaseList/Release/` except the release with the attribute `IsMainRelease="true"`
+
+#### trackMetadatas
+
+Metadata about each track in the album, not technically an Audius SDK metadata field, but uploaded
+as part of the album
+
+1. each `/ReleaseList/Release/` except the release with the attribute `IsMainRelease="true"`
+
+---
+
+### Optional Fields
+
+The following fields are optional for content to be listed on Audius and are examined and pulled
+from a DDEX delivery in cascading precedence.
+
+#### artists
+
+The `/PartyName/FullName` child element is used as the artist’s name and the `SequenceNumber`
+attribute to preserve order
+
+1. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/DisplayArtist`
+
+#### copyrightLine
+
+1. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/CLine`
+2. `/ReleaseList/Release/CLine`
+
+:::note
+
+This is only used if both `year` _AND_ `text` are non-empty. The child elements that are parsed are:
+`Year` and `CLineText`
+
+:::
+
+#### parentalWarningType
+
+1. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/ParentalWarningType`
+
+#### producerCopyrightLine
+
+1. `/ReleaseList/Release/ReleaseDetailsByTerritory[TerritoryCode="Worldwide"]/PLine`
+2. `/ReleaseList/Release/PLine`
+
+:::note
+
+This is only used if both `year` _AND_ `text` are non-empty. The child elements that are parsed are:
+`Year` and `PLineText`
+
+:::
+
+#### upc
+
+1. `/ReleaseList/Release/ReleaseId/ICPN`
+
+:::note
+
+ICPN (or "International Code Product Number") has an `IsEAN` attribute which determines if it’s an
+EAN (or "European Article Number") or UPC ("Universal Product Code" — only used in US and Canada).
+
+Audius uses these interchangeably and just set it as UPC even if it’s an EAN.
+
+:::
diff --git a/docs/docs/distributors/specification/overview.mdx b/docs/docs/distributors/specification/overview.mdx
new file mode 100644
index 00000000000..7c005871c81
--- /dev/null
+++ b/docs/docs/distributors/specification/overview.mdx
@@ -0,0 +1,37 @@
+---
+id: overview
+title: DDEX Best Practices
+pagination_label: DDEX Best Practices
+sidebar_label: DDEX Best Practices
+description: DDEX best practices for delivering DDEX to Audius
+---
+
+import useBaseUrl from '@docusaurus/useBaseUrl'
+
+## General Guidance
+
+:::info Delivery processing
+
+[TikiLabs](https://tikilabs.com) is a facilitator of distributing DDEX directly to the Audius
+Protocol.
+
+For inquiries or support, reach out at
+[support@audius.co](mailto:support@audius.co?subject=DDEX%20Support).
+
+:::
+
+- ERN3 is the preferred DDEX specification for bulk ingestion into Audius. See the
+ [ERN3 details](/distributors/specification/deal-types) for more details around submission
+ choreography.
+- Audius only accepts price information using absolute prices (e.g. via `WholesalePricePerUnit`).
+ Price codes will be ignored (e.g. `PriceType`).
+- Audius also does not support `ValidityPeriod` `EndDate`s. This includes using `EndDate` to specify
+ multiple `ValidityPeriod`s with different prices. We can only parse 1 `ValidityPeriod`
+ `StartDate`.
+- Audius currently only accepts the `Worldwide` `TerritoryCode`. Territory support for controlled
+ streaming is coming soon! 🌎
+- `NonInteractiveStream` is not supported.
+- A `ReleaseDeal` is required with a `DealReleaseReference` to each track on an album.
+- A `ReleaseDeal` is not required with a `DealReleaseReference` to an album release. If an album
+ deal is not specified, the album defaults to being free to stream, but each of its tracks is
+ configured according to the track’s `ReleaseDeal` `DealTerms`.
diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js
index fbf19d053f3..867ba0c1d4c 100644
--- a/docs/docusaurus.config.js
+++ b/docs/docusaurus.config.js
@@ -44,9 +44,7 @@ const config = {
path: 'docs',
routeBasePath: '/',
sidebarPath: './sidebars.js',
- // Please change this to your repo.
- // Remove this to remove the "edit this page" links.
- editUrl: 'https://github.com/AudiusProject/docs.audius.org/',
+ editUrl: 'https://github.com/AudiusProject/audius-protocol/tree/main/docs',
},
theme: {
customCss: './src/css/custom.css',
@@ -76,21 +74,31 @@ const config = {
label: 'Learn',
to: '/',
position: 'right',
+ activeBasePath: 'learn'
},
{
label: 'Developers',
to: '/developers/introduction/overview',
position: 'right',
+ activeBasePath: 'developers'
},
{
label: 'Staking',
to: '/node-operator/overview',
position: 'right',
+ activeBasePath: 'staking'
+ },
+ {
+ label: 'Distributors',
+ to: '/distributors/introduction/overview',
+ position: 'right',
+ activeBasePath: 'distributors'
},
{
label: 'Reference',
to: '/reference/overview',
position: 'right',
+ activeBasePath: 'reference'
},
{
'aria-label': 'Discord',
diff --git a/docs/i18n/en/code.json b/docs/i18n/en/code.json
new file mode 100644
index 00000000000..71f221e8427
--- /dev/null
+++ b/docs/i18n/en/code.json
@@ -0,0 +1,420 @@
+{
+ "theme.ErrorPageContent.title": {
+ "message": "This page crashed.",
+ "description": "The title of the fallback page when the page crashed"
+ },
+ "theme.BackToTopButton.buttonAriaLabel": {
+ "message": "Scroll back to top",
+ "description": "The ARIA label for the back to top button"
+ },
+ "theme.blog.paginator.navAriaLabel": {
+ "message": "Blog list page navigation",
+ "description": "The ARIA label for the blog pagination"
+ },
+ "theme.blog.paginator.newerEntries": {
+ "message": "Newer Entries",
+ "description": "The label used to navigate to the newer blog posts page (previous page)"
+ },
+ "theme.blog.paginator.olderEntries": {
+ "message": "Older Entries",
+ "description": "The label used to navigate to the older blog posts page (next page)"
+ },
+ "theme.blog.archive.title": {
+ "message": "Archive",
+ "description": "The page & hero title of the blog archive page"
+ },
+ "theme.blog.archive.description": {
+ "message": "Archive",
+ "description": "The page & hero description of the blog archive page"
+ },
+ "theme.blog.post.paginator.navAriaLabel": {
+ "message": "Blog post page navigation",
+ "description": "The ARIA label for the blog posts pagination"
+ },
+ "theme.blog.post.paginator.newerPost": {
+ "message": "Newer Post",
+ "description": "The blog post button label to navigate to the newer/previous post"
+ },
+ "theme.blog.post.paginator.olderPost": {
+ "message": "Older Post",
+ "description": "The blog post button label to navigate to the older/next post"
+ },
+ "theme.blog.post.plurals": {
+ "message": "One post|{count} posts",
+ "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
+ },
+ "theme.blog.tagTitle": {
+ "message": "{nPosts} tagged with \"{tagName}\"",
+ "description": "The title of the page for a blog tag"
+ },
+ "theme.tags.tagsPageLink": {
+ "message": "View All Tags",
+ "description": "The label of the link targeting the tag list page"
+ },
+ "theme.docs.breadcrumbs.navAriaLabel": {
+ "message": "Breadcrumbs",
+ "description": "The ARIA label for the breadcrumbs"
+ },
+ "theme.docs.DocCard.categoryDescription": {
+ "message": "{count} items",
+ "description": "The default description for a category card in the generated index about how many items this category includes"
+ },
+ "theme.colorToggle.ariaLabel": {
+ "message": "Switch between dark and light mode (currently {mode})",
+ "description": "The ARIA label for the navbar color mode toggle"
+ },
+ "theme.colorToggle.ariaLabel.mode.dark": {
+ "message": "dark mode",
+ "description": "The name for the dark color mode"
+ },
+ "theme.colorToggle.ariaLabel.mode.light": {
+ "message": "light mode",
+ "description": "The name for the light color mode"
+ },
+ "theme.docs.paginator.navAriaLabel": {
+ "message": "Docs pages",
+ "description": "The ARIA label for the docs pagination"
+ },
+ "theme.docs.paginator.previous": {
+ "message": "Previous",
+ "description": "The label used to navigate to the previous doc"
+ },
+ "theme.docs.paginator.next": {
+ "message": "Next",
+ "description": "The label used to navigate to the next doc"
+ },
+ "theme.docs.versionBadge.label": {
+ "message": "Version: {versionLabel}"
+ },
+ "theme.docs.tagDocListPageTitle.nDocsTagged": {
+ "message": "One doc tagged|{count} docs tagged",
+ "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
+ },
+ "theme.docs.tagDocListPageTitle": {
+ "message": "{nDocsTagged} with \"{tagName}\"",
+ "description": "The title of the page for a docs tag"
+ },
+ "theme.docs.versions.unreleasedVersionLabel": {
+ "message": "This is unreleased documentation for {siteTitle} {versionLabel} version.",
+ "description": "The label used to tell the user that he's browsing an unreleased doc version"
+ },
+ "theme.docs.versions.unmaintainedVersionLabel": {
+ "message": "This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.",
+ "description": "The label used to tell the user that he's browsing an unmaintained doc version"
+ },
+ "theme.docs.versions.latestVersionSuggestionLabel": {
+ "message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).",
+ "description": "The label used to tell the user to check the latest version"
+ },
+ "theme.docs.versions.latestVersionLinkLabel": {
+ "message": "latest version",
+ "description": "The label used for the latest version suggestion link label"
+ },
+ "theme.common.editThisPage": {
+ "message": "Edit this page",
+ "description": "The link label to edit the current page"
+ },
+ "theme.common.headingLinkTitle": {
+ "message": "Direct link to {heading}",
+ "description": "Title for link to heading"
+ },
+ "theme.lastUpdated.atDate": {
+ "message": " on {date}",
+ "description": "The words used to describe on which date a page has been last updated"
+ },
+ "theme.lastUpdated.byUser": {
+ "message": " by {user}",
+ "description": "The words used to describe by who the page has been last updated"
+ },
+ "theme.lastUpdated.lastUpdatedAtBy": {
+ "message": "Last updated{atDate}{byUser}",
+ "description": "The sentence used to display when a page has been last updated, and by who"
+ },
+ "theme.navbar.mobileVersionsDropdown.label": {
+ "message": "Versions",
+ "description": "The label for the navbar versions dropdown on mobile view"
+ },
+ "theme.NotFound.title": {
+ "message": "Page Not Found",
+ "description": "The title of the 404 page"
+ },
+ "theme.tags.tagsListLabel": {
+ "message": "Tags:",
+ "description": "The label alongside a tag list"
+ },
+ "theme.AnnouncementBar.closeButtonAriaLabel": {
+ "message": "Close",
+ "description": "The ARIA label for close button of announcement bar"
+ },
+ "theme.blog.sidebar.navAriaLabel": {
+ "message": "Blog recent posts navigation",
+ "description": "The ARIA label for recent posts in the blog sidebar"
+ },
+ "theme.admonition.caution": {
+ "message": "caution",
+ "description": "The default label used for the Caution admonition (:::caution)"
+ },
+ "theme.admonition.danger": {
+ "message": "danger",
+ "description": "The default label used for the Danger admonition (:::danger)"
+ },
+ "theme.admonition.info": {
+ "message": "info",
+ "description": "The default label used for the Info admonition (:::info)"
+ },
+ "theme.admonition.note": {
+ "message": "note",
+ "description": "The default label used for the Note admonition (:::note)"
+ },
+ "theme.admonition.tip": {
+ "message": "tip",
+ "description": "The default label used for the Tip admonition (:::tip)"
+ },
+ "theme.admonition.warning": {
+ "message": "warning",
+ "description": "The default label used for the Warning admonition (:::warning)"
+ },
+ "theme.CodeBlock.copied": {
+ "message": "Copied",
+ "description": "The copied button label on code blocks"
+ },
+ "theme.CodeBlock.copyButtonAriaLabel": {
+ "message": "Copy code to clipboard",
+ "description": "The ARIA label for copy code blocks button"
+ },
+ "theme.CodeBlock.copy": {
+ "message": "Copy",
+ "description": "The copy button label on code blocks"
+ },
+ "theme.CodeBlock.wordWrapToggle": {
+ "message": "Toggle word wrap",
+ "description": "The title attribute for toggle word wrapping button of code block lines"
+ },
+ "theme.DocSidebarItem.expandCategoryAriaLabel": {
+ "message": "Expand sidebar category '{label}'",
+ "description": "The ARIA label to expand the sidebar category"
+ },
+ "theme.DocSidebarItem.collapseCategoryAriaLabel": {
+ "message": "Collapse sidebar category '{label}'",
+ "description": "The ARIA label to collapse the sidebar category"
+ },
+ "theme.NavBar.navAriaLabel": {
+ "message": "Main",
+ "description": "The ARIA label for the main navigation"
+ },
+ "theme.NotFound.p1": {
+ "message": "We could not find what you were looking for.",
+ "description": "The first paragraph of the 404 page"
+ },
+ "theme.NotFound.p2": {
+ "message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.",
+ "description": "The 2nd paragraph of the 404 page"
+ },
+ "theme.TOCCollapsible.toggleButtonLabel": {
+ "message": "On this page",
+ "description": "The label used by the button on the collapsible TOC component"
+ },
+ "theme.blog.post.readMore": {
+ "message": "Read More",
+ "description": "The label used in blog post item excerpts to link to full blog posts"
+ },
+ "theme.blog.post.readMoreLabel": {
+ "message": "Read more about {title}",
+ "description": "The ARIA label for the link to full blog posts from excerpts"
+ },
+ "theme.blog.post.readingTime.plurals": {
+ "message": "One min read|{readingTime} min read",
+ "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
+ },
+ "theme.navbar.mobileLanguageDropdown.label": {
+ "message": "Languages",
+ "description": "The label for the mobile language switcher dropdown"
+ },
+ "theme.docs.sidebar.collapseButtonTitle": {
+ "message": "Collapse sidebar",
+ "description": "The title attribute for collapse button of doc sidebar"
+ },
+ "theme.docs.sidebar.collapseButtonAriaLabel": {
+ "message": "Collapse sidebar",
+ "description": "The title attribute for collapse button of doc sidebar"
+ },
+ "theme.docs.breadcrumbs.home": {
+ "message": "Home page",
+ "description": "The ARIA label for the home page in the breadcrumbs"
+ },
+ "theme.docs.sidebar.closeSidebarButtonAriaLabel": {
+ "message": "Close navigation bar",
+ "description": "The ARIA label for close button of mobile sidebar"
+ },
+ "theme.docs.sidebar.navAriaLabel": {
+ "message": "Docs sidebar",
+ "description": "The ARIA label for the sidebar navigation"
+ },
+ "theme.docs.sidebar.toggleSidebarButtonAriaLabel": {
+ "message": "Toggle navigation bar",
+ "description": "The ARIA label for hamburger menu button of mobile navigation"
+ },
+ "theme.docs.sidebar.expandButtonTitle": {
+ "message": "Expand sidebar",
+ "description": "The ARIA label and title attribute for expand button of doc sidebar"
+ },
+ "theme.docs.sidebar.expandButtonAriaLabel": {
+ "message": "Expand sidebar",
+ "description": "The ARIA label and title attribute for expand button of doc sidebar"
+ },
+ "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": {
+ "message": "← Back to main menu",
+ "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"
+ },
+ "theme.SearchBar.seeAll": {
+ "message": "See all {count} results"
+ },
+ "theme.SearchBar.label": {
+ "message": "Search",
+ "description": "The ARIA label and placeholder for search button"
+ },
+ "theme.SearchModal.searchBox.resetButtonTitle": {
+ "message": "Clear the query",
+ "description": "The label and ARIA label for search box reset button"
+ },
+ "theme.SearchModal.searchBox.cancelButtonText": {
+ "message": "Cancel",
+ "description": "The label and ARIA label for search box cancel button"
+ },
+ "theme.SearchModal.startScreen.recentSearchesTitle": {
+ "message": "Recent",
+ "description": "The title for recent searches"
+ },
+ "theme.SearchModal.startScreen.noRecentSearchesText": {
+ "message": "No recent searches",
+ "description": "The text when no recent searches"
+ },
+ "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": {
+ "message": "Save this search",
+ "description": "The label for save recent search button"
+ },
+ "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": {
+ "message": "Remove this search from history",
+ "description": "The label for remove recent search button"
+ },
+ "theme.SearchModal.startScreen.favoriteSearchesTitle": {
+ "message": "Favorite",
+ "description": "The title for favorite searches"
+ },
+ "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": {
+ "message": "Remove this search from favorites",
+ "description": "The label for remove favorite search button"
+ },
+ "theme.SearchModal.errorScreen.titleText": {
+ "message": "Unable to fetch results",
+ "description": "The title for error screen of search modal"
+ },
+ "theme.SearchModal.errorScreen.helpText": {
+ "message": "You might want to check your network connection.",
+ "description": "The help text for error screen of search modal"
+ },
+ "theme.SearchModal.footer.selectText": {
+ "message": "to select",
+ "description": "The explanatory text of the action for the enter key"
+ },
+ "theme.SearchModal.footer.selectKeyAriaLabel": {
+ "message": "Enter key",
+ "description": "The ARIA label for the Enter key button that makes the selection"
+ },
+ "theme.SearchModal.footer.navigateText": {
+ "message": "to navigate",
+ "description": "The explanatory text of the action for the Arrow up and Arrow down key"
+ },
+ "theme.SearchModal.footer.navigateUpKeyAriaLabel": {
+ "message": "Arrow up",
+ "description": "The ARIA label for the Arrow up key button that makes the navigation"
+ },
+ "theme.SearchModal.footer.navigateDownKeyAriaLabel": {
+ "message": "Arrow down",
+ "description": "The ARIA label for the Arrow down key button that makes the navigation"
+ },
+ "theme.SearchModal.footer.closeText": {
+ "message": "to close",
+ "description": "The explanatory text of the action for Escape key"
+ },
+ "theme.SearchModal.footer.closeKeyAriaLabel": {
+ "message": "Escape key",
+ "description": "The ARIA label for the Escape key button that close the modal"
+ },
+ "theme.SearchModal.footer.searchByText": {
+ "message": "Search by",
+ "description": "The text explain that the search is making by Algolia"
+ },
+ "theme.SearchModal.noResultsScreen.noResultsText": {
+ "message": "No results for",
+ "description": "The text explains that there are no results for the following search"
+ },
+ "theme.SearchModal.noResultsScreen.suggestedQueryText": {
+ "message": "Try searching for",
+ "description": "The text for the suggested query when no results are found for the following search"
+ },
+ "theme.SearchModal.noResultsScreen.reportMissingResultsText": {
+ "message": "Believe this query should return results?",
+ "description": "The text for the question where the user thinks there are missing results"
+ },
+ "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": {
+ "message": "Let us know.",
+ "description": "The text for the link to report missing results"
+ },
+ "theme.SearchModal.placeholder": {
+ "message": "Search docs",
+ "description": "The placeholder of the input of the DocSearch pop-up modal"
+ },
+ "theme.SearchPage.documentsFound.plurals": {
+ "message": "One document found|{count} documents found",
+ "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
+ },
+ "theme.SearchPage.existingResultsTitle": {
+ "message": "Search results for \"{query}\"",
+ "description": "The search page title for non-empty query"
+ },
+ "theme.SearchPage.emptyResultsTitle": {
+ "message": "Search the documentation",
+ "description": "The search page title for empty query"
+ },
+ "theme.SearchPage.inputPlaceholder": {
+ "message": "Type your search here",
+ "description": "The placeholder for search page input"
+ },
+ "theme.SearchPage.inputLabel": {
+ "message": "Search",
+ "description": "The ARIA label for search page input"
+ },
+ "theme.SearchPage.algoliaLabel": {
+ "message": "Search by Algolia",
+ "description": "The ARIA label for Algolia mention"
+ },
+ "theme.SearchPage.noResultsText": {
+ "message": "No results were found",
+ "description": "The paragraph for empty search result"
+ },
+ "theme.SearchPage.fetchingNewResults": {
+ "message": "Fetching new results...",
+ "description": "The paragraph for fetching new search results"
+ },
+ "theme.ErrorPageContent.tryAgain": {
+ "message": "Try again",
+ "description": "The label of the button to try again rendering when the React error boundary captures an error"
+ },
+ "theme.common.skipToMainContent": {
+ "message": "Skip to main content",
+ "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"
+ },
+ "theme.tags.tagsPageTitle": {
+ "message": "Tags",
+ "description": "The title of the tag list page"
+ },
+ "theme.unlistedContent.title": {
+ "message": "Unlisted page",
+ "description": "The unlisted content banner title"
+ },
+ "theme.unlistedContent.message": {
+ "message": "This page is unlisted. Search engines will not index it, and only users having a direct link can access it.",
+ "description": "The unlisted content banner message"
+ }
+}
diff --git a/docs/i18n/en/docusaurus-plugin-content-blog/options.json b/docs/i18n/en/docusaurus-plugin-content-blog/options.json
new file mode 100644
index 00000000000..9239ff706c2
--- /dev/null
+++ b/docs/i18n/en/docusaurus-plugin-content-blog/options.json
@@ -0,0 +1,14 @@
+{
+ "title": {
+ "message": "Blog",
+ "description": "The title for the blog used in SEO"
+ },
+ "description": {
+ "message": "Blog",
+ "description": "The description for the blog used in SEO"
+ },
+ "sidebar.title": {
+ "message": "Recent posts",
+ "description": "The label for the left sidebar"
+ }
+}
diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current.json b/docs/i18n/en/docusaurus-plugin-content-docs/current.json
new file mode 100644
index 00000000000..191957753c1
--- /dev/null
+++ b/docs/i18n/en/docusaurus-plugin-content-docs/current.json
@@ -0,0 +1,70 @@
+{
+ "version.label": {
+ "message": "Next",
+ "description": "The label for version current"
+ },
+ "sidebar.learn.category.Introduction": {
+ "message": "Introduction",
+ "description": "The label for category Introduction in sidebar learn"
+ },
+ "sidebar.learn.category.Core Concepts": {
+ "message": "Core Concepts",
+ "description": "The label for category Core Concepts in sidebar learn"
+ },
+ "sidebar.learn.category.Contributing": {
+ "message": "Contributing",
+ "description": "The label for category Contributing in sidebar learn"
+ },
+ "sidebar.developers.category.Introduction": {
+ "message": "Introduction",
+ "description": "The label for category Introduction in sidebar developers"
+ },
+ "sidebar.developers.category.Javascript SDK": {
+ "message": "Javascript SDK",
+ "description": "The label for category Javascript SDK in sidebar developers"
+ },
+ "sidebar.developers.category.Guides": {
+ "message": "Guides",
+ "description": "The label for category Guides in sidebar developers"
+ },
+ "sidebar.developers.category.The Graph": {
+ "message": "The Graph",
+ "description": "The label for category The Graph in sidebar developers"
+ },
+ "sidebar.distributors.category.Introduction": {
+ "message": "Introduction",
+ "description": "The label for category Introduction in sidebar distributors"
+ },
+ "sidebar.distributors.category.Specification": {
+ "message": "Specification",
+ "description": "The label for category Specification in sidebar distributors"
+ },
+ "sidebar.distributors.category.Self Serve": {
+ "message": "Self Serve",
+ "description": "The label for category Self Serve in sidebar distributors"
+ },
+ "sidebar.node_operators.category.Introduction": {
+ "message": "Introduction",
+ "description": "The label for category Introduction in sidebar node_operators"
+ },
+ "sidebar.node_operators.category.Staking": {
+ "message": "Staking",
+ "description": "The label for category Staking in sidebar node_operators"
+ },
+ "sidebar.node_operators.category.Run a Node": {
+ "message": "Run a Node",
+ "description": "The label for category Run a Node in sidebar node_operators"
+ },
+ "sidebar.node_operators.category.Register a Node": {
+ "message": "Register a Node",
+ "description": "The label for category Register a Node in sidebar node_operators"
+ },
+ "sidebar.reference.category.Introduction": {
+ "message": "Introduction",
+ "description": "The label for category Introduction in sidebar reference"
+ },
+ "sidebar.reference.category.Protocol Dashboard": {
+ "message": "Protocol Dashboard",
+ "description": "The label for category Protocol Dashboard in sidebar reference"
+ }
+}
diff --git a/docs/i18n/en/docusaurus-theme-classic/navbar.json b/docs/i18n/en/docusaurus-theme-classic/navbar.json
new file mode 100644
index 00000000000..a061485ed17
--- /dev/null
+++ b/docs/i18n/en/docusaurus-theme-classic/navbar.json
@@ -0,0 +1,30 @@
+{
+ "title": {
+ "message": "Audius",
+ "description": "The title in the navbar"
+ },
+ "logo.alt": {
+ "message": "Audius Logo",
+ "description": "The alt text of navbar logo"
+ },
+ "item.label.Learn": {
+ "message": "Learn",
+ "description": "Navbar item with label Learn"
+ },
+ "item.label.Developers": {
+ "message": "Developers",
+ "description": "Navbar item with label Developers"
+ },
+ "item.label.Staking": {
+ "message": "Staking",
+ "description": "Navbar item with label Staking"
+ },
+ "item.label.Distributors": {
+ "message": "Distributors",
+ "description": "Navbar item with label Distributors"
+ },
+ "item.label.Reference": {
+ "message": "Reference",
+ "description": "Navbar item with label Reference"
+ }
+}
diff --git a/docs/sidebars.js b/docs/sidebars.js
index 65b691e56a9..ae200ba613a 100644
--- a/docs/sidebars.js
+++ b/docs/sidebars.js
@@ -74,6 +74,31 @@ module.exports = {
},
],
+ distributors: [
+ {
+ type: 'category',
+ label: 'Introduction',
+ items: ['distributors/introduction/overview'],
+ collapsed: false,
+ },
+ {
+ type: 'category',
+ label: 'Specification',
+ items: [
+ 'distributors/specification/overview',
+ 'distributors/specification/metadata',
+ 'distributors/specification/deal-types',
+ ],
+ collapsed: false,
+ },
+ {
+ type: 'category',
+ label: 'Self Serve',
+ items: ['distributors/self-serve/overview', 'distributors/self-serve/run-a-ddex-server'],
+ collapsed: false,
+ },
+ ],
+
node_operators: [
{
type: 'category',
diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css
index 05ef6e7ef31..e1f5403a95f 100644
--- a/docs/src/css/custom.css
+++ b/docs/src/css/custom.css
@@ -22,7 +22,8 @@ footer {
--ifm-color-primary-light: var(--secondary-light-1);
--ifm-color-primary-lighter: var(--secondary-light-2);
--ifm-color-primary-lightest: var(--neutral-light-4);
- --ifm-code-font-size: 95%;
+ --ifm-code-font-size: 75%;
+ --ifm-code-font-weight: 600;
--ifm-spacing-horizontal: 1em;
--ifm-font-family-base: 'Avenir Next LT Pro', system-ui, -apple-system, Segoe UI, Roboto, Ubuntu,
Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif,
@@ -31,7 +32,8 @@ footer {
--ifm-font-color-base: var(--neutral-dark-3);
--ifm-font-weight-base: 500;
--ifm-footer-background-color: #35364f !important;
- --ifm-code-background: var(--neutral-light-9);
+ --ifm-code-background: var(--neutral-light-10);
+ --ifm-code-padding-horizontal: 2px;
--docsearch-searchbox-background: var(--white);
--ifm-color-danger-contrast-background: var(--accent-red);
--ifm-color-danger-contrast-foreground: var(--static-white);
@@ -162,6 +164,11 @@ footer .text--center {
/* Customized CSS Starts Here */
/* ///////////////////////////////////////////////////////////////////////// */
+code {
+ font-weight: 600;
+ color: var(--neutral-dark-1);
+}
+
/* Home Page customized css */
img.welcomeBanner {
@@ -316,3 +323,9 @@ html[data-theme='dark'] .navbar__items > a:nth-child(1):hover {
html[data-theme='dark'] .tabs__item--active {
background-color: #00000080;
}
+
+/* list elements */
+
+.markdown li {
+ margin-bottom: 12px;
+}
\ No newline at end of file