Zion Travel was never supposed to become a platform. It was supposed to be a travel directory site, full stop. Listings, towns, a map, some SEO plumbing to get it found. That's it. But somewhere around the third time I found myself opening that codebase to steal a chunk of it for something that had nothing to do with travel, I had to admit what was actually happening: I wasn't building travel sites anymore. I was building one platform and disguising it as a travel site every time.
So on June 27th I stopped disguising it.
The tell was the copy-paste
The admin panel, the CMS, the blog engine, the media library, the whole Jexii SEO layer underneath it, none of that cared that Zion Travel was about Utah canyons. It was generic infrastructure wearing a travel costume. Every time I spun up something new, I'd go find the last site, copy the parts that weren't travel-specific, and then spend an afternoon carefully picking out every stray reference to towns and listings and gateway cities that had snuck into files that had no business knowing what a "gateway town" was.
That afternoon of careful picking is the part that finally got old enough to fix properly. Not because it was slow, it wasn't, but because every time I did it by hand I was one missed reference away from a new site quietly inheriting travel-shaped assumptions it would never outgrow. I'd rather spend a week doing the extraction once than keep paying that tax forever.
What actually came out
The extraction wasn't glamorous. I pulled the admin dashboard, settings, and auth. The CMS: pages, menus, redirects. Blog and news with categories and a rich-text editor. The media library, backed by Cloudflare R2. The Jexii SEO engine, which is its own separate service and didn't care what it was optimizing anyway. Monitoring for GSC, GA4, Bing, PageSpeed. And the AI writing engine that drafts content through Claude.
Then I went through and scrubbed every place travel had leaked in where it shouldn't have. The color palette had rust-toned accents that were doing double duty as "outdoorsy," so those became a neutral slate-blue. There was a "TRAVEL ADMIN" label sitting in the dashboard header like it owned the place. Dead code generators that only made sense if you were generating gateway-town pages got deleted outright, not commented out, deleted. A stale schema file that still had "listings" baked into its bones got removed so the fresh migration wouldn't inherit assumptions nobody asked for.
The result got a name: Tungsten Core. Tungsten because it's the metal with the highest melting point of anything that shows up on a periodic table, the kind of foundation you're supposed to be able to build on without it warping under a new site's weight. The rule I set for it was blunt: Core ships with zero niche content. No travel directory. No portfolio. No blog posts about anything specific. Just the admin, the CMS, the blog engine, the media library, and the SEO machinery, sitting there ready to be pointed at whatever a site actually needs to be.
How a site actually gets its personality
The part I care about more than the extraction itself is the seam I built for adding a niche back in. A site's real content, a travel directory's listings, a portfolio's projects, whatever this site's project showcase is, gets bolted on top through two things: a migration that adds the tables that content actually needs, and a small adapter file called content-source.server.ts that tells the SEO engine, the internal-linking system, and the sitemap generator how to read that content. Everything downstream of that adapter, indexing, structured data, related-content suggestions, doesn't need to know or care whether it's looking at a hiking trail or a coffee shop or a case study. It just asks the adapter, and the adapter answers.
That one seam is why this site you're reading right now exists at all, and why it took a fraction of the time Zion Travel did. This is Core wearing a "personal project hub" costume instead of a travel one, with a Projects table standing in for listings. Nine travel directory sites run on this same foundation now, plus a couple of SaaS products that have nothing to do with travel or with each other. None of them know Zion Travel ever existed. That's the whole point.
I'll be honest about the tradeoff, because pretending there wasn't one would be a lie: Core itself does nothing useful on its own. It's an empty admin panel and a blog with no posts until you give it a reason to exist. But every site built on it since has shipped faster than Zion Travel did, because the boring 80% was already solved before I typed the first line of anything specific to that site. Turns out the fastest way to build ten sites was to stop building ten sites and build one foundation instead.


