# Configure Project dependencies

dbt™ Mesh introduces a new method to manage dependencies in your dbt™ project. This allow you to reference models from another project without having to import these as a dbt™️ package.

Instead, you treat your dependency on those models as an API that returns a dataset. The maintainer of the public model is responsible for ensuring its quality and stability.

## Prerequisites <a href="#prerequisites" id="prerequisites"></a>

* Use a supported version of dbt 1.7 or greater for both the upstream ("producer") project and the downstream ("consumer") project.
* Define models in an upstream ("producer") project that are configured with [`access: public`](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/best-practices/data-mesh-setup/model-access). You need at least one successful job run after defining their `access`.
* Have at least one [Bolt schedule](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/best-practices/data-mesh-setup/broken-reference) with a successful run.

## Setup your consumer project

To get started, you will to crate a configuration file in your dbt™️ consumer project for Paradime to fetch public models definition from your "producer" project. You will need to provide:

* The name of your "producer" project, as defined in your `dbt_project.yml`.
* The name of a  [Bolt schedule](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/best-practices/data-mesh-setup/broken-reference) in your "producer" project, Paradime will use this to fetch and inject model metadata in your "consumer" project.
* [API credentials from your "producer" project](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/developers/generate-api-keys). The API keys must have the *Bolt schedules metadata viewer* capabilit&#x79;*.*&#x20;

### 1. Add configuration file

To enable cross-project dependencies add a new file named `dbt_loom.config.yml` in your "consumer" project git repository and provide the "producer" project configuration.

{% hint style="info" %}
Make sure that this file sits in you dbt™️ project root level, this is usually in the same directory where your `dbt_project.yml` sits.
{% endhint %}

{% code title="dbt\_loom.config.yml" fullWidth="false" %}

```yaml
manifests:
  - name: jaffle_shop_platform # The name of your "producer" project
    type: paradime
    config:
      schedule_name: hourly_bolt_schedule #The name of the Bolt schedule in your "producer" project
      # Set the environment variables name which we will use to provide API credentials from the "producer" project.
      # You can set a name that is reppresentative for your producer dbt™️ project name
      api_key: ${PRODUCER_PROJECT_API_KEY} 
      api_secret: ${PRODUCER_PROJECT_API_SECRET}
      api_endpoint: ${PRODUCER_PROJECT_API_ENDPOINT}
```

{% endcode %}

### 2. Setup Workspace level API credentials

{% hint style="warning" %}
Ensure the environment variable names match those defined in your `dbt_loom.config.yml`
{% endhint %}

After generating the API credentials from your "producer" project, you will need to set these as an environment variable name in the workspace settings of the "consumer" project.&#x20;

This step is required to enable [Bolt to run dbt™️ schedules](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/best-practices/data-mesh-setup/broken-reference) referencing models in your "producer" project.

{% content-ref url="../../documentation/settings/environment-variables/workspace-environment-variables" %}
[workspace-environment-variables](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/documentation/settings/environment-variables/workspace-environment-variables)
{% endcontent-ref %}

<figure><img src="https://2337193041-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FHET0AD04uHMgdeLAjptq%2Fuploads%2FVvTvCWx2qtEcMuorwB8Z%2FScreenshot%202024-07-22%20at%2001.23.14.png?alt=media&#x26;token=390cae06-b834-42d5-ab90-94fc88eaf1c8" alt=""><figcaption></figcaption></figure>

### 3. Setup User-level level API credentials

{% hint style="warning" %}
Ensure the environment variable names match those defined in your `dbt_loom.config.yml`
{% endhint %}

After generating the API credentials from your "producer" project, each user developing in the "consumer" project **MUST** set the API credentials as an environment variable.&#x20;

This will allow user to reference "producer" project models while developing in the [Paradime Code IDE](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/best-practices/data-mesh-setup/broken-reference).

{% content-ref url="../../documentation/settings/environment-variables/user-level-environment-variables" %}
[user-level-environment-variables](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/documentation/settings/environment-variables/user-level-environment-variables)
{% endcontent-ref %}

<figure><img src="https://2337193041-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FHET0AD04uHMgdeLAjptq%2Fuploads%2FnGIY83v2RGSAVOe97pq0%2FScreenshot%202024-07-22%20at%2001.23.43.png?alt=media&#x26;token=0093d8f9-3e77-4f88-8cff-ef2e709ef139" alt=""><figcaption></figcaption></figure>

## How to use cross-project model ref

When referencing models from a project-type dependency, always use the two-argument `ref` that includes the project name.

```sql
with monthly_revenue as (

    select * from {{ ref('jaffle_finance', 'monthly_revenue') }}

),

...
```

{% hint style="info" %}
Only models with [`access: public`](https://docs.paradime.io/app-help/~/changes/rDjfrwa4QH3nWWrOItTq/best-practices/data-mesh-setup/model-access) can be referenced from your "producer" project.
{% endhint %}
