> ## Documentation Index
> Fetch the complete documentation index at: https://platform.docs.zenoo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Configuration Reference

> Complete reference for all cloud provider configuration properties

# Cloud Provider Configuration Reference

Complete reference for all configuration properties related to cloud provider support.

## Provider Selection

### hub.cloud.provider.type

**Type:** String
**Default:** `aws`
**Options:** `aws`, `gcp`, `local`, `azure` (future)

```yaml theme={null}
hub:
  cloud:
    provider:
      type: aws  # or gcp, local
```

Selects which cloud provider implementation to use.

* `aws` - Amazon Web Services (DynamoDB, Secrets Manager, CloudWatch)
* `gcp` - Google Cloud Platform (Firestore, Secret Manager, Cloud Monitoring)
* `local` - In-memory storage for development and testing

## AWS Provider Configuration

### Core AWS Settings

#### hub.aws.region

**Type:** String
**Required:** Yes
**Example:** `us-east-1`

```yaml theme={null}
hub:
  aws:
    region: us-east-1
```

AWS region for all services.

#### hub.aws.accessKey

**Type:** String
**Optional:** Yes (uses AWS default credential chain if omitted)

```yaml theme={null}
hub:
  aws:
    accessKey: ${AWS_ACCESS_KEY_ID}
```

AWS access key ID. Prefer IAM roles over explicit credentials.

#### hub.aws.secretKey

**Type:** String
**Optional:** Yes

```yaml theme={null}
hub:
  aws:
    secretKey: ${AWS_SECRET_ACCESS_KEY}
```

AWS secret access key.

### DynamoDB Configuration

#### hub.aws.dynamodb.prefix

**Type:** String
**Required:** Yes
**Pattern:** `^[\w.\-#{}]+$`

```yaml theme={null}
hub:
  aws:
    dynamodb:
      prefix: zenoo-hub
```

Prefix for all DynamoDB table names. Creates tables: `{prefix}-components`, `{prefix}-api-key-lookup`, `{prefix}-sharables`.

#### hub.aws.dynamodb.endpoint

**Type:** String
**Optional:** Yes
**Use Case:** LocalStack or custom DynamoDB endpoint

```yaml theme={null}
hub:
  aws:
    dynamodb:
      endpoint: http://localhost:4566
```

#### hub.aws.dynamodb.createTables

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  aws:
    dynamodb:
      createTables: true
```

Automatically create DynamoDB tables on startup.

#### hub.aws.dynamodb.tags

**Type:** `Map<String, String>`
**Optional:** Yes

```yaml theme={null}
hub:
  aws:
    dynamodb:
      tags:
        Environment: production
        CostCenter: engineering
        DataClassification: Restricted
```

Tags applied to all DynamoDB tables.

#### hub.aws.dynamodb.replicas

**Type:** `List<String>`
**Optional:** Yes

```yaml theme={null}
hub:
  aws:
    dynamodb:
      replicas:
        - us-west-2
        - eu-west-1
```

AWS regions for DynamoDB Global Table replication.

#### hub.aws.dynamodb.retryStrategy.requestTimeout

**Type:** Duration
**Default:** `500ms`

```yaml theme={null}
hub:
  aws:
    dynamodb:
      retryStrategy:
        requestTimeout: 500ms
```

Timeout for individual DynamoDB requests.

#### hub.aws.dynamodb.retryStrategy.maxRetries

**Type:** Integer
**Default:** `10`

```yaml theme={null}
hub:
  aws:
    dynamodb:
      retryStrategy:
        maxRetries: 10
```

Maximum number of retry attempts for failed requests.

#### hub.aws.dynamodb.retryStrategy.backoff

**Type:** Duration
**Default:** `100ms`

```yaml theme={null}
hub:
  aws:
    dynamodb:
      retryStrategy:
        backoff: 100ms
```

Initial backoff duration for exponential retry.

### Secrets Manager Configuration

#### hub.aws.secrets.prefix

**Type:** String
**Required:** Yes

```yaml theme={null}
hub:
  aws:
    secrets:
      prefix: zenoo-hub
