Building a Tag-Driven Metadata System for Political Domain Classification
Overview
As my civic-tech platform evolved, the complexity of classification increased: I needed to track ministry types, cabinet roles, party types (left, regional, royalist), election kinds, and more. Rather than hardcoding categories, I built a tag-driven metadata system.
This post explains the design and use cases for tag-based classification across multiple resources.
Use Cases for Tags
Tags allowed flexible classification of:
- Ministries (e.g., “Infrastructure”, “Defense”, “Education”)
- Parties (e.g., “Leftist”, “Royalist”, “Regional”, “New”)
- Governments (e.g., “Caretaker”, “Interim”)
- Scandals (e.g., “Corruption”, “Misuse of Funds”)
- Leaders (e.g., “Military Background”, “Convicted”)
Schema Design
Tags are defined in a central table:
model Tag {
id Int @id @default(autoincrement())
name String
nameLocal String?
type String // e.g. 'MINISTRY_TYPE', 'PARTY_TYPE', 'LEADER_FLAG'
}
model TagLink {
id Int @id @default(autoincrement())
tagId Int
resourceType String // 'PARTY', 'LEADER', 'GOVERNMENT', etc.
resourceId Int
}
This design supports many-to-many relations across arbitrary resource types.
Frontend Usage
Tags are used in listings and detail pages. Example use:
{tags.map(tag => (
<Badge key={tag.id}>{i18n.language === 'np' ? tag.nameLocal : tag.name}</Badge>
))}
They’re filterable in search and used to group similar entries across the app.
Dynamic Filtering
Tags also drive dynamic filters in dashboards. For example:
filters: [
{ label: 'Leftist Parties', value: 'LEFTIST' },
{ label: 'Royalist', value: 'ROYALIST' }
]
Tag Suggestions + Admin Tools
Admins can:
- Suggest tags while editing a resource
- View and manage global tag lists
- Localize tag names from admin panel
Benefits
This system allowed:
- Dynamic taxonomy management
- Reusable logic across many models
- Easy localization
- Classification at scale
Summary
Tags replaced hardcoded booleans and enums with flexible metadata. They power filtering, grouping, labeling, and classification across the civic data ecosystem.
In the next article, I’ll break down how I used full-text search for discovering parties, leaders, elections, and more in both English and Nepali.