Skip to content

Session content — breathing (guided pattern + intro/loop/outro audio)

Block type: breathing · Domain: session-content

Per-template payload for content.sessions.content where template_type='breathing'. Edit this file in naluma-directus; mirror into naluma-app/assets/schemas/session-content/ in the same change.

Fields

Field Type Required Allowed values Notes
kicker string no Optional overline text rendered above the title (e.g. 'RELAXATION'). Empty string is treated as absent.
intro string yes Body paragraph rendered above the CTA.
pattern array yes Ordered phase list. At least one entry MUST have seconds > 0. — minItems 1
pattern[].phase enum yes inhale, hold_full, exhale, hold_empty Phase tag. Drives the pacer animation curve and the screen-reader announcement.
pattern[].seconds integer yes Phase duration. Zero seconds is treated as a skipped phase at runtime (used to share a single shape across 4-7-8, box, coherent, etc.). — min 0 — max 60
default_rounds integer yes Initial rounds value when the screen first mounts. Range is fixed in code (kBreathingRoundsRange). — min 3 — max 15
audio object yes All three locale-tagged audio assets are required. Per-locale rows in content.audio_assets pick the active locale at fetch time.
audio.intro_asset_id string yes content.audio_assets UUID for the voice intro played before the pacer starts. — format: uuid
audio.outro_asset_id string yes content.audio_assets UUID for the voice outro played after the pacer rounds complete. — format: uuid
audio.loop_asset_id string yes content.audio_assets UUID for the pattern-matched background loop. Mastered to exactly sum(pattern.seconds) so the seam falls on the inhale boundary. — format: uuid

Example

{
  "intro": "Follow the pacer for a few rounds of box breathing.",
  "pattern": [
    {
      "phase": "inhale",
      "seconds": 4
    },
    {
      "phase": "hold_full",
      "seconds": 4
    },
    {
      "phase": "exhale",
      "seconds": 4
    },
    {
      "phase": "hold_empty",
      "seconds": 4
    }
  ],
  "default_rounds": 6,
  "audio": {
    "intro_asset_id": "11111111-1111-4111-8111-111111111111",
    "outro_asset_id": "22222222-2222-4222-8222-222222222222",
    "loop_asset_id": "33333333-3333-4333-8333-333333333333"
  }
}