Skip to main content

Dzaleka Metadata Standard (DMS)

License: MIT License: CC BY 4.0 Python 3.10+ Schema: v1.1.0

An open-source metadata specification and toolkit for describing, organising, and sharing digital heritage content from Dzaleka Refugee Camp.


What is DMS?

The Dzaleka Metadata Standard (DMS) is an open-source metadata specification and toolkit designed to describe, organise, and share digital heritage content from Dzaleka Refugee Camp in Malawi.

It provides a standardised, interoperable, and reusable schema for heritage items such as stories, photos, documents, audio, and events.

🧭 Purpose

The purpose of DMS is to:

  • Enable consistent metadata creation for heritage assets
  • Support discoverability, interoperability, and reuse of heritage data
  • Provide tools to validate, manage, and export metadata
  • Serve as an open standard for heritage documentation

DMS helps both technical systems and community contributors work with heritage content in a structured way.

📦 What DMS Includes

📌 Metadata Schema

A machine-readable specification defining fields, types, and constraints for heritage metadata.

Available formats:

🛠️ Python Tools & Web UI

A suite of tools for creating, validating, and converting metadata records. Includes a command-line interface and a local web workspace built with Kumo. See Quick Start below.

📖 Documentation

Field definitions, best practices, and tutorials for metadata entry. See Documentation.

📁 Example Records

Sample records covering stories, photos, documents, audio, and events. See Examples.


Quick Start

Installation

# Clone the repository
git clone https://github.com/Dzaleka-Connect/Dzaleka-Metadata-Standard.git
cd dzaleka-metadata-standard

# Install the CLI tools
pip install -e .

# Optional: full-screen terminal workspace
pip install -e ".[tui]"

The terminal workspace

In a real terminal, run dms with no arguments — the same way you would open Grok Build. It starts a full-screen, keyboard-first workspace for browsing local records, validation, vocabularies, and schema fields. Nothing is uploaded, and nothing on disk is changed.

dms
dms tui --dir examples/
dms tui --light

/ focuses search, Ctrl+P opens the command palette, Ctrl+T toggles the night and day themes, and Q quits. Use dms init, dms validate, and dms web when you need to create or edit records.

The Web UI

To create, validate, and manage records in a browser, start the local workspace:

dms web --port 8080 --dir records/

The DMS workspace includes a schema-driven editor, searchable records, JSON import, JSON/JSON-LD downloads, and a Vocabulary workspace for term lookups and structured references. Unsaved drafts are protected when switching to another record.

The Sources workspace can read published Dzaleka Services collections — including the Encyclopedia API — and prepare local drafts for review. Loading a collection is opt-in; local record contents are never uploaded. Review consent and reuse rights before sharing.

React and Kumo assets are bundled with the Python package. Node.js and a CDN connection are not needed to run the installed app. This is a localhost workspace, not an authenticated public hosting service. Rights metadata does not enforce filesystem access.

This also exposes a local vocabulary API at http://127.0.0.1:8080/api/taxonomy for DMS term lookups, deprecations, change logs, and JSON-LD/Turtle/RDF/XML output.

Create a Record via CLI

# Interactive wizard
dms init

# Skip type selection prompt
dms init --type poem

# Save to specific file
dms init --output my-record.json

Validate a Record

# Single file
dms validate examples/story.json

# All files in a directory
dms validate --dir examples/

Search & Analyze

# Search records by type, subject, or free-text
dms search --dir records/ --type poem -q "displacement"

# View collection analytics (types, languages, completion)
dms stats --dir records/

# Generate a browsable HTML catalogue of your collection
dms report --dir records/ --output catalogue.html

Interoperability Tools

# Export record(s) as JSON-LD for semantic web
dms export examples/story.json

# Convert CSV batch to JSON records
dms convert csv2json examples/batch.csv

# Compare two records field-by-field
dms diff record_v1.json record_v2.json

View Schema Info

dms info

Schema Overview

A DMS record describes a single heritage item with these fields:

Field Required Description
id ✅ Unique identifier (UUID)
title ✅ Name of the item
type ✅ Category: story, photo, document, audio, video, event, map, artwork, site, poem
description ✅ Narrative context
language ✅ Language code (BCP 47)
creator Recommended Who created it (name, role, affiliation)
date Recommended When it was created or occurred
subject Recommended Controlled tags and keywords
subject_ref Optional Structured subject identifiers and scheme references
location Recommended Place name, area, coordinates
rights Recommended License, access level, holder
source Optional Contributor, collection, original format
format Optional MIME type of the digital object
technical Optional File-level technical metadata
relation Optional IDs of related records
relation_detail Optional Typed relationships to related records or resources
coverage Optional Time period covered

All fields map to Dublin Core for broad interoperability, with Dzaleka-specific extensions for camp areas and access levels.