```

Prefix for all secret names.

#### hub.aws.secrets.cache

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  aws:
    secrets:
      cache: true
```

Enable in-memory caching of secrets.

#### hub.aws.secrets.cacheTtl

**Type:** Duration
**Default:** `300s` (5 minutes)

```yaml theme={null}
hub:
  aws:
    secrets:
      cacheTtl: 300s
```

Time-to-live for cached secrets.

#### hub.aws.secrets.forceDelete

**Type:** Boolean
**Default:** `false`

```yaml theme={null}
hub:
  aws:
    secrets:
      forceDelete: false
```

When `true`, deletes secrets immediately without recovery window. When `false`, uses AWS's default 30-day recovery period.

#### hub.aws.secrets.tags

**Type:** `Map<String, String>`
**Optional:** Yes

```yaml theme={null}
hub:
  aws:
    secrets:
      tags:
        Environment: production
        DataClassification: HighlyRestricted
```

Tags applied to all secrets.

#### hub.aws.secrets.replicas

**Type:** `List<String>`
**Optional:** Yes

```yaml theme={null}
hub:
  aws:
    secrets:
      replicas:
        - us-west-2
        - eu-west-1
```

AWS regions for secret replication.

### CloudWatch Metrics Configuration

#### hub.aws.dynamodb.metrics.enabled

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  aws:
    dynamodb:
      metrics:
        enabled: true
```

Enable CloudWatch metrics publishing.

#### hub.aws.dynamodb.metrics.namespace

**Type:** String
**Default:** `ZenooHub`

```yaml theme={null}
hub:
  aws:
    dynamodb:
      metrics:
        namespace: ZenooHub
```

CloudWatch namespace for metrics.

## Local Provider Configuration

The local provider uses in-memory storage and requires minimal configuration.

### hub.cloud.provider.type

**Type:** String
**Value:** `local`
**Required:** Yes (to activate local provider)

```yaml theme={null}
hub:
  cloud:
    provider:
      type: local
```

Activates the local provider for in-memory storage.

### hub.local.cleanupEnabled

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  local:
    cleanupEnabled: true
```

Enables automatic cleanup of expired sharables. When enabled, a background task periodically removes expired tokens from the sharable store.

**Note:** Cleanup only applies to sharables, not components or configurations.

### hub.local.cleanupInterval

**Type:** Duration
**Default:** `5m` (5 minutes)
**Supported Units:** `ms` (milliseconds), `s` (seconds), `m` (minutes), `h` (hours), `d` (days)

```yaml theme={null}
hub:
  local:
    cleanupInterval: 5m
```

Interval between cleanup runs. Shorter intervals reduce memory usage but increase CPU overhead. Longer intervals reduce CPU overhead but may accumulate expired sharables.

**Recommendations:**

* Development: `5m` (default)
* Integration tests: `1m` (faster cleanup)
* CI/CD: `30s` (aggressive cleanup)
* Disabled: Set `cleanupEnabled: false`

### hub.local.verboseLogging

**Type:** Boolean
**Default:** `false`

```yaml theme={null}
hub:
  local:
    verboseLogging: true
```

Enables detailed logging for debugging. When enabled, logs all storage operations:

* Component create/update/delete
* API key associations
* Secret operations
* Sharable store operations
* Cleanup activities

**Use Cases:**

* Debugging storage issues
* Understanding data flow
* Learning the local provider
* Troubleshooting tests

**Warning:** Generates significant log volume in production-like scenarios. Only enable for debugging.

### hub.local.simulatedDelay

**Type:** Duration
**Default:** `0ms` (no delay)
**Optional:** Yes

```yaml theme={null}
hub:
  local:
    simulatedDelay: 10ms
```

Introduces artificial delay to simulate network latency. Useful for testing timeout handling and async behavior.

**Use Cases:**

* Testing timeout configurations
* Simulating slow storage
* Load testing with realistic latency
* Validating retry logic

**Note:** Only use in testing scenarios. Do not enable in production.

### Complete Local Configuration Example

**Minimal (Development):**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: local
```

**With Optional Settings:**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: local

  local:
    cleanupEnabled: true
    cleanupInterval: 5m
    verboseLogging: false
    simulatedDelay: 0ms
```

