diff --git a/apps/docs/content/docs/self-hosted/coolify.mdx b/apps/docs/content/docs/self-hosted/coolify.mdx
index 02c6232c..b2243144 100644
--- a/apps/docs/content/docs/self-hosted/coolify.mdx
+++ b/apps/docs/content/docs/self-hosted/coolify.mdx
@@ -45,7 +45,7 @@ This uses a **Docker Compose resource**: you paste the compose file and set ever
Log in to Coolify and **create a project**. When you add a resource, Coolify asks what type it is — GitHub, a Docker image, a service, or a **Docker Compose** file. Choose **Docker Compose**, then **paste the contents of [`docker-compose.images.yaml`](https://github.com/classroomio/classroomio/blob/main/docker-compose.images.yaml)** into the editor.
-
+
@@ -53,8 +53,8 @@ Log in to Coolify and **create a project**. When you add a resource, Coolify ask
### Confirm the services parsed
After saving, Coolify parses the compose file and lists the services: `postgres`, `redis`, `api`, `dashboard`, `jobs` (and `minio` once you enable its profile in the next step). Confirm they all appear before moving on.
-
-
+
+
@@ -87,7 +87,7 @@ SMTP_SENDER=ClassroomIO
only if you use that integration. Leaving an optional one blank never causes a build or boot error.
-
+
@@ -102,7 +102,7 @@ SMTP_SENDER=ClassroomIO
reproducible.
-
+
@@ -112,7 +112,7 @@ Open the **dashboard** service → **Settings** and set its domain, including th
The dashboard proxies API calls server-side, so you normally only expose the dashboard publicly — the `api` service stays internal.
-
+
@@ -120,7 +120,7 @@ The dashboard proxies API calls server-side, so you normally only expose the das
Click **Deploy**. Coolify pulls `classroomio/{api,dashboard,jobs}:${CIO_VERSION}`, starts Postgres + Redis, the API container runs database setup on first boot, then the dashboard and the **jobs worker** come up. Watch the **logs** — they tell you when every service is up.
-
+
@@ -128,7 +128,7 @@ Click **Deploy**. Coolify pulls `classroomio/{api,dashboard,jobs}:${CIO_VERSION}
Once the logs show the stack is healthy, open your dashboard URL (`https://dash.yourdomain.com`) in a new browser tab and **sign up**. The **first** account becomes the organization **admin**. Every signup or sign-in after that joins as a student — unless you invite them with a specific role.
-
+
diff --git a/apps/docs/content/docs/self-hosted/railway.mdx b/apps/docs/content/docs/self-hosted/railway.mdx
index ca0edd10..30cf6dde 100644
--- a/apps/docs/content/docs/self-hosted/railway.mdx
+++ b/apps/docs/content/docs/self-hosted/railway.mdx
@@ -45,8 +45,8 @@ The one-click template provisions **all of the services** for you — Postgres,
Click the **Deploy on Railway** button above. Railway opens the template page where all of the ClassroomIO services are listed and ready to configure.
-
-
+
+
### Review the preconfigured services
@@ -58,7 +58,7 @@ The template comes with every service preconfigured — most need nothing from y
The next three steps cover the services that **do** need input: `cio-jobs`, `cio-minio`, and `cio-api`.
-
+
@@ -72,7 +72,7 @@ The next three steps cover the services that **do** need input: `cio-jobs`, `cio
- `SMTP_SENDER`
- `SMTP_PASSWORD`
-
+
@@ -84,7 +84,7 @@ Set the storage credentials on `cio-minio`:
- `MINIO_ROOT_USER`
- `MINIO_ROOT_PASSWORD`
-
+
@@ -92,8 +92,8 @@ Set the storage credentials on `cio-minio`:
On `cio-api`, set the SMTP host and any additional values you want. See the [Environment variable reference](#environment-variable-reference) below for the full list (object storage, auth secrets, dashboard origin, and more).
-
-
+
+
@@ -101,7 +101,7 @@ On `cio-api`, set the SMTP host and any additional values you want. See the [Env
Click **Deploy**. Railway begins building and bringing the services online — Redis, Postgres, and the rest come up first.
-
+
@@ -111,7 +111,7 @@ Click **Deploy**. Railway begins building and bringing the services online — R
On the first deploy, `cio-api` can crash. This is expected **only when you rely on the Railway-generated subdomain**: the API needs the dashboard's public domain (Better Auth's base URL), which doesn't exist yet. If you're using your **own custom subdomain**, this crash doesn't happen — skip ahead to signing up.
-
+
@@ -119,7 +119,7 @@ Click **Deploy**. Railway begins building and bringing the services online — R
Open **cio-dashboard → Settings → Networking** and click **Generate Domain**. Railway assigns the public domain the API needs.
-
+
@@ -127,8 +127,8 @@ Open **cio-dashboard → Settings → Networking** and click **Generate Domain**
Redeploy **cio-dashboard**, then **cio-api**, so both pick up the newly generated domain. They should now boot cleanly.
-
-
+
+
@@ -136,7 +136,7 @@ Redeploy **cio-dashboard**, then **cio-api**, so both pick up the newly generate
Open the generated dashboard URL in a **new browser tab** and **sign up** to create your first account.
-
+
diff --git a/apps/docs/public/coolify-01-add-resource.webp b/apps/docs/public/coolify-01-add-resource.webp
new file mode 100644
index 00000000..efdb72a9
Binary files /dev/null and b/apps/docs/public/coolify-01-add-resource.webp differ
diff --git a/apps/docs/public/coolify-01-new-resource.webp b/apps/docs/public/coolify-01-new-resource.webp
new file mode 100644
index 00000000..b4a0ecdd
Binary files /dev/null and b/apps/docs/public/coolify-01-new-resource.webp differ
diff --git a/apps/docs/public/coolify-02-services.webp b/apps/docs/public/coolify-02-services.webp
new file mode 100644
index 00000000..caa427a6
Binary files /dev/null and b/apps/docs/public/coolify-02-services.webp differ
diff --git a/apps/docs/public/coolify-03-env-vars.webp b/apps/docs/public/coolify-03-env-vars.webp
new file mode 100644
index 00000000..58ddc9ad
Binary files /dev/null and b/apps/docs/public/coolify-03-env-vars.webp differ
diff --git a/apps/docs/public/coolify-04-image-tag.webp b/apps/docs/public/coolify-04-image-tag.webp
new file mode 100644
index 00000000..045c6361
Binary files /dev/null and b/apps/docs/public/coolify-04-image-tag.webp differ
diff --git a/apps/docs/public/coolify-05-dashboard-domain.webp b/apps/docs/public/coolify-05-dashboard-domain.webp
new file mode 100644
index 00000000..a5a90e75
Binary files /dev/null and b/apps/docs/public/coolify-05-dashboard-domain.webp differ
diff --git a/apps/docs/public/coolify-06-deploy-logs.webp b/apps/docs/public/coolify-06-deploy-logs.webp
new file mode 100644
index 00000000..4a1eeb88
Binary files /dev/null and b/apps/docs/public/coolify-06-deploy-logs.webp differ
diff --git a/apps/docs/public/railway-01-deploy-template.webp b/apps/docs/public/railway-01-deploy-template.webp
new file mode 100644
index 00000000..6b324518
Binary files /dev/null and b/apps/docs/public/railway-01-deploy-template.webp differ
diff --git a/apps/docs/public/railway-02-services-overview.webp b/apps/docs/public/railway-02-services-overview.webp
new file mode 100644
index 00000000..56c5ec79
Binary files /dev/null and b/apps/docs/public/railway-02-services-overview.webp differ
diff --git a/apps/docs/public/railway-03-jobs-smtp.webp b/apps/docs/public/railway-03-jobs-smtp.webp
new file mode 100644
index 00000000..6b8cc195
Binary files /dev/null and b/apps/docs/public/railway-03-jobs-smtp.webp differ
diff --git a/apps/docs/public/railway-04-minio-credentials.webp b/apps/docs/public/railway-04-minio-credentials.webp
new file mode 100644
index 00000000..620bd777
Binary files /dev/null and b/apps/docs/public/railway-04-minio-credentials.webp differ
diff --git a/apps/docs/public/railway-05-api-config.webp b/apps/docs/public/railway-05-api-config.webp
new file mode 100644
index 00000000..ea670e28
Binary files /dev/null and b/apps/docs/public/railway-05-api-config.webp differ
diff --git a/apps/docs/public/railway-06-api-config-additional.webp b/apps/docs/public/railway-06-api-config-additional.webp
new file mode 100644
index 00000000..48ebd518
Binary files /dev/null and b/apps/docs/public/railway-06-api-config-additional.webp differ
diff --git a/apps/docs/public/railway-07-deploying.webp b/apps/docs/public/railway-07-deploying.webp
new file mode 100644
index 00000000..b0626f73
Binary files /dev/null and b/apps/docs/public/railway-07-deploying.webp differ
diff --git a/apps/docs/public/railway-08-first-boot-crash.webp b/apps/docs/public/railway-08-first-boot-crash.webp
new file mode 100644
index 00000000..c3d338d0
Binary files /dev/null and b/apps/docs/public/railway-08-first-boot-crash.webp differ
diff --git a/apps/docs/public/railway-09-generate-domain.webp b/apps/docs/public/railway-09-generate-domain.webp
new file mode 100644
index 00000000..6d672287
Binary files /dev/null and b/apps/docs/public/railway-09-generate-domain.webp differ
diff --git a/apps/docs/public/railway-10-redeploy-dashboard.webp b/apps/docs/public/railway-10-redeploy-dashboard.webp
new file mode 100644
index 00000000..4be87553
Binary files /dev/null and b/apps/docs/public/railway-10-redeploy-dashboard.webp differ
diff --git a/apps/docs/public/railway-11-redeploy-api.webp b/apps/docs/public/railway-11-redeploy-api.webp
new file mode 100644
index 00000000..6c952b7a
Binary files /dev/null and b/apps/docs/public/railway-11-redeploy-api.webp differ
diff --git a/apps/docs/public/railway-12-signup.webp b/apps/docs/public/railway-12-signup.webp
new file mode 100644
index 00000000..b14be02b
Binary files /dev/null and b/apps/docs/public/railway-12-signup.webp differ