How to stop worrying about content library tagging

It's boring and easy to neglect, but content tagging still has a purpose. How I set up and maintain tags for my content library.
Raise your hands if you get excited about applying tags to a content library. Anyone…? Anybody at all?
It's easy to see why you wouldn't. Starting from the top, you have to read everything. You need to figure out what the actual topics are, as opposed to the ones you assume are there. Then you have to settle on a vocabulary and apply it consistently across every entry.
Most importantly, you must avoid breaking anything on the way. One rogue 404 and the nearest SEO practitioner will start bending your ear.
None of that is difficult, but it is rather dull. Which is why a neglected tag library is a universal problem for every content manager.
So I got to thinking, how can we make tagging FUN? And easy to maintain? Because donning my information architecture beanie (patent pending), I knew I faced a growing problem if I didn't.
Why do you need tags at all?
Because a category only tells you where a post lives. A tag, meanwhile, has two jobs: discovery and connection.
Discovery. The Main Quest category currently holds 13 posts, which is already too many to browse. A good tag will surface common themes and topics throughout the site, outside of the top-tier hierarchy. For example, a tag that quickly signposts which of them are about design and which are about content modelling.
Connection. A category is broad by design, and can't fully describe the content it contains. The best way to connect posts as diverse as one about building a keyboard to rebuilding this site is a tag sitting above both. And for the tag to provide any value at all, it needs to be attached to at least two posts.
Stating the obvious, but deciding what your tags will be before you audit the content is pointless. As a body of work, there will be recurring themes and topics, and the content manager's job is to identify those strands and highlight them.
The process can lead to more insights, too. Is any tagged group so large that clicking on it filters nothing? Is any tagged group so small it has nothing to connect to? It's like dialling in the grind level on your favourite blend of espresso to get the right outcome.
The problem and the procedure
When I started the audit, six posts on this blog were about working with AI. Four of them sat under the Main Quest category. The other two sat under Side Quests. Sorted into their respective buckets, there was no connective tissue between them.
The library held a structural flaw that limited my options as a curator and your options as a reader. And the problem would compound with interest as more posts were published.
So, generative AI to the rescue? But of course. The procedure, if you'd like to try it for yourself.
Read the corpus. 20 posts, in full. Bodies, not just titles or excerpts.
Derive a set of candidate topics from what's actually there (rather than imposing a taxonomy the blog ought to have).
Count how often each candidate topic actually occurs across the library.
Propose every candidate tag with its post count visible, so thin ones are obvious before they exist.
Apply as a batch, mechanically, with the mapping fixed in advance.
Stage, review, publish. Nothing goes live unreviewed.
A snapshot of the tag library
The first result was 12 tags and 36 assignments, an average of 1.8 tags per post and three posts per tag.
Tag | Posts | Categories |
|---|---|---|
AI-Assisted | 6 | Main Quest, Side Quests |
Retro Gaming | 4 | Side Quests |
Accessibility | 3 | Main Quest |
Blogging | 3 | Main Quest |
Content Modelling | 3 | Main Quest |
Hardware | 3 | Side Quests |
Information Architecture | 3 | Main Quest |
Templates | 3 | Main Quest |
Contentful | 2 | Main Quest |
Design | 2 | Main Quest |
Film | 2 | Side Quests |
Machine-Readable | 2 | Main Quest |
Note the third column. Exactly one tag out of 12 spans both categories. The other 11 refine within a category rather than reaching across it, which means different tags are doing different jobs. Which is as it should be.
For application in practice, a cap of three tags per post is enforced within Contentful. Array fields take a size validation, so the CMS refuses a fourth tag altogether.
Who did what
"AI built me a taxonomy" isn't what happened: the real division of labour is more interesting than that.
Claude read 20 posts end to end and held all of them in view at once while proposing topics. It counted. It did the sizing arithmetic. It mapped 36 links across 20 entries without a transcription error, then re-audited afterwards to ensure the count was accurate.
The advantage there isn't intelligence, it's that all 20 posts could be held in view simultaneously. Claude could weigh post three against post 17 without its comprehension of either one fading. If I had to do it, there'd be a limit on how much information my feeble brain could retain at once – and I'm the guy who writes this stuff.
The part I played was to make judgement calls. For example, Structuring content like a trail of breadcrumbs legitimately wants four tags: Contentful, Content Modelling, Information Architecture, Machine-Readable. The cap only permits three, so the Contentful tag was pruned because the post had the least to say about it.
Elsewhere, a tag for "AI ethics" was proposed. I deferred it, because the third qualifying post hasn't been written yet. And honestly, I haven't decided if this blog needs to plough that particular furrow.
"AI-Assisted" was briefly renamed Claude and then reverted back within the hour, because three of those six posts were not about Claude. The tag describes a way of working, and narrowing it to a product would have collapsed exactly the cross-category link that justified the whole exercise.
All of this work should be extensible, too, as the blog grows and I find new subjects to explore and write about. The blogger's blueprint I wrote three months ago already feels stale (and the pace of change is exciting).
Applying the tags
Bulk editing a live content library is a task that'll make any site manager nervous.
The first move wasn't content at all, it was two amendments to the content model. A new Tag type, carrying a name, slug and description. And a new tags field on the existing Post type, an array of references that will only accept Tag entries.
Schema work is a web UI job here, and Contentful won't let you create entries against a type until it's been activated, so a new type is always two trips: build it, then fill it. After that, I used Claude together with the Contentful MCP integration to create the 12 tag entries.
When it came to applying the tags to the posts, Claude got through only two items on the list before a problem showed. Every update returned the whole entry, rich-text body and all, in order to change one field. And it was burning tokens at an alarming rate. Completing another 34 of those would have been the wrong use of the tool.
So the remaining mapping went into a script. 80 lines of plain Node talking to Contentful's management API from my own computer, with the table above hard-coded as its input.
Because the permissions I set for the Contentful MCP integration don't grant it publish, unpublish or delete rights in my space, every change landed as a draft. Contentful holds an edited published entry as "published with pending changes" and keeps serving the last published version until I hit publish.
In effect, nothing went live until I'd reviewed and tweaked the work in the UI.
The furniture
Of course, the 12 tags then needed somewhere to live. A glossary at /tags listing every tag with the posts that carry it, a page per tag at /tags/<slug>, pills on the listing cards, breadcrumbs.
None of this is novel nor unique. WordPress has been shipping tag archives for nearly two decades. The navigation I implemented made use of the plumbing already in place for authors and categories – robust and extensible.
One conditional rule inside the plumbing, though, to address how thin a topic might be. A tag needs two posts before it appears anywhere. Zero is a dead entry. One is a glossary heading announcing that something exists once and then linking nowhere else.
That threshold gates three things. Whether a tag appears in the glossary, whether the sitemap advertises it, and whether /tags/<slug> exists at all rather than returning a 404.
The ongoing overhead
Setting up the taxonomy for this site took an afternoon. Maintaining one is a longer term proposition, and that's the biggest challenge with tag systems. Six months in, a post might go out in a hurry with nothing on it, then another one, and the vocabulary slowly drifts into decoration.
Going forward, new posts arrive with tags proposed against the existing 12, the counts visible, and an argument attached if the post genuinely needs a whole new tag. The decisions are still editorial, but automation makes the process smoother. And dare I say it, more fun.
gouache illustration, a wall of wooden card catalogue drawers with small brass label fittings, one drawer pulled open showing a row of index cards, a single reader seen from behind flicking through the cards, wearing a green blazer, warm directional light from the upper left, deep crimson and warm cream palette, aged oak, editorial illustration, painterly brushwork, visible paper texture
