A few years ago I started building a thing called Backcast. The idea was simple: I listen to a lot of podcasts, and I wanted a way to back them up. I got as far as parsing OPML exports, writing some unit tests, setting up PHPCS, and documenting the whole thing on this blog. Then life happened, I lost the thread, and it sat untouched.
The itch never went away, though. I kept finding myself thinking, “I know someone said something about this on a podcast, but which one? Which episode? When?” Podcasts are full of ideas and I had no way to get back to them.
So I started over. Different project, different approach, same underlying frustration.
What is Holocron?
Holocron is a personal podcast archive I’m building for myself. I point it at RSS feeds and it ingests every episode from the full back-catalog including titles, descriptions, transcripts when available, deep links back to Apple Podcasts. Then I can search all of it.
That’s the whole idea: everything my podcasts know, searchable from one place.

It’s a local app. Single user. No account, no cloud, no subscription. Just my podcast library on my machine, built to solve my own problem.
The Problem It Solves for Me
Podcast apps are great at playing audio but they’re terrible at recall. I often find myself thinking, “someone talked about this on a podcast” and having no way to find it.
The content is trapped inside the audio, and the metadata – descriptions, show notes, transcripts – is scattered across hundreds of feeds with no unified search.
My podcast player does its job. Holocron gives me the search layer on top of it that I’ve always wanted.
The Stack
I built this with Laravel 12, PHP 8.4, Livewire 3, Alpine.js, and SQLite. If you’ve read this blog for any length of time you know I come from the WordPress world. But much of my recent work has been split between Google Cloud Platform and Laravel. And for this particular project, Laravel felt like the natural best option.
The frontend is almost entirely Livewire. No JavaScript framework, no build-heavy SPA. Livewire components handle search, feed management, sync progress, and pagination. Alpine.js fills in the gaps for things like keyboard shortcuts and file input styling. So far, it’s simple and it’s fast.
What’s Working Today

The 0.1.0 release covers the foundation:
- Feed ingestion from RSS URLs, Apple Podcasts links, and Overcast URLs
- Full back-catalog sync with background processing, real-time progress, and paginated RSS support
- Full-text search across episode titles, descriptions, and transcripts with feed filtering, date ranges, and sort options
- OPML import and export for bringing subscriptions in from any podcast app
- Episode detail pages with description quality indicators and Apple Podcasts deep links
- 155 tests covering the full stack
It’s not pretty yet. It’s not polished. But it works, and I’m using it almost every day (at least several times a week).
What’s Next
The next milestone is adding an AI layer. Local-only, running through Ollama. I’d prefer to have no API keys, no cloud calls. I want automatic tagging, summarization, and eventually semantic search via embeddings.
The idea that I could search for a concept across my entire podcast library and find relevant episodes even if the exact words don’t match. That’s the ultimate goal for the app by the time I’m done with it.
Why Document This?
Same reason I documented Backcast: Reading about what other people have built via their socials or their blogs is always interesting, I’ve done this in the past, and this seemed like a good opportunity to do so now.
Further, there are interesting, smaller problems I stumble into whenever I’m working on solving a larger problem. That’s both fun and beneficial to share. And I’ve already got a backlog of smaller posts on exactly those things I’ll be eventually sharing.
Case in point, having to figure out why a sync job silently stops because Laravel’s each() returns false or trying to decide how to best properly queue, batch, and process a podcast with over 2,000 episodes in its catalog and doing so in a performant manner.
So if you’re interested in something like this, bookmark this article’s tag and I’ll provide updates as I have ’em.
