diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0edc8d6..8f1ea61 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -2,16 +2,14 @@
 
 Great to see that you want to help out! Here are some tips for getting started:
 
-* If you're just starting out, I suggest tackling some [easy issues] first.
-
 * Please leave a comment on the issue you're working on, so that other people don't duplicate work.
 
-* Most contributions should include tests – see the [existing test code] for how to write these.
+* Most contributions should include [tests] and a [changelog entry].
 
-* Documentation on the proc macro interface can be found on [docs.rust-lang.org][proc_macro].
+* Want to work on documentation? See the [docs readme] for advice on that.
 
 Have fun! ☺️
 
-[easy issues]: https://github.com/lambda-fairy/maud/issues?q=is%3Aissue+is%3Aopen+label%3A%22difficulty%3A+easy%22
-[existing test code]: https://github.com/lambda-fairy/maud/tree/master/maud/tests
-[proc_macro]: https://doc.rust-lang.org/nightly/proc_macro/
+[tests]: maud/tests
+[changelog entry]: CHANGELOG.md
+[docs readme]: docs/README.md
diff --git a/RELEASE_PROCESS.md b/RELEASE_PROCESS.md
new file mode 100644
index 0000000..d74eac6
--- /dev/null
+++ b/RELEASE_PROCESS.md
@@ -0,0 +1,16 @@
+# Release process
+
+1. Update [changelog](CHANGELOG.md)
+2. Update `Cargo.toml`:
+    - [`maud`](maud/Cargo.toml) (don't forget dependencies!)
+    - [`maud_macros`](maud_macros/Cargo.toml)
+    - [`maud_htmlescape`](maud_htmlescape/Cargo.toml) (if necessary)
+3. Update `#![doc(html_root_html = "...")]`:
+    - [`maud`](maud/src/lib.rs)
+    - [`maud_macros`](maud_macros/src/lib.rs)
+    - [`maud_htmlescape`](maud_htmlescape/src/lib.rs) (if necessary)
+4. `cd docs && cargo update`
+5. Commit to a new branch `release-X.Y.Z`, open a PR, fix issues, merge
+6. [Create a release](https://github.com/lambda-fairy/maud/releases/new)
+7. `cargo publish`
+8. [Publish documentation](https://github.com/lambda-fairy/maud/actions?query=workflow%3A%22Publish+docs%22)