diff --git a/_snippets/review-footer.md b/_snippets/review-footer.md
index 5b2e2f8..b5ae8ac 100644
--- a/_snippets/review-footer.md
+++ b/_snippets/review-footer.md
@@ -2,11 +2,11 @@
///Footnotes Go Here///
-### Tip your waiter (sponsor) 👏
+### Tip your reviewer (sponsor) 👏
Did you receive excellent service? Want to compliment the chef? (_..and support development of current and future recipes!_) Sponsor me on [Github][github_sponsor] / [Patreon][patreon], or see the [contribute](/community/contribute/) page for more (_free or paid)_ ways to say thank you! 👏
-### Employ your chef (engage) 🤝
+### Work with me (engage) 🤝
Is this too much of a geeky PITA? Do you just want results, stat? [I do this for a living](https://www.funkypenguin.co.nz/about/) - I'm a full-time Kubernetes contractor, providing consulting and engineering expertise to businesses needing short-term, short-notice support in the cloud-native space, including AWS/Azure/GKE, Kubernetes, CI/CD and automation.
diff --git a/manuscript/docker-swarm/shared-storage-ceph.md b/manuscript/docker-swarm/shared-storage-ceph.md
index 6dd44c8..2f179cf 100644
--- a/manuscript/docker-swarm/shared-storage-ceph.md
+++ b/manuscript/docker-swarm/shared-storage-ceph.md
@@ -6,7 +6,7 @@ description: Ceph provides persistent storage to your Docker Swarm cluster, supp
While Docker Swarm is great for keeping containers running (_and restarting those that fail_), it does nothing for persistent storage. This means if you actually want your containers to keep any data persistent across restarts (_hint: you do!_), you need to provide shared storage to every docker node.
-{ loading=lazy }
+{ loading=lazy }
## Ingredients
diff --git a/manuscript/docker-swarm/traefik.md b/manuscript/docker-swarm/traefik.md
index 5040ca3..e25ddc0 100644
--- a/manuscript/docker-swarm/traefik.md
+++ b/manuscript/docker-swarm/traefik.md
@@ -15,7 +15,7 @@ There are some gaps to this approach though:
To deal with these gaps, we need a front-end load-balancer, and in this design, that role is provided by [Traefik](https://traefik.io/).
-{ loading=lazy }
+{ loading=lazy }
!!! tip
In 2021, this recipe was updated for Traefik v2. There's really no reason to be using Traefikv1 anymore ;)
diff --git a/manuscript/images/reviews/mastodon-back-in-2017.png b/manuscript/images/reviews/mastodon-back-in-2017.png
new file mode 100644
index 0000000..9fd1647
Binary files /dev/null and b/manuscript/images/reviews/mastodon-back-in-2017.png differ
diff --git a/manuscript/images/reviews/mastodon.png b/manuscript/images/reviews/mastodon.png
new file mode 100644
index 0000000..23bb78d
Binary files /dev/null and b/manuscript/images/reviews/mastodon.png differ
diff --git a/manuscript/kubernetes/ingress/traefik/dashboard.md b/manuscript/kubernetes/ingress/traefik/dashboard.md
index 629c8b5..328c1b3 100644
--- a/manuscript/kubernetes/ingress/traefik/dashboard.md
+++ b/manuscript/kubernetes/ingress/traefik/dashboard.md
@@ -6,7 +6,7 @@ description: Unlike competing ingresses (*cough* nginx *cough*), the beautiful T
One of the advantages [Traefik](/kubernetes/ingress/traefik/) offers over [Nginx](/kubernetes/ingress/nginx/), is a native dashboard available in the open-source version (*Nginx+, the commercially-supported version, also includes a dashboard*).
-{ loading=lazy }
+{ loading=lazy }
!!! summary "Ingredients"
diff --git a/manuscript/kubernetes/ingress/traefik/index.md b/manuscript/kubernetes/ingress/traefik/index.md
index 87abf5f..de41502 100644
--- a/manuscript/kubernetes/ingress/traefik/index.md
+++ b/manuscript/kubernetes/ingress/traefik/index.md
@@ -12,7 +12,7 @@ Traefik natively includes some features which Nginx lacks:
* [x] An elegant "middleware" implementation allowing certain requests to pass through additional layers of authentication
* [x] A beautiful dashboard
-{ loading=lazy }
+{ loading=lazy }
!!! summary "Ingredients"
diff --git a/manuscript/kubernetes/persistence/index.md b/manuscript/kubernetes/persistence/index.md
index 8e7692e..9f26530 100644
--- a/manuscript/kubernetes/persistence/index.md
+++ b/manuscript/kubernetes/persistence/index.md
@@ -7,5 +7,5 @@ Here are some popular options, ranked in difficulty/complexity, in vaguely ascen
* [Local Path Provisioner](/kubernetes/persistence/local-path-provisioner/) (on k3s)
* [TopoLVM](/kubernetes/persistence/topolvm/)
* OpenEBS (coming soon)
-* Rook Ceph (coming soon)
+* [Rook Ceph](/kubernetes/persistence/rook-ceph/)
* Longhorn (coming soon)
diff --git a/manuscript/kubernetes/persistence/rook-ceph.md b/manuscript/kubernetes/persistence/rook-ceph.md
index f0a3812..8d2358d 100644
--- a/manuscript/kubernetes/persistence/rook-ceph.md
+++ b/manuscript/kubernetes/persistence/rook-ceph.md
@@ -1,3 +1,53 @@
-# Rook Ceph
+---
+title: How to use Rook Ceph for Persistent Storage in Kubernetes
+description: How to deploy Rook Ceph into your Kubernetes cluster for persistent storage
+---
-Coming soon!
+# Persistent storage in Kubernetes with Rook Ceph / CephFS
+
+[Ceph](https://docs.ceph.com/en/quincy/) is a highly-reliable, scalable network storage platform which uses individual disks across participating nodes to provide fault-tolerant storage.
+
+{ loading=lazy }
+
+[Rook](https://rook.io) provides an operator for Ceph, decomposing the [10-year-old](https://en.wikipedia.org/wiki/Ceph_(software)#Release_history), at-time-arcane, platform into cloud-native components, created declaratively, whose lifecycle is managed by an operator.
+
+
+## Rook Ceph requirements
+
+!!! summary "Ingredients"
+
+ Already deployed:
+
+ * [x] A [Kubernetes cluster](/kubernetes/cluster/)
+ * [x] [Flux deployment process](/kubernetes/deployment/flux/) bootstrapped
+ * [x] An [Ingress](/kubernetes/ingress/) to route incoming traffic to services
+
+ New:
+
+ * [ ] At least 3 nodes with dedicated disks available (*more is better*)
+
+## Preparation
+
+### Namespace
+
+We need a namespace to deploy our HelmRelease and associated ConfigMaps into. Per the [flux design](/kubernetes/deployment/flux/), I create this example yaml in my flux repo at `/bootstrap/namespaces/namespace-rook-system.yaml`:
+
+```yaml title="/bootstrap/namespaces/namespace-mastodon.yaml"
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: rook-system
+```
+
+### HelmRepository
+
+```yaml title="/bootstrap/helmrepositories/gitepository-rook-release.yaml"
+apiVersion: source.toolkit.fluxcd.io/v1beta1
+kind: HelmRepository
+metadata:
+ name: rook-release
+ namespace: flux-system
+spec:
+ interval: 15m
+ url: https://charts.rook.io/release
+```
diff --git a/manuscript/recent-changes.md b/manuscript/recent-changes.md
index 1c50fc8..07c7e4e 100644
--- a/manuscript/recent-changes.md
+++ b/manuscript/recent-changes.md
@@ -30,6 +30,7 @@ Recipe | Description
Recipe | Description | Date
------------------------|--------------|-------------
+[Mastodon][review/mastodon] | First review | _9 Aug 2022_
[Immich][review/immich] | First review | _3 Aug 2022_
## Subscribe to updates
diff --git a/manuscript/recipes/kubernetes/mastodon.md b/manuscript/recipes/kubernetes/mastodon.md
index ce11f01..ec9edbf 100644
--- a/manuscript/recipes/kubernetes/mastodon.md
+++ b/manuscript/recipes/kubernetes/mastodon.md
@@ -260,6 +260,9 @@ Now hit the URL you defined in your config, and you should see your beautiful ne
Once you're done, "toot" me up by mentioning [funkypenguin@so.fnky.nz](https://so.fnky.nz/@funkypenguin) in a toot! :wave:
+!!! tip
+ If your instance feels lonely, try using some [relays](https://github.com/brodi1/activitypub-relays) to bring in the federated firehose!
+
## Summary
What have we achieved? We now have a fully-swarmed Mastodon instance, ready to federate with the world! :material-mastodon:
diff --git a/manuscript/recipes/mastodon.md b/manuscript/recipes/mastodon.md
index 748b976..45b2bae 100644
--- a/manuscript/recipes/mastodon.md
+++ b/manuscript/recipes/mastodon.md
@@ -383,6 +383,9 @@ Now hit the URL you defined in your config, and you should see your beautiful ne
Once you're done, "toot" me by mentioning [funkypenguin@so.fnky.nz](https://so.fnky.nz/@funkypenguin) in a toot! :wave:
+!!! tip
+ If your instance feels lonely, try using some [relays](https://github.com/brodi1/activitypub-relays) to bring in the federated firehose!
+
## Summary
diff --git a/manuscript/review/index.md b/manuscript/review/index.md
index 6c15f44..efd80df 100644
--- a/manuscript/review/index.md
+++ b/manuscript/review/index.md
@@ -12,6 +12,6 @@ What you'll find here are opinions and notes about various self-hosted applicati
App | Description | Date
---------|----------| ---------
[Immich][review/immich] | Google Photos replacement | 3 Aug 2022
-
+ [Mastodon][review/mastodon] | Federated microblogging social network | 9 Aug 2022
--8<-- "common-links.md"
\ No newline at end of file
diff --git a/manuscript/review/mastodon.md b/manuscript/review/mastodon.md
new file mode 100644
index 0000000..7686f8b
--- /dev/null
+++ b/manuscript/review/mastodon.md
@@ -0,0 +1,130 @@
+---
+title: Review / Mastodon - Self-hosted twitter alternative
+description: Mastodon is a globally interconnected, federated, microblogging community / social network
+upstream_version: v3.5.3
+upstream_repo: https://github.com/mastodon/mastodon/
+review_latest_change: Initial review!
+---
+
+# Mastodon - Open Source Twitter Alternative
+
+| Review details | |
+| ----------- | ------------------------------------ |
+| :material-calendar-check: Last updated | *{{ git_revision_date_localized }}* |
+| :octicons-number-24: Reviewed version | *[{{ page.meta.upstream_version }}]({{ page.meta.upstream_repo }})* |
+
+Mastodon is a twitter-inspired, federated, microblogging community ("social network"), which anybody can partricipate in by joining a public instance, or running their own instance.
+
+{ loading=lazy }
+
+## Background
+
+I've been interested in running a Mastodon instance since I [read about it](https://www.theverge.com/2017/4/4/15177856/mastodon-social-network-twitter-clone) back in 2017. I gave it a try back then, but IIRC Docker support was iffy, and the way federation worked was a bit hit-and-miss (*at least, in my attempts*) I did learn a bit about "[WebFinger](https://docs.joinmastodon.org/spec/webfinger/)" :fingers_crossed: though, which still sounds a bit dirty! :smiling_imp:
+
+{ loading=lazy }
+
+After abandoning my dreams of hosting an instance, I kept a few accounts on mastodon.social, experimenting with cross-posting from Micro.blog, and using the native RSS feature to provide a manually-created [changelog of new recipes](/recent-changes/).
+
+In 2022, finding myself wanting to up my "social game" without tying myself into Twitter, I started assembling a typically geeky, over-engineered workflow to [cross-post between Mastodon and Twitter](https://crossposter.masto.donte.com.br/), and easily produce RSS feeds.
+
+I decided to take a fresh attempt (*5 years on*) at running [my own instance][community/mastodon], and in the process, I re-introduced myself to elements of the Mastdon experience, which I'll explain below...
+
+## What's notable about Mastodon?
+
+Here are my thoughts:
+
+### Technology
+
+1. There's a [steady cadance of ongoing new releases](https://blog.joinmastodon.org/categories/new-features/), and a dedicated [Patreon](https://www.patreon.com/user?u=619786) and [Sponsor](https://joinmastodon.org/sponsors) supporter base.
+
+2. There are now (*as of April 2022*) [official mobile apps](https://blog.joinmastodon.org/2022/04/official-apps-now-available-for-ios-and-android/) for iOS and Android (*there are also dozens of 3rd-party apps which have appear over the years, but some of these are no longer updated*).
+
+### Culture
+
+Community is hard, [federation can be abused to harass target users and administrators](https://wilwheaton.net/2018/08/the-world-is-a-terrible-place-right-now-and-thats-largely-because-it-is-what-we-make-it/), and community moderation is generally a thankless job.
+
+Social "platforms" are no longer just fun cat pictures, they're a now powerful social tool for effecting change or producing life-destroying harm, and a mature, open-source code-base is an attractive starting point[^1] for those wanting to establish[^2] their own platforms.
+
+Public servers tend to serve [communities](https://joinmastodon.org/communities) of a particular interest, be it art, music, gaming, etc.
+
+## Details
+
+### Docker Install
+
+Mastodon includes a [docker-compose](https://github.com/mastodon/mastodon/blob/main/docker-compose.yml) file for deploying under Docker, but it's not a "fire-and-forget" deal, since there are some manual steps required to migrate (or instantiate) the database, setup users, secrets, etc.
+
+More importantly, since docker-compose will only run containers on a single host, this provides no resilience to failure, and no container orchestration like we're used to with Docker Swarm / Kubernetes.
+
+I've adapted the docker-compose for swarm mode, and written a recipe to [install Mastodon in Docker Swarm][mastodon].
+
+### Kubernetes Install
+
+Mastodon's repo also [includes a helm chart](https://github.com/mastodon/mastodon/tree/main/chart), which makes the process of deploying to Kubernetes **much** simpler than either Docker or Docker Swarm. The chart isn't published on [ArtifactHUB](https://artifacthub.io/packages/search?ts_query_web=mastodon&sort=relevance&page=1) yet (*I hope to fix this with a PR*), which means it's hard to discover.
+
+There are other elements I'd like to improve about the official chart, such as the use of env variables for secrets (*these should ideally be Kubernetes secrets*), but the availability of contructs such as Jobs makes the whole deployment and setup process work.
+
+Here's my an opinionated guite to [installing Mastodon in Kubernetes][k8s/mastodon], which is how I've deployed my [FNKY](https://so.fnky.nz ) instance.
+
+### Admin UI
+
+You could probably browse any public instance to get a feel for the user-facing UI and options, but it's harder to get a feel for the admin backend without performing your own installation. Here's a quick video of the admin options to scratch that itch...
+
+
+
+## Alternatives
+
+### Twitter
+
+OK, obviously one is a bot-filled :robot: cesspool so scary that Elon Musk doesn't want to buy it, and the other is open-source, self-hosted, federated, and can't be censored, monetized, mined, advertised to, etc.
+
+Here are some other differences...
+
+
+| Feature | :material-twitter: Twitter | :material-mastodon: Mastodon | Notes
+| ----- | ----------- | ------------------------------------ | ----- |
+| :octicons-comment-16: A post is.. | a "tweet" | a "toot" :material-thought-bubble-outline: | yes, really! |
+| :material-comment-multiple-outline: Sharing a post.. | retweeting | boosting | no, not "retooting"! |
+| :material-link: Links count as | 9 chars | 23 chars | Regardless of length of URL |
+| :material-counter: Character limit | 280 | 500 | |
+| :octicons-video-24: Media | :white_check_mark: | :white_check_mark: | video/audio/images work as you'd expect
+| :material-poll: Polls | :white_check_mark: | :white_check_mark: | yes, polls too |
+| :material-sunglasses: Privacy | :white_check_mark: | :white_check_mark: | you can hide your toots! |
+| :octicons-comment-discussion-16: Threads | :white_check_mark: | :white_check_mark: | like [this](https://so.fnky.nz/web/@funkypenguin/108790252118210551)|
+| :material-sticker-emoji: Custom emoji | :x: | :white_check_mark: | like Discord, you can define custom emoji for your community |
+| :material-rss: RSS feed | :x: | :white_check_mark: | like [this](https://so.fnky.nz/web/@funkypenguin.rss) |
+| :bikini: Content warnings | :x: | :white_check_mark: | hide NSFW content, spoilers, etc |
+| :material-police-badge: Moderation | TWTR | per-instance | |
+
+ Mastodon vs Twitter
+
+
+**Conclusion**: Although the primary differentiator is centralized "Big Tech" vs federated open-source, there are some feature advantages (*and some quirks!*) to Mastodon vs Twitter :thumbsup:
+
+## Summary
+
+### TL;DR
+
+If you..
+
+* Just like the tech..
+* Want to "*stick it to the man*"..
+* Find the concept of an isolated, themed social community attractive...
+
+.. Then join one of the thousands of [available instances](https://joinmastodon.org/communities).
+
+If you additionally:
+
+* Prefer to self-host your own tools..
+* Want an instance to share with your community...
+
+.. Then install your own instance in [Docker][mastodon] or [Kubernetes][k8s/mastodon]!
+
+I want to "own" my content[^3], and I want to invest in the [Geek Cookbook community](/community/), so I chose my own instance.
+
+Whichever path you take into the "fediverse", [toot me up](https://so.fnky.nz/@funkypenguin) when you get here!
+
+--8<-- "review-footer.md"
+
+[^1]: https://blog.joinmastodon.org/2019/07/statement-on-gabs-fork-of-mastodon/
+[^2]: https://blog.joinmastodon.org/2021/10/trumps-new-social-media-platform-found-using-mastodon-code/
+[^3]: I'll continue to cross-post from Mastodon to Twitter though, for visibility and engagement
diff --git a/mkdocs.yml b/mkdocs.yml
index c6acfbe..1bb7268 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -193,8 +193,8 @@ nav:
- kubernetes/persistence/index.md
- Local Path Provisioner: kubernetes/persistence/local-path-provisioner.md
- TopoLVM: kubernetes/persistence/topolvm.md
- # - Rook Ceph: kubernetes/persistence/rook-ceph.md
# - OpenEBS: kubernetes/persistence/openebs.md
+ # - Rook Ceph: kubernetes/persistence/rook-ceph.md
# - LongHorn: kubernetes/persistence/longhorn.md
# - Backup:
# - kubernetes/backup/index.md
@@ -243,7 +243,8 @@ nav:
# - Kubernetes: premix/kubernetes.md
- ☑️ Reviews:
- review/index.md
- - Immich: review/immich.md
+ - Immich: review/immich.md
+ - Mastodon: review/mastodon.md
- CHANGELOG: recent-changes.md
- Support: support.md
- Contribute: community/contribute.md