Podcast · Christian faith
Perfectos PodcastA Christian podcast with a daily devotional, Bible verses and navigable episodes
Static site for the Christian podcast Perfectos Podcast: 16 episodes with Bible verses and an FAQ, and 365 daily prayers ready to share.
Technologies
- Astro 7
- TypeScript
- MDX
- Framework-free CSS
- Satori
- resvg-js
- @astrojs/sitemap
- Fontsource
- React 19 (build time only)
- nginx
- Docker
- Railway
- Cloudflare
- Google Analytics 4
- Microsoft Clarity

365
daily prayers
21
pages by book of the Bible
16
episodes
44
URLs in the sitemap
My role
Design and development of the site at Azirgo SAS: visual identity, a static Astro site, a daily devotional with images generated at build time, SEO and deployment.
The problem
Perfectos Podcast releases an episode every Sunday. The site had to go beyond the release: give people a reason to come back every day, bring each episode into text with its verses and its questions, and be easy to share on WhatsApp, which is where the prayers get forwarded. All without turning a content site into an application that needs maintaining.
What I built
- A daily devotional: 365 declarations, each with its prayer and its verse, from 29 July 2026 to 28 July 2027, every one with its own page and a button to share it on WhatsApp.
- A share image for every day, generated at build time with the logo, the date, the title of the declaration and its verse.
- /oraciones with today's prayer and 21 pages by book of the Bible - Psalms, John, Isaiah and the rest - to find prayers by passage.
- 16 episodes with video, a summary split into navigable sections, the verses quoted, an FAQ and a carousel of more episodes.
- Dedicated pages for the host, James Pratt, and the co-host, Daniela Moreira, with their profile, their episodes and an FAQ.
- An /sobre (about) page that opens with a direct definition of the show, and /contacto with the studio, the map and a form that opens WhatsApp with the details already written.
- A home page with the declaration of the day, the show's themes, the latest episodes, verses, a guest application and links to YouTube, Spotify and social accounts.
How it's structured
Astro in static mode: the build outputs plain HTML with the CSS inlined in each page, and an nginx image serves it on Railway. There are no client-side React islands; apart from analytics, the site's JavaScript is a handful of inline scripts.
- Routes: home, /sobre, /episodios and 16 episode pages, /james-pratt, /daniela-moreira, /oraciones, 21 pages at /oraciones/libro/<book>, 365 at /oracion-diaria/<date> and /contacto.
- Episodes: an MDX collection with number, title, short title for sharing, YouTube ID, duration, summary, search description, verses and questions; the number decides the order.
- Devotional: one 365-day JSON file feeds the home page, /oraciones, the book pages, the daily pages and their images, without duplicating a single text.
- Video through the youtube-nocookie player, and a “coming soon” state when an episode has no video yet.
- Structured data: WebSite, Organization and PodcastSeries on the home page; PodcastEpisode and BreadcrumbList on every episode; Person on the host pages; AboutPage on /sobre; ItemList on the listings; FAQPage wherever there are visible questions; ContactPage and LocalBusiness on contact.
- sitemap.xml with last-modified dates, a static llms.txt and a robots.txt that allows AI search engines; nginx adds HSTS, CSP and per-file-type caching policies.
Visual identity
Light and calm: snow-white and pale sky-blue backgrounds, a sky-blue accent and a night blue for the footer and dark blocks. Fraunces for headlines and Outfit for body text.
- The hero shows three rows of episode thumbnails scrolling in alternating directions, next to the verse the show is named after, Matthew 5:48.
- Verses are presented as large quotes, and the home page's verse section is a bento grid that fits in a single viewport.
- Project rule: no letter-spacing at all, positive or negative; words keep their natural spacing.
Inside the site

Prayers index with the prayer of the day. 
Host page for James Pratt, with his profile and his episodes.
Technical decisions
- A 100% static site served by nginx: nothing changes per visitor, so there is no need for an application server. The only live piece, today's prayer, is fixed at build time and corrected in the browser by reading the same JSON with the visitor's real date.
- The 365 daily pages are noindex and kept out of the sitemap: they are near-twins built to be shared, not to rank. What gets indexed is the grouping by book of the Bible.
- Each day's share image is generated at build time with Satori and resvg, using the site's own typefaces: when the link is pasted into WhatsApp, the preview shows that day's prayer rather than a generic cover.
- One source per kind of content: the devotional comes from a JSON file and the episodes from an MDX collection in which every ### opens a section, so the “In this episode” list and its anchors generate themselves. A custom plugin turns headings with accents and ñ into ASCII anchors so the links are not percent-encoded.
- The host and the co-host each have a stable schema.org @id that the other pages reference, so search engines see two identified people rather than a name repeated on every episode.
Challenges
- Composing 365 images at build time with Satori, which only reads static fonts: it uses the .woff versions of Fraunces and Outfit, the same families as the site.
- Following the show's editorial conventions across all content - for example, always writing “Dios” (God), including inside quoted verses - without losing the warm tone.
- Changing names with the project already under way: the site was born as Voces de Fe and became Perfectos Podcast, with a new domain, social accounts and logo.
Result
The site is in production with the 16 episodes, the full year of the devotional and the pages for both hosts. It is static end to end: each new episode is one MDX file and one build, and the sitemap declares 44 indexable URLs with their last-modified date.