SoCalNomad

Tech Stack: WordPress, React, n8n, Docker

SoCalNomad is an independent Southern California entertainment platform combining event discovery, local journalism, photography, and artist and venue data.

The project spans WordPress, React, PostgreSQL, Python automation, Docker, and self-hosted infrastructure. This page collects the engineering stories behind its architecture, production systems, and ongoing evolution.

Posts

The Archive Nobody Else Could Build

I did not set out to make a documentary archive of festival work. I was working. Sometimes I had a camera with me. Over the years, the photographs accumulated: a crew getting ready before the gates opened, a quiet stretch of grounds that would soon be crowded, glitter going on, an armload of leis moving … Read more

Read More →

Event Deduplication Is Editorial Judgment

Two event records share a venue and start time. Are they duplicates? At a single-stage club, probably. At a casino with several rooms or a festival with several stages, perhaps not. If one provider lists the headliner and another lists the full co-bill, title equality may be less useful than artist relationships. I stopped thinking … Read more

Read More →

AI Atmosphere Images That Do Not Compete With My Photography

An automated event card needs a background. The calendar does not have original photography for every venue, and repeatedly generating fake concert photographs would blur an important line in the project. SoCalNomad is partly a photography platform. Synthetic imagery should fill a production gap without pretending to document a place I have not photographed. I … Read more

Read More →

Instrument The Experiment Before Optimizing It

A new social format can look successful for the wrong reasons. The first carousel may receive more likes because it featured a famous artist. A post may satisfy existing followers without reaching anyone new. A format can grow reach while sending no one to the site. Without stored measurements, every explanation remains a story told … Read more

Read More →

Building This Week In SoCal From Calendar Data

I had thousands of upcoming events in the calendar and no reason to expect anyone to browse all of them. “This Week in SoCal” turns the database into a short editorial slate for Instagram: one cover, a limited set of event cards, and a branded closing card. It runs for the coming weekend on Thursday … Read more

Read More →

Why Two Sources Can Be Enough For A Local Story

Three independent sources sounds like a responsible publication threshold. For a major tour announcement, it is easy to satisfy. National outlets, trade publications, label publicity, and entertainment sites all repeat the same announcement. For a legitimate club show or scene festival, three outlets may never cover it. A rigid source minimum can therefore measure publicity … Read more

Read More →

The Calendar Was Teaching The Newsroom To Prefer Arena Pop

I noticed the automated newsroom publishing mainstream arena acts while repeatedly overlooking punk, metal, hardcore, indie, and festival stories. The feeds were not the problem. Articles about those scenes were being ingested and passing the Southern California relevance filter. They were dying later because the system had accidentally defined local relevance as popularity inside its … Read more

Read More →

Why I Stopped Posting To X After 99 Posts

The X publisher was not broken. It had posted 99 times. The schedule worked, content moved through the API, and the account accumulated an orderly history of links. It generated effectively no traffic for SoCalNomad. When the API credits ran out, buying more would have meant paying to preserve an automation whose only demonstrated output … Read more

Read More →

Thirty-Six Percent Of The Media Library Was Pipeline Debris

I started the alt-text audit with a straightforward accessibility problem. Only about six percent of the WordPress media library had useful alternative text. The plan was to derive conservative descriptions from the parent article and date, preserve anything already written by hand, and improve coverage without inventing visual detail. Then I found 281 images that … Read more

Read More →

The Ad Dashboard Was Counting A Different Audience

The ad server reported thousands of monthly impressions. The site had roughly 250 to 300 human visits per month. The server-side ad proxy delivered creative to crawlers as well as people, so both numbers could be technically correct. I could not prove the exact human-to-bot split from the ad counter alone. I could prove that … Read more

Read More →

Google Crawled The Empty Application And Never Came Back

The calendar worked perfectly well for a person with a modern browser. Google saw almost nothing. The public calendar was a single-page application. Its initial HTML response was an application shell, and JavaScript supplied the useful content after load. Search Console showed one crawl followed by months in “Crawled – currently not indexed.” My diagnosis … Read more

Read More →

The Geographic Filter That Replaced Manual Cleanup

Every calendar refresh used to leave me with geographic cleanup. Ticketing-market boundaries are not publication boundaries. A provider’s Southern California market can include Bakersfield, Ventura, Santa Barbara, San Luis Obispo, Imperial County, and occasional edge cases beyond California. A broad coordinate rectangle has similar spillover. The fetchers accepted those records, wrote them into several outputs, … Read more

Read More →

When A Free AI Model Disappeared Without Breaking The Cron Job

The automation kept running. Scheduled jobs started on time. Processes exited. Logs continued to accumulate. Nothing obvious announced that the newsroom had stopped publishing. The external AI model it depended on was no longer available. Process Health Was Not Product Health NewsDesk uses language models for classification, entity extraction, clustering, and synthesis. At the time, … Read more

Read More →

Why Two Database Tables Could Not Safely Share An ID

An integer primary key is unique inside its table. That last phrase is easy to forget. NewsDesk consumed articles from two source tables created by different stages of the editorial pipeline. Both tables assigned ordinary incremental IDs. Record 42 could therefore exist in both places and refer to two unrelated articles. A downstream cluster that … Read more

Read More →

The Similarity Threshold That Rejected Ten Real Stories

Automated publishers need a way to avoid repeating themselves. SoCalNomad’s NewsDesk already checked whether a recently published story covered the same artist. It also had a title-similarity backstop intended to catch near-duplicate headlines that slipped through the first check. I found ten legitimate stories on the wrong side of that backstop. Entertainment Headlines Share A … Read more

