Sign inSign up

jptmoore/miiify

By jptmoore

•Updated 8 months ago

A web annotation server built using the same principles as Git

Image
Databases & storage
0

2.9K

jptmoore/miiify repository overview

⁠Introduction

Miiify is a light-weight web annotation server using an embedded database. Its primary use case is to support IIIF⁠ applications. There is a choice of two storage backends:

⁠git

Designed to be compatible with the Git protocol. This means annotations can be added or edited using standard git flow mechanisms such as a pull request and all new content can go through a review process before going public.

⁠pack

Designed to be highly-scalable and disk efficient. This backend uses technology that is part of the distributed ledger used within the Tezos blockchain.

⁠Getting started

Miiify can be run with Docker using either the git or pack backend. The example below uses the pack backend.

⁠Starting server
docker compose pull pack
docker compose up pack -d
⁠Check the server is running
http :
⁠Stopping server
docker compose down pack
⁠Basic concepts

Annotations are organised into containers and can be retrieved in pages to display within IIIF viewers such as Mirador⁠. To filter the annotation page to a specific IIIF canvas an additional target parameter can be supplied. The examples below use httpie⁠ with a live demo server which spins down when inactive.

Create an annotation container called my-container:

https miiify.onrender.com/annotations/ < miiify/test/container1.json Slug:my-container

Add an annotation called foobar to my-container:

https miiify.onrender.com/annotations/my-container/ < miiify/test/annotation1.json Slug:foobar

Add another annotation but use a system generated id:

https miiify.onrender.com/annotations/my-container/ < miiify/test/annotation1.json

Retrieve the first annotation page from my-container:

https miiify.onrender.com/annotations/my-container/\?page\=0

produces:

{
    "@context": "http://iiif.io/api/presentation/3/context.json",
    "id": "https://miiify.onrender.com/annotations/my-container/?page=0",
    "items": [
        {
            "@context": "http://www.w3.org/ns/anno.jsonld",
            "body": "http://example.org/post1",
            "created": "2023-12-07T17:13:18Z",
            "id": "https://miiify.onrender.com/annotations/my-container/4acb2493-96b2-4efb-a5aa-044cde1408f0",
            "target": "http://example.com/page1",
            "type": "Annotation"
        },
        {
            "@context": "http://www.w3.org/ns/anno.jsonld",
            "body": "http://example.org/post1",
            "created": "2023-12-07T17:11:44Z",
            "id": "https://miiify.onrender.com/annotations/my-container/foobar",
            "target": "http://example.com/page1",
            "type": "Annotation"
        }
    ],
    "partOf": {
        "created": "2023-12-07T17:10:20Z",
        "id": "https://miiify.onrender.com/annotations/my-container/",
        "label": "A Container for Web Annotations",
        "total": 2,
        "type": "AnnotationCollection"
    },
    "startIndex": 0,
    "type": "AnnotationPage"
}

Retrieve the first annotation page from my-container but filter annotations based on their target:

https miiify.onrender.com/annotations/my-container/ < miiify/test/annotation3.json
https miiify.onrender.com/annotations/my-container/\?page\=0\&target\=http://example.com/page3

produces:

{
    "@context": "http://iiif.io/api/presentation/3/context.json",
    "id": "https://miiify.onrender.com/annotations/my-container/?page=0&target=http://example.com/page3",
    "items": [
        {
            "@context": "http://www.w3.org/ns/anno.jsonld",
            "body": "http://example.org/post3",
            "created": "2023-12-07T17:15:47Z",
            "id": "https://miiify.onrender.com/annotations/my-container/20375636-3af4-44e4-b005-b5c5e625ec85",
            "target": "http://example.com/page3",
            "type": "Annotation"
        }
    ],
    "partOf": {
        "created": "2023-12-07T17:10:20Z",
        "id": "https://miiify.onrender.com/annotations/my-container/",
        "label": "A Container for Web Annotations",
        "total": 3,
        "type": "AnnotationCollection"
    },
    "startIndex": 0,
    "type": "AnnotationPage"
}

Retrieve a single annotation:

https miiify.onrender.com/annotations/my-container/foobar

produces

{
    "@context": "http://www.w3.org/ns/anno.jsonld",
    "body": "http://example.org/post1",
    "created": "2023-12-07T17:11:44Z",
    "id": "https://miiify.onrender.com/annotations/my-container/foobar",
    "target": "http://example.com/page1",
    "type": "Annotation"
}
⁠Tutorial

Simple video tutorial⁠ to show how to create annotations and display them in the Mirador IIIF viewer.

⁠Other key features
  • Support for validating annotations using ATD⁠
  • Easy to use with Docker and Kubernetes
  • Support for ETag caching and collision avoidance
  • Simple key/value interface for working with IIIF manifests
⁠Building from source

To build your own native Docker images:

cd miiify/test
./build.sh pack
⁠Documentation

API specification⁠

Tag summary

Content type

Image

Digest

sha256:bab5a74f9…

Size

100.6 MB

Last updated

8 months ago

docker pull jptmoore/miiify