Case Study · No. 06
Totoong Balita
A regional newsroom for Southern Tagalog where writers never see wp-admin, a correction is part of the software rather than a promise on a policy page, and nothing on the site ever invents a lotto number.
The situation
A new independent news site covering CALABARZON and MIMAROPA, built from nothing. The brief was not a blog with a news theme on it. A newsroom needs things a blog never asks for: bylines that mean something, an editor who decides what leads the front page, corrections that stay visible after they are made, photo credit and licensing, live updates on a story that is still happening, and an inbox where a tip and a contact form land in the same place.
It also needed to be trustworthy in the specific ways a local news site is judged. Publishing a wrong lotto number, or quietly editing an error away, costs a regional outlet its readers faster than anything else it can do.
What I built
About sixty modules living in a theme-independent loader, plus a custom theme for presentation only. Swap the theme and the newsroom still works, because none of the logic lives in it.
Staff work in a newsroom at its own URL: overview, content, an editor, videos, analytics, the mailbox, ads, settings, team and invitations, media, lotto, the newsletter, and a pre-launch readiness checklist. Writers keep WordPress's built-in roles, because there was no reason to invent new ones, and wp-admin is reduced to the two screens they genuinely need, media and their own profile.
The public side carries editorial control of the front page, a breaking banner, live blogs, corrections in four levels matching the published policy exactly, writer profiles, a place taxonomy, PCSO draw results, live weather for the region's towns on a map, a double opt-in newsletter with an automatic digest, and a conservative content security policy that is actually enforced.
A real decision
The newsroom's inbox reads real email over IMAP, and the IMAP client is hand-written.
PHP's imap extension is not installed on this server, is absent from most managed hosting by default, and was moved out of core in PHP 8.4. Building on it would have meant a feature that fails on the majority of hosts and breaks outright on a future upgrade, for a newsroom that cannot be expected to negotiate a PHP extension with its host. So this speaks IMAP4rev1 over a TLS stream and needs nothing beyond openssl.
Its scope is narrow on purpose: connect, authenticate, select a folder, search, fetch headers and a text body. It is a mailbox reader, not a mail client. Real email and website form submissions land in the same inbox as the same record type, so one workflow and one reply box serve both.
Decisions that earned their space
Lotto results are mirrored, never authored. The source of truth is my own LottoNatin, which already holds a clean results table. Here they live in a custom table rather than a post type, because a post type invites editing in wp-admin and an edited mirror silently drifts from the thing it mirrors. Around thirteen draws a day forever belongs in an indexed table, not in wp_posts next to the journalism. And no code path here invents a number: a missing row renders as walang resulta, never a guess.
Audience numbers without surveillance. View counting is first-party and stores no IP address at all. A reader is a salted hash that rotates daily, which is enough to deduplicate one day's reading and useless for following anyone across days.
Watermarks on the copies, never the master. Only generated sizes are marked, so a photograph can always be re-cropped or re-exported from a clean original, and the lightbox points at a marked size rather than the master. The watermark is a PNG because this server has GD and not Imagick, and because SVG uploads are blocked outright: SVG is XML that can carry script, which would mean stored cross-site scripting in an editor's browser.
Place as a real taxonomy. A reader in Calamba wants Calamba before they want anything else, and the footer had been serving that with a search URL. A search matches any passing mention, has no landing page worth ranking, and was marked noindex, so every one of those links pointed at a page the site had told Google to ignore. Place is now hierarchical, region to province to town, with real archives.
The pre-launch screen is a review list, not a purge button. The seeded demo content carries no marker identifying it, and it is interleaved by date with real work added during the build. A one-click cleanup would have to guess, and guessing wrong deletes a writer's article. So the screen lists what is there with the signals that usually separate filler from journalism, length, a missing credit, a missing alt text, and lets a person tick the boxes. Slower, and the only version that cannot destroy real work.
The outcome
Live at totoongbalita.com with 67 published stories, eight bylines, and 342 mirrored draw results. Editors run the front page, corrections, live blogs, the newsletter, ads and the mailbox from the newsroom itself. Nobody files a request to publish, and nobody needs wp-admin to do their job.
The site has only just opened to the public, so there is no traffic story to tell yet. The newsroom it opened with is complete.
Tech stack
Need something like this built?
Tell me what your operation actually does all day, and I'll tell you honestly what's worth building. No jargon, no "let's circle back."