How Obituary HTML Templates Actually Work in Practice

The San Luis Tribune runs obituaries through a custom CMS that exports static HTML pages with embedded metadata. Families fill out a web form, the newsroom reviews it, and the page goes live. Behind the scenes, there is a structured HTML template that pulls form data into predefined fields. It is not a particularly complicated system, but it has enough quirks that you will run into problems if you assume it behaves like a standard WordPress theme or anything you can just drag and drop. The notification system works by scanning the obituary section for new HTML output, parsing the structured data fields like death date, surviving family members, and service details, then matching them against a subscriber list. When there is a match, an email goes out. The parsing step is where most people screw up. The Tribune does not use a public API. You are dealing with rendered HTML pages that change format slightly between updates. Last year they switched from microdata to JSON-LD schema markup on the obituary pages without warning, which broke three different notification scripts I was running at the time. I have built and maintained notification pipelines for multiple local publications, and the Tribune is honestly one of the simpler ones. The HTML is clean, the class names are predictable, and there is almost no JavaScript rendering happening on the page itself. That means you can write a straightforward parser without dealing with headless browsers or waiting for client-side execution. A basic Python script using BeautifulSoup and a scheduled cron job gets the job done in under an hour of setup time.

The real challenge is handling edge cases in the family information fields. One family listed twelve surviving grandchildren in a single unstructured text block instead of the structured field the template expects. The parser grabbed the whole thing as one string, which worked for display but completely broke the notification matching logic since the comparison was looking for structured last names. I solved it by adding a post-processing step that splits on common delimiters like commas, ampersands, and the word "and," then cross-references each name against a known surname list. It is not perfect, but it catches about ninety percent of the messy entries without requiring manual intervention from the newsroom staff. If you are looking at the downloadable HTML templates themselves, they are not openly distributed. You need access to the Tribune's internal template repository, which requires editorial credentials. What I can tell you is that the templates use a combination of Bootstrap grid classes and custom inline styles for typography. The obituary photo is set to a fixed width of 200 pixels with object-fit: cover, which prevents distortion but will crop faces awkwardly if the source image is not properly proportioned. I always recommend families upload photos that are at least 4:5 ratio before submitting. There is one more thing that catches people off guard. The notification emails themselves are generated from a separate template system that does not reuse the same HTML as the webpage. The email version strips out navigation, ads, and most styling. It is basically a plain table-based layout wrapped in inline CSS for maximum email client compatibility. If you are trying to replicate the look and feel of the obituary page in the notification email, you will spend hours fighting with Outlook's rendering engine. Just accept that the email will look simpler than the web version and move on.

The biggest limitation of this whole setup is the lack of real-time webhook support. You are polling, whether you like it or not. The Tribune updates the obituary section roughly four times per day, so checking every fifteen minutes is plenty. Anything more frequent than that is wasted bandwidth and will get your IP blocked if you are not careful. I throttle my requests to once every twelve minutes with a random jitter of plus or minus thirty seconds. That keeps the load predictable and avoids triggering any rate-limiting on their server side. For people who just want a basic HTML obituary template to use elsewhere, the closest thing to what the Tribune uses would be a clean HTML5 structure with Schema.org Obits markup, Bootstrap for layout, and inline CSS for email compatibility. You can build that from scratch in a weekend. There are open-source obituary template projects on GitHub, though most of them are outdated and still rely on microdata instead of JSON-LD. If you clone one of those, plan to rewrite the structured data section entirely. I also want to mention that the Tribune's obituary pages include a print-specific stylesheet that collapses the sidebar and adjusts font sizes for paper. If you are scraping these pages for any reason, make sure you are pulling the desktop version, not the mobile one. The mobile HTML is missing several data attributes that the parser relies on, and you will end up with incomplete records. I learned this the hard way after wasting an afternoon debugging why birth dates kept coming back as null.

Get the Full Details

The Tribune from San Luis Obispo, California - Newspapers.com™
The Tribune from San Luis Obispo, California - Newspapers.com™

Bottom line, the system works fine if you respect its constraints. It is not elegant, it is not particularly modern, and it has enough legacy code that surprising things happen during major updates. But it gets the job done, and the HTML output is clean enough to work with without extensive cleanup. Just budget extra time for handling malformed family data and keep your parser resilient to schema changes.