diff --git a/docs/source/conf.py b/docs/source/conf.py
index 7c6a130e..adea465d 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -15,7 +15,10 @@ release = latest_tag
version = release
myst_substitutions = {
- "repo_host" : "codeberg.org" # or 'github.com'
+ "repo_host" : "codeberg.org", # or 'github.com'
+# "repo_host" : "github.com",
+ "repo_pgpainless_src" : "codeberg.org/pgpainless/pgpainless/src/branch",
+# "repo_pgpainless_src" : "github.com/pgpainless/pgpainless/tree",
}
# -- General configuration
diff --git a/docs/source/pgpainless-core/quickstart.md b/docs/source/pgpainless-core/quickstart.md
index 4be4f59e..e20a53ec 100644
--- a/docs/source/pgpainless-core/quickstart.md
+++ b/docs/source/pgpainless-core/quickstart.md
@@ -1,31 +1,125 @@
## PGPainless API with pgpainless-core
-Coming soon.
+The `pgpainless-core` module contains the bulk of the actual OpenPGP implementation.
:::{note}
This chapter is work in progress.
:::
### Setup
-bla
+
+PGPainless' releases are published to and can be fetched from Maven Central.
+To get started, you first need to include `pgpainless-core` in your projects build script:
+
+```
+// If you use Gradle
+...
+dependencies {
+ ...
+ implementation "org.pgpainless:pgpainless-core:XYZ"
+ ...
+}
+
+// If you use Maven
+...
+
+ ...
+
+ org.pgpainless
+ pgpainless-core
+ XYZ
+
+ ...
+
+```
+
+This will automatically pull in PGPainless' dependencies, such as Bouncy Castle.
+
+:::{important}
+Replace `XYZ` with the current version, in this case {{ env.config.version }}!
+:::
+
+The entry point to the API is the `PGPainless` class.
+For many common use-cases, examples can be found in the
+{{ '[examples package](https://{}/main/pgpainless-core/src/test/java/org/pgpainless/example)'.format(repo_pgpainless_src) }}.
+There is a very good chance that you can find code examples there that fit your needs.
+
+### Read and Write Keys
+Reading keys from ASCII armored strings or from binary files is easy:
+
+```java
+String key = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"...;
+PGPSecretKeyRing secretKey = PGPainless.readKeyRing()
+ .secretKeyRing(key);
+```
+
+Similarly, keys or certificates can quickly be exported:
+
+```java
+// ASCII armored key
+PGPSecretKeyRing secretKey = ...;
+String armored = PGPainless.asciiArmor(secretKey);
+
+// binary (unarmored) key
+byte[] binary = secretKey.getEncoded();
+```
### Generate a Key
-bla
+PGPainless comes with a simple to use `KeyRingBuilder` class that helps you to quickly generate modern OpenPGP keys.
+There are some predefined key archetypes, but it is possible to fully customize the key generation to fit your needs.
+
+```java
+// EdDSA primary key with EdDSA signing- and XDH encryption subkeys
+PGPSecretKeyRing secretKeys = PGPainless.generateKeyRing()
+ .modernKeyRing("Romeo ", "thisIsAPassword");
+
+// RSA key without additional subkeys
+PGPSecretKeyRing secretKeys = PGPainless.generateKeyRing()
+ .simpleRsaKeyRing("Juliet ", RsaLength._4096);
+```
+
+To generate a customized key, use `PGPainless.buildKeyRing()` instead:
+
+```java
+// Customized key
+PGPSecretKeyRing keyRing = PGPainless.buildKeyRing()
+ .setPrimaryKey(KeySpec.getBuilder(
+ RSA.withLength(RsaLength._8192),
+ KeyFlag.SIGN_DATA, KeyFlag.CERTIFY_OTHER)
+ .overrideCompressionAlgorithms(CompressionAlgorithm.ZLIB)
+ ).addSubkey(
+ KeySpec.getBuilder(ECDSA.fromCurve(EllipticCurve._P256), KeyFlag.SIGN_DATA)
+ ).addSubkey(
+ KeySpec.getBuilder(
+ ECDH.fromCurve(EllipticCurve._P256),
+ KeyFlag.ENCRYPT_COMMS, KeyFlag.ENCRYPT_STORAGE)
+ ).addUserId("Juliet ")
+ .addUserId("xmpp:juliet@capulet.lit")
+ .setPassphrase(Passphrase.fromPassword("romeo_oh_Romeo<3"))
+ .build();
+```
+
+As you can see, it is possible to generate all kinds of different keys.
### Extract a Certificate
-bla
+If you have a secret key, you might want to extract a public key certificate from it:
+
+```java
+PGPSecretKeyRing secretKey = ...;
+PGPPublicKeyRing certificate = PGPainless.extractCertificate(secretKey);
+```
### Apply / Remove ASCII Armor
-bla
+TODO
### Encrypt a Message
-bla
+TODO
### Decrypt a Message
-bla
+TODO
### Sign a Message
-bla
+TODO
### Verify a Signature
-bla
+TODO
diff --git a/docs/source/pgpainless-sop/quickstart.md b/docs/source/pgpainless-sop/quickstart.md
index 8c8aabb4..ecd7d81d 100644
--- a/docs/source/pgpainless-sop/quickstart.md
+++ b/docs/source/pgpainless-sop/quickstart.md
@@ -239,7 +239,7 @@ If you provided the senders certificate for the purpose of signature verificatio
probably want to check, if the message was actually signed by the sender by checking `result.getVerifications()`.
:::{note}
-Signature verification will be discussed in more detail in section [](#verifications)
+Signature verification will be discussed in more detail in section "Verifications".
:::
If the message was encrypted symmetrically using a password, you can also decrypt is symmetrically by calling