**Integration Testing:**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: local

  local:
    cleanupEnabled: true
    cleanupInterval: 1m      # Faster cleanup
    verboseLogging: false
    simulatedDelay: 0ms
```

**Debugging:**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: local

  local:
    cleanupEnabled: true
    cleanupInterval: 10m
    verboseLogging: true     # See all operations
    simulatedDelay: 0ms
```

**Latency Testing:**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: local

  local:
    cleanupEnabled: false    # Disable for performance
    verboseLogging: false
    simulatedDelay: 50ms     # Simulate network latency
```

### Switching Between Local and AWS

**Local Development Profile (application-local.yml):**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: local

  local:
    cleanupEnabled: true
    cleanupInterval: 5m
```

**AWS Production Profile (application-aws.yml):**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: aws

  aws:
    region: us-east-1
    dynamodb:
      prefix: my-hub
      createTables: true
    secrets:
      prefix: my-hub
```

**Activate with:**

```bash theme={null}
# Local
./gradlew bootRun --args='--spring.profiles.active=local'

# AWS
./gradlew bootRun --args='--spring.profiles.active=aws'

# GCP
./gradlew bootRun --args='--spring.profiles.active=gcp'
```

## GCP Provider Configuration

The GCP provider uses Cloud Firestore (Native Mode), Secret Manager, and Cloud Monitoring for full cloud-based storage.

### Core GCP Settings

#### hub.cloud.provider.type

**Type:** String
**Value:** `gcp`
**Required:** Yes (to activate GCP provider)

```yaml theme={null}
hub:
  cloud:
    provider:
      type: gcp
```

Activates the GCP provider for Cloud Firestore storage and Secret Manager.

#### hub.gcp.projectId

**Type:** String
**Required:** Yes

```yaml theme={null}
hub:
  gcp:
    projectId: your-gcp-project-id
```

GCP project ID where Firestore and Secret Manager resources will be created.

#### hub.gcp.credentialsLocation

**Type:** String
**Optional:** Yes (uses Application Default Credentials if omitted)

```yaml theme={null}
hub:
  gcp:
    credentialsLocation: /path/to/service-account-key.json
```

Path to service account key JSON file. If omitted, uses Application Default Credentials (ADC) which automatically detects credentials from:

* `GOOGLE_APPLICATION_CREDENTIALS` environment variable
* `gcloud auth application-default login` credentials
* Attached service account on GCE, GKE, or Cloud Run
* Compute Engine metadata service

**Best Practice:** Prefer ADC over explicit key files for better security.

#### hub.gcp.enabled

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  gcp:
    enabled: true
```

Enable or disable GCP provider. Set to `false` to temporarily disable GCP provider without changing provider type.

### Cloud Firestore Configuration

#### hub.gcp.firestore.database

**Type:** String
**Default:** `"(default)"`

```yaml theme={null}
hub:
  gcp:
    firestore:
      database: "(default)"
```

Firestore database name. Use `"(default)"` for the default database, or specify a custom database name.

**Important:** Hub requires Firestore in **Native Mode**, not Datastore Mode.

#### hub.gcp.firestore.prefix

**Type:** String
**Default:** `"zenoo-hub"`
**Pattern:** `^[\w-]+$`

```yaml theme={null}
hub:
  gcp:
    firestore:
      prefix: "zenoo-hub"
```

Prefix for all Firestore collection names. Creates collections:

* `{prefix}-components` - Component definitions with versioning
* `{prefix}-api-keys` - API key lookup mappings
* `{prefix}-sharables` - Temporary sharable tokens

#### hub.gcp.firestore.createIndexes

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  gcp:
    firestore:
      createIndexes: true
```

Automatically create composite indexes for complex queries. Set to `false` if you prefer to manage indexes manually via Firebase Console or `firestore.indexes.json`.

#### hub.gcp.firestore.ttlEnabled

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  gcp:
    firestore:
      ttlEnabled: true
```

Enable Time-To-Live (TTL) field for automatic cleanup of expired sharables. When enabled, Firestore automatically deletes documents when the TTL timestamp is reached.

