diff --git a/package-lock.json b/package-lock.json
index 3996135..8cc4537 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "siteforge",
- "version": "2.15.0",
+ "version": "2.15.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "siteforge",
- "version": "2.15.0",
+ "version": "2.15.1",
"dependencies": {
"@aws-sdk/client-s3": "^3.1135.0",
"@dnd-kit/core": "^6.3.1",
diff --git a/package.json b/package.json
index b662fe2..56e4684 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "siteforge",
"private": true,
- "version": "2.15.0",
+ "version": "2.15.1",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/server/routes/podcast-workflow.js b/server/routes/podcast-workflow.js
index bf93f87..2c7c333 100644
--- a/server/routes/podcast-workflow.js
+++ b/server/routes/podcast-workflow.js
@@ -9,8 +9,7 @@ import { fetchAllEpisodes } from './episodes.js'
const WORKFLOW_FILE = path.join(DATA_DIR, 'podcast-workflow.json')
-// Same steps as the Nuggets workflow.
-const STEPS = ['listen', 'coldOpen', 'recordColdOpen', 'edit', 'spotify']
+const STEPS = ['readScript', 'record', 'edit', 'upload']
async function load() {
try {
@@ -26,7 +25,6 @@ const save = data => writeFile(WORKFLOW_FILE, JSON.stringify(data, null, 2), 'ut
function emptyState() {
return {
steps: Object.fromEntries(STEPS.map(s => [s, null])),
- coldOpenText: '',
notes: '',
}
}
@@ -133,7 +131,6 @@ export function register(app) {
}
}
}
- if (typeof body.coldOpenText === 'string') next.coldOpenText = body.coldOpenText.slice(0, 5000)
if (typeof body.notes === 'string') next.notes = body.notes.slice(0, 5000)
wf.items[key] = next
await save(wf)
diff --git a/src/AdminPage.tsx b/src/AdminPage.tsx
index df75016..c2225c3 100644
--- a/src/AdminPage.tsx
+++ b/src/AdminPage.tsx
@@ -1799,6 +1799,16 @@ function NuggetsWorkflowAdmin() {
)
}
+type PodcastStepKey = 'readScript' | 'record' | 'edit' | 'upload'
+interface PodcastWorkflowState { steps: Record; notes: string }
+
+const PODCAST_STEP_DEFS: { key: PodcastStepKey; label: string; hint: string }[] = [
+ { key: 'readScript', label: 'Read the script', hint: 'Read it through, mark pacing and emphasis.' },
+ { key: 'record', label: 'Record the episode', hint: 'Capture the final take.' },
+ { key: 'edit', label: 'Edit the episode', hint: 'Trim, clean up, mix and master.' },
+ { key: 'upload', label: 'Upload to Spotify', hint: 'Publish with show notes. It moves to Released once it’s in the feed.' },
+]
+
// ── Podcast Episode Workflow (Lane A / Lane B) ─────────────────────────────
interface PodcastWorkflowItem {
key: string
@@ -1811,7 +1821,7 @@ interface PodcastWorkflowItem {
spotifyUrl?: string
hasScript?: boolean
planned?: boolean
- state: WorkflowState
+ state: PodcastWorkflowState
}
function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season?: number }; laneB: { title: string; season?: number } }) {
@@ -1856,7 +1866,7 @@ function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season
setError(e instanceof Error ? e.message : 'Save failed.')
}
}
- const patchLocal = (key: string, patch: Partial) =>
+ const patchLocal = (key: string, patch: Partial) =>
setItems(prev => prev.map(i => (i.key === key ? { ...i, state: { ...i.state, ...patch } } : i)))
const addPlanned = async () => {
@@ -1880,7 +1890,7 @@ function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season
}
const label = (i: PodcastWorkflowItem) => `${i.episodeNumber ? `Ep ${i.episodeNumber}` : 'Ep'}${i.title ? ` — ${i.title}` : ''}`
- const doneCount = (i: PodcastWorkflowItem) => (i.released ? WORKFLOW_STEP_DEFS.length : WORKFLOW_STEP_DEFS.filter(s => i.state.steps[s.key]).length)
+ const doneCount = (i: PodcastWorkflowItem) => (i.released ? PODCAST_STEP_DEFS.length : PODCAST_STEP_DEFS.filter(s => i.state.steps[s.key]).length)
const row = (i: PodcastWorkflowItem) => (
@@ -1961,7 +1971,7 @@ function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season
)}
- {WORKFLOW_STEP_DEFS.map((s, idx) => {
+ {PODCAST_STEP_DEFS.map((s, idx) => {
const completedAt = selected.state.steps[s.key]
const checked = selected.released || Boolean(completedAt)
return (
@@ -1981,17 +1991,6 @@ function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season
- {s.key === 'coldOpen' && (
-