diff --git a/scripts/release-checksums.rb b/scripts/release-checksums.rb
new file mode 100644
index 0000000000..ee0a6398c1
--- /dev/null
+++ b/scripts/release-checksums.rb
@@ -0,0 +1,34 @@
+#!/usr/bin/env ruby
+
+require "open-uri"
+require "digest"
+
+tag = ARGV[0]
+puts "Generating release checksums for #{tag}, this could take a while..."
+
+windows_exe = "https://github.com/nervosnetwork/neuron/releases/download/#{tag}/Neuron-#{tag}-win-installer.exe"
+macos_zip = "https://github.com/nervosnetwork/neuron/releases/download/#{tag}/Neuron-#{tag}-mac.zip"
+macos_dmg = "https://github.com/nervosnetwork/neuron/releases/download/#{tag}/Neuron-#{tag}-mac.dmg"
+linux_appimage = "https://github.com/nervosnetwork/neuron/releases/download/#{tag}/Neuron-#{tag}-linux-x86_64.AppImage"
+
+def get_sha256_checksum(url)
+ content = open(url).read
+ Digest::SHA256.hexdigest(content)
+end
+
+windows_exe_sha256, macos_zip_sha256, macos_dmg_sha256, linux_appimage_sha256 = [windows_exe, macos_zip, macos_dmg, linux_appimage].map do |url|
+ Thread.new { get_sha256_checksum(url) }
+end.map(&:value)
+
+checksums = %(
+### Downloads
+
+OS | Arch | Package | SHA256 Checksum
+-- | -- | -- | --
+Windows | x64 | [exe](#{windows_exe}) | #{windows_exe_sha256}
+macOS | x64 | [zip](#{macos_zip}) | #{macos_zip_sha256}
+macOS | x64 | [DMG](#{macos_dmg}) | #{macos_dmg_sha256}
+Linux | x64 | [AppImage](#{linux_appimage}) | #{linux_appimage_sha256}
+)
+
+puts checksums
\ No newline at end of file