New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IIIF Viewers with IPFS #240

Open
diasdavid opened this Issue Apr 15, 2017 · 67 comments

Comments

Projects
None yet
8 participants
@diasdavid
Member

diasdavid commented Apr 15, 2017

IIIF (International Image Interoperability Framework) is hosting a conference at the Vatican on June 5-9. We (@diasdavid and @flyingzumwalt) will be present at that conference to talk about the benefits of using decentralized Web technologies that institutions like IIIF can benefit from.

We will be collaborating with @edsilv and @aeschylus to prepare a demo to showcase at the conference, of both Mirador and UniversalViewer using IPFS to exchange and update annotations made on the images. This issue will be used to coordinate this effort as a main central hub.

Mirador and UniversalViewer are both viewers of IIIF data that follow IIIF defined data model, they are created by independent researchers, but there is a lot of collaboration and idea sharing.

From the design thinking we've done, we know that we need:

  • A way to propagate changes on the Annotation List
  • A way to synchronize the state of the Annotation List for each document.

This converts into roughly the following milestones:

  1. Mechanism to propagate changes on the annotation list (this can be using libp2p pubsub directly)
  2. Synchronize the Annotation list through IPFS directly (using orbit-db or another CRDT library that is mounted on top of IPFS
  3. Load the entire collection of images into the viewer through IPFS itself
  4. Load and run the entire viewer using only js-ipfs, requiring no plugins installed.

This suggested that we just need to create primitives for get and put with the ability to follow changes or updated in a document, once that part is done, it can be fully integrated.

Other important pieces of context:

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid Apr 17, 2017

Member

alright, just had a good chat with @pgte on this endeavor, he is in!

To move forward:

  • @edsilv and @aeschylus, could you provide current Annotation List examples, changes, updates and so on.
  • There is a lot of room to explore here, but I feel that the milestones described above are the best to start with, let me know if you feel something should be added from the start.
  • We should set a weekly standup to make sure this demo is progressing and needs are met. @edsilv, @aeschylus, @flyingzumwalt would you be available to do this? I can set up a Doodle.

Let's try to all meet this week :)

Member

diasdavid commented Apr 17, 2017

alright, just had a good chat with @pgte on this endeavor, he is in!

To move forward:

  • @edsilv and @aeschylus, could you provide current Annotation List examples, changes, updates and so on.
  • There is a lot of room to explore here, but I feel that the milestones described above are the best to start with, let me know if you feel something should be added from the start.
  • We should set a weekly standup to make sure this demo is progressing and needs are met. @edsilv, @aeschylus, @flyingzumwalt would you be available to do this? I can set up a Doodle.

Let's try to all meet this week :)

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Apr 17, 2017

Great! Here's an example of an AnnotationList:

https://wellcomelibrary.org/annoservices/search/b18035723?q=gene

(http://iiif.io/model/shared-canvas/1.0/#AnnotationList)

This is the format Mirador uses to store annotations and the UV uses to display search results.

This will eventually be replaced with the Web Annotation Data Model as part of IIIF Presentation API 3.0, but this is still some way off:

IIIF/api#496

(https://www.w3.org/TR/annotation-model/#annotation-collection)

Milestone 3 states that the images should be loaded over IPFS. Currently we only have this very simple fully-IPFS-enabled IIIF manifest: http://universalviewer.io/examples/?manifest=https%3A%2F%2Fipfs.io%2Fipfs%2FQmYomyCpT1vKNovYvTjAStYq31JoaH8xdivjmWcDj5mpM1

Milestone 4 would require some work from @aeschylus to port Mirador to be able to be loaded over IPFS. Currently the UV can be loaded using the ipfs.io gateway. Are you suggesting that we bypass the gateway and use js-ipfs to load all of the viewer assets?

Perhaps in order to keep things manageable initially we could focus on enabling serverless communication between the viewers over js-ipfs, with the viewers themselves and IIIF manifests being loaded over HTTP. We could then move on to fully IPFS-ifying the viewers and IIIF manifests + assets?

I need to complete the work that will allow me to update the UV search results programmatically as opposed to on user interaction. This will be necessary to be able to respond to the IPFS annotation endpoint. I'm working on giving the UV an external API and expect this to be ready in the next few weeks.

We will also need to be able to specify the annotation endpoint to subscribe to somehow when starting the viewers. Perhaps a text field that we paste the name of the endpoint into?

A weekly standup sounds good!

edsilv commented Apr 17, 2017

Great! Here's an example of an AnnotationList:

https://wellcomelibrary.org/annoservices/search/b18035723?q=gene

(http://iiif.io/model/shared-canvas/1.0/#AnnotationList)

This is the format Mirador uses to store annotations and the UV uses to display search results.

This will eventually be replaced with the Web Annotation Data Model as part of IIIF Presentation API 3.0, but this is still some way off:

IIIF/api#496

(https://www.w3.org/TR/annotation-model/#annotation-collection)

Milestone 3 states that the images should be loaded over IPFS. Currently we only have this very simple fully-IPFS-enabled IIIF manifest: http://universalviewer.io/examples/?manifest=https%3A%2F%2Fipfs.io%2Fipfs%2FQmYomyCpT1vKNovYvTjAStYq31JoaH8xdivjmWcDj5mpM1

Milestone 4 would require some work from @aeschylus to port Mirador to be able to be loaded over IPFS. Currently the UV can be loaded using the ipfs.io gateway. Are you suggesting that we bypass the gateway and use js-ipfs to load all of the viewer assets?

Perhaps in order to keep things manageable initially we could focus on enabling serverless communication between the viewers over js-ipfs, with the viewers themselves and IIIF manifests being loaded over HTTP. We could then move on to fully IPFS-ifying the viewers and IIIF manifests + assets?

I need to complete the work that will allow me to update the UV search results programmatically as opposed to on user interaction. This will be necessary to be able to respond to the IPFS annotation endpoint. I'm working on giving the UV an external API and expect this to be ready in the next few weeks.

We will also need to be able to specify the annotation endpoint to subscribe to somehow when starting the viewers. Perhaps a text field that we paste the name of the endpoint into?

A weekly standup sounds good!

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Apr 18, 2017

At the bottom of https://wellcomelibrary.org/annoservices/search/b18035723?q=gene you'll see a hits array. This is extra data to provide context to search results. We don't need to worry about this as the UV doesn't require it.

edsilv commented Apr 18, 2017

At the bottom of https://wellcomelibrary.org/annoservices/search/b18035723?q=gene you'll see a hits array. This is extra data to provide context to search results. We don't need to worry about this as the UV doesn't require it.

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid Apr 19, 2017

Member

Let's find the time for that weekly standup

@edsilv @pgte @flyingzumwalt @aeschylus please fill: https://doodle.com/poll/bqpzs9xxzfde25pc

Everyone else is welcome to add their availability if they are interested in actively participating in this endeavor, otherwise, we will have to favor the schedule of the people contributing. Thank you :)

Member

diasdavid commented Apr 19, 2017

Let's find the time for that weekly standup

@edsilv @pgte @flyingzumwalt @aeschylus please fill: https://doodle.com/poll/bqpzs9xxzfde25pc

Everyone else is welcome to add their availability if they are interested in actively participating in this endeavor, otherwise, we will have to favor the schedule of the people contributing. Thank you :)

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid Apr 20, 2017

Member

\o/ woot, we have a schedule! :)

Every friday at:

image

Zoom URL is: https://zoom.us/j/131133322

Member

diasdavid commented Apr 20, 2017

\o/ woot, we have a schedule! :)

Every friday at:

image

Zoom URL is: https://zoom.us/j/131133322

@aeschylus

This comment has been minimized.

Show comment
Hide comment
@aeschylus

aeschylus Apr 20, 2017

Great!

I'll look forward to speaking to everyone on the 28th. For reference, here is the link to a fork of orbitdb we've made where the main example has been tossed up to work as a textarea.

https://github.com/viewdir/orbit-db/tree/initial-hacking

More context is in orbitdb/orbit-db#213, noted above.

aeschylus commented Apr 20, 2017

Great!

I'll look forward to speaking to everyone on the 28th. For reference, here is the link to a fork of orbitdb we've made where the main example has been tossed up to work as a textarea.

https://github.com/viewdir/orbit-db/tree/initial-hacking

More context is in orbitdb/orbit-db#213, noted above.

@flyingzumwalt

This comment has been minimized.

Show comment
Hide comment
@flyingzumwalt

flyingzumwalt Apr 21, 2017

Standup Friday April 21

Agenda

  • Welcome
  • Round of Intros
  • Define target for next week

Misc:

Recent Article about using pubsub on IPFS

Notes

There are 2 main vierwers in the IIIF space

  • Mirador (Stanford, Mellon-funded), which is more of a scholarly workbench and a tool for authoring annotations.
  • Universal Viewer, aka "UV"(Wellcome Trust, British Library) - more of a generic viewer for many data formats (Image, PDF, Video, 3D objects...)

Main IIIF APIs:

  • Images api - way to display images from an image service
  • Presentation api - way of listing canvases (ie. a series of pages)

Other Apis: search, annotation, etc.

  • new annotations API will use the WebAnnotations Model (w3c spec)
    • lets you create AnnotationList objects

The Demo: Serverless IIIF Image Annotations

  • mirador producing annotations, writing them ot IPFS & UV showing those annotations -- completely serverless collaborative editing of the annotations

Work Done so Far

Drew and Ed got a basic version of UV running on orbit-db. they got it working but ran into troubles with orbit and confusion about what they should do

Questions:

  • Will the IPFS daemon run in the browser? Will people have to run a go-ipfs daemon in order to use IPFS pubsub?
    • 2 attempts: one in november 2016 with @dignifiedquire. Then again in March 2017 using the latest orbit-db (hoping that they would be able to to pure js implementation)

Q: can we use js-ipfs?
A: you can use either. go-ipfs has some features that js-ipfs doesn't have

Current Work

NEED for demo:
Easy way for everyone in the room to get the demo code, including a working IPFS node

  • needs ipfs-download.js, or something similar

Theatrics of the demo:

  • everyone downloading ipfs binaries over HTTP will be slow
  • everyone downloading IIIF tiles over HTTP will be slow
  • everyone downloading IIIF tiles over IPFS ifs they have ipfs running will (should?) be much faster

Where the work will happen:

  • @pgte will create a repo for this annotations-pubsub work in github.com/pgte/ ... we might create an "ipfs-labs" github org for this kind of work to live
  • the first-pass version of this demo only relies on ipfs, which includes ipfs-pubsub. it doesn't need CRDTs, so doesn't need orbit-db
  • if we have time before the demo, we will add CRDT support.

Action Items:

  • figure out what the annotations pubsub API should look like
  • get basic annotations on pubsub working in both viewers
    • updates are the whole blob of annotations (refresh the whole list on every change)
  • prepare the theatrics of the demo
  • Add CRDTs (deal with chronological order of annotations with many editors)

What Ed & Drew need:

  • (pubsub consumer) a way for mirador & UV to listen for an event telling you that something has changed
  • (pubsub producer) a way to send updates when you have changed something
  • a way to declare a pubsub topic/channel and subscribe to it

Standup Friday April 21

Agenda

  • Welcome
  • Round of Intros
  • Define target for next week

Misc:

Recent Article about using pubsub on IPFS

Notes

There are 2 main vierwers in the IIIF space

  • Mirador (Stanford, Mellon-funded), which is more of a scholarly workbench and a tool for authoring annotations.
  • Universal Viewer, aka "UV"(Wellcome Trust, British Library) - more of a generic viewer for many data formats (Image, PDF, Video, 3D objects...)

Main IIIF APIs:

  • Images api - way to display images from an image service
  • Presentation api - way of listing canvases (ie. a series of pages)

Other Apis: search, annotation, etc.

  • new annotations API will use the WebAnnotations Model (w3c spec)
    • lets you create AnnotationList objects

The Demo: Serverless IIIF Image Annotations

  • mirador producing annotations, writing them ot IPFS & UV showing those annotations -- completely serverless collaborative editing of the annotations

Work Done so Far

Drew and Ed got a basic version of UV running on orbit-db. they got it working but ran into troubles with orbit and confusion about what they should do

Questions:

  • Will the IPFS daemon run in the browser? Will people have to run a go-ipfs daemon in order to use IPFS pubsub?
    • 2 attempts: one in november 2016 with @dignifiedquire. Then again in March 2017 using the latest orbit-db (hoping that they would be able to to pure js implementation)

Q: can we use js-ipfs?
A: you can use either. go-ipfs has some features that js-ipfs doesn't have

Current Work

NEED for demo:
Easy way for everyone in the room to get the demo code, including a working IPFS node

  • needs ipfs-download.js, or something similar

Theatrics of the demo:

  • everyone downloading ipfs binaries over HTTP will be slow
  • everyone downloading IIIF tiles over HTTP will be slow
  • everyone downloading IIIF tiles over IPFS ifs they have ipfs running will (should?) be much faster

Where the work will happen:

  • @pgte will create a repo for this annotations-pubsub work in github.com/pgte/ ... we might create an "ipfs-labs" github org for this kind of work to live
  • the first-pass version of this demo only relies on ipfs, which includes ipfs-pubsub. it doesn't need CRDTs, so doesn't need orbit-db
  • if we have time before the demo, we will add CRDT support.

Action Items:

  • figure out what the annotations pubsub API should look like
  • get basic annotations on pubsub working in both viewers
    • updates are the whole blob of annotations (refresh the whole list on every change)
  • prepare the theatrics of the demo
  • Add CRDTs (deal with chronological order of annotations with many editors)

What Ed & Drew need:

  • (pubsub consumer) a way for mirador & UV to listen for an event telling you that something has changed
  • (pubsub producer) a way to send updates when you have changed something
  • a way to declare a pubsub topic/channel and subscribe to it
@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte Apr 21, 2017

Created repo, can move it later to org: https://github.com/pgte/ipfs-iiif-annotations

pgte commented Apr 21, 2017

Created repo, can move it later to org: https://github.com/pgte/ipfs-iiif-annotations

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid Apr 28, 2017

Member

Standup Friday April 28

Agenda

  • Standup

Notes

Video: it is being rendered and uploaded

Member

diasdavid commented Apr 28, 2017

Standup Friday April 28

Agenda

  • Standup

Notes

Video: it is being rendered and uploaded

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Apr 28, 2017

Some more notes from the 28/04/17 standup:

We are currently using the Open Annotation spec which is what the UV and Mirador both support and is perfect for an MVP. However, IIIF will use the Web Annotation Data Model in future. This has support for AnnotationPages which would allow us to break up the data into more manageable chunks instead of a single large json blob.

It also supports agents which would allow us to identify and filter by user.

The model uses IRIs for ids, which means fs:/ipfs/<hash> is a valid identifier if we want to permit content addressing.

Also worth noting that AnnotationPages are based upon Activity Streams Collections. Activity Streams is a more generic specification and can be applied to many other types of actions.

Create a front end test harness? Use Jest: https://facebook.github.io/jest/

edsilv commented Apr 28, 2017

Some more notes from the 28/04/17 standup:

We are currently using the Open Annotation spec which is what the UV and Mirador both support and is perfect for an MVP. However, IIIF will use the Web Annotation Data Model in future. This has support for AnnotationPages which would allow us to break up the data into more manageable chunks instead of a single large json blob.

It also supports agents which would allow us to identify and filter by user.

The model uses IRIs for ids, which means fs:/ipfs/<hash> is a valid identifier if we want to permit content addressing.

Also worth noting that AnnotationPages are based upon Activity Streams Collections. Activity Streams is a more generic specification and can be applied to many other types of actions.

Create a front end test harness? Use Jest: https://facebook.github.io/jest/

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid May 4, 2017

Member

@pgte has finished the first milestone, you can see it here: ipfs-shipyard/ipfs-iiif-db#1 (comment)

@edsilv @aeschylus can I get your ack? The example includes a demo video

Member

diasdavid commented May 4, 2017

@pgte has finished the first milestone, you can see it here: ipfs-shipyard/ipfs-iiif-db#1 (comment)

@edsilv @aeschylus can I get your ack? The example includes a demo video

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 5, 2017

edsilv commented May 5, 2017

@aeschylus

This comment has been minimized.

Show comment
Hide comment
@aeschylus

aeschylus May 5, 2017

Having a look now and getting our example put up.

Having a look now and getting our example put up.

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 5, 2017

@flyingzumwalt @diasdavid Here's the designer/illustrator I mentioned: http://whitevinyldesign.com
I worked with Luke on https://blokdust.com

edsilv commented May 5, 2017

@flyingzumwalt @diasdavid Here's the designer/illustrator I mentioned: http://whitevinyldesign.com
I worked with Luke on https://blokdust.com

@edsilv

This comment has been minimized.

Show comment
Hide comment
@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid May 6, 2017

Member

Standup Friday May 5

Agenda

  • standup: updates from everyone
  • first milestone finished - get+put primitives are done, propagates data
  • validate the api - can we build on the interface
  • set up next milestone
  • generating tiles

Notes

First milestone finished - get + put

  • doesn't use CRDTs but supports basic pubsub for propagation of changes

drew:

  • created IPFS experiments repo in IIIF github
  • how will we serve the code? npm link from github? publish on npm?
    • npm link locally and then browserify
  • seems to have everything we need
  • future feature: would be nice to be able to look back in history
    • A: there will be a proper CRDT structure to show log
      pedro:
  • done with 1st iteration of the library. nothing IIIF specific, just a JSON blob going back & forth
  • next: CRDTs and make the libary better at handling concurrency
    ed:
  • working on UV for stanford
    • plays into what we need for the demo, smoothing off rough edges around supporting IIIF v3

Validating the API

  • looks right. next validation: actually build the demo with it
  • how does it find peers?
    • one way nodes find peers: auto-discover using WebRTC signaling
    • another way: websockets, using a preconfigured bootstrap list
      • we will probably use this for the demo so the nodes connect with peers that have the IIIF data loaded

What about preservation? Can we set up a listener node that's archiving the annotations?

  • yes. we can create a listener node that listens to the topic an pins all of the annotations on that topic

every time someone makes an annotation, the annotation goes on IPFS and the node publishes a link to that annotation on the pubsub topic. There is not a global log for all annoations

Next Milestone:

Drew: get mirador using pedro's new pubsub library, using browserify version. would like to also incorporate into electron version of mirador
Ed: integrate into UV
Pedro: support Ed + Drew, integrate proper CRDT-based log
Matt: think about structure of demo, theatrics and visuals/illustrations

Next Next Milestone:

Add in CRDTs: Swap out swarmjs or yjs in place of current simple pubsub library

Member

diasdavid commented May 6, 2017

Standup Friday May 5

Agenda

  • standup: updates from everyone
  • first milestone finished - get+put primitives are done, propagates data
  • validate the api - can we build on the interface
  • set up next milestone
  • generating tiles

Notes

First milestone finished - get + put

  • doesn't use CRDTs but supports basic pubsub for propagation of changes

drew:

  • created IPFS experiments repo in IIIF github
  • how will we serve the code? npm link from github? publish on npm?
    • npm link locally and then browserify
  • seems to have everything we need
  • future feature: would be nice to be able to look back in history
    • A: there will be a proper CRDT structure to show log
      pedro:
  • done with 1st iteration of the library. nothing IIIF specific, just a JSON blob going back & forth
  • next: CRDTs and make the libary better at handling concurrency
    ed:
  • working on UV for stanford
    • plays into what we need for the demo, smoothing off rough edges around supporting IIIF v3

Validating the API

  • looks right. next validation: actually build the demo with it
  • how does it find peers?
    • one way nodes find peers: auto-discover using WebRTC signaling
    • another way: websockets, using a preconfigured bootstrap list
      • we will probably use this for the demo so the nodes connect with peers that have the IIIF data loaded

What about preservation? Can we set up a listener node that's archiving the annotations?

  • yes. we can create a listener node that listens to the topic an pins all of the annotations on that topic

every time someone makes an annotation, the annotation goes on IPFS and the node publishes a link to that annotation on the pubsub topic. There is not a global log for all annoations

Next Milestone:

Drew: get mirador using pedro's new pubsub library, using browserify version. would like to also incorporate into electron version of mirador
Ed: integrate into UV
Pedro: support Ed + Drew, integrate proper CRDT-based log
Matt: think about structure of demo, theatrics and visuals/illustrations

Next Next Milestone:

Add in CRDTs: Swap out swarmjs or yjs in place of current simple pubsub library

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid May 6, 2017

Member

I've created a roadmap to help us have a notion of time we have left and the sync the things we have planned for each week. I'll keep updating this roadmap as things progress and we set new goals. Right now it clearly lists the goals for this week and how much time we have till the conf.

ROADMAP

Here is a generated ROADMAP with what we have planned so far to help us be on the same page.

Week May 8

  • publish iiif-db to npm
  • Integrate Mirador with iiif-db
  • Integrate Universal Viewer with iiif-db
  • sync annotations with both viewers
  • upgrade iiif-db to support custom IPFS configs
  • upgrade iiif-db to support switching between go-ipfs and js-ipfs nodes (see how it is done in js-ipfs tests)
  • create two branchs of iiif-db, one using swarmjs, other using yjs offering the same API
  • create an outline of the demo + presentation
  • add namespace support (extra channel) to support pinning.

Week May 15

  • (@aeschylus) - Implementing endpoint for Mirador
  • (@flyingzumwalt) - Design the final demo and write an outline for it
  • (@pgte + @edsilv ) Figure out how to shard the annotations list
  • (@pgte) pick one of the CRDT libraries and invest the time of changing its internals to use js-ipfs directly

Week May 22

Week May 29

Week May 5

  • The conference
Member

diasdavid commented May 6, 2017

I've created a roadmap to help us have a notion of time we have left and the sync the things we have planned for each week. I'll keep updating this roadmap as things progress and we set new goals. Right now it clearly lists the goals for this week and how much time we have till the conf.

ROADMAP

Here is a generated ROADMAP with what we have planned so far to help us be on the same page.

Week May 8

  • publish iiif-db to npm
  • Integrate Mirador with iiif-db
  • Integrate Universal Viewer with iiif-db
  • sync annotations with both viewers
  • upgrade iiif-db to support custom IPFS configs
  • upgrade iiif-db to support switching between go-ipfs and js-ipfs nodes (see how it is done in js-ipfs tests)
  • create two branchs of iiif-db, one using swarmjs, other using yjs offering the same API
  • create an outline of the demo + presentation
  • add namespace support (extra channel) to support pinning.

Week May 15

  • (@aeschylus) - Implementing endpoint for Mirador
  • (@flyingzumwalt) - Design the final demo and write an outline for it
  • (@pgte + @edsilv ) Figure out how to shard the annotations list
  • (@pgte) pick one of the CRDT libraries and invest the time of changing its internals to use js-ipfs directly

Week May 22

Week May 29

Week May 5

  • The conference
@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 8, 2017

  • Support custom IPFS configs
  • Released ipfs-iiif-db v0.1.0.

pgte commented May 8, 2017

  • Support custom IPFS configs
  • Released ipfs-iiif-db v0.1.0.
@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid May 9, 2017

Member

How is the integration going @aeschylus @edsilv ? Need any help?

Member

diasdavid commented May 9, 2017

How is the integration going @aeschylus @edsilv ? Need any help?

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 9, 2017

edsilv commented May 9, 2017

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 10, 2017

Hi Ed,

The bundle node_modules/ipfs-iiif-annotations/examples/simple-producer-consumer/public/js/app.js is specific to that example. Instead, I guess you could try to somehow use the library from within the app:

  1. If you're going to use a bundler like browserify or webpack, you could use it like a node.js or an ES6 module from inside your app.
  2. Alternatively, the ipfs-iiif-db library could provide a bundle that you could include on a script tag.

Which pattern(s) suits your needs?

pgte commented May 10, 2017

Hi Ed,

The bundle node_modules/ipfs-iiif-annotations/examples/simple-producer-consumer/public/js/app.js is specific to that example. Instead, I guess you could try to somehow use the library from within the app:

  1. If you're going to use a bundler like browserify or webpack, you could use it like a node.js or an ES6 module from inside your app.
  2. Alternatively, the ipfs-iiif-db library could provide a bundle that you could include on a script tag.

Which pattern(s) suits your needs?

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 10, 2017

edsilv commented May 10, 2017

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 10, 2017

@edsilv :
Just published version 0.2.0, which now includes a packaged dist.

Here are the instructions for dropping in a script tag:
https://github.com/pgte/ipfs-iiif-db/tree/master#using-a-script-tag-in-a-browser

pgte commented May 10, 2017

@edsilv :
Just published version 0.2.0, which now includes a packaged dist.

Here are the instructions for dropping in a script tag:
https://github.com/pgte/ipfs-iiif-db/tree/master#using-a-script-tag-in-a-browser

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 10, 2017

@pgte I've updated https://github.com/viewdir/ipfs-experiments to use the unpkg.com script instead. mirador.html has a button that submits the contents of a textfield and this is console.logged in uv.html. So the plumbing works :-)

edsilv commented May 10, 2017

@pgte I've updated https://github.com/viewdir/ipfs-experiments to use the unpkg.com script instead. mirador.html has a button that submits the contents of a textfield and this is console.logged in uv.html. So the plumbing works :-)

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 12, 2017

Hey, preservation didn't get mentioned on the standup. We should aim to make it trivially easy to have your ipfs node "watch" a topic and pin new annotations. Perhaps ipfs-iiif-db could have a cli like ipfs-iiif-db watch mytopic ?

edsilv commented May 12, 2017

Hey, preservation didn't get mentioned on the standup. We should aim to make it trivially easy to have your ipfs node "watch" a topic and pin new annotations. Perhaps ipfs-iiif-db could have a cli like ipfs-iiif-db watch mytopic ?

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 13, 2017

@edsilv I think that's a great idea. @diasdavid?

pgte commented May 13, 2017

@edsilv I think that's a great idea. @diasdavid?

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 13, 2017

Also, just a suggestion - but what about calling it ipfs-annotation-db ? Bit more generic?

edsilv commented May 13, 2017

Also, just a suggestion - but what about calling it ipfs-annotation-db ? Bit more generic?

@flyingzumwalt

This comment has been minimized.

Show comment
Hide comment
@flyingzumwalt

flyingzumwalt May 13, 2017

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid May 14, 2017

Member

Sounds great to me ! :)

