Inside the DSC blog CMS hardening sprint in May

Inside the DSC blog CMS hardening sprint in May

The DSC blog index — the CMS we hardened over the May sprint.

Our blog CMS was shipping on schedule, but the seams were showing. Posts went up fine. What was rough was the operational surface around publishing: a bad post took a database edit to remove, leads and titles drifted in shape, the series index was a manual list, the CTA at the end of every post was a hardcoded string, and the connection between a post and the repo it came from was implicit. On 2026-05-19 we shipped five commits in a single day that tightened each of those seams. The work is operational hardening — the publication machinery, not the publication itself. Output volume did not change. What changed is that operating the pipeline got quieter and more predictable. This post covers each commit, what it does, and why it matters for teams running similar pipelines.

The delete-post API route

9cd70b9 adds an admin route that takes either a slug or a numeric id and removes the matching post. Before this, retracting a post required either a direct database edit or a redeploy with a removal patch. Neither is a workflow.

The route checks admin permissions at the boundary, validates the input, and returns a structured response the admin UI can act on. The post is removed from the index, the public listing, and the search index in a single transaction. There is no soft-delete state in this version; the route deletes, and the audit log records the deletion with the actor's id and timestamp.

A draft that got published by mistake is now reversible in one API call. A post that needs to come down for legal or compliance reasons is now reversible in one API call. The deployment pipeline is no longer the safety net.

Editorial pass tightening leads and titles

74b0397 is an editorial pass, not an engineering one. The lead paragraph of each post and the title were tightened to a consistent shape: a single pressure line, a single outcome line, and a clean handoff to the body. The change applied to existing posts, and the publishing template was updated so future posts inherit the same structure.

This is operational hardening, not cosmetics, because editorial inconsistency compounds. A reader who lands on a sharp lead and clicks through to a soft one registers the difference as noise. Over months, the publication stops feeling like a single voice and starts feeling like a feed. Tightening the shape of the lead and title is what keeps the publication readable as a publication, not just a list of posts.

The practical effect for the editorial team: review cycles are faster because the structure is predictable, and the bar for "ready to ship" is no longer a judgment call.

Public repo callouts on posts

9d1427e adds a clear callout at the end of every post pointing to the public repository. The callout is a short line with a link, not a paragraph. It tells the reader: the work described here has code you can read, an issue tracker you can follow, and a commit history you can audit.

The operational impact is that the publication is now self-evidencing. A reader who wants to verify a claim can do so without contacting us. A reviewer who wants to check a date or a commit hash can do so without contacting us. A future contributor who wants to know if their work fits can read three posts and a repo and decide. None of that required new content; it required the publication to be honest about what it is.

Auto-listed Empanada series chapters

4fbb8c9 replaces the manually-maintained index of Empanada series posts with an auto-generated list. The anchor post now renders the chapter list from the same data the rest of the system uses to identify series posts, ordered by published date, with the current chapter marked.

The previous index was a hand-edited list inside the anchor post. Every time a new chapter shipped, an editor had to update the list, and the list drifted within a week of the first missed update. The auto-list eliminates that drift by construction: there is no list to forget to update. Adding a new post to the series is a matter of tagging it correctly, and the anchor post reflects the change on the next render.

For teams running series content, the lesson is that any list that has to be kept in sync with another list will eventually not be. The fix is to derive one from the other.

Configurable CTA

b78923a moves the call-to-action at the end of each post from a hardcoded string in the template to a configuration value. The CTA is still rendered in the same place, with the same visual treatment, but the copy and link target are read from configuration rather than embedded in the template.

The operational impact is that changing the CTA — to point at a new contact form, to update a phone number, to rotate to a seasonal offer — no longer requires a code change. It is a config change, made by the editorial or marketing team, and it takes effect on the next render.

The deeper impact is that the template is now free of business copy. The template is a template; the CTA is a value. The two can change independently, on their own cadences, with their own review processes. That is operational hardening in practice: removing the places where unrelated concerns were coupled together.

Why this is hardening, not cosmetics

Each of these five commits removes a coupling, a manual step, or a hidden state. The delete route removes the coupling between retraction and the deployment pipeline. The editorial pass removes the coupling between publication quality and the editor's mood that day. The repo callout removes the gap between the work and the evidence of the work. The auto-list removes the manual sync between the series and its index. The CTA config removes the coupling between template changes and business copy changes.

The publication still publishes on the same cadence, on the same topics, for the same audience. What changed is that the people operating it spend less time on the parts that should be automatic.

What to watch

The next round of work covers three surfaces. First, the editorial template will get a structured metadata block at the top of each post — audience, scope, status — so the publication surface and the indexing surface agree on what each post is for. Second, the admin API will get a bulk-action endpoint, so multiple retractions or updates can happen in a single authorized call rather than as a sequence. Third, the series mechanism is moving to a more general "collection" concept, so future series work does not require a one-off implementation.

The commits covered here are 9cd70b9, 74b0397, 9d1427e, 4fbb8c9, and b78923a, all shipped on 2026-05-19.