#### hub.gcp.firestore.ttlField

**Type:** String
**Default:** `"ttl"`

```yaml theme={null}
hub:
  gcp:
    firestore:
      ttlField: "ttl"
```

Name of the TTL field in sharable documents. Must match the TTL policy configured in Firestore.

#### hub.gcp.firestore.retryStrategy.requestTimeout

**Type:** Duration
**Default:** `500ms`
**Supported Units:** `ms`, `s`, `m`, `h`

```yaml theme={null}
hub:
  gcp:
    firestore:
      retryStrategy:
        requestTimeout: 500ms
```

Per-request timeout for Firestore operations. Increase for large documents or slow networks.

#### hub.gcp.firestore.retryStrategy.maxRetries

**Type:** Integer
**Default:** `10`

```yaml theme={null}
hub:
  gcp:
    firestore:
      retryStrategy:
        maxRetries: 10
```

Maximum number of retry attempts for transient errors (e.g., `UNAVAILABLE`, `DEADLINE_EXCEEDED`).

#### hub.gcp.firestore.retryStrategy.backoff

**Type:** Duration
**Default:** `100ms`

```yaml theme={null}
hub:
  gcp:
    firestore:
      retryStrategy:
        backoff: 100ms
```

Base duration for exponential backoff between retries. Actual backoff increases exponentially: 100ms, 200ms, 400ms, etc.

### Secret Manager Configuration

#### hub.gcp.secrets.prefix

**Type:** String
**Default:** `"zenoo-hub"`
**Pattern:** `^[\w-/]+$`

```yaml theme={null}
hub:
  gcp:
    secrets:
      prefix: "zenoo-hub"
```

Prefix for all Secret Manager secret names. Creates secrets:

* `{prefix}/component-config/{key}/{version}` - Component configuration
* `{prefix}/api-key/{keyName}` - API key secrets

#### hub.gcp.secrets.cacheSize

**Type:** Integer
**Default:** `128`

```yaml theme={null}
hub:
  gcp:
    secrets:
      cacheSize: 128
```

Maximum number of secrets to cache in memory (Caffeine cache). Increase for applications with many configuration keys to reduce Secret Manager API calls.

#### hub.gcp.secrets.cacheExpiry

**Type:** Duration
**Default:** `30m`
**Supported Units:** `ms`, `s`, `m`, `h`, `d`

```yaml theme={null}
hub:
  gcp:
    secrets:
      cacheExpiry: 30m
```

Time-to-live for cached secrets. Balance between freshness (shorter TTL) and API cost reduction (longer TTL).

#### hub.gcp.secrets.versionsLimit

**Type:** Integer
**Default:** `18`

```yaml theme={null}
hub:
  gcp:
    secrets:
      versionsLimit: 18
```

Maximum number of versions to keep per secret. When limit is reached, oldest versions are automatically deleted. Increase for more extensive version history, decrease to reduce storage costs.

#### hub.gcp.secrets.forceDelete

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  gcp:
    secrets:
      forceDelete: true
```

Immediate deletion of secrets vs 30-day recovery window.

* `true` - Secrets deleted immediately (cannot be recovered)
* `false` - Secrets scheduled for deletion after 30 days (can be recovered)

**Recommendation:** Use `false` for production environments to enable recovery.

#### hub.gcp.secrets.retryStrategy.requestTimeout

**Type:** Duration
**Default:** `2s`

```yaml theme={null}
hub:
  gcp:
    secrets:
      retryStrategy:
        requestTimeout: 2s
```

Per-request timeout for Secret Manager operations. Longer than Firestore timeout to handle eventual consistency.

#### hub.gcp.secrets.retryStrategy.maxRetries

**Type:** Integer
**Default:** `5`

```yaml theme={null}
hub:
  gcp:
    secrets:
      retryStrategy:
        maxRetries: 5
```

Maximum retry attempts for Secret Manager operations.

#### hub.gcp.secrets.retryStrategy.backoff

**Type:** Duration
**Default:** `200ms`

```yaml theme={null}
hub:
  gcp:
    secrets:
      retryStrategy:
        backoff: 200ms