Member

diasdavid commented May 14, 2017

Sounds great to me ! :)

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 17, 2017

@edsilv @aeschylus Here is a proposal for the new API that supports CRDTs:
https://github.com/pgte/ipfs-iiif-db/tree/yjs#instantiate

It's much more specific than the previous one, since I had to define a specific data structure, supported by shared CRDTs.

It should now be easier to integrate with a UI without the need to refresh the entire annotation list.

Here is an example app: https://github.com/pgte/ipfs-iiif-db/blob/yjs/examples/simple-producer-consumer/src/app.js

Here is a demo of it working: https://youtu.be/8xE1MEyZsbo

@edsilv @aeschylus Do you see any problem with this API, or some use case that you require that it doesn't support?

pgte commented May 17, 2017

@edsilv @aeschylus Here is a proposal for the new API that supports CRDTs:
https://github.com/pgte/ipfs-iiif-db/tree/yjs#instantiate

It's much more specific than the previous one, since I had to define a specific data structure, supported by shared CRDTs.

It should now be easier to integrate with a UI without the need to refresh the entire annotation list.

Here is an example app: https://github.com/pgte/ipfs-iiif-db/blob/yjs/examples/simple-producer-consumer/src/app.js

Here is a demo of it working: https://youtu.be/8xE1MEyZsbo

