Dzaleka Metadata Standard (DMS)
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:
- JSON Schema —
dms/data/schema/dms.json(Draft 2020-12) - YAML Schema —
dms/data/schema/dms.yaml - JSON-LD / RDF —
dms/data/schema/dms.jsonldfor semantic web / linked data use
🛠️ 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 .
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 seven published Dzaleka Services collections 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
│ ├── 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:
- story.json — "Journey to Dzaleka: A Story of Hope" (oral history)
- photo.json — "Market Day at Dzaleka" (daily life photography)
- document.json — "Community School Registration Records, 2018"
- audio.json — "Traditional Songs of the Great Lakes Region"
- event.json — "World Refugee Day Celebration 2024"
- site.json — "Dzaleka Health Centre" (from Site Register)
- mural.json — "Child Early Marriage Awareness Mural" (from Art Catalogue)
- poem.json — "Home Is a Word I Carry" (poetry)
- batch.csv — Records in CSV format for batch import
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
- Code (Python tools): MIT License
- Schema & Documentation: Creative Commons Attribution 4.0
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.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dzaleka_metadata_standard-1.2.0.tar.gz | 298.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dzaleka_metadata_standard-1.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 558.5 kB
Release files / dzaleka_metadata_standard-1.2.0.tar.gz
| Download URL | dzaleka_metadata_standard-1.2.0.tar.gz |
|---|---|
| Size | 298.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ced36dc35d20a9332cd4502bfcb1a10b3a7be7d6fafe04d8dac2e005068d59e5
|
|
BLAKE2b-256 checksum How to use checksums |
5b5f85da8b6e7e0d06c2a52d833a611e3b0307ea6a9c9adef0505a13fa04d7b2
|
| 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 logRelease files / dzaleka_metadata_standard-1.2.0-py3-none-any.whl
| Download URL | dzaleka_metadata_standard-1.2.0-py3-none-any.whl |
|---|---|
| Size | 260.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
193482307c969af1c1b9296648cce45b33bc0dfc527d2dea610a717240c7f176
|
|
BLAKE2b-256 checksum How to use checksums |
c2c320d16c2497ef4f811507441992d7786b9c8e2b68fca898765b1fe50b9f9b
|
| 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