2026-09-09 15:42:53 -04:00
{
"id" : "pco-plan" ,
"name" : "PCO Plan" ,
2026-09-13 12:58:12 -04:00
"version" : "1.4.0" ,
"proddash" : ">=1.4.0" ,
"description" : "Order of service from Planning Center Services" ,
"provides" : [ "timers" ],
2026-09-09 15:42:53 -04:00
"client" : "client.js" ,
"server" : "server.js" ,
"style" : "style.css" ,
"minSize" : { "w" : 3 , "h" : 3 },
"defaultSize" : { "w" : 5 , "h" : 6 },
2026-09-10 15:31:12 -04:00
"configGroups" : {
"Planning Center credentials" : {
"collapsed" : "whenSet" ,
2026-09-13 12:58:12 -04:00
"help" : "Create a Personal Access Token at api.planningcenteronline.com and paste its Client ID + Secret here, or paste an OAuth 2.0 access token instead. Saved secrets never reach browsers."
},
"Service timing" : {
"help" : "A plan's services (9:00, 11:00…) take turns owning the service clock: the next one takes over Pre-roll minutes before its scheduled start, once the previous one has ended or was due to end, and the elapsed clock, item timing and countdown start afresh for it. A service starts at its scheduled time unless Service start is set to a ProPresenter document — then it starts the moment that document goes live in ProPresenter (the document that opens the service; from Pre-roll before the scheduled start), falling back to the scheduled time if the document has not appeared Start failsafe minutes after it. It ends when the End document goes live (the document that closes the service — a post-service loop, say), or, without one, when the next service takes over or an hour after the last one's scheduled end. Documents are matched by name the way plan items are, so a renamed \"Post-Service Loop\" still counts as \"Post Service Loop\". The document lists hold what the ProPresenter module has shown or listed since ProdDash started plus what is saved here; a saved name stays selectable even when ProPresenter is off."
2026-09-10 15:31:12 -04:00
}
},
2026-09-09 15:42:53 -04:00
"configSchema" : {
"appId" : {
"type" : "string" ,
2026-09-13 12:58:12 -04:00
"label" : "Client ID" ,
2026-09-10 15:31:12 -04:00
"default" : "" ,
"group" : "Planning Center credentials"
2026-09-09 15:42:53 -04:00
},
"secret" : {
"type" : "password" ,
2026-09-10 15:31:12 -04:00
"label" : "Secret" ,
"default" : "" ,
"group" : "Planning Center credentials"
2026-09-09 15:42:53 -04:00
},
"accessToken" : {
"type" : "password" ,
2026-09-13 12:58:12 -04:00
"label" : "OAuth 2.0 access token (instead of Client ID + Secret)" ,
2026-09-10 15:31:12 -04:00
"default" : "" ,
"group" : "Planning Center credentials"
2026-09-09 15:42:53 -04:00
},
"serviceTypeId" : {
2026-09-10 15:31:12 -04:00
"type" : "select" ,
"label" : "Service type" ,
"default" : "" ,
2026-09-13 12:58:12 -04:00
"optionsRoute" : "/service-types"
2026-09-09 15:42:53 -04:00
},
"planId" : {
2026-09-10 15:31:12 -04:00
"type" : "select" ,
"label" : "Plan" ,
"default" : "" ,
"options" : [{ "value" : "" , "label" : "Automatic — today's plan, else the next upcoming" }],
"optionsRoute" : "/plans" ,
2026-09-13 12:58:12 -04:00
"optionsDependsOn" : "serviceTypeId"
2026-09-09 15:42:53 -04:00
},
"pollSeconds" : {
"type" : "number" ,
2026-09-13 12:58:12 -04:00
"label" : "Refresh Interval (s)" ,
2026-09-09 15:42:53 -04:00
"default" : 30
},
"followProPresenter" : {
2026-09-10 15:31:12 -04:00
"type" : "switch" ,
2026-09-13 12:58:12 -04:00
"label" : "Follow ProPresenter Module" ,
2026-09-09 15:42:53 -04:00
"default" : true
2026-09-13 12:58:12 -04:00
},
"preRollMinutes" : {
"type" : "number" ,
"label" : "Pre-roll (min)" ,
"default" : 30 ,
"group" : "Service timing" ,
"help" : "How long before a service's scheduled start the clock, item timing and countdown switch to it."
},
"useDocumentTriggers" : {
"type" : "switch" ,
"label" : "ProPresenter document triggers" ,
"default" : false ,
"group" : "Service timing"
},
"serviceStartTrigger" : {
"type" : "select" ,
"label" : "Service start" ,
"default" : "schedule" ,
"group" : "Service timing" ,
"showWhen" : "useDocumentTriggers" ,
"options" : [
{ "value" : "schedule" , "label" : "Scheduled service time" },
{ "value" : "document" , "label" : "ProPresenter document" }
]
},
"serviceStartDocument" : {
"type" : "select" ,
"label" : "Start document" ,
"default" : "" ,
"group" : "Service timing" ,
"showWhen" : "useDocumentTriggers" ,
"optionsRoute" : "/documents" ,
"help" : "The document that goes live as the service begins."
},
"startGraceMinutes" : {
"type" : "number" ,
"label" : "Start failsafe (min)" ,
"default" : 10 ,
"group" : "Service timing" ,
"showWhen" : "useDocumentTriggers" ,
"help" : "Without the start document this long after the scheduled start, the service counts from the scheduled start anyway."
},
"serviceEndDocument" : {
"type" : "select" ,
"label" : "End document" ,
"default" : "" ,
"group" : "Service timing" ,
"showWhen" : "useDocumentTriggers" ,
"optionsRoute" : "/documents" ,
"help" : "The document that goes live as the service ends; it freezes the service clock."
2026-09-10 16:20:46 -04:00
}
},
"instanceGroups" : {
"Top bar" : {
"collapsed" : false
2026-09-10 15:31:12 -04:00
},
2026-09-10 16:31:46 -04:00
"Colors" : {
"collapsed" : false ,
"columns" : 2
},
2026-09-10 16:20:46 -04:00
"Show / hide" : {
"collapsed" : true ,
"columns" : 3 ,
2026-09-13 12:58:12 -04:00
"help" : "Switch off anything this tile should not show."
2026-09-10 16:20:46 -04:00
}
},
"instanceSchema" : {
"textSize" : { "type" : "number" , "label" : "Text size (px)" , "default" : 14 },
"autoScroll" : { "type" : "boolean" , "label" : "Keep the current item in view" , "default" : true },
2026-09-10 15:31:12 -04:00
"noteCategories" : {
"type" : "string" ,
"label" : "Item note categories to show (comma-separated, blank = all)" ,
"default" : ""
},
"headerTemplate" : {
"type" : "string" ,
"label" : "Top bar text" ,
"default" : "{series} • {part} | {serviceType} • {date}" ,
"group" : "Top bar" ,
"help" : "Placeholders: {series} series name · {part} plan title / part number · {serviceType} · {date} · {shortDate} · {time} service start time · {length} planned length · {items} item count. Use • between items (an item whose placeholders are empty or hidden is dropped) and | to start a second line."
},
2026-09-10 16:31:46 -04:00
"keyColor" : { "type" : "color" , "label" : "Song key" , "default" : "#4ea1ff" , "group" : "Colors" },
"headerColor" : { "type" : "color" , "label" : "Section headers" , "default" : "#2ee59a" , "group" : "Colors" },
"currentColor" : { "type" : "color" , "label" : "Current item" , "default" : "#2ee59a" , "group" : "Colors" },
"headerGradient" : { "type" : "boolean" , "label" : "Fade header color to the right" , "default" : true , "group" : "Colors" },
"tintByType" : { "type" : "boolean" , "label" : "Tint items by type (song / media / other)" , "default" : false , "group" : "Colors" },
2026-09-10 15:31:12 -04:00
"showTopBar" : { "type" : "boolean" , "label" : "Top bar" , "default" : true , "group" : "Show / hide" },
"showSeries" : { "type" : "boolean" , "label" : "Series name" , "default" : true , "group" : "Show / hide" },
"showPart" : { "type" : "boolean" , "label" : "Part # / plan title" , "default" : true , "group" : "Show / hide" },
"showServiceType" : { "type" : "boolean" , "label" : "Service type" , "default" : true , "group" : "Show / hide" },
"showDate" : { "type" : "boolean" , "label" : "Plan date" , "default" : true , "group" : "Show / hide" },
"showServiceTime" : { "type" : "boolean" , "label" : "Service time" , "default" : true , "group" : "Show / hide" },
"showTotalLength" : { "type" : "boolean" , "label" : "Planned total length" , "default" : true , "group" : "Show / hide" },
"showRunningClock" : { "type" : "boolean" , "label" : "Running clock (ahead / behind)" , "default" : true , "group" : "Show / hide" },
"showCountdown" : { "type" : "boolean" , "label" : "Countdown to service start" , "default" : true , "group" : "Show / hide" },
"showHeaders" : { "type" : "boolean" , "label" : "Section headers" , "default" : true , "group" : "Show / hide" },
"showItemNumbers" : { "type" : "boolean" , "label" : "Item numbers" , "default" : false , "group" : "Show / hide" },
"showStartTimes" : { "type" : "boolean" , "label" : "Scheduled start times" , "default" : true , "group" : "Show / hide" },
"showLength" : { "type" : "boolean" , "label" : "Item length" , "default" : true , "group" : "Show / hide" },
"showItemType" : { "type" : "boolean" , "label" : "Item type badge" , "default" : true , "group" : "Show / hide" },
"showKey" : { "type" : "boolean" , "label" : "Song key" , "default" : true , "group" : "Show / hide" },
"showArrangement" : { "type" : "boolean" , "label" : "Song arrangement" , "default" : false , "group" : "Show / hide" },
"showSongAuthor" : { "type" : "boolean" , "label" : "Song author / CCLI" , "default" : false , "group" : "Show / hide" },
"showDescription" : { "type" : "boolean" , "label" : "Item description" , "default" : true , "group" : "Show / hide" },
"showNotes" : { "type" : "boolean" , "label" : "Item notes" , "default" : true , "group" : "Show / hide" },
"showPreService" : { "type" : "boolean" , "label" : "Pre-service items" , "default" : true , "group" : "Show / hide" },
"showPostService" : { "type" : "boolean" , "label" : "Post-service items" , "default" : true , "group" : "Show / hide" },
"showNowIndicator" : { "type" : "boolean" , "label" : "Now indicator" , "default" : true , "group" : "Show / hide" },
"showItemRuntime" : { "type" : "boolean" , "label" : "Item runtime (elapsed vs planned)" , "default" : true , "group" : "Show / hide" },
"dimCompleted" : { "type" : "boolean" , "label" : "Dim completed items" , "default" : true , "group" : "Show / hide" },
"showLiveFooter" : { "type" : "boolean" , "label" : "ProPresenter match line" , "default" : true , "group" : "Show / hide" }
2026-09-09 15:42:53 -04:00
}
}