Easy and secure paper backups of (smallish) secrets using the Age format (age-encryption.org/v1).
This is what the output PDF looks like (alternatively see the letter equivalent). The QR code is easily readable with an iPhone (or any modern smartphone).
If you want to try decoding it yourself, the passphrase is snakeoil
.
Add the PaperAge Tap to install the latest version with Homebrew:
sh
brew tap matiaskorhonen/paper-age
brew install paper-age
Download the latest release from the Releases page, extract the files, and install the paper-age
binary somewhere in PATH
(for example /usr/local/bin
).
```sh
curl -Lo paper-age.tar.gz https://github.com/matiaskorhonen/paper-age/releases/download/v1.1.3/paper-age-universal-apple-darwin.tar.gz
curl -Lo paper-age.tar.gz https://github.com/matiaskorhonen/paper-age/releases/download/v1.1.3/paper-age-x86_64-unknown-linux-gnu.tar.gz
curl -Lo paper-age.tar.gz https://github.com/matiaskorhonen/paper-age/releases/download/v1.1.3/paper-age-aarch64-unknown-linux-gnu.tar.gz
tar -xf paper-age.tar.gz
sudo install paper-age /usr/local/bin/
sudo xattr -r -d com.apple.quarantine /usr/local/bin/paper-age ```
If you already have Rust installed, PaperAge can be installed with Cargo:
sh
cargo install paper-age
paper-age [OPTIONS] [INPUT]
<INPUT>
— The path to the file to read. Defaults to standard input. Max. ~1.9KB.-t
, --title <TITLE>
— Page title (max. 64 characters)
Default value: PaperAge
-o
, --output <OUTPUT>
— Output file name. Use - for STDOUT.
Default value: out.pdf
-s
, --page-size <PAGE_SIZE>
— Paper size [default: a4
] [possible values: a4
, letter
]-f
, --force
— Overwrite the output file if it already exists-g
, --grid
— Draw a grid pattern for debugging layout issues--fonts-license
— Print out the license for the embedded fonts-v
, --verbose...
— More output per occurrence-q
, --quiet...
— Less output per occurrence-h
, --help
— Print help-V
, --version
— Print versionPaperAge is entirely agnostic about the input file type. If you need to squeeze in more data, you can apply compression to the input file before passing it on to PaperAge, for example:
sh
gzip --best --stdout in.txt | paper-age --output=compressed.pdf --title="in.txt.gz"
Compression ratios vary wildly depending on the input data, so whether or not this is worth it is up to you.
On iOS, it's best to use the Code Scanner from Control Center instead of the Camera app. The Code Scanner lets you copy the QR code contents to the clipboard instead of just searching for it.
On Android, the built-in camera app should let you copy the QR code contents to the clipboard. The Google Lens app seems to work fine too.
Run the latest from git locally, assuming you have already installed Rust:
cargo test
cargo run -- -h
echo "Hello World" | cargo run -- --title="secrets from stdin" --out="stdin.pdf"
echo "Hello World" | cargo run -- -vvvv
Releases are compiled and released on GitHub when new versions are tagged in git.
Use cargo release to tag and publish a new version, for example:
sh
cargo release 1.2.3
⚠️ Append --execute
to the command to actually execute the release.
PaperAge is released under the MIT License. See LICENSE.txt for details.
Includes the SIL Open Font Licensed IBM Plex Mono font. See IBMPlexMono-LICENSE.txt.
Uses the Rust implementation of Age from github.com/str4d/rage and the printpdf library.
Thanks to Ariel Salminen for the PaperAge icon.