Add Episode Highlights player with Spotify embed auto-resolution and direct embed URL support

This commit is contained in:
nmemmert
2026-05-07 11:36:07 -04:00
parent 93548b1ac8
commit 7568be368e
5 changed files with 527 additions and 143 deletions
+95 -13
View File
@@ -2,6 +2,9 @@
"siteContent": { "siteContent": {
"eyebrow": "A Journey Through Scripture", "eyebrow": "A Journey Through Scripture",
"heroTagline": "Exploring God's Word one verse at a time", "heroTagline": "Exploring God's Word one verse at a time",
"heroBtnSpotify": "Listen on Spotify",
"heroBtnEpisodes": "Explore Episodes ↓",
"heroBtnStartHere": "New here? Start here →",
"startHereHeading": "New Here? Start Here", "startHereHeading": "New Here? Start Here",
"startHereIntro": "If this is your first visit, this path helps you get grounded quickly and make the most of the site.", "startHereIntro": "If this is your first visit, this path helps you get grounded quickly and make the most of the site.",
"startHereStep1Title": "Step 1: Listen to 3 Starter Episodes", "startHereStep1Title": "Step 1: Listen to 3 Starter Episodes",
@@ -13,6 +16,9 @@
"startHereStep3Title": "Step 3: Ask Nate Directly", "startHereStep3Title": "Step 3: Ask Nate Directly",
"startHereStep3Body": "Use the contact form to submit your Bible question for future Q&A or an upcoming episode.", "startHereStep3Body": "Use the contact form to submit your Bible question for future Q&A or an upcoming episode.",
"startHereStep3Cta": "Submit a Question", "startHereStep3Cta": "Submit a Question",
"aboutEyebrow": "About Nate",
"aboutListenBtnLabel": "Listen Now ↓",
"aboutShowEyebrow": "About the Show",
"aboutShowHeading": "Depth. Clarity. Application.", "aboutShowHeading": "Depth. Clarity. Application.",
"aboutShowP1": "Verse by Verse with Nate walks through Scripture passage by passage — unpacking the original context, drawing out the meaning, and connecting each verse to how we live today.", "aboutShowP1": "Verse by Verse with Nate walks through Scripture passage by passage — unpacking the original context, drawing out the meaning, and connecting each verse to how we live today.",
"aboutShowP2": "Whether you're in the car, at the gym, or just looking for something to anchor your day, each episode is designed to feed your faith with solid, practical teaching.", "aboutShowP2": "Whether you're in the car, at the gym, or just looking for something to anchor your day, each episode is designed to feed your faith with solid, practical teaching.",
@@ -20,17 +26,95 @@
"aboutPhotoUrl": "/images/nate-photo.jpeg", "aboutPhotoUrl": "/images/nate-photo.jpeg",
"aboutVerseArtUrl": "/images/hebrews-4-12-verse-art.png", "aboutVerseArtUrl": "/images/hebrews-4-12-verse-art.png",
"contactPhotoUrl": "/images/nate-contact-photo.png", "contactPhotoUrl": "/images/nate-contact-photo.png",
"contactEyebrow": "Get in Touch",
"contactHeading": "Contact Nate",
"contactName": "Nate",
"contactRole": "Bible teacher · Lynchburg, VA",
"contactQuote": "I read every message - nothing blesses me more than hearing how God's Word is at work in your life.",
"contactIntro": "Ask a Bible question, share a testimony, or request a topic for a future episode.",
"contactPoint1": "I read every message personally",
"contactPoint2": "Response within 48 hours",
"contactVerse": "Your word is a lamp to my feet and a light to my path.",
"contactVerseRef": "Psalm 119:105",
"seriesLabel": "Now Playing", "seriesLabel": "Now Playing",
"seriesTitle": "Study of Titus: Sound Doctrine", "seriesTitle": "Study of Titus: Sound Doctrine",
"seriesDescription": "A deep-dive into Paul's letter to Titus — unpacking what it means to build a church and a life on sound doctrine.", "seriesDescription": "A deep-dive into Paul's letter to Titus — unpacking what it means to build a church and a life on sound doctrine.",
"seriesImageUrl": "/uploads/titus_study_cover-1777916521873.png", "seriesImageUrl": "/images/titus-cover.png",
"seriesListenUrl": "https://open.spotify.com/show/0Gq1TzoJOdReSZ1gYQi8Xl", "seriesListenUrl": "/spotify",
"seriesListenBtnLabel": "Listen to Series",
"seriesDownloadsBtnLabel": "View Downloads",
"studyGuideTitle": "Companion Study Guide", "studyGuideTitle": "Companion Study Guide",
"studyGuideDescription": "Go deeper in your study with the official Verse by Verse companion guide — now available on Amazon.", "studyGuideDescription": "Go deeper in your study with the official Verse by Verse companion guide — now available on Amazon.",
"studyGuideDownloadUrl": "", "studyGuideDownloadUrl": "",
"studyGuideUrl": "https://a.co/d/01sG2tOJ", "studyGuideUrl": "https://a.co/d/01sG2tOJ",
"studyGuideAmazonButtonLabel": "Get it on Amazon",
"shareHeading": "Help one more person hear the Word this week.", "shareHeading": "Help one more person hear the Word this week.",
"shareP": "Scan the QR code or text the show link to a friend who needs encouragement today.", "shareP": "Scan the QR code or text the show link to a friend who needs encouragement today.",
"whereToNextEyebrow": "Where to Next",
"whereToNextHeading": "Choose the page you need.",
"whereToNextCards": [
{
"id": "episodes",
"title": "Episodes",
"description": "Listen to latest episodes and platform links.",
"path": "/episodes"
},
{
"id": "downloads",
"title": "Downloads",
"description": "Main guide, extra downloads, and past study files.",
"path": "/resources"
},
{
"id": "qa",
"title": "Q&A",
"description": "Browse Bible questions and approved answers.",
"path": "/questions"
},
{
"id": "about",
"title": "About",
"description": "Learn about Nate and the mission of the show.",
"path": "/about"
},
{
"id": "contact",
"title": "Contact",
"description": "Submit a Bible question, testimony, or topic.",
"path": "/contact"
}
],
"footerTitle": "Verse by Verse with Nate",
"footerSubtitle": "A Journey Through Scripture",
"footerEmail": "hello@versebyversewithnate.us",
"footerCopyright": "© 2026 Nate Emmert · Made with faith.",
"footerPrivacyNote": "Privacy: with consent, analytics may store masked IP-based location data (country/state/county/city) and returning visitor activity.",
"platformSpotifyUrl": "/spotify",
"platformAppleUrl": "/apple",
"platformYoutubeUrl": "https://www.youtube.com/@blackzebraem5558",
"platformAmazonUrl": "/amazon",
"platformFacebookUrl": "https://facebook.com/versebyversewithnate",
"platformCreatorUrl": "https://creators.spotify.com/pod/profile/nmemmert/",
"welcomeEmailSubject": "Welcome to Verse by Verse with Nate",
"welcomeEmailGreetingPrefix": "Glad you're here",
"welcomeEmailIntro": "Thanks for subscribing to Verse by Verse with Nate - a Bible teaching podcast where we slow down, dig into the text, and pull out the nuggets God has for us word by word.",
"welcomeEmailCurrentSeries": "Right now we're working through the book of Titus - a short letter packed with practical wisdom about grace, godliness, and what the Christian life looks like when it's rooted in sound doctrine.",
"welcomeEmailStartHereTitle": "Episode 1 - Introduction to Titus",
"welcomeEmailStartHereSummary": "Who wrote it, who received it, and why it still matters.",
"welcomeEmailStartHereUrl": "/start-here",
"welcomeEmailSpotifyUrl": "/spotify",
"welcomeEmailAppleUrl": "/apple",
"welcomeEmailAmazonUrl": "/amazon",
"welcomeEmailWebsiteUrl": "https://versebyversewithnate.us",
"welcomeEmailImageUrl": "/images/podcast-art.jpeg",
"welcomeEmailWhatToExpect1": "Verse-by-verse teaching - we go slow and let the text speak for itself.",
"welcomeEmailWhatToExpect2": "Greek word studies - the kind that open up meaning without being a lecture.",
"welcomeEmailWhatToExpect3": "New episodes + study notes delivered right to your inbox.",
"welcomeEmailScripture": "For the grace of God has appeared, bringing salvation to all people.",
"welcomeEmailScriptureRef": "Titus 2:11 - BSB",
"welcomeEmailSignoff": "Grace and peace,\nNate",
"headerFollowLabel": "Follow on Spotify",
"cookieBannerText": "We use optional analytics cookies to measure visits and location trends for site improvement.",
"customLinks": [], "customLinks": [],
"customBlocks": [], "customBlocks": [],
"archivedSeries": [], "archivedSeries": [],
@@ -56,17 +140,15 @@
], ],
"podcastFeaturedLinks": [ "podcastFeaturedLinks": [
{ {
"id": "sample-highlight-1", "id": "movn6tk3",
"title": "Introduction to Titus", "title": "news",
"episodeNumber": "2", "episodeNumber": "1",
"summary": "A practical walkthrough of context, structure, and application for this study.", "summary": "news",
"url": "https://open.spotify.com/episode/3mpFfJQP6avAhzxu4BTKvR?si=cl_Dm_2vQraiboouaoINaw", "url": "",
"embedUrl": "", "embedUrl": "https://open.spotify.com/embed/episode/4fDzD2q9XtVtOsOq0xlgLn?utm_source=generator",
"showNotes": "", "showNotes": "test",
"discussionQuestions": [ "discussionQuestions": [
"1. What do you already know about Paul, Titus, or the island of Crete? And what — if anything — surprised you about the background of this letter?", "tes"
"2. The letters core theme is that sound doctrine leads to godly living. Where have you seen that connection — or its breakdown — in your own experience?",
"3. Paul trusted Titus with a hard assignment. Who has trusted you with something difficult — and what did that trust mean to you?"
] ]
} }
], ],
@@ -101,5 +183,5 @@
] ]
} }
}, },
"updatedAt": "2026-05-05T20:02:33.053Z" "updatedAt": "2026-05-07T15:35:23.888Z"
} }
+89 -29
View File
@@ -2,6 +2,9 @@
"siteContent": { "siteContent": {
"eyebrow": "A Journey Through Scripture", "eyebrow": "A Journey Through Scripture",
"heroTagline": "Exploring God's Word one verse at a time", "heroTagline": "Exploring God's Word one verse at a time",
"heroBtnSpotify": "Listen on Spotify",
"heroBtnEpisodes": "Explore Episodes ↓",
"heroBtnStartHere": "New here? Start here →",
"startHereHeading": "New Here? Start Here", "startHereHeading": "New Here? Start Here",
"startHereIntro": "If this is your first visit, this path helps you get grounded quickly and make the most of the site.", "startHereIntro": "If this is your first visit, this path helps you get grounded quickly and make the most of the site.",
"startHereStep1Title": "Step 1: Listen to 3 Starter Episodes", "startHereStep1Title": "Step 1: Listen to 3 Starter Episodes",
@@ -13,6 +16,9 @@
"startHereStep3Title": "Step 3: Ask Nate Directly", "startHereStep3Title": "Step 3: Ask Nate Directly",
"startHereStep3Body": "Use the contact form to submit your Bible question for future Q&A or an upcoming episode.", "startHereStep3Body": "Use the contact form to submit your Bible question for future Q&A or an upcoming episode.",
"startHereStep3Cta": "Submit a Question", "startHereStep3Cta": "Submit a Question",
"aboutEyebrow": "About Nate",
"aboutListenBtnLabel": "Listen Now ↓",
"aboutShowEyebrow": "About the Show",
"aboutShowHeading": "Depth. Clarity. Application.", "aboutShowHeading": "Depth. Clarity. Application.",
"aboutShowP1": "Verse by Verse with Nate walks through Scripture passage by passage — unpacking the original context, drawing out the meaning, and connecting each verse to how we live today.", "aboutShowP1": "Verse by Verse with Nate walks through Scripture passage by passage — unpacking the original context, drawing out the meaning, and connecting each verse to how we live today.",
"aboutShowP2": "Whether you're in the car, at the gym, or just looking for something to anchor your day, each episode is designed to feed your faith with solid, practical teaching.", "aboutShowP2": "Whether you're in the car, at the gym, or just looking for something to anchor your day, each episode is designed to feed your faith with solid, practical teaching.",
@@ -20,40 +26,96 @@
"aboutPhotoUrl": "/images/nate-photo.jpeg", "aboutPhotoUrl": "/images/nate-photo.jpeg",
"aboutVerseArtUrl": "/images/hebrews-4-12-verse-art.png", "aboutVerseArtUrl": "/images/hebrews-4-12-verse-art.png",
"contactPhotoUrl": "/images/nate-contact-photo.png", "contactPhotoUrl": "/images/nate-contact-photo.png",
"contactEyebrow": "Get in Touch",
"contactHeading": "Contact Nate",
"contactName": "Nate",
"contactRole": "Bible teacher · Lynchburg, VA",
"contactQuote": "I read every message - nothing blesses me more than hearing how God's Word is at work in your life.",
"contactIntro": "Ask a Bible question, share a testimony, or request a topic for a future episode.",
"contactPoint1": "I read every message personally",
"contactPoint2": "Response within 48 hours",
"contactVerse": "Your word is a lamp to my feet and a light to my path.",
"contactVerseRef": "Psalm 119:105",
"seriesLabel": "Now Playing", "seriesLabel": "Now Playing",
"seriesTitle": "Study of Titus: Sound Doctrine", "seriesTitle": "Study of Titus: Sound Doctrine",
"seriesDescription": "A deep-dive into Paul's letter to Titus — unpacking what it means to build a church and a life on sound doctrine.", "seriesDescription": "A deep-dive into Paul's letter to Titus — unpacking what it means to build a church and a life on sound doctrine.",
"seriesImageUrl": "/uploads/titus_study_cover-1777916521873.png", "seriesImageUrl": "/images/titus-cover.png",
"seriesListenUrl": "https://open.spotify.com/show/0Gq1TzoJOdReSZ1gYQi8Xl", "seriesListenUrl": "/spotify",
"seriesListenBtnLabel": "Listen to Series",
"seriesDownloadsBtnLabel": "View Downloads",
"studyGuideTitle": "Companion Study Guide", "studyGuideTitle": "Companion Study Guide",
"studyGuideDescription": "Go deeper in your study with the official Verse by Verse companion guide — now available on Amazon.", "studyGuideDescription": "Go deeper in your study with the official Verse by Verse companion guide — now available on Amazon.",
"studyGuideDownloadUrl": "", "studyGuideDownloadUrl": "",
"studyGuideUrl": "https://a.co/d/01sG2tOJ", "studyGuideUrl": "https://a.co/d/01sG2tOJ",
"studyGuideAmazonButtonLabel": "Get it on Amazon",
"shareHeading": "Help one more person hear the Word this week.", "shareHeading": "Help one more person hear the Word this week.",
"shareP": "Scan the QR code or text the show link to a friend who needs encouragement today.", "shareP": "Scan the QR code or text the show link to a friend who needs encouragement today.",
"customLinks": [ "whereToNextEyebrow": "Where to Next",
"whereToNextHeading": "Choose the page you need.",
"whereToNextCards": [
{ {
"id": "pocket-casts", "id": "episodes",
"label": "Pocket Casts", "title": "Episodes",
"url": "https://pca.st/76jisz3d", "description": "Listen to latest episodes and platform links.",
"placement": "platforms", "path": "/episodes"
"imageUrl": "/images/listen-on-pocket-casts.svg"
}, },
{ {
"id": "castbox", "id": "downloads",
"label": "Castbox", "title": "Downloads",
"url": "https://castbox.fm/channel/id7140701?country=us", "description": "Main guide, extra downloads, and past study files.",
"placement": "platforms", "path": "/resources"
"imageUrl": "/images/listen-on-castbox.svg"
}, },
{ {
"id": "goodpods", "id": "qa",
"label": "Goodpods", "title": "Q&A",
"url": "https://goodpods.com/podcasts/verse-by-verse-with-nate-732127", "description": "Browse Bible questions and approved answers.",
"placement": "platforms", "path": "/questions"
"imageUrl": "https://storage.googleapis.com/goodpods-images-bucket/badges/generic-badge-3.svg" },
{
"id": "about",
"title": "About",
"description": "Learn about Nate and the mission of the show.",
"path": "/about"
},
{
"id": "contact",
"title": "Contact",
"description": "Submit a Bible question, testimony, or topic.",
"path": "/contact"
} }
], ],
"footerTitle": "Verse by Verse with Nate",
"footerSubtitle": "A Journey Through Scripture",
"footerEmail": "hello@versebyversewithnate.us",
"footerCopyright": "© 2026 Nate Emmert · Made with faith.",
"footerPrivacyNote": "Privacy: with consent, analytics may store masked IP-based location data (country/state/county/city) and returning visitor activity.",
"platformSpotifyUrl": "/spotify",
"platformAppleUrl": "/apple",
"platformYoutubeUrl": "https://www.youtube.com/@blackzebraem5558",
"platformAmazonUrl": "/amazon",
"platformFacebookUrl": "https://facebook.com/versebyversewithnate",
"platformCreatorUrl": "https://creators.spotify.com/pod/profile/nmemmert/",
"welcomeEmailSubject": "Welcome to Verse by Verse with Nate",
"welcomeEmailGreetingPrefix": "Glad you're here",
"welcomeEmailIntro": "Thanks for subscribing to Verse by Verse with Nate - a Bible teaching podcast where we slow down, dig into the text, and pull out the nuggets God has for us word by word.",
"welcomeEmailCurrentSeries": "Right now we're working through the book of Titus - a short letter packed with practical wisdom about grace, godliness, and what the Christian life looks like when it's rooted in sound doctrine.",
"welcomeEmailStartHereTitle": "Episode 1 - Introduction to Titus",
"welcomeEmailStartHereSummary": "Who wrote it, who received it, and why it still matters.",
"welcomeEmailStartHereUrl": "/start-here",
"welcomeEmailSpotifyUrl": "/spotify",
"welcomeEmailAppleUrl": "/apple",
"welcomeEmailAmazonUrl": "/amazon",
"welcomeEmailWebsiteUrl": "https://versebyversewithnate.us",
"welcomeEmailImageUrl": "/images/podcast-art.jpeg",
"welcomeEmailWhatToExpect1": "Verse-by-verse teaching - we go slow and let the text speak for itself.",
"welcomeEmailWhatToExpect2": "Greek word studies - the kind that open up meaning without being a lecture.",
"welcomeEmailWhatToExpect3": "New episodes + study notes delivered right to your inbox.",
"welcomeEmailScripture": "For the grace of God has appeared, bringing salvation to all people.",
"welcomeEmailScriptureRef": "Titus 2:11 - BSB",
"welcomeEmailSignoff": "Grace and peace,\nNate",
"headerFollowLabel": "Follow on Spotify",
"cookieBannerText": "We use optional analytics cookies to measure visits and location trends for site improvement.",
"customLinks": [],
"customBlocks": [], "customBlocks": [],
"archivedSeries": [], "archivedSeries": [],
"redirects": [ "redirects": [
@@ -78,17 +140,15 @@
], ],
"podcastFeaturedLinks": [ "podcastFeaturedLinks": [
{ {
"id": "sample-highlight-1", "id": "movn6tk3",
"title": "Introduction to Titus", "title": "news",
"episodeNumber": "2", "episodeNumber": "1",
"summary": "A practical walkthrough of context, structure, and application for this study.", "summary": "news",
"url": "https://open.spotify.com/episode/3mpFfJQP6avAhzxu4BTKvR?si=cl_Dm_2vQraiboouaoINaw", "url": "",
"embedUrl": "", "embedUrl": "https://open.spotify.com/embed/episode/4fDzD2q9XtVtOsOq0xlgLn?utm_source=generator",
"showNotes": "", "showNotes": "test",
"discussionQuestions": [ "discussionQuestions": [
"1. What do you already know about Paul, Titus, or the island of Crete? And what — if anything — surprised you about the background of this letter?", "tes"
"2. The letters core theme is that sound doctrine leads to godly living. Where have you seen that connection — or its breakdown — in your own experience?",
"3. Paul trusted Titus with a hard assignment. Who has trusted you with something difficult — and what did that trust mean to you?"
] ]
} }
], ],
@@ -123,5 +183,5 @@
] ]
} }
}, },
"updatedAt": "2026-05-04T17:42:41.949Z" "updatedAt": "2026-05-07T15:35:23.896Z"
} }
+102 -98
View File
@@ -1,98 +1,102 @@
[ {
{ "questions": [
"id": "cb_001", {
"firstName": "Nate", "id": "cb_001",
"question": "What Bible translation do you use?", "firstName": "Nate",
"answer": "In the podcast, I primarily teach from the BSB (Berean Standard Bible). I may compare other translations at times, but BSB is my main teaching text in the Verse by Verse episodes.", "question": "What Bible translation do you use?",
"isApproved": true, "answer": "In the podcast, I primarily teach from the BSB (Berean Standard Bible). I may compare other translations at times, but BSB is my main teaching text in the Verse by Verse episodes.",
"topic": "Bible Study" "isApproved": true,
}, "topic": "Bible Study",
{ "answeredAt": "2026-05-07T13:36:16.859Z"
"id": "cb_002", },
"firstName": "Nate", {
"question": "How do you approach a difficult or confusing Bible passage?", "id": "cb_002",
"answer": "I always start by reading the surrounding context — a confusing verse often makes perfect sense once you zoom out a chapter or two. Then I look at who the author was, who they were writing to, and what was happening historically. A good study Bible or a commentary like Matthew Henry's can be a huge help. Most importantly, pray for understanding before you dive in. The Holy Spirit is your best guide.", "firstName": "Nate",
"isApproved": true, "question": "How do you approach a difficult or confusing Bible passage?",
"topic": "Bible Study" "answer": "I always start by reading the surrounding context — a confusing verse often makes perfect sense once you zoom out a chapter or two. Then I look at who the author was, who they were writing to, and what was happening historically. A good study Bible or a commentary like Matthew Henry's can be a huge help. Most importantly, pray for understanding before you dive in. The Holy Spirit is your best guide.",
}, "isApproved": true,
{ "topic": "Bible Study"
"id": "cb_003", },
"firstName": "Nate", {
"question": "How do I stay consistent with daily Bible reading?", "id": "cb_003",
"answer": "Start small and protect that time like an appointment. Even 10 minutes in the morning before checking your phone can be transformative over a year. A reading plan helps a lot — there are great ones on apps like YouVersion that break the whole Bible into daily chunks so you never have to decide what to read. And give yourself grace on the days you miss; guilt is not a good motivator. Just pick back up where you left off.", "firstName": "Nate",
"isApproved": true, "question": "How do I stay consistent with daily Bible reading?",
"topic": "Bible Study" "answer": "Start small and protect that time like an appointment. Even 10 minutes in the morning before checking your phone can be transformative over a year. A reading plan helps a lot — there are great ones on apps like YouVersion that break the whole Bible into daily chunks so you never have to decide what to read. And give yourself grace on the days you miss; guilt is not a good motivator. Just pick back up where you left off.",
}, "isApproved": true,
{ "topic": "Bible Study"
"id": "cb_007", },
"firstName": "Nate", {
"question": "How do I submit a question to Nate?", "id": "cb_007",
"answer": "You can submit a question using the contact form at the bottom of this page. Select 'Bible Question' as the message type. Nate reads every question personally and answers the best ones on the site's Q&A section or in a future episode. There's no guarantee every question gets a public response, but all are read and appreciated!", "firstName": "Nate",
"isApproved": true, "question": "How do I submit a question to Nate?",
"topic": "Podcast" "answer": "You can submit a question using the contact form at the bottom of this page. Select 'Bible Question' as the message type. Nate reads every question personally and answers the best ones on the site's Q&A section or in a future episode. There's no guarantee every question gets a public response, but all are read and appreciated!",
}, "isApproved": true,
{ "topic": "Podcast"
"id": "cb_faith_family_001", },
"firstName": "Nate", {
"question": "How can I share my faith with skeptical family?", "id": "cb_faith_family_001",
"answer": "Lead with relationship, not argument. Skeptical family members usually don't need more information — they need to see the faith lived out genuinely. Consistency, love, and patience over time speaks louder than any debate win.\n\nPray specifically and persistently. This is the most underrated strategy. God moves hearts in ways arguments never can.", "firstName": "Nate",
"isApproved": true, "question": "How can I share my faith with skeptical family?",
"topic": "Faith & Life" "answer": "Lead with relationship, not argument. Skeptical family members usually don't need more information — they need to see the faith lived out genuinely. Consistency, love, and patience over time speaks louder than any debate win.\n\nPray specifically and persistently. This is the most underrated strategy. God moves hearts in ways arguments never can.",
}, "isApproved": true,
{ "topic": "Faith & Life"
"id": "cb_blessed_hope_001", },
"firstName": "Nate", {
"question": "What is the blessed hope?", "id": "cb_blessed_hope_001",
"answer": "The blessed hope is a phrase from Titus 2:13 — \"as we await the blessed hope and glorious appearance of our great God and Savior Jesus Christ.\" In Episode 9, Nate breaks down the Greek: makaria elpis. Makaria is the same word used in the Beatitudes — a divinely favored condition. And elpis in the New Testament is not wishful thinking. Biblical hope is a confident expectation of something certain. Not a wish. An anchor.\n\nThe blessed hope is simply this: Jesus is coming back. Not maybe. He is coming back. And the person who really believes that is in a blessed condition even now, living toward a certainty that changes how everything feels today.", "firstName": "Nate",
"isApproved": true, "question": "What is the blessed hope?",
"topic": "Titus" "answer": "The blessed hope is a phrase from Titus 2:13 — \"as we await the blessed hope and glorious appearance of our great God and Savior Jesus Christ.\" In Episode 9, Nate breaks down the Greek: makaria elpis. Makaria is the same word used in the Beatitudes — a divinely favored condition. And elpis in the New Testament is not wishful thinking. Biblical hope is a confident expectation of something certain. Not a wish. An anchor.\n\nThe blessed hope is simply this: Jesus is coming back. Not maybe. He is coming back. And the person who really believes that is in a blessed condition even now, living toward a certainty that changes how everything feels today.",
}, "isApproved": true,
{ "topic": "Titus"
"id": "cb_who_is_titus_001", },
"firstName": "Nate", {
"question": "Who was Titus?", "id": "cb_who_is_titus_001",
"answer": "Titus was a Gentile — not Jewish — who came to faith through Paul's ministry. Paul calls him \"my true child in our common faith\" (Titus 1:4). He was one of Paul's closest and most trusted co-workers. In 2 Corinthians 7, Paul describes being comforted by Titus arriving during a difficult season. In chapter 8, Titus helped organize a relief offering for believers in Jerusalem. In Galatians 2, he appears as proof that the gospel is for everyone.\n\nPaul left Titus on the island of Crete with a difficult assignment: appoint elders, correct false teaching, and help a young church find its footing in a challenging culture. The letter of Titus is essentially his briefing.", "firstName": "Nate",
"isApproved": true, "question": "Who was Titus?",
"topic": "Titus" "answer": "Titus was a Gentile — not Jewish — who came to faith through Paul's ministry. Paul calls him \"my true child in our common faith\" (Titus 1:4). He was one of Paul's closest and most trusted co-workers. In 2 Corinthians 7, Paul describes being comforted by Titus arriving during a difficult season. In chapter 8, Titus helped organize a relief offering for believers in Jerusalem. In Galatians 2, he appears as proof that the gospel is for everyone.\n\nPaul left Titus on the island of Crete with a difficult assignment: appoint elders, correct false teaching, and help a young church find its footing in a challenging culture. The letter of Titus is essentially his briefing.",
}, "isApproved": true,
{ "topic": "Titus"
"id": "cb_deny_works_001", },
"firstName": "Nate", {
"question": "What does it mean to deny God by your works?", "id": "cb_deny_works_001",
"answer": "Titus 1:16 says: \"They profess to know God, but by their actions they deny Him. They are detestable, disobedient, and unfit for any good deed.\"\n\nIn Episode 6, Nate explains this using three precise words Paul chose. Detestable — morally repulsive before God, regardless of religious appearance. Disobedient — not persuadable, resistant to truth even when confronted with it. Unfit — a Greek metalworking term for metal tested and found counterfeit. Religious on the surface, but no real substance underneath.\n\nThe warning cuts both ways: a person can know the right words, attend the right services, hold the right opinions — and still live in a way that functionally says God doesn't matter. Theology and life are inseparable. What you actually believe will show itself in how you actually live.", "firstName": "Nate",
"isApproved": true, "question": "What does it mean to deny God by your works?",
"topic": "Titus" "answer": "Titus 1:16 says: \"They profess to know God, but by their actions they deny Him. They are detestable, disobedient, and unfit for any good deed.\"\n\nIn Episode 6, Nate explains this using three precise words Paul chose. Detestable — morally repulsive before God, regardless of religious appearance. Disobedient — not persuadable, resistant to truth even when confronted with it. Unfit — a Greek metalworking term for metal tested and found counterfeit. Religious on the surface, but no real substance underneath.\n\nThe warning cuts both ways: a person can know the right words, attend the right services, hold the right opinions — and still live in a way that functionally says God doesn't matter. Theology and life are inseparable. What you actually believe will show itself in how you actually live.",
}, "isApproved": true,
{ "topic": "Titus"
"id": "cb_grace_trains_001", },
"firstName": "Nate", {
"question": "What does grace actually train us to do?", "id": "cb_grace_trains_001",
"answer": "Titus 2:11-12 says grace \"instructs us to renounce ungodliness and worldly passions, and to live sensible, upright, and godly lives.\"\n\nIn Episode 8, Nate points out that the Greek word for instructs is paideuō — the education of a child. Not classroom instruction but formation. Grace is the subject doing the teaching.\n\nGrace teaches two things: what to say no to (ungodliness and worldly passions) and what to say yes to — sensible (an ordered mind), upright (right in relationship with others), and godly (God genuinely at the center). Inward, outward, and upward.\n\nThe key insight: the pathway to saying no to sin is going deeper into grace, not trying harder. Grace properly understood reorients your desires — it doesn't just change the rules, it changes what you want. Grace is not a hall pass. It's a school you attend every day.", "firstName": "Nate",
"isApproved": true, "question": "What does grace actually train us to do?",
"topic": "Titus" "answer": "Titus 2:11-12 says grace \"instructs us to renounce ungodliness and worldly passions, and to live sensible, upright, and godly lives.\"\n\nIn Episode 8, Nate points out that the Greek word for instructs is paideuō — the education of a child. Not classroom instruction but formation. Grace is the subject doing the teaching.\n\nGrace teaches two things: what to say no to (ungodliness and worldly passions) and what to say yes to — sensible (an ordered mind), upright (right in relationship with others), and godly (God genuinely at the center). Inward, outward, and upward.\n\nThe key insight: the pathway to saying no to sin is going deeper into grace, not trying harder. Grace properly understood reorients your desires — it doesn't just change the rules, it changes what you want. Grace is not a hall pass. It's a school you attend every day.",
}, "isApproved": true,
{ "topic": "Titus"
"id": "cb_leadership_titus1_001", },
"firstName": "Nate", {
"question": "What does Titus 1 teach about church leadership?", "id": "cb_leadership_titus1_001",
"answer": "Paul's first instruction in Titus was to appoint elders — because a church without mature, qualified leadership is vulnerable. From Episode 4 (Titus 1:5-9):\n\nThe elder's home is exhibit A. Before looking at preaching or public presence, look at the household. If a man cannot lead his own family well, there's no reason to believe he'll lead God's family well. Integrity can't be compartmentalized.\n\nPaul gives five things an elder must NOT be: not self-absorbed, not quick-tempered, not given to drunkenness, not violent, not greedy. And six things he must BE: hospitable, a lover of good, self-controlled, upright, holy, and disciplined in sound doctrine.\n\nThis is not a job description for a CEO. Nate frames it as a picture of Christlike character — authority that flows from below, from a posture of submission and service, not dominance.", "firstName": "Nate",
"isApproved": true, "question": "What does Titus 1 teach about church leadership?",
"topic": "Titus" "answer": "Paul's first instruction in Titus was to appoint elders — because a church without mature, qualified leadership is vulnerable. From Episode 4 (Titus 1:5-9):\n\nThe elder's home is exhibit A. Before looking at preaching or public presence, look at the household. If a man cannot lead his own family well, there's no reason to believe he'll lead God's family well. Integrity can't be compartmentalized.\n\nPaul gives five things an elder must NOT be: not self-absorbed, not quick-tempered, not given to drunkenness, not violent, not greedy. And six things he must BE: hospitable, a lover of good, self-controlled, upright, holy, and disciplined in sound doctrine.\n\nThis is not a job description for a CEO. Nate frames it as a picture of Christlike character — authority that flows from below, from a posture of submission and service, not dominance.",
}, "isApproved": true,
{ "topic": "Titus"
"id": "cb_titus347_summary_001", },
"firstName": "Nate", {
"question": "Give me a summary of Titus 3:4-7", "id": "cb_titus347_summary_001",
"answer": "Titus 3:4-7 is what Nate calls 'the gospel in one paragraph' — one of the most concentrated summaries of salvation anywhere in Paul's letters. Episode 12 breaks it down:\n\nAll three persons of the Trinity are present: God the Father is the initiating motivation — He is kind and full of love toward humanity. The Holy Spirit is the agent of new birth and ongoing renewal. Jesus Christ is the one through whom the Spirit is poured out, and verse 7 calls him 'our Savior.'\n\nThe hinge of the passage is verse 5: He saved us not by the righteous deeds we had done, but according to His mercy. Not partially. Not mostly. The basis is His mercy, not our merit — which means salvation rests on something that cannot change.\n\nVerse 7 gives us two results: justified (declared righteous in God's courtroom) and heirs (members of the family with a guaranteed inheritance). You are not just legally acquitted — you belong.", "firstName": "Nate",
"isApproved": true, "question": "Give me a summary of Titus 3:4-7",
"topic": "Titus" "answer": "Titus 3:4-7 is what Nate calls 'the gospel in one paragraph' — one of the most concentrated summaries of salvation anywhere in Paul's letters. Episode 12 breaks it down:\n\nAll three persons of the Trinity are present: God the Father is the initiating motivation — He is kind and full of love toward humanity. The Holy Spirit is the agent of new birth and ongoing renewal. Jesus Christ is the one through whom the Spirit is poured out, and verse 7 calls him 'our Savior.'\n\nThe hinge of the passage is verse 5: He saved us not by the righteous deeds we had done, but according to His mercy. Not partially. Not mostly. The basis is His mercy, not our merit — which means salvation rests on something that cannot change.\n\nVerse 7 gives us two results: justified (declared righteous in God's courtroom) and heirs (members of the family with a guaranteed inheritance). You are not just legally acquitted — you belong.",
}, "isApproved": true,
{ "topic": "Titus"
"id": "cb_christians_politics_001", },
"firstName": "Nate", {
"question": "How should Christians engage with politics and public life?", "id": "cb_christians_politics_001",
"answer": "Titus 3:1-2 is Paul's answer, covered in Episode 10. He tells Titus to remind believers to submit to rulers and authorities, be obedient, be ready for every good work, malign no one, and be peaceable, gentle, and considerate to everyone.\n\nNate's key insight: Paul is not saying agree with every government decision. He's saying your engagement with public life should be marked by something recognizable as different. Submission, readiness to do good, and a peaceable presence are not just civic virtues — they are missionary strategies. The way you navigate public life either opens doors for the gospel or closes them.\n\nThe word for peaceable in Greek is amachous — literally non-combative. Paul doesn't say malign no one except your political opponents. He says no one. This is not weakness. It is the confidence of people who know how the story ends and don't need to win every argument to prove it.", "firstName": "Nate",
"isApproved": true, "question": "How should Christians engage with politics and public life?",
"topic": "Faith & Life" "answer": "Titus 3:1-2 is Paul's answer, covered in Episode 10. He tells Titus to remind believers to submit to rulers and authorities, be obedient, be ready for every good work, malign no one, and be peaceable, gentle, and considerate to everyone.\n\nNate's key insight: Paul is not saying agree with every government decision. He's saying your engagement with public life should be marked by something recognizable as different. Submission, readiness to do good, and a peaceable presence are not just civic virtues — they are missionary strategies. The way you navigate public life either opens doors for the gospel or closes them.\n\nThe word for peaceable in Greek is amachous — literally non-combative. Paul doesn't say malign no one except your political opponents. He says no one. This is not weakness. It is the confidence of people who know how the story ends and don't need to win every argument to prove it.",
} "isApproved": true,
] "topic": "Faith & Life"
}
],
"updatedAt": "2026-05-07T15:35:23.896Z"
}
+124
View File
@@ -2702,6 +2702,130 @@ async function fetchAllEpisodes() {
return episodes return episodes
} }
function toSpotifyEpisodeEmbedUrl(urlValue) {
if (!urlValue) return ''
try {
const parsed = new URL(urlValue)
if (parsed.protocol !== 'https:') return ''
const host = parsed.hostname.toLowerCase()
const parts = parsed.pathname.split('/').filter(Boolean)
if (host === 'open.spotify.com') {
if (parts[0] === 'embed' && parts[1] === 'episode' && parts[2]) {
return `https://open.spotify.com/embed/episode/${parts[2]}?utm_source=generator`
}
if (parts[0] === 'episode' && parts[1]) {
return `https://open.spotify.com/embed/episode/${parts[1]}?utm_source=generator`
}
}
} catch {
return ''
}
return ''
}
function extractSpotifyEpisodeIdFromCreatorHtml(html, sourceUrl) {
const input = String(html || '')
if (!input) return ''
const sourceEpisodeSlug = /-([A-Za-z0-9]+)(?:\/|$)/.exec(sourceUrl)?.[1] ?? ''
const blockRegex = /"episodeId":"([^"]+)"[\s\S]*?"spotifyUrl":"([^"]+)"/g
let match
let firstEpisodeId = ''
while ((match = blockRegex.exec(input)) !== null) {
const episodeSlug = match[1]
const spotifyUrl = decodeEscapedJsonUrl(match[2])
const episodeId = /\/episode\/([A-Za-z0-9]+)/.exec(spotifyUrl)?.[1]
if (!firstEpisodeId && episodeId) firstEpisodeId = episodeId
if (sourceEpisodeSlug && episodeSlug === sourceEpisodeSlug && episodeId) {
return episodeId
}
}
if (firstEpisodeId) return firstEpisodeId
const urlMatch = /"spotifyUrl":"(https:\\u002F\\u002Fopen\.spotify\.com\\u002Fepisode\\u002F([A-Za-z0-9]+))/.exec(input)
return urlMatch ? (urlMatch[2] || '') : ''
}
function isAllowedSpotifyResolverHost(hostname) {
const host = String(hostname || '').toLowerCase()
return host === 'open.spotify.com'
|| host === 'creators.spotify.com'
|| host === 'anchor.fm'
|| host === 'podcasters.spotify.com'
}
function decodeEscapedJsonUrl(value) {
return String(value || '').replace(/\\u002F/g, '/').replace(/\\\//g, '/')
}
app.get('/api/spotify/embed-url', async (req, res) => {
const incoming = typeof req.query.url === 'string' ? req.query.url.trim() : ''
const safeInput = sanitizeUrl(incoming)
if (!safeInput || safeInput.startsWith('/')) {
res.status(400).json({ message: 'A valid episode URL is required.' })
return
}
let parsed
try {
parsed = new URL(safeInput)
} catch {
res.status(400).json({ message: 'Malformed URL.' })
return
}
if (parsed.protocol !== 'https:' || !isAllowedSpotifyResolverHost(parsed.hostname)) {
res.status(400).json({ message: 'Unsupported episode URL host.' })
return
}
const directEmbed = toSpotifyEpisodeEmbedUrl(safeInput)
if (directEmbed) {
res.json({ embedUrl: directEmbed, resolvedFrom: 'direct' })
return
}
try {
const controller = new AbortController()
const timeout = setTimeout(() => controller.abort(), 8000)
const response = await fetch(safeInput, {
signal: controller.signal,
headers: {
'User-Agent': 'Siteforge/1.0 (+https://versebyversewithnate.us)',
Accept: 'text/html',
},
})
clearTimeout(timeout)
if (!response.ok) {
res.status(404).json({ message: 'Could not fetch episode page.' })
return
}
const html = await response.text()
const spotifyEpisodeId = extractSpotifyEpisodeIdFromCreatorHtml(html, safeInput)
if (!spotifyEpisodeId) {
res.status(404).json({ message: 'Could not resolve Spotify episode ID from page.' })
return
}
const embedUrl = `https://open.spotify.com/embed/episode/${spotifyEpisodeId}?utm_source=generator`
res.json({ embedUrl, resolvedFrom: 'page-fetch' })
} catch (err) {
console.error('[spotify/embed-url] resolve error:', err.message)
res.status(500).json({ message: 'Could not resolve Spotify embed URL right now.' })
}
})
app.get('/api/episodes', async (_req, res) => { app.get('/api/episodes', async (_req, res) => {
try { try {
const episodes = await fetchAllEpisodes() const episodes = await fetchAllEpisodes()
+117 -3
View File
@@ -13,6 +13,48 @@ const SPOTIFY_EMBED_URL =
const CONSENT_KEY = 'vbn_analytics_consent_choice' const CONSENT_KEY = 'vbn_analytics_consent_choice'
const HEADLINER_WIDGET_ID = 'WI_cmou3b4q7000701p0o9qmmcfj' const HEADLINER_WIDGET_ID = 'WI_cmou3b4q7000701p0o9qmmcfj'
function toSpotifyEpisodeEmbedUrl(url: string | undefined): string {
if (!url) return ''
try {
const parsed = new URL(url)
const host = parsed.hostname.toLowerCase()
const parts = parsed.pathname.split('/').filter(Boolean)
if (host === 'open.spotify.com') {
if (parts[0] === 'embed' && parts[1] === 'episode' && parts[2]) {
return `https://open.spotify.com/embed/episode/${parts[2]}?utm_source=generator`
}
if (parts[0] === 'episode' && parts[1]) {
return `https://open.spotify.com/embed/episode/${parts[1]}?utm_source=generator`
}
}
} catch {
return ''
}
return ''
}
function isLikelySpotifyEpisodeUrl(url: string | undefined): boolean {
if (!url) return false
if (toSpotifyEpisodeEmbedUrl(url)) return true
try {
const parsed = new URL(url)
const host = parsed.hostname.toLowerCase()
const path = parsed.pathname.toLowerCase()
if (host === 'creators.spotify.com' && path.includes('/episodes/')) return true
if (host === 'anchor.fm' && path.includes('/episodes/')) return true
if (host === 'podcasters.spotify.com' && path.includes('/episodes/')) return true
} catch {
return false
}
return false
}
function HeadlinerWidget() { function HeadlinerWidget() {
const [iframeSrc, setIframeSrc] = useState('') const [iframeSrc, setIframeSrc] = useState('')
const [status, setStatus] = useState<'loading' | 'ready' | 'empty'>('loading') const [status, setStatus] = useState<'loading' | 'ready' | 'empty'>('loading')
@@ -683,7 +725,12 @@ function PodcastHighlightsSection({ content }: { content: SiteContent }) {
</h2> </h2>
<div className="resources-list"> <div className="resources-list">
{links.map(link => { {links.map(link => {
const hasRichContent = !!(link.embedUrl || (link.discussionQuestions ?? []).length > 0 || link.showNotes) const hasRichContent = !!(
link.embedUrl
|| isLikelySpotifyEpisodeUrl(link.url)
|| (link.discussionQuestions ?? []).length > 0
|| link.showNotes
)
const label = <>{link.episodeNumber ? `Ep. ${link.episodeNumber}: ` : ''}{link.title || link.url}</> const label = <>{link.episodeNumber ? `Ep. ${link.episodeNumber}: ` : ''}{link.title || link.url}</>
// Use external link only when there's a url AND no rich detail-page content // Use external link only when there's a url AND no rich detail-page content
if (!hasRichContent && link.url) { if (!hasRichContent && link.url) {
@@ -1004,6 +1051,73 @@ function LandingPage({ content }: { content: SiteContent }) {
function EpisodeDetailPage({ content }: { content: SiteContent }) { function EpisodeDetailPage({ content }: { content: SiteContent }) {
const { id } = useParams<{ id: string }>() const { id } = useParams<{ id: string }>()
const episode = (content.podcastFeaturedLinks ?? []).find(e => e.id === id) const episode = (content.podcastFeaturedLinks ?? []).find(e => e.id === id)
const [resolvedEmbedUrl, setResolvedEmbedUrl] = useState('')
useEffect(() => {
let cancelled = false
if (!episode) {
setResolvedEmbedUrl('')
return () => {
cancelled = true
}
}
const manualEmbed = episode.embedUrl?.trim() ?? ''
if (manualEmbed) {
setResolvedEmbedUrl(manualEmbed)
return () => {
cancelled = true
}
}
if (!episode.url) {
setResolvedEmbedUrl('')
return () => {
cancelled = true
}
}
try {
const urlObj = new URL(episode.url)
const host = urlObj.hostname.toLowerCase()
if (host === 'open.spotify.com') {
const fromUrl = toSpotifyEpisodeEmbedUrl(episode.url)
if (fromUrl) {
setResolvedEmbedUrl(fromUrl)
return () => {
cancelled = true
}
}
}
} catch {
// ignore
}
if (!isLikelySpotifyEpisodeUrl(episode.url)) {
setResolvedEmbedUrl('')
return () => {
cancelled = true
}
}
setResolvedEmbedUrl('')
fetch(`/api/spotify/embed-url?url=${encodeURIComponent(episode.url)}`)
.then(r => (r.ok ? r.json() : Promise.reject(new Error('embed resolve failed'))))
.then((data: { embedUrl?: string }) => {
if (cancelled) return
setResolvedEmbedUrl(data.embedUrl?.trim() ?? '')
})
.catch(() => {
if (cancelled) return
setResolvedEmbedUrl('')
})
return () => {
cancelled = true
}
}, [episode])
if (!episode) { if (!episode) {
return ( return (
@@ -1037,10 +1151,10 @@ function EpisodeDetailPage({ content }: { content: SiteContent }) {
<h1 className="episode-detail-title">{episode.title}</h1> <h1 className="episode-detail-title">{episode.title}</h1>
{episode.summary && <p className="episode-detail-summary">{episode.summary}</p>} {episode.summary && <p className="episode-detail-summary">{episode.summary}</p>}
{episode.embedUrl && ( {resolvedEmbedUrl && (
<div className="episode-detail-embed"> <div className="episode-detail-embed">
<iframe <iframe
src={episode.embedUrl} src={resolvedEmbedUrl}
title={episode.title} title={episode.title}
width="100%" width="100%"
height="152" height="152"