Show profiles are saved snapshots of your routing configuration. They capture which devices are connected, what signal types flow between them, how audio channels are mapped, and any template variables used. Profiles let you recall a complete production setup instantly.
| Field | Description |
|---|---|
name | Human-readable profile name (e.g., “Sunday Live Broadcast”) |
description | Optional notes about the configuration |
version | Incrementing integer; updated each time the profile is saved |
routes_snapshot | Full JSON snapshot of all routes in the profile |
device_assignments | Map of logical roles to physical device IDs |
audio_channel_maps | Audio channel mapping configurations per route |
template_variables | Key-value pairs for reusable configuration (e.g., { "venue": "Studio A" }) |
created_by | User who created the profile |
updated_by | User who last modified the profile |
After configuring your routes in the routing matrix, save the current state:
const response = await fetch('/api/ncp/show-profiles', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`,
},
body: JSON.stringify({
name: 'Weekly News Broadcast',
description: 'Standard 4-camera setup with Dante audio and NDI graphics',
routes_snapshot: currentRoutes, // Array of route objects
device_assignments: {
'camera_1': 'device-uuid-1',
'camera_2': 'device-uuid-2',
'graphics': 'device-uuid-3',
'audio_mixer': 'device-uuid-4',
},
audio_channel_maps: {
'route-uuid-1': { '1': '1', '2': '2' },
'route-uuid-2': { '1': '3', '2': '4', '3': '5', '4': '6' },
},
template_variables: {
'venue': 'Studio A',
'show_name': 'WAVE News at 6',
},
}),
});
Retrieve a profile and apply its routes to the current routing matrix:
// List all profiles
const listResponse = await fetch('/api/ncp/show-profiles', {
headers: { 'Authorization': `Bearer ${accessToken}` },
});
const { data: profiles } = await listResponse.json();
// Get a specific profile
const profileResponse = await fetch(`/api/ncp/show-profiles/${profileId}`, {
headers: { 'Authorization': `Bearer ${accessToken}` },
});
const { data: profile } = await profileResponse.json();
When loading a profile, the system:
audio_channel_maps configurationtemplate_variables for the target environmentTemplate variables make profiles portable across venues or productions. Instead of hardcoding device IDs, define logical roles and resolve them at load time:
// Profile definition with template variables
{
template_variables: {
'venue': 'Studio A',
'primary_camera': 'device-uuid-1',
'backup_camera': 'device-uuid-2',
}
}
// At a different venue, override the variables:
{
template_variables: {
'venue': 'Studio B',
'primary_camera': 'device-uuid-99',
'backup_camera': 'device-uuid-100',
}
}
Every time a show profile is updated, the version field increments. The database tracks who made the change (updated_by) and when (updated_at).
To compare versions:
version field and updated_at timestamproutes_snapshot JSON objectsWhen multiple profiles exist for similar productions, compare them side by side:
routes_snapshot arrays to identify added, removed, or changed routesdevice_assignments to see which devices differaudio_channel_maps for audio configuration differencesShow profiles are scoped to an organization, meaning any site within the organization can access and load any profile. This enables:
Show profiles are stored in the ncp_show_profiles table:
CREATE TABLE ncp_show_profiles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id UUID NOT NULL REFERENCES organizations(id),
name TEXT NOT NULL,
description TEXT,
version INTEGER NOT NULL DEFAULT 1,
routes_snapshot JSONB NOT NULL DEFAULT '[]',
device_assignments JSONB NOT NULL DEFAULT '{}',
audio_channel_maps JSONB NOT NULL DEFAULT '{}',
template_variables JSONB NOT NULL DEFAULT '{}',
created_by UUID NOT NULL REFERENCES auth.users(id),
updated_by UUID REFERENCES auth.users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
RLS policies ensure that only members of the owning organization can read or write profiles. Only organization admins can delete profiles.