# onderwijsin/directus-extensions architecture

> Architecture diagram of the GitHub repository onderwijsin/directus-extensions, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/onderwijsin/directus-extensions
- Repository: https://github.com/onderwijsin/directus-extensions

## Overview

This is a collection of Directus extensions and shared runtime utilities, rather than one application. Users interact with Studio modules, field interfaces, or Directus endpoints and operations; the extensions then provide authentication, deployment, contact synchronization, content/redirect management, health and policy access, and Sentry integration. The graph preserves these major product branches and a shared utility layer. README descriptions support the capabilities, while sampled source clarifies selected API calls and internal behavior; unsampled extension wiring is intentionally not inferred.

Main entry points: [`extensions/directus-coolify-deployments-bundle/src/coolify-deployments-module/module.vue`](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/coolify-deployments-module/module.vue) (Deployment Studio), [`extensions/directus-coolify-deployments-bundle/src/shared/coolify-client/index.ts`](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/shared/coolify-client/index.ts) (Coolify client), [`extensions/directus-loops-bundle/src/shared/client.ts`](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-loops-bundle/src/shared/client.ts) (Loops client), [`extensions/directus-magic-links-bundle/src/magic-links-endpoint/index.ts`](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-magic-links-bundle/src/magic-links-endpoint/index.ts) (Magic-link endpoint)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_auth["Authentication"]
  node_magic_endpoint["Magic-link endpoint<br/>[index.ts]"]
  node_magic_handlers["Issue and redeem links<br/>[handlers.ts]"]
  node_magic_hook["Auth lifecycle hook<br/>[index.ts]"]
  node_policies_endpoint["Effective policies<br/>[index.ts]"]
end

subgraph group_integrations["External Integrations"]
  node_coolify_ui["Deployment Studio<br/>[module.vue]"]
  node_coolify_api["Deployment API<br/>[index.ts]"]
  node_coolify_operation["Deploy operation<br/>[index.ts]"]
  node_coolify_client["Coolify client<br/>[index.ts]"]
  node_loops_hook["Contact sync hook<br/>[index.ts]"]
  node_loops_operation["Campaign ingestion<br/>[index.ts]"]
  node_loops_client["Loops client<br/>[client.ts]"]
  node_health_endpoint["Health endpoint<br/>[index.ts]"]
  node_health_checks["Server checks<br/>[health.ts]"]
  node_sentry_hook["Sentry integration<br/>[index.ts]"]
end

subgraph group_content["Content Tools"]
  node_slug_hook["Slug and redirect hooks<br/>[index.ts]"]
  node_slug_domain["Redirect rules<br/>[service.ts]"]
  node_slug_recalculate["Field recalculation<br/>[handler.ts]"]
end

subgraph group_studio["Studio Experience"]
  node_quick_copy["Copy field controls<br/>[interface.vue]"]
  node_studio_docs["Studio documentation<br/>[module.vue]"]
end

subgraph group_runtime["Shared Runtime"]
  node_shared_utils["Extension utilities<br/>[index.ts]"]
  node_auto_task["Auto-task coordinator<br/>[handler.ts]"]
  node_task_storage["Task storage<br/>[storage.ts]"]
  node_task_store[("Memory, Redis, filesystem<br/>[storage.ts]")]
end

node_directus_user(("Directus user"))
node_directus_auth["Directus auth services"]
node_coolify_service["Coolify service"]
node_loops_service["Loops service"]

node_directus_user -->|"requests link"| node_magic_endpoint
node_magic_endpoint -->|"dispatches"| node_magic_handlers
node_magic_handlers -->|"refreshes session"| node_directus_auth
node_magic_hook -->|"extends auth"| node_directus_auth
node_directus_user -->|"views deployments"| node_coolify_ui
node_coolify_ui -->|"requests status"| node_coolify_api
node_coolify_ui -->|"triggers deploy"| node_coolify_operation
node_coolify_api -->|"uses client"| node_coolify_client
node_coolify_operation -->|"uses client"| node_coolify_client
node_coolify_client -->|"calls API"| node_coolify_service
node_loops_hook -->|"syncs profiles"| node_loops_client
node_loops_operation -->|"reads campaigns"| node_loops_client
node_loops_client -->|"calls API"| node_loops_service
node_health_endpoint -->|"runs checks"| node_health_checks
node_directus_user -->|"requests policies"| node_policies_endpoint
node_slug_hook -->|"manages redirects"| node_slug_domain
node_directus_user -->|"starts recalculation"| node_slug_recalculate
node_slug_recalculate -->|"creates redirects"| node_slug_domain
node_directus_user -->|"copies field value"| node_quick_copy
node_directus_user -->|"reads documentation"| node_studio_docs
node_auto_task -->|"uses storage"| node_task_storage
node_task_storage -->|"reads and writes"| node_task_store

