medialinker-cli 0.5.0

Share files and text through MediaLinker with 5-character codes
medialinker-cli-0.5.0 is not a library.

MediaLinker-cli

ml shares files and text through a MediaLinker server. Every share gets a 5-character code that works until it expires.

Install

macOS and Linux:

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/marxnoe/MediaLinker-cli/releases/latest/download/medialinker-cli-installer.sh | sh

Windows (PowerShell):

powershell -ExecutionPolicy Bypass -c "irm https://github.com/marxnoe/MediaLinker-cli/releases/latest/download/medialinker-cli-installer.ps1 | iex"

With Cargo:

cargo binstall medialinker-cli   # prebuilt binary, needs cargo-binstall
cargo install medialinker-cli    # build from source

Prebuilt archives for Linux (x86_64, ARM64), macOS (Intel, Apple Silicon) and Windows are on the releases page.

Server

ml talks to https://medialinker.noecore.com by default. To use another MediaLinker server, save it once:

ml server https://media.example.com

--server <URL> or the ML_SERVER environment variable override the saved server.

Usage

ml send photo.jpg            # share a file, prints the code
ml send "meet at 6"          # share text
ml send notes.txt --text     # share the words "notes.txt", not the file
cat log.txt | ml send        # share stdin as text
tar cz dir | ml send -n dir.tgz   # share stdin as a file
ml send video.mp4 --ttl 7d   # expiry: 1h, 24h (default) or 7d

ml get K7QX2                 # prints text, or saves a file in the current directory
ml get K7QX2 -o out.jpg      # save under another name (-o - writes to stdout)

ml get never overwrites an existing file unless you pass --force.

In a terminal, ml send also prints a QR code and a link to the receive page, so a phone can open the share straight away. --no-qr leaves the QR code out; nothing extra is printed when stderr is not a terminal, so CODE=$(ml send file) stays clean.

End-to-end encryption

Encryption is off unless you ask for it. With --encrypt (-e), ml encrypts the share locally with AES-256-GCM and a fresh key before uploading, so the server stores only ciphertext and never sees the key, the file name or whether it is text. ml send -e prints CODE.KEY instead of the bare code, and its link and QR code carry the key after the #, which browsers never send.

ml send -e taxes.pdf                       # prints K7QX2.3q9Vh…
ml get K7QX2.3q9Vh…                        # decrypt with the key
ml get 'https://…/?code=K7QX2#k=3q9Vh…'    # or the whole link from the web page
ml get K7QX2 --key 3q9Vh…                  # or the key on its own

Shares encrypted on the web page open with ml get, and the other way round. The code alone can't open an encrypted share.

Shell completions

ml completions <shell> prints a completion script for bash, zsh, fish, powershell or elvish:

ml completions bash > ~/.local/share/bash-completion/completions/ml
ml completions zsh > ~/.zfunc/_ml        # with fpath+=~/.zfunc in .zshrc
ml completions fish > ~/.config/fish/completions/ml.fish
ml completions powershell >> $PROFILE

Releasing

Releases are built by cargo-dist. Bump version in Cargo.toml, merge it, then push a matching tag:

git tag v0.2.0 && git push origin v0.2.0

The release workflow builds every target, publishes the archives and installers to a GitHub release, then publishes the crate to crates.io (needs the CARGO_REGISTRY_TOKEN repo secret).

License

MIT, see LICENSE.