--- /dev/null
+#!/bin/sh -ex
+
+cur=$(pwd)
+tmp=$(mktemp -d ${TMPDIR:-/tmp}/keks-distXXXXXX)
+release=$1
+[ -n "$release" ]
+
+git clone . $tmp/keks-$release
+git checkout v$release || :
+
+cd $tmp/keks-$release
+echo $release >VERSION
+redo \
+ c/doc/keks.info \
+ c/lib/cm/pub.schema.keks.c.in \
+ go/cm/enc/encrypted.schema.keks \
+ go/cm/hash/prehash.schema.keks \
+ go/cm/sign/pub.schema.keks \
+ go/cm/sign/signed.schema.keks \
+ go/rpc/rpc.schema.keks
+rm -r c/doc/build c/doc/docstringer.log
+
+cd py3/tests
+mkdir fuzz-inputs
+cd fuzz-inputs
+PATH=../../../tcl:$PATH TCLLIBPATH=../../../tcl ../../../tcl/mk-fuzz-inputs
+
+cd ../../../go
+go mod vendor
+./mk-fuzz-testdata
+cd cmd/pp
+go mod vendor
+cd ../../cm
+go mod vendor
+rm -r vendor/golang.org/x/sys/windows
+cd ..
+$HOME/work/sgodup/sgodup -basedir cm/vendor -dupdir cmd/pp/vendor -action hardlink
+$HOME/work/sgodup/sgodup -basedir cm/vendor -dupdir vendor -action hardlink
+cd ..
+
+cd spec
+swg info >../spec.info
+./mk-html
+mv ../spec.info .
+cd ..
+
+redo-cleanup full
+rm -fr .git makedist
+mkdir third-party
+
+cd ..
+zstd -d <$HOME/work/bass/build/distfiles/libtap-0.1.0-44-gb53e4ef.tar.zst >keks-"$release"/third-party/libtap-0.1.0-44-gb53e4ef.tar
+zstd -d <$HOME/src/monocypher-4.0.2.tar.zst >keks-"$release"/third-party/monocypher-4.0.2.tar
+zstd -d <$HOME/work/goredo/doc/goredo.html/download/goredo-2.6.4.tar.zst >keks-"$release"/third-party/goredo-2.6.4.tar
+
+git clone $HOME/work/sharness sharness-v1.2.1
+cd sharness-v1.2.1
+git checkout v1.2.1
+rm -fr .git
+cd ..
+detpax sharness-v1.2.1 >keks-"$release"/third-party/sharness-v1.2.1.tar
+
+git clone $HOME/work/swg swg-v1.0.0
+cd swg-v1.0.0
+git checkout v1.0.0
+rm -fr .git
+cd ..
+detpax swg-v1.0.0 >keks-"$release"/third-party/swg-v1.0.0.tar
+
+detpax keks-"$release" >keks-"$release".tar
+zstd -22 --ultra -v keks-"$release".tar
+tarball=keks-"$release".tar.zst
+ssh-keygen -Y sign -f ~/.ssh/sign/keks@cypherpunks.su -n file "$tarball"
+meta4ra-create -fn "$tarball" -mtime "$tarball" \
+ -sig-ssh "$tarball".sig \
+ http://www.keks.cypherpunks.su/download/"$tarball" \
+ http://y.www.keks.cypherpunks.su/download/"$tarball" <"$tarball" >"$tarball".meta4
+cmsigtool -d 4<$HOME/.cm/sign/keks@cypherpunks.su.pub \
+ 8<$HOME/.cm/sign/keks@cypherpunks.su.prv <"$tarball" >"$tarball".sig
+touch -r "$tarball" "$tarball".sig
+
+size=$(( $(stat -f %z $tarball) / 1024 ))
+release_date=$(date "+%Y-%m-%d")
+cat <<EOF
+An entry for documentation:
+$release | $release_date | $size KiB
+ => download/$tarball.meta4
+ => download/$tarball
+ => download/$tarball.sig
+EOF
+
+mv "$tarball" "$tarball".meta4 "$tarball".sig $cur/spec/spec.html/download
+
+cat <<EOF
+Subject: KEKS $release release announcement
+
+I am pleased to announce KEKS $release release availability!
+
+KEKS is compact, deterministic, concise and streaming binary
+serialisation format. It is aimed to be lightweight in terms of CPU,
+memory, storage and codec implementation size usage. It supports wide
+range of data types, making it able to transparently replace JSON.
+
+------------------------ >8 ------------------------
+
+The main improvements for that release are:
+
+
+------------------------ >8 ------------------------
+
+KEKS's home page is: http://www.keks.cypherpunks.su/
+
+Source code and its signature for that version can be found here:
+
+ http://www.keks.cypherpunks.su/download/keks-${release}.tar.zst ($size KiB)
+ http://www.keks.cypherpunks.su/download/keks-${release}.tar.zst.sig
+
+OpenSSH key: SHA256:egDNCXj0/8mCSWVEc3mlB788/yM86m0C5UYitppZyc8
+cm/signed key: C8E1B383FADA392E08F8F9F6B07C2F11861F14BE6D98C008C9AB8A9185527B5F
+EOF
+echo mutt -s \"KEKS $release release announcement\" \
+ keks@lists.cypherpunks.su \
+ -a $cur/spec/spec.html/download/"$tarball".meta4
+
+rm -fr $tmp