```

Base duration for exponential backoff between retries.

### Cloud Monitoring Configuration

#### hub.gcp.metrics.enabled

**Type:** Boolean
**Default:** `true`

```yaml theme={null}
hub:
  gcp:
    metrics:
      enabled: true
```

Enable Cloud Monitoring metrics publishing. Set to `false` to disable metrics (reduces API calls and costs).

#### hub.gcp.metrics.prefix

**Type:** String
**Default:** `"hub"`

```yaml theme={null}
hub:
  gcp:
    metrics:
      prefix: "hub"
```

Prefix for custom metric names in Cloud Monitoring.

#### hub.gcp.metrics.batchSize

**Type:** Integer
**Default:** `200`
**Maximum:** `200` (GCP limit)

```yaml theme={null}
hub:
  gcp:
    metrics:
      batchSize: 200
```

Maximum number of time series to send per Cloud Monitoring API request. GCP limit is 200.

### Complete GCP Configuration Examples

#### Minimal GCP Configuration (Development)

Uses Application Default Credentials and all defaults:

```yaml theme={null}
hub:
  cloud:
    provider:
      type: gcp
  gcp:
    projectId: dev-project-123
```

#### Production GCP Configuration

Full production configuration with service account key:

```yaml theme={null}
hub:
  cloud:
    provider:
      type: gcp
  gcp:
    projectId: prod-project-456
    credentialsLocation: /run/secrets/gcp-sa-key.json

    firestore:
      prefix: "hub-prod"
      database: "(default)"
      createIndexes: true
      ttlEnabled: true
      retryStrategy:
        requestTimeout: 1s
        maxRetries: 15
        backoff: 100ms

    secrets:
      prefix: "hub-prod"
      cacheSize: 256
      cacheExpiry: 1h
      versionsLimit: 30
      forceDelete: false        # Enable 30-day recovery
      retryStrategy:
        requestTimeout: 2s
        maxRetries: 5
        backoff: 200ms

    metrics:
      enabled: true
      prefix: "hub-prod"
      batchSize: 200
```

#### High Performance GCP Configuration

Optimized for throughput:

```yaml theme={null}
hub:
  cloud:
    provider:
      type: gcp
  gcp:
    projectId: perf-project-789

    firestore:
      prefix: "hub-perf"
      retryStrategy:
        requestTimeout: 500ms
        maxRetries: 20
        backoff: 50ms           # Faster retries

    secrets:
      cacheSize: 512            # Larger cache
      cacheExpiry: 2h           # Longer TTL
      versionsLimit: 50

    metrics:
      batchSize: 200            # Max batch size
```

#### Multi-Environment GCP Profile Example

**GCP Development Profile (application-gcp-dev.yml):**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: gcp

  gcp:
    projectId: hub-dev-project
    firestore:
      prefix: "hub-dev"
    secrets:
      prefix: "hub-dev"
      forceDelete: true         # Immediate deletion for dev
    metrics:
      enabled: false            # Reduce costs in dev
```

**GCP Production Profile (application-gcp-prod.yml):**

```yaml theme={null}
hub:
  cloud:
    provider:
      type: gcp

  gcp:
    projectId: hub-prod-project
    credentialsLocation: /run/secrets/gcp-sa-key.json
    firestore:
      prefix: "hub-prod"
      createIndexes: true
    secrets:
      prefix: "hub-prod"
      cacheSize: 256
      cacheExpiry: 1h
      forceDelete: false        # Enable recovery
    metrics:
      enabled: true
```

**Activate with:**

```bash theme={null}
# Development
./gradlew bootRun --args='--spring.profiles.active=gcp-dev'

# Production
./gradlew bootRun --args='--spring.profiles.active=gcp-prod'
```

## Component Storage Configuration

### hub.cloud.provider.component.operationTimeout

**Type:** Duration
**Default:** `30s`

```yaml theme={null}
hub:
  cloud:
    provider:
      component:
        operationTimeout: 30s
```

Timeout for component storage operations.

## Sharable Storage Configuration

### hub.cloud.provider.sharable.operationTimeout

**Type:** Duration
**Default:** `10s`