@edsilv @aeschylus Do you see any problem with this API, or some use case that you require that it doesn't support?

@pgte

This comment has been minimized.

Show comment
Hide comment

pgte commented May 17, 2017

Now has own issue: ipfs-shipyard/ipfs-iiif-db#4

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 17, 2017

@pgte Looks good - essentially CRUD on top of a CRDT? I'll look at updating the demo app tomorrow to fit this new model. I'm sure this will uncover any potential problems.

edsilv commented May 17, 2017

@pgte Looks good - essentially CRUD on top of a CRDT? I'll look at updating the demo app tomorrow to fit this new model. I'm sure this will uncover any potential problems.

@edsilv

This comment has been minimized.

Show comment
Hide comment
@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 17, 2017

@edsilv great! I haven't released a distribution yet, will do it first thing in the morning.

pgte commented May 17, 2017

@edsilv great! I haven't released a distribution yet, will do it first thing in the morning.

@BigBlueHat

This comment has been minimized.

Show comment
Hide comment
@BigBlueHat

BigBlueHat May 17, 2017

@edsilv curious about jsonfeed.org. The Web Annotation Protocol has a "feed" mechanism built in:
https://www.w3.org/TR/annotation-protocol/#representations-with-annotation-descriptions

It's based on Activity Stream 2.0 collections.

