This is the final report of our project to enable the monetization of Solid applications,
allowing Solid identities to be linked to Web Monetization wallets,
and incorporating payment processing into Solid’s authentication.
Learn more about our project here: https://github.com/KNowledgeOnWebScale/solid-web-monetization
After our initial smooth progress on the application to assign payment pointers to a Solid WebID, we struggled a bit on the next part of the project. An initial scan of the Interledger technology stack gave the impression of a mature ecosystem, with ample library and documentation support. This lead us to believe that it would be straightforward to perform Interledger Protocol based STREAM payments, right from the user's browser to the target payment pointer of a content creator (present inside the HTML of his/her website). What we found however was that every library and example that we discovered had several issues that could always be described as one or more of the following:
- Libraries were written for node but not browser compatible because of internal node-specific library dependencies.
- Documentation was outdated (but not mentioned as being outdated).
- No pointer or link to what the correct newer libraries to use were now (since redesigns in this space seemed to happen multiple times, making older libraries obsolete but still publicly available)
- Little to no response on dedicated Slack channels
- Missing formal abstraction to request executing payment from a wallet, based on the payment pointer. Since any wallet could host its own auhtentication method and API for doing so, and there is no formal discovery mechanism.
This led us to request for a 3 month (time) extension for the project.
This inspired us to refresh our view on this problem. It lead us to propose a Solid Web Monetization Provider specification for a component that works much like Coil's service. The key difference is that it is a Solid-based application, that stores personal data in the user's Solid Pod. The user is also free to pick any Solid Web Monetization Provider he/she wants (and thus trusts!) to subscribe to and perform Web Monetization in his/her behalf.
Once we made that change, the demonstrator and specification soon followed.
One of our three original objectives was to be able to configure a link between a user's Solid identity and his/her wallet. This was completed at the time of our first report. Nothing has really changed here, except that deployment of the Accountant application is no longer done on the GitHub pages. Instead we've opted for a Docker image build, so the whole demonstrator can be boostrapped by a single
A second objective was creating a prototype monetized Solid application. This objective has also been successfully completed in the form of the Microstore application. This application is also built as a docker image. The microstore app is an example application which has two use cases showing how locked/premium content can be unlocked once micropayments are started using web monetization.
A third and last objective was tying into the Solid authentication library to trigger a check for payment pointers in the user's Solid Identity. Since the only requirement for our scripts to work, is having access to the user's public Solid WebID document, a hard tie-in at this time was not needed. As a result, we've encapsulated the required code in a client library that works alongside the Web Monetization Provider implemenation, instead of extending the Solid authentication library directly.
In the future however it could be integrated in the Solid authentication process, which in turn could even be handled by the visiting user's browser agent by means of an extension. That would truly require nothing else than a
<meta name="monetization" content="$my.pointer"> tag from the content creator to enable micropayments.
Milestone 1: Application to configure a Web Monetization wallet into a Solid identity
Task 1.1. Extension of WebID ontology to include link to Web Monetization Wallet
We are of the opinion that Payment Pointers should have an extra indirection so that more properties can be attached to a single payment pointer. This would allow a user to (in the future):
- Mark a payment pointer with a purpose/tag (eg. work, personal)
- Mark a payment pointer as default (if there are multiples)
- Use different types of Payment Pointers (right now we are working with an
- Easily add any more propeties in the future if deemed necessary.
Our solution initially required RDF BlankNodes to implement this. However blank nodes are still problematic when parsing and writing RDF, so we've opted to skolemize the blank nodes.
Task 1.2. Application to configure a Web Monetization wallet into a Solid identity
This started out as a React-Typescript project, because we wanted to reuse the @inrupt/solid-ui-react library. This library leans on top of the @inrupt/solid-client-authn-browser library. Since however the newest features of that underlaying library weren't available yet and we needed more fine grained control, the
@inrupt/solid-ui-reactlibrary was dropped. Because the team is very familiar with angular applications, we then quickly rewrote the application as an angular application using that lower-level
When the user logs in, he/she can choose between 3 identity providers: inrupt.net, solidcomminity.net and a custom identity provider (url). The latter one can (among others) be used to refer to the Community Solid Server (CSS).
Milestone 2: Extension of the Solid authentication library with Web Monetization support
- Task 2.1. Analysis of Solid/WebID authentication protocol
This task involves studying Solid OIDC, Solid OIDC Primer and DPoP tokens. This knowledge was used to implement the authentication flow for the Solid Web Monetization Provider application.
- Task 2.2. Analysis of Web Monetization protocol
This task involves reading the Web Monetization Specification and theorizing about web monetization use cases in a Solid context.
- Task 2.3. Theoretical integration of WebID and Web Monetization protocols
This task manifested itself in the design of the Solid Web Monetization Provider specification that we proposed.
- Task 2.4. Implementation of integrated protocol
This task manifested itself in the proof of concept authentication implementation of the Solid Web Monetization Provider specification that we did in the form of the Solid Web Monetization Provider application.
Milestone 3: Prototypical Web Monetized Solid application
- Task 3.1. Implementation of prototypical Solid application
This task required the implementation of a prototypical Solid application. The result of this task is the Microstore application. This application is an example of a Web Monetized Solid application: it has two subpages which represent a typical use case each (paywall and mixed content). Micropayments allow the visiting user to see the locked content.
- Task 3.2. Integration testing of Web Monetization in combination with Solid authentication
This task has been reduced somewhat in the sense that manual tests using the prototype implementation of the Microstore application were the main point of focus. Besides, the actual authentiation steps in the client-side application (Microstore and Accountant) were handled by the @inrupt/solid-client-authn-browser library, which is already thoroughly tested.
- Milestone 4: Documentation and tutorials
- Task 4.1. Documentation for Solid users to configure a Web Monetization wallet
For this task documentation was written and publicly hosted on the Github Pages.
- The practical docs are meant for users, explaining how to use the Accountant application.
- The technical docs are meant for developers, on how to implement an application like the Accountant application.
- Task 4.2. Documentation for application developers to monetize their application
For this task documentation was written and publicly hosted on the Github Pages.
- The practical docs are meant for users, explaining how to use the Microstore application.
- The technical docs are meant for developers, on how to implement an application like the Microstore application.
- Milestone 5: Dissemination of the main results and findings of this project
- Task 5.1. Presentation at Web-related conferences via publications and tutorials
A demonstrator was built and a scenario was detailed to go through the demonstrator. A demonstration paper is in the making which will be presented at a conference in the near future.
- Task 5.2. Publishing prototype on the Web as a live demonstration
The demonstrator is publicly available at the GitHub repository, documentation on how to get it running is hosted on the GitHub Pages. It can be installed locally by anyone using Docker Compose and the
docker-compose.ymlfile. The setup is documented here.
The demonstrator will also be hosted online at (url coming soon).
We are collaborating with other initiatives that combine Web Monetization with Solid on https://github.com/solid/webmonetization.
The next steps would be hearing possible objections or suggestion to the Solid Web Monetization Provider specification proposal. If this specification is followed, it would allow us to hook into Solid authentication code (right after the authentication step is done). Which would make it possible to immediatly fetch the required information from the user's Solid WebID to perform micropayments on web monetization supported webpages.
We would be very excited to see Solid app developers interested in implementing monetization using our WMP client.
- Solid Accountant: configure Web Monetization wallet into a Solid identity.
- Solid MicroStore: prototypical Web Monetized Solid application.
- Solid WMP: Web Monetization Provider with a fake currency,
- Project repository: https://github.com/KNowledgeOnWebScale/solid-web-monetization/
- Client library repository: https://github.com/KNowledgeOnWebScale/solid-wmp-client/
- Project documentation: https://knowledgeonwebscale.github.io/solid-web-monetization/
- Npm: https://www.npmjs.com/package/solid-wmp-client
- Library API: https://knowledgeonwebscale.github.io/solid-wmp-client/