```yaml theme={null}
hub:
  cloud:
    provider:
      sharable:
        operationTimeout: 10s
```

Timeout for sharable token operations.

### hub.cloud.provider.sharable.defaultTtl

**Type:** Duration
**Default:** `24h`

```yaml theme={null}
hub:
  cloud:
    provider:
      sharable:
        defaultTtl: 24h
```

Default time-to-live for sharable tokens.

## Configuration Examples

### Minimal Production Configuration

```yaml theme={null}
hub:
  aws:
    region: us-east-1
    dynamodb:
      prefix: prod-hub
      createTables: true
    secrets:
      prefix: prod-hub
```

### Development with LocalStack

```yaml theme={null}
hub:
  aws:
    region: us-east-1
    accessKey: test
    secretKey: test
    dynamodb:
      endpoint: http://localhost:4566
      prefix: dev-hub
      createTables: true
    secrets:
      endpoint: http://localhost:4566
      prefix: dev-hub
```

### Multi-Region Production

```yaml theme={null}
hub:
  cloud:
    provider:
      type: aws
      component:
        operationTimeout: 30s
      sharable:
        operationTimeout: 10s
        defaultTtl: 24h

  aws:
    region: us-east-1
    dynamodb:
      prefix: prod-hub
      createTables: true
      replicas:
        - us-west-2
        - eu-west-1
      tags:
        Environment: production
        CostCenter: engineering
      retryStrategy:
        requestTimeout: 500ms
        maxRetries: 10
        backoff: 100ms
    secrets:
      prefix: prod-hub
      cache: true
      cacheTtl: 600s
      replicas:
        - us-west-2
        - eu-west-1
      tags:
        Environment: production
        DataClassification: HighlyRestricted
```

### High-Performance Configuration

```yaml theme={null}
hub:
  cloud:
    provider:
      type: aws
      component:
        operationTimeout: 15s  # Reduced timeout
      sharable:
        operationTimeout: 5s   # Reduced timeout

  aws:
    region: us-east-1
    dynamodb:
      prefix: fast-hub
      retryStrategy:
        requestTimeout: 300ms  # Aggressive timeout
        maxRetries: 5          # Fewer retries
        backoff: 50ms          # Faster backoff
    secrets:
      prefix: fast-hub
      cache: true
      cacheTtl: 900s          # Longer cache (15 min)
```

## Environment Variable Substitution

All configuration properties support Spring Boot's property placeholder syntax:

```yaml theme={null}
hub:
  aws:
    region: ${AWS_REGION:us-east-1}
    dynamodb:
      prefix: ${HUB_TABLE_PREFIX:zenoo-hub}
      endpoint: ${DYNAMODB_ENDPOINT:}
    secrets:
      prefix: ${HUB_SECRET_PREFIX:zenoo-hub}
```

## Profile-Specific Configuration

Use Spring profiles for environment-specific settings:

```yaml theme={null}
# application.yml (common)
hub:
  aws:
    dynamodb:
      createTables: true

---
# application-dev.yml
hub:
  aws:
    region: us-east-1
    dynamodb:
      endpoint: http://localhost:4566
      prefix: dev-hub

---
# application-staging.yml
hub:
  aws:
    region: us-east-1
    dynamodb:
      prefix: staging-hub

---
# application-prod.yml
hub:
  aws:
    region: us-east-1
    dynamodb:
      prefix: prod-hub
      replicas:
        - us-west-2
```

## Configuration Precedence

Configuration sources in order of precedence (highest to lowest):

1. Command-line arguments: `--hub.aws.region=us-west-2`
2. Environment variables: `HUB_AWS_REGION=us-west-2`
3. Profile-specific files: `application-prod.yml`
4. Application properties: `application.yml`
5. Default values

## See Also

* [AWS Provider Guide](/technical-specification/hub-backend/cloud-providers/aws)
* [Migration Guide](/technical-specification/hub-backend/cloud-providers/migration-guide)
* [Architecture](/technical-specification/hub-backend/cloud-providers/architecture)
* [Local Development](/technical-specification/hub-backend/cloud-providers/local-development)