Repository Structure

├── dms/                 Python CLI tools
│   ├── cli.py           Command entry points
│   ├── terminal.py      Full-screen terminal workspace
│   ├── validator.py     Schema validation engine
│   ├── generator.py     Interactive record creator
│   ├── converter.py     CSV ↔ JSON converter
│   └── taxonomy.py      Local vocabulary service and serializers
│
│   data/schema/         Schema definitions
│   ├── dms.json         JSON Schema (Draft 2020-12)
│   ├── dms.yaml         YAML version
│   └── dms.jsonld       JSON-LD context for linked data
│
│   data/taxonomy/       DMS vocabulary files
│   └── types.json       Curated heritage item type vocabulary
│
├── docs/                Documentation
│   ├── field-guide.md   Field definitions & guidelines
│   ├── best-practices.md Metadata entry best practices
│   ├── semantic-tagging.md Controlled vocabularies and richer subject metadata
│   ├── taxonomy-api.md  Local vocabulary API endpoints and formats
│   └── getting-started.md Installation & tutorial
│
├── examples/            Sample records
│   ├── story.json       Oral history
│   ├── photo.json       Photograph
│   ├── document.json    Administrative record
│   ├── audio.json       Music recording
│   ├── event.json       Community event
│   ├── site.json        Heritage site (Site Register)
│   ├── mural.json       Public artwork (Art Catalogue)
│   ├── poem.json        Poetry
│   └── batch.csv        CSV batch import example
│
└── tests/               Test suite

Examples

The examples/ directory contains sample records for common heritage item types:

Documentation

  • Field Guide — Detailed definitions for every schema field
  • Best Practices — Guidelines for quality metadata entry
  • Semantic Tagging — DMS guidance for controlled vocabularies and richer subject metadata
  • Taxonomy API — Query vocabularies, terms, deprecations, and semantic formats
  • Getting Started — Installation and first steps tutorial

Interoperability

DMS is designed to work with existing standards and systems. The dms.jsonld context enables linked data publishing with mappings to:

Vocabulary Prefix Used for
Dublin Core dc:, dcterms: Core metadata fields (title, creator, subject, rights, etc.)
FOAF foaf: Person/Agent descriptions (foaf:name, foaf:Person, foaf:Image)
BIBO bibo: Bibliographic roles (bibo:editor, bibo:translator, bibo:interviewer)
Schema.org schema: Creative works, places, events, affiliations
W3C Geo geo: Geographic coordinates (geo:lat, geo:long)
SKOS skos: Subject vocabularies and concept schemes

Additional format support:

  • CSV — Import/export for spreadsheet-based workflows
  • JSON Schema — Machine-readable validation for any language or platform

Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

Areas where you can help:

  • 📝 Adding example records from the Dzaleka community
  • 🌐 Translating documentation into Swahili, French, or Kinyarwanda
  • 🔧 Improving the CLI tools
  • 📖 Writing guides for specific use cases
  • 🐛 Reporting bugs and suggesting improvements

License

Acknowledgments

  • The Dzaleka refugee community for their heritage, stories, and resilience
  • Dublin Core Metadata Initiative for the foundational metadata standard
  • All contributors and volunteers who help preserve Dzaleka's digital heritage

Preserving heritage. Empowering community. Building the future.

Metadata

Release files for dzaleka-metadata-standard 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dzaleka-metadata-standard 1.3.0
File Size Uploaded
dzaleka_metadata_standard-1.3.0.tar.gz 315.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dzaleka-metadata-standard 1.3.0
File Interpreter ABI Platform
dzaleka_metadata_standard-1.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 589.9 kB

Release files / dzaleka_metadata_standard-1.3.0.tar.gz

Download URL dzaleka_metadata_standard-1.3.0.tar.gz
Size 315.4 kB
Tags Source
SHA-256 checksum
How to use checksums
ed055a43b378029f6be7bd83da4bd0b0a8af82efcec0cceca4de32cff8578008
BLAKE2b-256 checksum
How to use checksums
abe64f3481dd1f2f1cc42248d8e519bc04b7cca17d2502743f8483aac26ed8d9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.

Transparency log

Release files / dzaleka_metadata_standard-1.3.0-py3-none-any.whl

Download URL dzaleka_metadata_standard-1.3.0-py3-none-any.whl
Size 274.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
daaaf2cb67e34c17e0197c882291d7404aaf7c51cf60f6ca53da0981c01e1ef4
BLAKE2b-256 checksum
How to use checksums
7ddb817ed54ac6c3e3eebdbb91d4387ff89fb11ea051297c899bae6b2c37b5fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.

Transparency log

Release history Release notifications | RSS feed

1.4.0

2 release files

This release

1.3.0 This release

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page