diff --git a/.github/workflows/snapshots.yml b/.github/workflows/snapshots.yml
index 701c77439..f31927e16 100644
--- a/.github/workflows/snapshots.yml
+++ b/.github/workflows/snapshots.yml
@@ -22,10 +22,6 @@ jobs:
 
       - run: chmod -R 777 *
 
-      - name: Get branch name
-        id: branch-name
-        uses: tj-actions/branch-names@v4.8
-
       - name: Init gradle project
         run: ./gradlew clean --scan
 
@@ -56,3 +52,8 @@ jobs:
           SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}
           SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}
           CURRENT_BRANCH_NAME: dev
+
+      - run: >
+          ./gradlew publishSnapshotPage --info
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/ci-release-helper/build.gradle.kts b/ci-release-helper/build.gradle.kts
index 3c7c13950..000c8144d 100644
--- a/ci-release-helper/build.gradle.kts
+++ b/ci-release-helper/build.gradle.kts
@@ -6,8 +6,14 @@
  *
  *  https://github.com/mamoe/mirai/blob/master/LICENSE
  */
+import com.google.gson.JsonObject
 import keys.SecretKeys
 import java.io.ByteArrayOutputStream
+import java.net.URI
+import java.net.http.HttpClient
+import java.net.http.HttpRequest
+import java.net.http.HttpRequest.BodyPublishers
+import java.net.http.HttpResponse
 
 plugins {
     id("io.codearte.nexus-staging") version "0.22.0"
@@ -36,6 +42,45 @@ tasks.register("updateSnapshotVersion") {
     }
 }
 
+tasks.register("publishSnapshotPage") {
+    doLast {
+        val token = System.getenv("GH_TOKEN") ?: error("GH_TOKEN not found")
+
+        val sha = getSha().trim()
+        val ver = (project.version as Any?).toString()
+        val http = HttpClient.newHttpClient()
+        val document = rootProject.projectDir.resolve("docs/UsingSnapshots.md").let { file ->
+            kotlin.runCatching { file.readText() }.getOrElse { "" }
+        }
+        val content = JsonObject().also { data ->
+            data.addProperty("name", "Snapshot Build Output")
+            data.addProperty("head_sha", sha)
+            data.addProperty("conclusion", "success")
+            data.add("output", JsonObject().also { output ->
+                output.addProperty("title", "Snapshot build ($ver)")
+                output.addProperty("summary", "snapshot version: `$ver`\n\n------\n\n\n$document")
+            })
+        }.toString()
+        http.send(
+            HttpRequest.newBuilder(URI.create("https://api.github.com/repos/mamoe/mirai/check-runs"))
+                .POST(BodyPublishers.ofString(content))
+                .header("Authorization", "token $token")
+                .header("Accept", "application/vnd.github.v3+json")
+                .build(),
+            HttpResponse.BodyHandlers.ofByteArrayConsumer { rsp ->
+                if (rsp.isPresent) {
+                    System.out.write(rsp.get())
+                } else {
+                    println()
+                    println()
+                }
+            }
+        )
+
+        (http.executor() as? java.util.concurrent.ExecutorService)?.shutdown()
+    }
+}
+
 
 val snapshotVersion by lazy { getSnapshotVersionImpl() }