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"
}
}