diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index a934e7c..0000000
--- a/docs/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# doip.js
-
-doip.js allows websites and Node.js projects to verify decentralized online
-identities based on OpenPGP.
-
-## Features
-
-- Verify online identities using profile URLs
-- Regex-based service provider detection
-- [Mocha](https://mochajs.org/) tests
-
-## About Keyoxide
-
-[Keyoxide](https://keyoxide.org/), made by Yarmo Mackenbach, is a modern, secure
-and privacy-friendly platform to establish decentralized online identities using
-a novel concept know as [DOIP](doip.md). In an effort to make this technology
-accessible for other projects and stimulate the emergence of both complementary
-and competing projects, this project-agnostic library is
-[published on codeberg.org](https://codeberg.org/keyoxide/doipjs) and open
-sourced under the
-[Apache-2.0](https://codeberg.org/keyoxide/doipjs/src/branch/main/LICENSE)
-license.
-
-## Community
-
-There's a [Keyoxide Matrix room](https://matrix.to/#/#keyoxide:matrix.org) where
-we discuss everything DOIP and Keyoxide.
-
-## Donate
-
-Please consider [donating](https://liberapay.com/Keyoxide/) if you think this
-project is a step in the right direction for the internet.
-
-## Funding
-
-This library was realized with funding from
-[NLnet](https://nlnet.nl/project/Keyoxide/).
diff --git a/docs/_coverpage.md b/docs/_coverpage.md
deleted file mode 100644
index d06b626..0000000
--- a/docs/_coverpage.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# doip.js 0.12.0
-
-
-
-Decentralized OpenPGP Identity Proofs library in Node.js
-
-[Source code](https://codeberg.org/keyoxide/doipjs)
-[Getting started](#doipjs)
-
-![color](#c9beff)
diff --git a/docs/_sidebar.md b/docs/_sidebar.md
deleted file mode 100644
index c70fb45..0000000
--- a/docs/_sidebar.md
+++ /dev/null
@@ -1,39 +0,0 @@
-- Getting started
-
- - [Installation](installation.md)
- - [Quick start (Node.js)](quickstart-nodejs.md)
- - [Quick start (browser)](quickstart-browser.md)
- - [Terminology](terminology.md)
-
-- Concepts
-
- - [DOIP](doip.md)
- - [Proofs](proofs.md)
- - [Claims](claims.md)
- - [Service providers](serviceproviders.md)
-
-- Reference doip.js
-
- - [Claim (class)](doipjs/class_claim.md)
- - [keys (module)](doipjs/module_keys.md)
-
-- Service providers
-
- - [dev.to](serviceproviders/devto.md)
- - [discourse](serviceproviders/discourse.md)
- - [dns](serviceproviders/dns.md)
- - [fediverse](serviceproviders/fediverse.md)
- - [gitea](serviceproviders/gitea.md)
- - [github](serviceproviders/github.md)
- - [gitlab](serviceproviders/gitlab.md)
- - [hackernews](serviceproviders/hackernews.md)
- - [liberapay](serviceproviders/liberapay.md)
- - [lobste.rs](serviceproviders/lobsters.md)
- - [mastodon](serviceproviders/mastodon.md)
- - [owncast](serviceproviders/owncast.md)
- - [reddit](serviceproviders/reddit.md)
- - [twitter](serviceproviders/twitter.md)
- - [xmpp](serviceproviders/xmpp.md)
-
-- More
- - [Changelog](changelog.md)
diff --git a/docs/changelog.md b/docs/changelog.md
deleted file mode 100644
index 6f93a7f..0000000
--- a/docs/changelog.md
+++ /dev/null
@@ -1,295 +0,0 @@
-# Changelog
-
-## [0.11.2]
-
-[2021-03-06](https://codeberg.org/keyoxide/doipjs/releases/tag/0.11.2)
-
-## Fixed
-- Matrix.to URLs
-
-## [0.11.1]
-
-[2021-03-06](https://codeberg.org/keyoxide/doipjs/releases/tag/0.11.1)
-
-## Fixed
-- Proxy URL encoding
-
-## [0.11.0]
-
-[2021-03-05](https://codeberg.org/keyoxide/doipjs/releases/tag/0.11.0)
-
-## Added
-- IRC service provider
-- Matrix service provider
-## Fixed
-- Handling of requests without URI
-
-## [0.10.5]
-
-[2021-03-02](https://codeberg.org/keyoxide/doipjs/releases/tag/0.10.5)
-
-## Fixed
-- Logic error
-
-## [0.10.4]
-
-[2021-03-02](https://codeberg.org/keyoxide/doipjs/releases/tag/0.10.4)
-
-## Changed
-- Add Twitter proxy verification
-
-## [0.10.3]
-
-[2021-03-02](https://codeberg.org/keyoxide/doipjs/releases/tag/0.10.3)
-
-## Changed
-- Remove twitter dependency
-
-## [0.10.2]
-
-[2021-03-01](https://codeberg.org/keyoxide/doipjs/releases/tag/0.10.2)
-
-## Changed
-- Make Twitter verification configurable
-
-## [0.10.1]
-
-[2021-01-13](https://codeberg.org/keyoxide/doipjs/releases/tag/0.10.1)
-
-## Fixed
-- Polyfill for promise.allSettled
-
-## [0.10.0]
-
-[2021-01-13](https://codeberg.org/keyoxide/doipjs/releases/tag/0.10.0)
-
-## Added
-- Owncast service provider
-
-## [0.9.4]
-
-[2021-01-10](https://codeberg.org/keyoxide/doipjs/releases/tag/0.9.4)
-
-## Fixed
-- Fix typo in keyserver url
-
-## [0.9.3]
-
-[2021-01-10](https://codeberg.org/keyoxide/doipjs/releases/tag/0.9.3)
-
-## Fixed
-- Fix regex skipping some claims
-
-## [0.9.2]
-
-[2021-01-09](https://codeberg.org/keyoxide/doipjs/releases/tag/0.9.2)
-
-## Fixed
-- Network errors blocking code execution
-
-## [0.9.1]
-
-[2021-01-09](https://codeberg.org/keyoxide/doipjs/releases/tag/0.9.1)
-
-## Changed
-- Use signature data to find key location
-
-## [0.9.0]
-
-[2021-01-07](https://codeberg.org/keyoxide/doipjs/releases/tag/0.9.0)
-
-## Added
-- Signature claims verification
-
-## [0.8.5]
-
-[2021-01-03](https://codeberg.org/keyoxide/doipjs/releases/tag/0.8.5)
-
-### Fixed
-- Remove trailing slash from HKP server URL
-
-## [0.8.4]
-
-[2021-01-02](https://codeberg.org/keyoxide/doipjs/releases/tag/0.8.4)
-
-### Fixed
-- Fetch Twitter proofs from Nitter
-
-## [0.8.3]
-
-[2020-12-26](https://codeberg.org/keyoxide/doipjs/releases/tag/0.8.3)
-
-### Fixed
-- Handling of users without userId
-
-## [0.8.2]
-
-[2020-12-26](https://codeberg.org/keyoxide/doipjs/releases/tag/0.8.2)
-
-### Fixed
-- Handling of users without selfCertifications
-
-## [0.8.1]
-
-[2020-12-20](https://codeberg.org/keyoxide/doipjs/releases/tag/0.8.1)
-
-### Fixed
-- Timeout for claim verification promises
-
-## [0.8.0]
-
-[2020-12-11](https://codeberg.org/keyoxide/doipjs/releases/tag/0.8.0)
-
-### Added
-- Add fallback proxy policy
-
-### Fixed
-- Handling of failed network requests
-- Handling of rejected promises
-- DNS proxy URL generation
-- Twitter & Dev.to service provider
-
-## [0.7.5]
-
-[2020-12-10](https://codeberg.org/keyoxide/doipjs/releases/tag/0.7.5)
-
-### Fixed
-- Browser bundling
-
-## [0.7.4]
-
-[2020-12-08](https://codeberg.org/keyoxide/doipjs/releases/tag/0.7.4)
-
-### Fixed
-- Handling HKP URI
-
-## [0.7.3]
-
-[2020-12-08](https://codeberg.org/keyoxide/doipjs/releases/tag/0.7.3)
-
-### Fixed
-- Bundled library for release
-
-## [0.7.2]
-
-[2020-12-08](https://codeberg.org/keyoxide/doipjs/releases/tag/0.7.2)
-
-### Fixed
-- Support for specifying keyservers
-
-## [0.7.1]
-
-[2020-12-08](https://codeberg.org/keyoxide/doipjs/releases/tag/0.7.1)
-
-### Changed
-- Update openpgpjs dependency
-
-## [0.7.0]
-
-[2020-12-05](https://codeberg.org/keyoxide/doipjs/releases/tag/0.7.0)
-
-### Changed
-- Properly reject promises
-
-## [0.6.0]
-
-[2020-11-20](https://codeberg.org/keyoxide/doipjs/releases/tag/0.6.0)
-
-### Changed
-- Handle multiple users in key
-
-## 0.5.2
-
-[2020-11-20](https://codeberg.org/keyoxide/doipjs/releases/tag/0.5.2)
-
-### Fixed
-
-- Claim verification regex
-
-## 0.5.1
-
-[2020-11-20](https://codeberg.org/keyoxide/doipjs/releases/tag/0.5.1)
-
-### Fixed
-- Link to bundled openpgp
-
-## 0.5.0
-
-[2020-11-18](https://codeberg.org/keyoxide/doipjs/releases/tag/0.5.0)
-
-### Added
-- Keys fetching using openpgp.js
-- Claims extraction from keys using openpgp.js
-
-### Changed
-- Support xmpp via doip-proxy
-- Module structure
-- Docs
-
-### Fixed
-- Bad verification value return for text proofs
-- Missing User-Agent request header
-
-## 0.4.2
-
-[2020-11-06](https://codeberg.org/keyoxide/doipjs/releases/tag/0.4.2)
-
-### Changed
-
-- URLs in package.json
-
-## 0.4.1
-
-[2020-11-06](https://codeberg.org/keyoxide/doipjs/releases/tag/0.4.1)
-
-### Changed
-
-- Update README
-- Add image to coverpage
-
-## 0.4.0
-
-[2020-11-06](https://codeberg.org/keyoxide/doipjs/releases/tag/0.4.0)
-
-### Added
-
-- Custom request handler for DNS service provider
-- Docs
-
-### Changed
-
-- Service provider data structure
-- More consistent handling of options
-
-### Removed
-
-- dotenv dependency
-
-### Fixed
-
-- Crash for unexpected JSON data structure
-- Body in http requests
-
-## 0.3.0
-
-[2020-11-04](https://codeberg.org/keyoxide/doipjs/releases/tag/0.3.0)
-
-### Added
-
-- Liberapay service provider
-- Proxy request handler
-
-### Changed
-
-- Improve handling of arrays in JSON
-- Customizable proxy hostname
-
-### Fixed
-
-- Dots in URL regex
-
-## 0.2.0
-
-[2020-11-03](https://codeberg.org/keyoxide/doipjs/releases/tag/0.2.0)
-
-Initial release
diff --git a/docs/claims.md b/docs/claims.md
deleted file mode 100644
index cb1efc9..0000000
--- a/docs/claims.md
+++ /dev/null
@@ -1,147 +0,0 @@
-# Claims
-
-## Definition
-
-A **claim** is one of the two pieces of data needed to verify an online
-identity, the other being a [proof](proofs.md).
-
-A claim is always a phrase, string or URI that is expected to be found inside
-the proof. **The presence of a claim inside a proof verifies that claim.**
-
-## Claims in OpenPGP keys
-
-DOIP assumes claims are stored in OpenPGP keys as so-called notations. The
-format for all claims is the same:
-
-```
-proof@metacode.biz=...
-```
-
-## Relation with proof
-
-The relation between proof and claim is defined by three variables: `format`,
-`path` and `relation`.
-
-In the following examples, we'll assume we are dealing with a key that has the
-fingerprint `13ec664f5e0c3e4ebad8b7441adbf09217175f75`.
-
-### format
-
-This variable describes how the proof is integrated in the data returned by the
-service provider.
-
-If `format` is set to `uri`, the claim expects the proof to be or contain:
-
-```
-openpgp4fpr:13ec664f5e0c3e4ebad8b7441adbf09217175f75
-```
-
-If `format` is set to `message`, the claim expects the proof to be or contain:
-
-```
-[Verifying my OpenPGP key: openpgp4fpr:13ec664f5e0c3e4ebad8b7441adbf09217175f75]
-```
-
-If `format` is set to `fingerprint`, the claim expects the proof to be or
-contain:
-
-```
-13ec664f5e0c3e4ebad8b7441adbf09217175f75
-```
-
-### path
-
-This variables describes how to get to the important proof-containing field
-inside the JSON data. It is an array of strings, each string equal to the next
-field inside the JSON data.
-
-If the proof data is text, the `path` value is ignored.
-
-Assuming the following JSON data:
-
-```json
-"firstField": {
- "secondField": {
- "finalField": "openpgp4fpr:13ec664f5e0c3e4ebad8b7441adbf09217175f75",
- "yetAnotherField": "yetAnotherValue"
- },
- "otherField": "someValue"
-}
-```
-
-To verify any claim, the `path` should be set to:
-
-```javascript
-claim.path = ['firstField', 'secondField', 'finalField']
-```
-
-**JSON data containing arrays**
-
-In cases there are arrays in the JSON data, these should **not** be entered in
-`path`. They will always be iterated over.
-
-Assuming the following JSON data:
-
-```json
-"firstField": {
- "fieldContainingArray": [
- {
- "finalField": "https://domain.org",
- "yetAnotherField": "yetAnotherValue1"
- },
- {
- "finalField": "openpgp4fpr:13ec664f5e0c3e4ebad8b7441adbf09217175f75",
- "yetAnotherField": "yetAnotherValue2"
- }
- ],
- "otherField": "someValue"
-}
-```
-
-To verify any claim, the `path` should be set to:
-
-```javascript
-claim.path = ['firstField', 'fieldContainingArray', 'finalField']
-```
-
-Every `finalField` field for every item in the `fieldContainingArray` array will
-be tested for the claim.
-
-### relation
-
-This variable simply states whether after following the `path` inside the JSON
-data, the obtained value `contains` the claim, `equals` the claim or if the
-obtained value is an array, the claim is `oneOf` the values of the array.
-
-The `relation` should be `contains` for the following proof data:
-
-```json
-"firstField": {
- "secondField": {
- "finalField": "Long text. openpgp4fpr:13ec664f5e0c3e4ebad8b7441adbf09217175f75. Perhaps more text."
- }
-}
-```
-
-The `relation` should be `equals` for the following proof data:
-
-```json
-"firstField": {
- "secondField": {
- "finalField": "openpgp4fpr:13ec664f5e0c3e4ebad8b7441adbf09217175f75"
- }
-}
-```
-
-The `relation` should be `oneOf` for the following proof data:
-
-```json
-"firstField": {
- "secondField": {
- "finalField": [
- "cats",
- "openpgp4fpr:13ec664f5e0c3e4ebad8b7441adbf09217175f75"
- ]
- }
-}
-```
diff --git a/docs/doip.md b/docs/doip.md
deleted file mode 100644
index c51b24b..0000000
--- a/docs/doip.md
+++ /dev/null
@@ -1,102 +0,0 @@
-# Decentralized OpenPGP Identity Proofs
-
-Decentralized OpenPGP Identity Proofs, or DOIPs, are a way of identifying
-and linking profiles and accounts on the internet. Take ten different websites
-and make an account on each of them. How could outsiders tell they were created
-by the same person? They can't directly. You could be **Alice** on website A but
-**Alice123** on website B.
-
-What if a bad actor creates an account **Alice** on a brand new website and
-starts contacting people you know from website A? How could they verify this new
-accounts is in fact you?
-
-With the digital realm becoming more and more a second home in our lives, we
-need tools to identify ourselves and stay safe.
-
-## Why decentralized?
-
-Say you have a Facebook or Google account. You can use that to create accounts
-on different websites. Problem solved! That is, until the day you get an email
-that your account was flagged by AI, you just lost access to all those websites
-and there's no way to contact them to restore it.
-
-This [happens way too often](https://www.businessinsider.com/google-users-locked-out-after-years-2020-10?international=true&r=US&IR=T).
-
-Why does it happen? You are a number to them. Losing you as a user doesn't cost
-them anything.
-
-Therefore, it is imperative that new solutions give the people **sovereignty**
-over their identity. How do we do this? By making new solutions
-**decentralized**.
-
-**Decentralized** simply means that there is no central authority. In the
-classic model, you give your data to Facebook or Google and the truth is what
-they say it is: if they say you no longer exist, then, well, you no longer
-exist. In the **decentralized** model, you hold your own data and no one can
-take that away from you. This also means that service providers should fight for
-you to keep you as a user since **you allow them to use your data**. Any misstep
-on their behalf and you can take it away.
-
-## Why OpenPGP?
-
-To achieve user sovereignty, DOIP relies on **OpenPGP** cryptographic keys. Read
-more about those keys [here](cryptographickeys.md) but in short: they are like
-documents that the whole world can read but only you can edit. In that way, you
-can publish a list of profiles on websites that you have created but no one can
-do that for you in an attempt to impersonate you.
-
-## Bidirectional linking
-
-There's a catch: simply adding a link to a profile inside your OpenPGP document
-is not sufficient. If it were, you could claim any profile anywhere simply by
-linking to them!
-
-This is why DOIP uses two-way or bidirectional linking. Your key must link to a
-profile and your profile must link back to the key. That is the only way to make
-sure you hold both the key and the profile.
-
-This also solves the imposter problem. A bad actor could you link to your
-profile but since your profile doesn't link back to their key, DOIP will not
-verify their claim. Unless they hacked your profile, in which case you have more
-urgent problems.
-
-How does a profile link to a cryptographic key? Every key can be uniquely
-identified using what we call their **fingerprint**. All a profile page needs to
-do is contain that fingerprint somehow. Usually, this can be added as the last
-line to a biography.
-
-Note that the service provider itself needs to do a few things to support the
-verification of DOIPs. Please refer to the [list of supported service providers](serviceproviders.md)
-
-## Adding more than one proof
-
-The endgame of using DOIP is to add at least two profile. Proving that you own
-a single profile—in a way—doesn't prove anything. The issue is that
-we cannot prove that **you**, the physical being **you**, holds that key. DOIP
-can only verify that "_whoever holds that key also holds that profile_".
-
-By adding at least two profiles, you can create meaningful links between those
-profiles. If someone knows **you**, the physical being **you**, is **Alice** on
-website A, they will also now know that you are **Alice123** on website B,
-simply because "_whoever holds that key also holds both of those profiles_".
-
-## Why the snail logo?
-
-> Aren't snails associated with slowness?
-
-Well, they are also animals that take their homes with them wherever they go. In
-a sense, they are a nice metaphor for DOIP. Snails are the ultimate
-"decentralized life" species of the animal kingdom. They don't have to rely on
-centralized (social) structures, they are self-sufficient by always having their
-home and their identity—and their data!—with them.
-
-> Yeah, but… Snails are slow, though!
-
-You know what, let's embrace the Big Slow. DOIP is slow. Not computationally
-slow. DOIP is just a slow technology. It doesn't provide a social network, it
-doesn't send notifications or reminders, it doesn't want your attention. DOIP is
-more set-and-forget. Set your identities and the technology handles the rest. As
-long as your public keys are live, they'll just continue to work without your
-intervention.
-
-So yes, it's a **Slow Technology**.
diff --git a/docs/doip.png b/docs/doip.png
deleted file mode 100644
index 18be005..0000000
Binary files a/docs/doip.png and /dev/null differ
diff --git a/docs/doipjs/class_claim.md b/docs/doipjs/class_claim.md
deleted file mode 100644
index a980767..0000000
--- a/docs/doipjs/class_claim.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# Claim (class)
-
-## Constructor
-
-new Claim([uri], [fingerprint])
-
-**Parameters**
-
-| Name | Type | Mandatory | Description |
-| ----------- | ------ | --------- | --------------------------------- |
-| uri | string | false | The URI to an identity to verify |
-| fingerprint | string | false | The fingerprint to verify against |
-
-## Properties
-
-### uri
-
-The `uri` to an identity to verify. It can be modified until the claim is in a
-`matched` state.
-
-**Returns** `{String|null}`
-
-### fingerprint
-
-The `fingerprint` to verify against. It can be modified until the claim is in a
-`verified` state.
-
-**Returns** `{String|null}`
-
-### state
-
-The current `state` of the Claim object. It can not be set.
-
-**Values**
-
-| Value | Description |
-| -------- | ----------------------------------------------------------------- |
-| init | The claim has just been initialized |
-| matched | The claim has been matched to candidate claim definitions |
-| verified | The claim has attempted to verify all candidate claim definitions |
-
-**Returns** `{String}` The current state
-
-### matches
-
-The `matches` (or "candidate claim definitions") that have been matched against
-the `uri`.
-
-Will throw an error if the claim has not yet run `match()`.
-
-**Returns** `{Array