Dyrected
Guides

Globals & Site Settings

Use globals to manage singleton content like site settings, navigation, and footer links.

Globals are for content that only has one instance — site name, navigation menu, SEO defaults, footer links. Unlike collections, a global has no list view; editors just open it and edit the single document.


1. Define globals

// dyrected.config.ts  (same for both frameworks)
export default defineConfig({
  globals: [
    {
      slug: 'site-settings',
      label: 'Site Settings',
      fields: [
        { name: 'siteName',  type: 'text',         required: true },
        { name: 'tagline',   type: 'text' },
        { name: 'logo',      type: 'relationship',  relationTo: 'media' },
        { name: 'favicon',   type: 'relationship',  relationTo: 'media' },
        { name: 'seoDefault', type: 'object', fields: [
          { name: 'title',       type: 'text' },
          { name: 'description', type: 'textarea' },
          { name: 'ogImage',     type: 'relationship', relationTo: 'media' },
        ]},
      ],
    },
    {
      slug: 'navigation',
      label: 'Navigation',
      fields: [
        {
          name: 'items',
          type: 'array',
          fields: [
            { name: 'label', type: 'text', required: true },
            { name: 'url',   type: 'text', required: true },
          ],
        },
      ],
    },
  ],
})

2. Fetch a global in your layout

// app/layout.tsx
import { createClient } from '@dyrected/sdk'

const client = createClient({
  baseUrl: process.env.NEXT_PUBLIC_DYRECTED_URL!,
  apiKey: process.env.DYRECTED_API_KEY!,
})

async function getSiteSettings() {
  return client.global('site-settings').get({ depth: 1 })
}

export default async function RootLayout({ children }: { children: React.ReactNode }) {
  const settings = await getSiteSettings()

  return (
    <html lang="en">
      <head>
        <title>{settings.siteName}</title>
        {settings.favicon && <link rel="icon" href={settings.favicon.url} />}
      </head>
      <body>
        <header>
          {settings.logo && <img src={settings.logo.url} alt={settings.siteName} />}
        </header>
        {children}
      </body>
    </html>
  )
}
<!-- app.vue -->
<script setup lang="ts">
const { data: settings } = await useDyrectedGlobal('site-settings', { depth: 1 })
const { data: nav }      = await useDyrectedGlobal('navigation')

useHead({
  title: settings.value?.siteName,
  link: settings.value?.favicon
    ? [{ rel: 'icon', href: settings.value.favicon.url }]
    : [],
})
</script>

<template>
  <header>
    <img v-if="settings?.logo" :src="settings.logo.url" :alt="settings.siteName" />
    <nav>
      <NuxtLink v-for="item in nav?.items" :key="item.url" :to="item.url">
        {{ item.label }}
      </NuxtLink>
    </nav>
  </header>
  <NuxtPage />
</template>

3. Fetch with the SDK

const settings = await client.global('site-settings').get({ depth: 1 })
const nav      = await client.global('navigation').get()

4. Update a global

PATCH /dyrected/globals/site-settings
Authorization: Bearer <admin-token>
Content-Type: application/json

{ "siteName": "My Updated Site" }

5. Revalidate when a global changes

// dyrected.config.ts
{
  slug: 'site-settings',
  hooks: {
    afterChange: [
      async () => {
        await fetch(`${process.env.NEXT_PUBLIC_SITE_URL}/api/revalidate`, {
          method: 'POST',
          headers: { 'x-revalidate-secret': process.env.REVALIDATE_SECRET! },
          body: JSON.stringify({ path: '/' }),
        })
      },
    ],
  },
  fields: [...],
}
// dyrected.config.ts
{
  slug: 'site-settings',
  hooks: {
    afterChange: [
      async () => {
        // Nuxt uses event-driven cache invalidation
        await $fetch('/api/revalidate', { method: 'POST' })
      },
    ],
  },
  fields: [...],
}

Common globals to define

SlugWhat it holds
site-settingsSite name, logo, favicon, SEO defaults
navigationHeader nav items
footerColumns, social links, legal copy
announcementBanner message, enabled toggle, CTA link
themeAccent colour, font choice, dark mode default

On this page