click node_magic_endpoint "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-magic-links-bundle/src/magic-links-endpoint/index.ts"
click node_magic_handlers "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-magic-links-bundle/src/magic-links-endpoint/handlers.ts"
click node_magic_hook "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-magic-links-bundle/src/magic-links-hook/index.ts"
click node_coolify_ui "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/coolify-deployments-module/module.vue"
click node_coolify_api "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/coolify-deployments-endpoint/index.ts"
click node_coolify_operation "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/coolify-deploy-operation/index.ts"
click node_coolify_client "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/shared/coolify-client/index.ts"
click node_loops_hook "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-loops-bundle/src/loops-webhook-hook/index.ts"
click node_loops_operation "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-loops-bundle/src/loops-webhook-operation/index.ts"
click node_loops_client "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-loops-bundle/src/shared/client.ts"
click node_health_endpoint "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-enhanced-server-health-endpoint/src/index.ts"
click node_health_checks "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-enhanced-server-health-endpoint/src/health.ts"
click node_policies_endpoint "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-policies-endpoint/src/index.ts"
click node_slug_hook "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-sluggernaut-bundle/src/sluggernaut-hook/index.ts"
click node_slug_domain "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-sluggernaut-bundle/src/sluggernaut-hook/redirects/service.ts"
click node_slug_recalculate "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-sluggernaut-bundle/src/sluggernaut-recalculate/handler.ts"
click node_quick_copy "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-quick-copy-bundle/src/quick-copy-interface/interface.vue"
click node_studio_docs "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-studio-docs-bundle/src/studio-docs-module/module.vue"
click node_sentry_hook "https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-sentry-bundle/src/sentry-hook/index.ts"
click node_shared_utils "https://github.com/onderwijsin/directus-extensions/blob/main/packages/extension-utils/src/index.ts"
click node_auto_task "https://github.com/onderwijsin/directus-extensions/blob/main/packages/extension-utils/src/server/auto-task/handler.ts"
click node_task_storage "https://github.com/onderwijsin/directus-extensions/blob/main/packages/extension-utils/src/server/auto-task/storage.ts"
click node_task_store "https://github.com/onderwijsin/directus-extensions/blob/main/packages/extension-utils/src/server/auto-task/storage.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_magic_endpoint,node_magic_handlers,node_magic_hook,node_policies_endpoint,node_directus_user toneBlue
class node_coolify_ui,node_coolify_api,node_coolify_operation,node_coolify_client,node_loops_hook,node_loops_operation,node_loops_client,node_health_endpoint,node_health_checks,node_sentry_hook toneAmber
class node_slug_hook,node_slug_domain,node_slug_recalculate toneMint
class node_quick_copy,node_studio_docs toneRose
class node_shared_utils,node_auto_task,node_task_storage,node_task_store,node_directus_auth,node_coolify_service,node_loops_service toneIndigo
```

## Components

### Authentication

- [Magic-link endpoint](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-magic-links-bundle/src/magic-links-endpoint/index.ts): `extensions/directus-magic-links-bundle/src/magic-links-endpoint/index.ts`
- [Issue and redeem links](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-magic-links-bundle/src/magic-links-endpoint/handlers.ts): `extensions/directus-magic-links-bundle/src/magic-links-endpoint/handlers.ts`
- [Auth lifecycle hook](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-magic-links-bundle/src/magic-links-hook/index.ts): `extensions/directus-magic-links-bundle/src/magic-links-hook/index.ts`
- [Effective policies](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-policies-endpoint/src/index.ts): `extensions/directus-policies-endpoint/src/index.ts`

### External Integrations

- [Deployment Studio](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/coolify-deployments-module/module.vue): `extensions/directus-coolify-deployments-bundle/src/coolify-deployments-module/module.vue`
- [Deployment API](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/coolify-deployments-endpoint/index.ts): `extensions/directus-coolify-deployments-bundle/src/coolify-deployments-endpoint/index.ts`
- [Deploy operation](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/coolify-deploy-operation/index.ts): `extensions/directus-coolify-deployments-bundle/src/coolify-deploy-operation/index.ts`
- [Coolify client](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-coolify-deployments-bundle/src/shared/coolify-client/index.ts): `extensions/directus-coolify-deployments-bundle/src/shared/coolify-client/index.ts`
- [Contact sync hook](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-loops-bundle/src/loops-webhook-hook/index.ts): `extensions/directus-loops-bundle/src/loops-webhook-hook/index.ts`
- [Campaign ingestion](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-loops-bundle/src/loops-webhook-operation/index.ts): `extensions/directus-loops-bundle/src/loops-webhook-operation/index.ts`
- [Loops client](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-loops-bundle/src/shared/client.ts): `extensions/directus-loops-bundle/src/shared/client.ts`
- [Health endpoint](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-enhanced-server-health-endpoint/src/index.ts): `extensions/directus-enhanced-server-health-endpoint/src/index.ts`
- [Server checks](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-enhanced-server-health-endpoint/src/health.ts): `extensions/directus-enhanced-server-health-endpoint/src/health.ts`
- [Sentry integration](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-sentry-bundle/src/sentry-hook/index.ts): `extensions/directus-sentry-bundle/src/sentry-hook/index.ts`

### Content Tools

- [Slug and redirect hooks](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-sluggernaut-bundle/src/sluggernaut-hook/index.ts): `extensions/directus-sluggernaut-bundle/src/sluggernaut-hook/index.ts`
- [Redirect rules](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-sluggernaut-bundle/src/sluggernaut-hook/redirects/service.ts): `extensions/directus-sluggernaut-bundle/src/sluggernaut-hook/redirects/service.ts`
- [Field recalculation](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-sluggernaut-bundle/src/sluggernaut-recalculate/handler.ts): `extensions/directus-sluggernaut-bundle/src/sluggernaut-recalculate/handler.ts`

### Studio Experience

- [Copy field controls](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-quick-copy-bundle/src/quick-copy-interface/interface.vue): `extensions/directus-quick-copy-bundle/src/quick-copy-interface/interface.vue`
- [Studio documentation](https://github.com/onderwijsin/directus-extensions/blob/main/extensions/directus-studio-docs-bundle/src/studio-docs-module/module.vue): `extensions/directus-studio-docs-bundle/src/studio-docs-module/module.vue`

### Shared Runtime

- [Extension utilities](https://github.com/onderwijsin/directus-extensions/blob/main/packages/extension-utils/src/index.ts): `packages/extension-utils/src/index.ts`
- [Auto-task coordinator](https://github.com/onderwijsin/directus-extensions/blob/main/packages/extension-utils/src/server/auto-task/handler.ts): `packages/extension-utils/src/server/auto-task/handler.ts`
- [Task storage](https://github.com/onderwijsin/directus-extensions/blob/main/packages/extension-utils/src/server/auto-task/storage.ts): `packages/extension-utils/src/server/auto-task/storage.ts`
- [Memory, Redis, filesystem](https://github.com/onderwijsin/directus-extensions/blob/main/packages/extension-utils/src/server/auto-task/storage.ts): `packages/extension-utils/src/server/auto-task/storage.ts`

### Other components

- **Directus user**
- **Directus auth services**
- **Coolify service**
- **Loops service**

## Connections

- Directus user → Magic-link endpoint: requests link
- Magic-link endpoint → Issue and redeem links: dispatches
- Issue and redeem links → Directus auth services: refreshes session
- Auth lifecycle hook → Directus auth services: extends auth
- Directus user → Deployment Studio: views deployments
- Deployment Studio → Deployment API: requests status
- Deployment Studio → Deploy operation: triggers deploy
- Deployment API → Coolify client: uses client
- Deploy operation → Coolify client: uses client
- Coolify client → Coolify service: calls API
- Contact sync hook → Loops client: syncs profiles
- Campaign ingestion → Loops client: reads campaigns
- Loops client → Loops service: calls API
- Health endpoint → Server checks: runs checks
- Directus user → Effective policies: requests policies
- Slug and redirect hooks → Redirect rules: manages redirects
- Directus user → Field recalculation: starts recalculation
- Field recalculation → Redirect rules: creates redirects
- Directus user → Copy field controls: copies field value
- Directus user → Studio documentation: reads documentation
- Auto-task coordinator → Task storage: uses storage
- Task storage → Memory, Redis, filesystem: reads and writes
