ZS(1) User Commands ZS(1)

zs - Zeichensalat, compress, sign and encode or decode, verify, decompress and run executables

zs [OPTION|zeichensalat]

zs, short for Zeichensalat (German for mojibake) is a tool to make/run compressed, signed executables copy/pastes using less than 500 unicode characters. It is intended to be used on the fediverse (or in chats). Note: the goal is to reduce the number of characters not bytes. At the moment each deflate compressed byte is represented by one unicode character. The encoding is very similar to base256U but doesn't use some problematic symbols. As signature algorithm Ed25519 is used. Future versions might use different compression, signature and encoding algorithms.

-h, --help display this help

create private and public key pair if it doesn't exist yet
create an executable shell script (executable is read from stdin and result is written to stdout)
just encode from stdin (similar to base64)
just decode from stdin (similar to base64 -d)
display own public key
display version

with exactly one non-option argument that argument is processed as input otherwise without any arguments:

Decode from stdin to file, check signature (ask if unknown signatory), decompress and run. This mode of operation is used by the shell scripts created with -E at the moment.

Thanks to seb for testing and feedback. Thanks to cendyne for <https://cendyne.dev/posts/2022-03-06-ed25519-signatures.html>. Thanks to KIAaze for <https://stackoverflow.com/questions/77244714/how-can-i-extract-the-32-byte-ed25519-public-key-from-a-pem-file-and-how-can-i> Thanks to Burak Gökmen for https://www.baeldung.com/linux/expect-script-process-exit-code

amd64 debian/bookworm, amd64 debian/trixie (still testing), aarch64 android with termux

Jens Thiele (karme@karme.de)

~/.zeichensalat/known_keys

Public key store including name, key and trust value.

~/.zeichensalat/private.pem

Password encrypted private key.

~/.zeichensalat/public.bin

Own public key.

# create private and public key pair

$ zs -c

# compress, sign and encode the example to /tmp/x

$ zs -e < example > /tmp/x

# decode, verify signature and decompress from /tmp/x

$ zs -d < /tmp/x

# decode, verify signature, decompress and run from /tmp/x

$ zs < /tmp/x

# decode, verify signature, decompress and run from argument

$ zs $(cat /tmp/x)

# create executable shell script

$ zs -E < example

# hello world (my public key is wWHzHvnWWnNC2ZbVtLS+ouOblhdSIeUg6LkYrM7mHws=)

$ zs 'ߏŅäŷUŽŚÝöÄŝĚřĸĸłĦŧğĚN ÔXũWŬĽOİŒŪVBÑõŢķJÙĔðëkNœĿGžū ĊŞĉĝŃþţJńčĪuĪĚ0ÍoÍĠŝŰŶĶĒĎYÂŶ ŅČļĂijųεŵąøŋŽņÃÇĔÓeβ1ÕÙŘÑŎŐŗl ŒŤÌÏŒŌÚŌÊőōōū20'

base64(1), gzexe(1), bzexe(1), upx-ucl(1), makeself(1), <https://en.wikipedia.org/wiki/Fediverse>, base256U <https://github.com/fleschutz/base256U>, deflate compression <https://en.wikipedia.org/wiki/Deflate>

April 2025 Zeichensalat 0.1.1