# Registry {#registry} As the number of dependencies grows, so does the time to resolve them. While other package managers like [CocoaPods](https://cocoapods.org/) or [npm](https://www.npmjs.com/) are centralized, Swift Package Manager is not. Because of that, SwiftPM needs to resolve dependencies by doing a deep clone of each repository, which can be time-consuming and takes up more memory than a centralized approach would. To address this, Tuist provides an implementation of the [Package Registry](https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/PackageRegistryUsage.md), so you can download only the commits you _actually need_. The packages in the registry are based on the [Swift Package Index](https://swiftpackageindex.com/) -- if you can find a package there, the package is also available in the Tuist Registry. Additionally, the packages are distributed across the globe using an edge storage for minimum latency when resolving them. ## Usage {#usage} There are two ways to set up the registry: ### Option 1: Automatic setup during generation (recommended) {#automatic-setup} If you're using Tuist to generate your project, you can enable the registry by setting the `registryEnabled` option in your `Tuist.swift` configuration: ```swift import ProjectDescription let tuist = Tuist( project: .tuist( generationOptions: .options( registryEnabled: true ) ) ) ``` With this option, `tuist generate` will automatically create the registry configuration file in your workspace. This eliminates the need to run `tuist registry setup` separately. ::: tip If you want to integrate dependencies through Xcode's default Swift Package Manager integration (rather than Tuist's XcodeProj-based integration), enabling `registryEnabled` in your generated projects will configure them to use the registry automatically: ```swift import ProjectDescription let tuist = Tuist( project: .tuist( generationOptions: .options( registryEnabled: true ) ) ) ``` ::: ### Option 2: Manual setup {#manual-setup} To set up the registry manually, run the following command in your project's directory: ```bash tuist registry setup ``` This command generates a registry configuration file that enables the registry for your project. Ensure this file is committed so your team can also benefit from the registry. ### Authentication (optional) {#authentication} Authentication is **optional**. Without authentication, you can use the registry with a rate limit of **1,000 requests per minute** per IP address. To get a higher rate limit of **20,000 requests per minute**, you can authenticate by running: ```bash tuist registry login ``` ::: info Authentication requires a Tuist account and project. ::: ### Resolving dependencies {#resolving-dependencies} To resolve dependencies from the registry instead of from source control, continue reading based on your project setup: - Xcode project - Generated project with the Xcode package integration - Generated project with the XcodeProj-based package integration - Swift package To set up the registry on the CI, follow this guide: Continuous integration. ### Package registry identifiers {#package-registry-identifiers} When you use package registry identifiers in a `Package.swift` or `Project.swift` file, you need to convert the URL of the package to the registry convention. The registry identifier is always in the form of `{organization}.{repository}`. For example, to use the registry for the `https://github.com/pointfreeco/swift-composable-architecture` package, the package registry identifier would be `pointfreeco.swift-composable-architecture`. ::: info The identifier can't contain more than one dot. If the repository name contains a dot, it's replaced with an underscore. For example, the `https://github.com/groue/GRDB.swift` package would have the registry identifier `groue.GRDB_swift`. :::