If I've misunderstood the plans for this, let me know. 😃 Happy to help where I can!

@edsilv curious about jsonfeed.org. The Web Annotation Protocol has a "feed" mechanism built in:
https://www.w3.org/TR/annotation-protocol/#representations-with-annotation-descriptions

It's based on Activity Stream 2.0 collections.

If I've misunderstood the plans for this, let me know. 😃 Happy to help where I can!

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 18, 2017

@BigBlueHat Hey! I just posted jsonfeed.org out of interest really. If we're making something here that's essentially a way to easily do CRUDable json arrays on top of a CRDT there are all kinds of possibilities. Activity Streams are super interesting. It would be great if you wanted to join our new regular IPFS for GLAM call. Perhaps you could give us the lowdown on Activity Streams?

https://github.com/ipfs-labs/ipfs-glam-community

edsilv commented May 18, 2017

@BigBlueHat Hey! I just posted jsonfeed.org out of interest really. If we're making something here that's essentially a way to easily do CRUDable json arrays on top of a CRDT there are all kinds of possibilities. Activity Streams are super interesting. It would be great if you wanted to join our new regular IPFS for GLAM call. Perhaps you could give us the lowdown on Activity Streams?

https://github.com/ipfs-labs/ipfs-glam-community

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 18, 2017