Read More →

The Home Lab Grew Operational Discipline

The longer SoCalNomad ran, the less the interesting work looked like feature development. It looked like operations. That is not a complaint. It is what happens when a project becomes real. Once people and crawlers can reach it, every change has a blast radius. Every cache has a memory. Every workflow has a schedule. Every … Read more

Read More →

The Signup Endpoint That Never Sent The Confirmation Email

I could see newsletter subscriptions accumulating in the list manager as unconfirmed. That seemed normal at first. Double opt-in begins in an unconfirmed state and becomes active after the subscriber clicks a message. The confirmation message was never being sent. Two Endpoints Created Similar Records The signup path posted to Listmonk’s administrative subscriber endpoint. That … Read more

Read More →

Why Concert Photography Gets WebP Quality 98

The usual web-image advice tells me to compress harder. That is sensible when the image is decorative or when an oversized upload is slowing an otherwise lightweight page. It becomes less useful when original photography is part of the reason the page exists. Concert images are particularly good at exposing the cost of a generic … Read more

Read More →

Search Console As A Production Acceptance Test

I did not expect Google Search Console to become part of deployment acceptance. It often feels like one because it reports failure. Pages are not indexed. Sitemaps are not read. URLs are discovered but ignored. Phantom 404s accumulate. Structured data is incomplete. Crawled pages remain excluded. But Search Console is really an external acceptance test. … Read more

Read More →

The Home-Origin Production Stack

The public version of SoCalNomad looked simple enough: a WordPress site, a calendar subdomain, some articles, event pages, ads, and links out to ticket vendors. The inside was more interesting. Behind Cloudflare was a small home-origin production stack running on residential fiber with a business account. It was not large infrastructure, but it was layered … Read more

Read More →

Self-Hosted Ads On A Site Ad Blockers Did Not Trust

Advertising was part of the SoCalNomad plan from the beginning. That did not mean dropping third-party ad tags into a sidebar and hoping for revenue. The infrastructure had to support ads in a way that fit the site’s constraints: self-hosted origin, Cloudflare edge, WordPress theme integration, calendar placements, affiliate campaigns, and ad blockers that reasonably … Read more

Read More →

Cache Invalidation Was The Launch Tax

The fastest version of a site is often the one that refuses to change. That is the bargain caching offers. SoCalNomad needed aggressive caching because it was running from modest infrastructure behind Cloudflare. The site needed to be fast for readers and credible to crawlers. Cloudflare made that possible. Then publishing exposed the tax. The … Read more

Read More →

Cloudflare Was The Free Edge Team

Running a public site from a home origin changes the meaning of “free tier.” Cloudflare’s free services were not a convenience for SoCalNomad. They were part of the architecture. The project ran on a residential fiber connection with a business account. The origin could serve the site, but I did not want the home network … Read more

Read More →

Feed Reliability Before AI Magic

AI was never the first hard problem in the SoCalNomad newsfeed. The first hard problem was getting ordinary RSS feeds into a database reliably. That sounds less interesting than clustering, summarization, or automated publishing. It was also more important. If the intake layer is unreliable, every clever downstream step inherits bad assumptions. The 54-Feed Problem … Read more

Read More →

The Data Mart Behind The Media Site

At some point, I stopped treating the media site as only a collection of posts. For SoCalNomad, that point arrived when the same facts needed to serve several products: A newsfeed. A calendar. Artist pages. Venue pages. Ticker items. Future newsletters and social posts. WordPress could store published content, but it was not the right … Read more

Read More →

The Calendar Became The Performance Test

I started the calendar as an event-discovery feature. It became a test of whether the whole platform could behave like a production system. An entertainment site can publish articles all day and still fail readers if they cannot find something to do. The calendar was the practical interface: dates, venues, artists, ticket links, and enough … Read more

Read More →

Two VMs And A Fiber Line

The production architecture I am proudest of was not large. It was disciplined. SoCalNomad ran from a home Proxmox environment on a residential fiber connection with a business account. The public side looked like an ordinary HTTPS site. Behind it was a small two-VM architecture that separated page serving from automation and data processing. That … Read more

Read More →

Docker DNS And The First Black Box Lesson

One of the earliest SoCalNomad automation failures looked like an AI problem. It was not. The workflow was supposed to let n8n call a local LLM service running in another Docker container. The model was up. n8n was up. Both containers were attached to the same Docker network. The HTTP request node looked reasonable. The … Read more

Read More →

The First Newsroom Was A Filter

The first serious SoCalNomad automation problem was not writing articles. It was deciding what did not deserve to become one. The early ambition was obvious enough: collect Southern California entertainment stories from many sources, filter them, synthesize useful coverage, and publish through WordPress. The trap was also obvious once I looked at the data. Entertainment … Read more

Read More →

SoCalNomad Was Never Just a Website

SoCalNomad started with a modest public premise: Southern California entertainment, events, photography, and local culture. The engineering premise was less modest. I was not trying to stand up a brochure site. I was trying to build a small media platform that could collect event information, publish original and automated coverage, organize artists and venues, serve … Read more

Read More →

Recovering My Old Reviews From The Wayback Machine

There is a strange kind of loss that happens when a site disappears. The work is still real. The bylines were real. The shows happened. The photos, deadlines, venue notes, and late-night drafts all existed. But if the site goes dark and the database is gone, the public record starts to dissolve. That is what … Read more

Read More →