Curation Workflow Guide - Michael J Wright Digital Archive
Overview
This guide provides step-by-step instructions for curating content into the Fedora 6 repository, with emphasis on storing low-resolution, watermarked access copies in Fedora and storing full-resolution masters outside Fedora (referenced via metadata).
Prerequisites
Required Tools
- ImageMagick: For image conversion and watermarking (download)
- cURL or Postman: For API interactions (cURL bundled with Windows)
- Text Editor: For editing JSON metadata (VS Code, Notepad++, etc.)
Access Credentials
- Curator Account:
curator1/ChangeThisCuratorPassword789! - Admin Account:
AdminRob/ [strong password from .env]
Repository Endpoints
- Local Development:
http://localhost:8080/fcrepo/rest/ - Production (via Cloudflare):
https://data.michaeljwright.com.au/fcrepo/rest/
Note: Production endpoint uses automatic authentication via Cloudflare Worker. For curator-specific actions, test at localhost first.
Workflow 1: Curating a Painting
Step 1: Prepare Master File
Ensure you have the high-resolution archival master:
- Format: TIFF uncompressed or LZW
- Resolution: 300 DPI minimum
- Color Space: Adobe RGB 1998 or ProPhoto RGB
- File Naming:
MJW-P-YYYY-NNN_master.tif
Example: MJW-P-1987-042_master.tif
Step 2: Create Web Preview with Watermark
Using ImageMagick, convert the master to a web-optimized preview:
magick convert MJW-P-1987-042_master.tif `
-resize 1200x1200> `
-quality 80 `
-density 72 `
-colorspace sRGB `
-gravity SouthEast `
-pointsize 16 `
-fill white `
-stroke black `
-strokewidth 2 `
-annotate +20+20 "© Michael J Wright - Preview Only" `
MJW-P-1987-042_web.jpg
Verify:
- File size < 300 KB
- Longest edge ≤ 1200px
- Watermark visible in bottom-right corner
Step 3: Store Master File Separately
Move or copy the master file to external archive storage:
\\archive\paintings\1987\MJW-P-1987-042_master.tif
Or upload to cloud storage (AWS S3, Azure Blob, etc.)
Step 4: Prepare Metadata
Copy the painting template and fill in details:
cp templates/painting-template.json metadata-temp.json
Edit metadata-temp.json:
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"dcterms": "http://purl.org/dc/terms/",
"schema": "https://schema.org/"
},
"dc:title": "Coastal Landscape at Dusk",
"dc:creator": "Michael J Wright",
"dc:date": "1987-03",
"dc:type": "Painting",
"dc:format": "Oil on canvas",
"dc:rights": "Copyright © Michael J Wright. All rights reserved.",
"dc:description": "A moody depiction of the Australian coast at twilight, featuring windswept vegetation and turbulent seas",
"dc:subject": [
"Landscape",
"Seascape",
"Australian landscape",
"Coast"
],
"schema:artworkSurface": "76 x 101 cm",
"dc:identifier": "MJW-P-1987-042",
"dcterms:isPartOf": "Coastal Studies Series",
"schema:contentLocation": "Private collection, Melbourne",
"dcterms:hasFormat": {
"@id": "https://licensing.michaeljwright.com.au/masters/MJW-P-1987-042",
"dc:format": "image/tiff",
"schema:contentSize": "87340032",
"schema:encodingFormat": "TIFF; 16-bit; Adobe RGB; 300 DPI",
"dcterms:accessRights": "Restricted; commercial licensing required"
}
}
Consult:
docs/metadata-standards.mdfor field requirementsdocs/controlled-vocabularies.mdfor standardized terms
Step 5: Create Container in Fedora
Using cURL, create the container with metadata:
curl -X PUT `
-H "Content-Type: application/ld+json" `
--data-binary "@metadata-temp.json" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/paintings/coastal-studies/MJW-P-1987-042
Response: 201 Created with Location header
Step 6: Upload Web Preview Binary
Attach the web preview image to the container:
curl -X PUT `
-H "Content-Type: image/jpeg" `
-H "Content-Disposition: attachment; filename=MJW-P-1987-042_web.jpg" `
--data-binary "@MJW-P-1987-042_web.jpg" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/paintings/coastal-studies/MJW-P-1987-042/web-preview
Response: 201 Created
Step 7: Verify
Retrieve the resource to confirm:
curl -H "Accept: application/ld+json" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/paintings/coastal-studies/MJW-P-1987-042
Verify:
- Metadata fields present
- Binary link at
/web-preview dcterms:hasFormatpoints to external licensing URL
Step 8: View Web Preview
Access the image in browser:
http://localhost:8080/fcrepo/rest/paintings/coastal-studies/MJW-P-1987-042/web-preview
Check:
- Image displays correctly
- Watermark visible
- File downloads at correct size
Workflow 2: Curating a Photograph
Step 1: Prepare Master File
- Format: DNG (Digital Negative) or TIFF for archival
- Resolution: Native sensor resolution; 300 DPI for prints
- File Naming:
MJW-PH-YYYY-NNN_master.dng
Step 2: Create Web Preview
magick convert MJW-PH-1992-089_master.dng `
-resize 1024x1024> `
-quality 75 `
-density 72 `
-colorspace sRGB `
-gravity SouthEast `
-pointsize 14 `
-fill white `
-stroke black `
-strokewidth 2 `
-annotate +20+20 "© Michael J Wright - Preview Only" `
MJW-PH-1992-089_web.jpg
Step 3-8: Follow Same Process as Paintings
- Use
templates/photograph-template.jsonfor metadata - Create container under
/photographs/path - Upload web preview binary
- Store master separately
Container Path Example:
/fcrepo/rest/photographs/nature-studies/MJW-PH-1992-089
Workflow 3: Curating a Poem
Step 1: Prepare Text
- Save poem as plain text file:
MJW-PM-1995-018.txt - Or embed in metadata as
dc:descriptionif short
Step 2: Prepare Metadata
Use templates/poem-template.json:
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"dcterms": "http://purl.org/dc/terms/",
"schema": "https://schema.org/"
},
"dc:title": "The Weight of Winter",
"dc:creator": "Michael J Wright",
"dc:date": "1995",
"dc:type": "Poem",
"dc:format": "Text; 42 lines",
"dc:language": "en-AU",
"dc:rights": "Copyright © Michael J Wright. All rights reserved.",
"dc:description": "A meditation on loss and renewal through seasonal imagery",
"dc:subject": [
"Nature poetry",
"Australian literature",
"Seasons"
],
"dc:identifier": "MJW-PM-1995-018",
"schema:citation": "When the frost descends on sleeping fields",
"dcterms:isPartOf": "Winter Sonnets Collection",
"schema:contentLocation": "Artist's estate"
}
Step 3: Create Container
curl -X PUT `
-H "Content-Type: application/ld+json" `
--data-binary "@metadata-temp.json" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/poems/winter-sonnets/MJW-PM-1995-018
Step 4: Upload Poem Text (Optional)
If storing full text as binary:
curl -X PUT `
-H "Content-Type: text/plain; charset=utf-8" `
-H "Content-Disposition: attachment; filename=MJW-PM-1995-018.txt" `
--data-binary "@MJW-PM-1995-018.txt" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/poems/winter-sonnets/MJW-PM-1995-018/full-text
Alternative: Embed full text in dc:description if under ~500 words.
Workflow 4: Curating a Notebook
Step 1: Prepare Master Files
Notebooks are multi-page documents:
- Individual Pages:
MJW-NB-1989-003_p001_master.tif,p002, etc. - Compiled PDF:
MJW-NB-1989-003_master.pdf
Step 2: Create Web Previews for Sample Pages
Create previews for select pages (e.g., first page, representative spreads):
magick convert MJW-NB-1989-003_p001_master.tif `
-resize 1000x1000> `
-quality 70 `
-density 96 `
-colorspace sRGB `
-gravity SouthEast `
-pointsize 14 `
-fill white `
-stroke black `
-strokewidth 2 `
-annotate +20+20 "© Michael J Wright - Preview Only" `
MJW-NB-1989-003_p001_web.jpg
Step 3: Prepare Metadata
Use templates/notebook-template.json:
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"dcterms": "http://purl.org/dc/terms/",
"schema": "https://schema.org/"
},
"dc:title": "Field Notes - Outback Journey 1989",
"dc:creator": "Michael J Wright",
"dc:date": "1989-05/1989-08",
"dc:type": "Notebook",
"dc:format": "Handwritten journal; mixed media",
"dcterms:extent": "87 pages",
"dc:rights": "Copyright © Michael J Wright. All rights reserved.",
"dc:description": "Travel journal documenting 3-month journey through central Australia, includes sketches, poetry fragments, and botanical observations",
"dc:subject": [
"Travel writing",
"Australian outback",
"Artist notebooks"
],
"dc:identifier": "MJW-NB-1989-003",
"dcterms:tableOfContents": "Journey log (p.1-45), Sketches (p.46-67), Poems (p.68-87)",
"dcterms:relation": "Source material for 'Desert Series' paintings 1990-1991",
"schema:contentLocation": "Artist's estate",
"dcterms:hasFormat": {
"@id": "https://licensing.michaeljwright.com.au/masters/MJW-NB-1989-003",
"dc:format": "application/pdf",
"schema:contentSize": "523400192",
"schema:encodingFormat": "PDF; multipage TIFF sequence; 400 DPI",
"dcterms:accessRights": "Restricted; commercial licensing required"
}
}
Step 4: Create Container and Upload Sample Pages
Create notebook container:
curl -X PUT `
-H "Content-Type: application/ld+json" `
--data-binary "@metadata-temp.json" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/notebooks/outback-journals/MJW-NB-1989-003
Upload sample page previews:
curl -X PUT `
-H "Content-Type: image/jpeg" `
-H "Content-Disposition: attachment; filename=MJW-NB-1989-003_p001_web.jpg" `
--data-binary "@MJW-NB-1989-003_p001_web.jpg" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/notebooks/outback-journals/MJW-NB-1989-003/page-001-preview
Repeat for additional representative pages.
Container Hierarchy Strategy
Recommended Structure
/fcrepo/rest/
paintings/
coastal-studies/
MJW-P-1987-042
MJW-P-1988-015
desert-series/
MJW-P-1990-023
photographs/
nature-studies/
MJW-PH-1992-089
urban-fragments/
MJW-PH-1998-134
poems/
winter-sonnets/
MJW-PM-1995-018
nature-poetry/
MJW-PM-1993-007
notebooks/
outback-journals/
MJW-NB-1989-003
sketchbooks/
MJW-NB-1985-001
Container Type Selection
Use Basic Containers for maximum flexibility:
- Supports arbitrary hierarchies
- Easy to reorganize
- Compatible with all Fedora features
Creating Top-Level Containers
Before adding items, create series/category containers:
curl -X PUT `
-H "Content-Type: text/turtle" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/paintings/coastal-studies
This creates an empty container ready to hold individual artworks.
Image Preparation Checklist
Before uploading any visual work:
- Master file stored in external archive with correct naming (
MJW-TYPE-YYYY-NNN_master.ext) - Master file has embedded EXIF/IPTC copyright metadata
- Web preview created with correct dimensions (1200px paintings, 1024px photos, 1000px notebooks)
- Web preview compressed to < 300 KB file size
- Web preview has visible watermark in bottom-right corner
- Web preview saved as
MJW-TYPE-YYYY-NNN_web.jpg - Metadata JSON prepared using appropriate template
- Catalog ID follows convention (
MJW-TYPE-YYYY-NNN) - Subject keywords selected from controlled vocabulary
-
dcterms:hasFormatpoints to external licensing URL
Metadata Update Workflow
To update metadata on an existing resource:
Step 1: Retrieve Current Metadata
curl -H "Accept: application/ld+json" `
-u curator1:ChangeThisCuratorPassword789! `
http://localhost:8080/fcrepo/rest/paintings/coastal-studies/MJW-P-1987-042 > current-metadata.json
Step 2: Edit Metadata
Modify current-metadata.json with changes.
Step 3: Update via PATCH (SPARQL)
Use SPARQL UPDATE to modify specific triples:
curl -X PATCH `
-H "Content-Type: application/sparql-update" `
-u curator1:ChangeThisCuratorPassword789! `
--data-binary @- `
http://localhost:8080/fcrepo/rest/paintings/coastal-studies/MJW-P-1987-042 << 'EOF'
PREFIX dc: <http://purl.org/dc/elements/1.1/>
DELETE { <> dc:description ?old }
INSERT { <> dc:description "Updated description with more detail about the painting" }
WHERE { <> dc:description ?old }
EOF
Step 4: Add Modification Timestamp
curl -X PATCH `
-H "Content-Type: application/sparql-update" `
-u curator1:ChangeThisCuratorPassword789! `
--data "PREFIX dcterms: <http://purl.org/dc/terms/> INSERT { <> dcterms:modified \"2025-11-03T10:30:00Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime> } WHERE {}" `
http://localhost:8080/fcrepo/rest/paintings/coastal-studies/MJW-P-1987-042
Bulk Import Considerations
If you have many items to curate, consider:
- CSV Inventory: Create spreadsheet with catalog IDs, titles, dates, subjects, etc.
- Scripted Conversion: Write script to generate JSON metadata from CSV
- Batch Processing: Use ImageMagick batch commands to process all images
- Automated Upload: Script cURL commands to iterate through files
Example PowerShell script skeleton:
$csv = Import-Csv "inventory.csv"
foreach ($item in $csv) {
$catalogId = $item.CatalogID
$title = $item.Title
# ... build JSON metadata
# ... run ImageMagick conversion
# ... execute cURL upload
}
Recommendation: Start with manual workflow for first 5-10 items to validate process, then automate.
Troubleshooting
Authentication Errors
Error: 401 Unauthorized
Solution: Verify credentials; check that container is restarted with latest .env values
Binary Upload Fails
Error: 413 Payload Too Large
Solution: Web preview should be < 300 KB; re-compress image
Metadata Validation Errors
Error: 400 Bad Request with JSON parse error
Solution: Validate JSON syntax at jsonlint.com; check quotes, commas, brackets
Container Already Exists
Error: 409 Conflict
Solution: Resource at that path exists; use different path or DELETE existing resource first
Watermark Not Visible
Issue: Watermark blends into image background
Solution: Adjust -stroke color or add shadow; test with -strokewidth 3 for more contrast
Quality Assurance
After ingestion, verify:
- Metadata Completeness: All required fields populated
- Keyword Accuracy: Terms match controlled vocabularies
- Image Quality: Web preview displays correctly; watermark visible
- File Naming: Follows convention exactly
- Master Archival: Full-resolution file safely stored externally
- Licensing Link:
dcterms:hasFormatpoints to correct URL - Accessibility: Public can view web preview without authentication (via Cloudflare Worker)
Next Steps
After completing initial curation:
- Review
docs/metadata-standards.mdfor field definitions - Consult
docs/controlled-vocabularies.mdwhen adding keywords - Refer to
docs/image-resolution-strategy.mdfor technical specs - Use
templates/*.jsonfor consistent metadata structure - Plan IIIF integration for enhanced image viewing
- Consider OAI-PMH harvesting setup for broader discovery