@edsilv @aeschylus version 2.0.0 of ifs-iiif-db released.

Distribution URL to update the script tag: http://unpkg.com/ipfs-iiif-db@2.0.0/dist/index.min.js

(The previous version is still available through here: https://unpkg.com/ipfs-iiif-db@0.2.0/dist/index.min.js )

pgte commented May 18, 2017

@edsilv @aeschylus version 2.0.0 of ifs-iiif-db released.

Distribution URL to update the script tag: http://unpkg.com/ipfs-iiif-db@2.0.0/dist/index.min.js

(The previous version is still available through here: https://unpkg.com/ipfs-iiif-db@0.2.0/dist/index.min.js )

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 18, 2017

@edsilv @aeschylus beware of reconnection difficulties (almost fixed) reported here:
ipfs-shipyard/ipfs-iiif-db#6

pgte commented May 18, 2017

@edsilv @aeschylus beware of reconnection difficulties (almost fixed) reported here:
ipfs-shipyard/ipfs-iiif-db#6

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 18, 2017

@pgte I've updated the example. Here's a video of it working: https://youtu.be/SMOiTZYeoG0

Right now I'm passing in the original param inline on both clients like this:

https://github.com/viewdir/ipfs-experiments/blob/master/viewer-annotations/mirador.html#L27

Perhaps we generate the @id by hashing the combined manifest URI and topic?

e.g.

"@id": "fs:/ipfs/<hash>",

edsilv commented May 18, 2017

@pgte I've updated the example. Here's a video of it working: https://youtu.be/SMOiTZYeoG0

Right now I'm passing in the original param inline on both clients like this:

https://github.com/viewdir/ipfs-experiments/blob/master/viewer-annotations/mirador.html#L27

Perhaps we generate the @id by hashing the combined manifest URI and topic?

e.g.

"@id": "fs:/ipfs/<hash>",
@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 18, 2017

@edsilv we can generate any kind of id if it's not defined, and we could create a random one.
The first argument of the db.annotationList() is supposed to be an id, a unique identifier for that annotationList. Could be a URI, any string that has some identification meaning to you.

We can create an alternative API where the ID can (or not) be defined inside the originalValue, and if it's not defined, we create a random one. Something like:

db.annotationList({
    "@context": "http://iiif.io/api/search/0/context.json",
    "@id": "https://wellcomelibrary.org/annoservices/search/b18035723?q=gene",
    "@type": "sc:AnnotationList",
    "within": {
        "@type": "sc:Layer"
    },
    "startIndex": 0,
    "resources": []
})

(in this case we wouldn't create an id since it already has one).

Another option is to enforce an id.

Which API suites you best?

pgte commented May 18, 2017

@edsilv we can generate any kind of id if it's not defined, and we could create a random one.
The first argument of the db.annotationList() is supposed to be an id, a unique identifier for that annotationList. Could be a URI, any string that has some identification meaning to you.

We can create an alternative API where the ID can (or not) be defined inside the originalValue, and if it's not defined, we create a random one. Something like:

db.annotationList({
    "@context": "http://iiif.io/api/search/0/context.json",
    "@id": "https://wellcomelibrary.org/annoservices/search/b18035723?q=gene",
    "@type": "sc:AnnotationList",
    "within": {
        "@type": "sc:Layer"
    },
    "startIndex": 0,
    "resources": []
})

(in this case we wouldn't create an id since it already has one).

Another option is to enforce an id.

Which API suites you best?

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv May 19, 2017

@pgte Hmm, not sure. I think this is something we can discuss on the standup later.

edsilv commented May 19, 2017

@pgte Hmm, not sure. I think this is something we can discuss on the standup later.

@flyingzumwalt

This comment has been minimized.

Show comment
Hide comment
@flyingzumwalt

flyingzumwalt May 19, 2017

Here's my outline for the demo. We can discuss + refine on today's call. It's in this hackpad

Same info in slide deck form (slightly outdated): Serverless IIIF with IPFS.pdf ... and here's the Keynote file

flyingzumwalt commented May 19, 2017

Here's my outline for the demo. We can discuss + refine on today's call. It's in this hackpad

Same info in slide deck form (slightly outdated): Serverless IIIF with IPFS.pdf ... and here's the Keynote file

@diasdavid diasdavid referenced this issue May 19, 2017

Closed

⚡️ v0.24.0 RELEASE 🚀 #855

14 of 14 tasks complete
@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 20, 2017

New 2.1.0 version of the ipfs-iiif-db package just released.
Supports new semantics for the @id attribute of an annotationList and passing in only the id or the initial annotationList.
// @edsilv @aeschylus

pgte commented May 20, 2017

New 2.1.0 version of the ipfs-iiif-db package just released.
Supports new semantics for the @id attribute of an annotationList and passing in only the id or the initial annotationList.
// @edsilv @aeschylus

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 22, 2017

@edsilv @aeschylus just released version 2.2.0. Relevant changes:

  • code: If you're using the <script> tag, the URL has now changed.
  • store: You can now use "memory", "indexeddb" (browser only) or "leveldb" (node.js only, not relevant to your case) as local stores (see docs):
const db = DB({store: "indexeddb"})

(If you got confused by this store thing, it's ok. This store is the local store where to keep the intermediary CRDT values, it still uses IPFS to propagate the changes anyway.)

If you're going to start using the "indexeddb" store, make sure that you listen to the "started" event and take that opportunity to render the AnnotationList, since the local history is now relevant.

You can keep referring back to the example app, which is being kept up to date with the latest API changes:
https://github.com/pgte/ipfs-iiif-db/blob/master/examples/simple-producer-consumer/src/app.js#L36-L61

pgte commented May 22, 2017

@edsilv @aeschylus just released version 2.2.0. Relevant changes:

  • code: If you're using the <script> tag, the URL has now changed.
  • store: You can now use "memory", "indexeddb" (browser only) or "leveldb" (node.js only, not relevant to your case) as local stores (see docs):
const db = DB({store: "indexeddb"})

(If you got confused by this store thing, it's ok. This store is the local store where to keep the intermediary CRDT values, it still uses IPFS to propagate the changes anyway.)

If you're going to start using the "indexeddb" store, make sure that you listen to the "started" event and take that opportunity to render the AnnotationList, since the local history is now relevant.

You can keep referring back to the example app, which is being kept up to date with the latest API changes:
https://github.com/pgte/ipfs-iiif-db/blob/master/examples/simple-producer-consumer/src/app.js#L36-L61

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte May 22, 2017

Just completed and released a CLI tracker.

As proposed by @edsilv, I created a CLI tool that tracks a partition (defaults to "iiif"). Each node will repeatedly announce all known records, and this CLI tool will track it, participating on all CRDTs as an equal node, persisting the changes to a local LevelDB database.

CLI Docs here: https://github.com/pgte/ipfs-iiif-db#cli

pgte commented May 22, 2017

Just completed and released a CLI tracker.

As proposed by @edsilv, I created a CLI tool that tracks a partition (defaults to "iiif"). Each node will repeatedly announce all known records, and this CLI tool will track it, participating on all CRDTs as an equal node, persisting the changes to a local LevelDB database.

CLI Docs here: https://github.com/pgte/ipfs-iiif-db#cli

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte Jun 1, 2017

@flyingzumwalt instead of a CLI, we're going to use a web app (because WebRTC module is not yet stable on Node.js).
I've put together all the tools and CLIs we were talking about into one repo: https://github.com/pgte/ipfs-iiif-db-demo

The README should be self-explanatory, but ping me if you have any trouble.

pgte commented Jun 1, 2017

@flyingzumwalt instead of a CLI, we're going to use a web app (because WebRTC module is not yet stable on Node.js).
I've put together all the tools and CLIs we were talking about into one repo: https://github.com/pgte/ipfs-iiif-db-demo

The README should be self-explanatory, but ping me if you have any trouble.

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte Jun 1, 2017

@flyingzumwalt FYI, the annotationList id we're tracking on all parts of the demo is:

http://wellcomelibrary.org/iiif/b18035723/manifest#ipfs-iiif-db-example

pgte commented Jun 1, 2017

@flyingzumwalt FYI, the annotationList id we're tracking on all parts of the demo is:

http://wellcomelibrary.org/iiif/b18035723/manifest#ipfs-iiif-db-example
@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte Jun 1, 2017

@flyingzumwalt also, if you want to try it out without NPM installing it, you can go to
http://pgte.github.io/ipfs-iiif-db-demo/public/

Also, I added this URL to the pgte/ipfs-iiif-db-demo README.

pgte commented Jun 1, 2017

@flyingzumwalt also, if you want to try it out without NPM installing it, you can go to
http://pgte.github.io/ipfs-iiif-db-demo/public/

Also, I added this URL to the pgte/ipfs-iiif-db-demo README.

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte Jun 2, 2017

@flyingzumwalt Here is a list of the ipfs-iiif-db demo applications (demo video here):

1. Mutator

  • User can add or remove a random annotation from the annotation list (using the add and remove buttons).
  • Tracks changes to the annotation list and prints the latest
  • Lists the connected peers

URLs:

2. Tracker

  • Tracks changes to all annotation lists in the 'iiif' partition
  • Lists the connected peers

URLs:

3. Auto Mutator

  • Every 2 seconds, adds a random annotation from the annotation list.
  • Tracks changes to the annotation list and prints the latest
  • Lists the connected peers

URLs:

pgte commented Jun 2, 2017

@flyingzumwalt Here is a list of the ipfs-iiif-db demo applications (demo video here):

1. Mutator

  • User can add or remove a random annotation from the annotation list (using the add and remove buttons).
  • Tracks changes to the annotation list and prints the latest
  • Lists the connected peers

URLs:

2. Tracker

  • Tracks changes to all annotation lists in the 'iiif' partition
  • Lists the connected peers

URLs:

3. Auto Mutator

  • Every 2 seconds, adds a random annotation from the annotation list.
  • Tracks changes to the annotation list and prints the latest
  • Lists the connected peers

URLs:

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid Jul 4, 2017

Member

\o/ IIIF Annotations on IPFS was an astonishing success \o/

img_0183

@edsilv and @aeschylus demoing IIIF DB with Mirador and UV

img_0185

The room was packed

Thanks again to @aeschylus, @edsilv and @pgte for making it happen at the IIIF Conf at the Vatican and now at the IPFS All Hands, so that we have a recording to share with the rest of the community.

If you are interested in the demo, you can check it out at: https://youtu.be/hmAniA6g9D0?t=10m40s

I guess the question now is: "What's next?" :D

Member

diasdavid commented Jul 4, 2017

\o/ IIIF Annotations on IPFS was an astonishing success \o/

img_0183

@edsilv and @aeschylus demoing IIIF DB with Mirador and UV

img_0185

The room was packed

Thanks again to @aeschylus, @edsilv and @pgte for making it happen at the IIIF Conf at the Vatican and now at the IPFS All Hands, so that we have a recording to share with the rest of the community.

If you are interested in the demo, you can check it out at: https://youtu.be/hmAniA6g9D0?t=10m40s

I guess the question now is: "What's next?" :D

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Jul 4, 2017

Excited to work on more similar projects :-D

This is the other project I've been working on recently:

https://www.youtube.com/watch?v=itFJDsxI2xs&t=1s

At the end of the video you can see that the IIIF Collection the user is creating is being stored using js-ipfs.

We'd like to be able to track these collections as per ipfs-iiif-db. So if you're a gallery or museum hosting an exhibition, visitors can create and share their collections, and they are preserved by the host institution(s).

I think the ability to create IIIF Collections using CRDTs would be quite a generally useful thing. There is a lot of discussion in the IIIF community around discovery, and the ability to easily create and share collections could aid with this. For example, see https://github.com/ryanfb/iiif-universe which is a curated top-level 'collection of collections'.

The UV and Mirador also have their own separately stored collections of manifests to use as examples, e.g:

http://universalviewer.io/examples/

The drop down box under the UV is generated from a IIIF Collection.

It would be cool if it were trivial to generate these collections and have them preserved by interested parties. We could use https://github.com/viewdir/iiif-explorer-component to navigate them :-)

edsilv commented Jul 4, 2017

Excited to work on more similar projects :-D

This is the other project I've been working on recently:

https://www.youtube.com/watch?v=itFJDsxI2xs&t=1s

At the end of the video you can see that the IIIF Collection the user is creating is being stored using js-ipfs.

We'd like to be able to track these collections as per ipfs-iiif-db. So if you're a gallery or museum hosting an exhibition, visitors can create and share their collections, and they are preserved by the host institution(s).

I think the ability to create IIIF Collections using CRDTs would be quite a generally useful thing. There is a lot of discussion in the IIIF community around discovery, and the ability to easily create and share collections could aid with this. For example, see https://github.com/ryanfb/iiif-universe which is a curated top-level 'collection of collections'.

The UV and Mirador also have their own separately stored collections of manifests to use as examples, e.g:

http://universalviewer.io/examples/

The drop down box under the UV is generated from a IIIF Collection.

It would be cool if it were trivial to generate these collections and have them preserved by interested parties. We could use https://github.com/viewdir/iiif-explorer-component to navigate them :-)

@pgte

This comment has been minimized.

Show comment
Hide comment
@pgte

pgte Jul 4, 2017

@edsilv would be happy to collaborate in this project, a set of shared open collections backed by IPFS!

Right now the goal is to extract enough into a shared library that reduces ipfs-iiif-db to a set of declarative configuration parameters (the schema for the data structures, basically).
Right now it's a little more than a declaration of intents, but you can track it here:
https://github.com/ipfs-labs/ipfs-live-db

Once this is usable, supporting more IIIF data types should be extremely easy.

Do you have any time frame in mind?

pgte commented Jul 4, 2017

@edsilv would be happy to collaborate in this project, a set of shared open collections backed by IPFS!

Right now the goal is to extract enough into a shared library that reduces ipfs-iiif-db to a set of declarative configuration parameters (the schema for the data structures, basically).
Right now it's a little more than a declaration of intents, but you can track it here:
https://github.com/ipfs-labs/ipfs-live-db

Once this is usable, supporting more IIIF data types should be extremely easy.

Do you have any time frame in mind?

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Jul 4, 2017

edsilv commented Jul 4, 2017

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Jul 6, 2017

Something we'll need to think about is how to do auth for creating new annotations/collection items/whatever.

In the HoloLens collections example I link to above, I'm thinking that users will get a unique anonymous session each time, and a link to their collection will be optionally emailed to them. Similar to the pattern we used when making blokdust.com where we delegated responsibility for identity to other platforms, and just dealt in unique public and anonymous URLs.

Currently our annotations system is using something akin to this model.

The IIIF Auth API is at version 1 right now: http://iiif.io/api/auth/1.0/#workflow-from-the-browser-client-perspective

This will be extended in future to permit "state changing operations", as well as just requesting data.

The pattern allows you to plug in any cookie and token service you like.

One of the use cases we discussed is allowing academic institutions to track annotations created by their own staff/students.

Once we start introducing user identities into the mix we need to start thinking about how to protect them.

Is there any prior art in the decentralised tech sphere that could be relevant?

edsilv commented Jul 6, 2017

Something we'll need to think about is how to do auth for creating new annotations/collection items/whatever.

In the HoloLens collections example I link to above, I'm thinking that users will get a unique anonymous session each time, and a link to their collection will be optionally emailed to them. Similar to the pattern we used when making blokdust.com where we delegated responsibility for identity to other platforms, and just dealt in unique public and anonymous URLs.

Currently our annotations system is using something akin to this model.

The IIIF Auth API is at version 1 right now: http://iiif.io/api/auth/1.0/#workflow-from-the-browser-client-perspective

This will be extended in future to permit "state changing operations", as well as just requesting data.

The pattern allows you to plug in any cookie and token service you like.

One of the use cases we discussed is allowing academic institutions to track annotations created by their own staff/students.

Once we start introducing user identities into the mix we need to start thinking about how to protect them.

Is there any prior art in the decentralised tech sphere that could be relevant?

@edsilv

This comment has been minimized.

Show comment
Hide comment
@VictorBjelkholm

This comment has been minimized.

Show comment
Hide comment
@VictorBjelkholm

VictorBjelkholm Jul 6, 2017

Member

Two things that can be used as well:

Member

VictorBjelkholm commented Jul 6, 2017

Two things that can be used as well:

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Jul 6, 2017

ConsenSys (uPort) is a member of DIF. Just watching this: https://www.youtube.com/watch?v=l5laRZfn8AI

I like what Ryan Shea (Blockstack) has to say about interoperability.

edsilv commented Jul 6, 2017

ConsenSys (uPort) is a member of DIF. Just watching this: https://www.youtube.com/watch?v=l5laRZfn8AI

I like what Ryan Shea (Blockstack) has to say about interoperability.

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid Jul 12, 2017

Member

To everyone following this thread, check out the latest Tutorial published by @pgte on how to use PubSub to create Real-Time apps over IPFS

image

Full discussion here: libp2p/research-pubsub#18

Member

diasdavid commented Jul 12, 2017

To everyone following this thread, check out the latest Tutorial published by @pgte on how to use PubSub to create Real-Time apps over IPFS

image

Full discussion here: libp2p/research-pubsub#18

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Jul 12, 2017

One thing that came up on the IIIF Software Devs call when discussing this is whether peers could index annotations for search as well as preserve them?

edsilv commented Jul 12, 2017

One thing that came up on the IIIF Software Devs call when discussing this is whether peers could index annotations for search as well as preserve them?

@diasdavid

This comment has been minimized.

Show comment
Hide comment
@diasdavid

diasdavid Dec 5, 2017

Member

Quick update that I think this crowd will be interested in! IPFS Station -- https://github.com/ipfs-shipyard/station -- just got a refresh by @hacdias, bug fixes, new features and a whole new look. One of the next requested features is to have a pane for simple file pinning ipfs-shipyard/ipfs-desktop#518 which can make things like pin the IIIF annotations simpler :)

Member

diasdavid commented Dec 5, 2017

Quick update that I think this crowd will be interested in! IPFS Station -- https://github.com/ipfs-shipyard/station -- just got a refresh by @hacdias, bug fixes, new features and a whole new look. One of the next requested features is to have a pane for simple file pinning ipfs-shipyard/ipfs-desktop#518 which can make things like pin the IIIF annotations simpler :)

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Dec 5, 2017

Will give it a try!

In possibly related news I've been working on a static IIIF generator: https://github.com/edsilv/biiif/
I thought about trying to get it to generate IPFS hashes to use as id IRIs so everything can be resolvable over the IPFS network, but as we've seen before, this is difficult (impossible?) e.g.

{
  "id": "fs:/ipfs/<hash>/index.json",
  "type": "Collection",
  "label": "Bones",
  "members": [
     {
      "id": "fs:/ipfs/<hash>/vertebra/index.json",
      "type": "Manifest",
      "label": "Vertebra",
      "thumbnail": [
        {
          "id": "fs:/ipfs/<hash>/vertebra/thumb.jpg",
          "type": "Image"
        }
      ]
    }
  ]
}

In this example I'd initially leave a placeholder for the hash in the ids, hash the folder containing all of the index.jsons (IIIF manifests), thumbnails, objs etc, then add that hash to all of the index.json id placeholders. But this obviously then changes the hash :-)

It ultimately boils down to files not being able to contain their own hashes.

This doesn't prevent us however from only hashing the assets themselves (obj, jpg, mp4, etc) and referring to them by their hash in the regular json manifests - sort of a HTTP+IPFS hybrid.

edsilv commented Dec 5, 2017

Will give it a try!

In possibly related news I've been working on a static IIIF generator: https://github.com/edsilv/biiif/
I thought about trying to get it to generate IPFS hashes to use as id IRIs so everything can be resolvable over the IPFS network, but as we've seen before, this is difficult (impossible?) e.g.

{
  "id": "fs:/ipfs/<hash>/index.json",
  "type": "Collection",
  "label": "Bones",
  "members": [
     {
      "id": "fs:/ipfs/<hash>/vertebra/index.json",
      "type": "Manifest",
      "label": "Vertebra",
      "thumbnail": [
        {
          "id": "fs:/ipfs/<hash>/vertebra/thumb.jpg",
          "type": "Image"
        }
      ]
    }
  ]
}

In this example I'd initially leave a placeholder for the hash in the ids, hash the folder containing all of the index.jsons (IIIF manifests), thumbnails, objs etc, then add that hash to all of the index.json id placeholders. But this obviously then changes the hash :-)

It ultimately boils down to files not being able to contain their own hashes.

This doesn't prevent us however from only hashing the assets themselves (obj, jpg, mp4, etc) and referring to them by their hash in the regular json manifests - sort of a HTTP+IPFS hybrid.

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Dec 6, 2017

Ah, I forgot about IPNS. I guess you could publish an IPNS hash and use that as a mutable endpoint for your data? Just checking ipfs/js-ipfs#209 - can you do this from nodejs?

edsilv commented Dec 6, 2017

Ah, I forgot about IPNS. I guess you could publish an IPNS hash and use that as a mutable endpoint for your data? Just checking ipfs/js-ipfs#209 - can you do this from nodejs?

@edsilv

This comment has been minimized.

Show comment
Hide comment
@edsilv

edsilv Dec 14, 2017

There's now a starter project for anyone who wants to build a IIIF-enabled website using the UV and biiif: https://github.com/UniversalViewer/uv-app-starter

I made a portfolio for @sophiedixon to test it here: https://sophiedixon.github.io/3d-portfolio/

In terms of IPFS, I'd love to add support to biiif as discussed above, but also to revisit the work @pgte did on ipfs-iiif-db to create a simple commenting system for these objects. We can use annotations with a "commenting" motivation for this: https://www.w3.org/TR/annotation-model/

This could later be extended to annotating specific regions of objects as opposed to the whole object.

I think wrapping this commenting system in a web component would be great too, enabling it to be used anywhere.

IPFS could also solve a big problem the IIIF Discovery group have run into regarding who should host a centralised index of all collections. My answer at the Toronto working group meeting was "everyone hosts it" :-)

edsilv commented Dec 14, 2017

There's now a starter project for anyone who wants to build a IIIF-enabled website using the UV and biiif: https://github.com/UniversalViewer/uv-app-starter

I made a portfolio for @sophiedixon to test it here: https://sophiedixon.github.io/3d-portfolio/

In terms of IPFS, I'd love to add support to biiif as discussed above, but also to revisit the work @pgte did on ipfs-iiif-db to create a simple commenting system for these objects. We can use annotations with a "commenting" motivation for this: https://www.w3.org/TR/annotation-model/

This could later be extended to annotating specific regions of objects as opposed to the whole object.

I think wrapping this commenting system in a web component would be great too, enabling it to be used anywhere.

IPFS could also solve a big problem the IIIF Discovery group have run into regarding who should host a centralised index of all collections. My answer at the Toronto working group meeting was "everyone hosts it" :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment