| Crates.io | rfortune |
| lib.rs | rfortune |
| version | 0.5.5 |
| created_at | 2025-07-29 22:12:33.793286+00 |
| updated_at | 2025-11-10 12:01:26.018877+00 |
| description | A Rust-based clone of the classic UNIX 'fortune' command |
| homepage | https://github.com/umpire274/rFortune |
| repository | https://github.com/umpire274/rFortune |
| max_upload_size | |
| id | 1772882 |
| size | 78,151 |
rFortune is a modern, cross-platform reimplementation of the classic Unix fortune program, written in Rust.
It displays a random quote or witty phrase from a plain text file, making it perfect for terminal startup messages, scripting, or just a bit of inspiration.
π Multiple fortune file support
--file <PATH>.rfortune --file ~/fortunes/dev --file ~/fortunes/humor
fortune_files (list). When defined, it takes priority over default_file.fortune_files is missing or empty, it is initialized automatically with the
previous default_file value.π Cache robustness improvements
fs2 crate) is used to protect concurrent access to the shared cache (
last_quotes.json). This reduces races when multiple rFortune processes run simultaneously.open_and_lock() helper to centralize file opening/locking logic and switched
internal cache APIs to use anyhow for richer error context.tests/cache_tests.rs) and the dependencies fs2 and anyhow.app_dir() function on Linux and macOS where dirs::data_dir() could return None in CI or
headless environments.$HOME/Library/Application Support/rfortune$HOME/.local/share/rfortuneapp_dir() usage on Linux/macOS.ensure_cache_dir() to centralize cache directory creation, improving reliability
across save_last_cache() and save_last_cache_json().files_fortune key and single-file print_random() function have been removed or replaced by the new
multi-file logic.%yay -S rfortune
# or
paru -S rfortune
brew tap umpire274/tap
brew install rfortune
cargo install rfortune
Precompiled binaries are available in the Releases section.
| Platform | Architecture | File |
|---|---|---|
| Windows | x86_64 | rfortune-<version>-x86_64-pc-windows-msvc.zip |
| Linux | x86_64 | rfortune-<version>-unknown-linux-gnu.tar.gz |
| macOS Intel Architecture | x86_64 | rfortune-<version>-x86_64-apple-darwin.tar.gz |
| macOS Apple Silicon | aarch64 | rfortune-<version>-aarch64-apple-darwin.tar.gz |
All release archives are cryptographically signed with GPG.
.sig files contain the ASCII-armored detached signature for the corresponding archive.gpg --verify rfortune-<version>-<target>.tar.gz.sig rfortune-<version>-<target>.tar.gz
The releases are signed with the following GPG key:
To import the key from a keyserver:
gpg --recv-keys 423FABCE0A1921FB
Or from OpenPGP server:
gpg --keyserver keys.openpgp.org --recv-keys 423FABCE0A1921FB
Then verify the fingerprint:
gpg --fingerprint 423FABCE0A1921FB
rfortune [OPTIONS]
rfortune <SUBCOMMAND>
Running rfortune without subcommands prints a random fortune from the default file (rfortune.dat).
When rfortune is launched for the first time and no configuration directory exists,
the application will ask whether to initialize its environment (creating the default
configuration and fortune files).
In non-interactive contexts, initialization happens automatically.
| Command / Option | Description |
|---|---|
-f, --file <PATH> |
Use a custom fortune file instead of the default |
config init |
Create the configuration file with default options |
config edit [--editor <E>] |
Open the configuration file in the systemβs default or a specified editor |
file init |
Create a sample default fortune file (rfortune.dat) |
cache clear |
Remove all cached last-used fortunes |
-V, --version |
Show version information |
-h, --help |
Show help message |
# Print a random fortune from the default file (rfortune.dat)
rfortune
# Print a random fortune from a specific file
rfortune --file ~/fortunes/misc
# Create the default configuration file in the user data directory
rfortune config init
# Open the configuration file in the systemβs default text editor
rfortune config edit
# Open the configuration file with a specific editor (e.g. vi, nano, code)
rfortune config edit --editor vi
# Create a sample default fortune file (rfortune.dat)
rfortune file init
# Clear all cached last-used fortunes
rfortune cache clear
rfortune.conf)Example:
default_file: "/home/user/.local/share/rfortune/rfortune.dat"
print_title: true
use_cache: true
# Optional: load additional quote files
fortune_files:
- "/usr/local/share/rfortune/philosophy.fort"
- "/usr/local/share/rfortune/tech.fort"
Priority order:
--file <PATH> CLI argument(s)fortune_files list in configdefault_fileYou can load quotes from multiple files and rfortune will automatically choose one at random:
rfortune --file my_quotes.fort --file jokes.fort --file tech.fort
Or configure them permanently:
fortune_files:
- "/path/to/my_quotes.fort"
- "/path/to/jokes.fort"
If both are present, CLI always wins.
rfortune keeps a small cache and automatically avoids repeating the same quote twice in a row, but only for quotes from the same file.
This keeps the output natural across multiple sources.
If your previous configuration did not contain fortune_files,
rfortune will automatically migrate your config by adding it and setting:
fortune_files:
- default_file
No manual action is required.
Each fortune must be on one or more lines separated by %, like so:
%
The best way to get a good idea is to get a lot of ideas.
%
Do or do not. There is no try.
%
To iterate is human, to recurse divine.
%
You may optionally add a title at the top of the file by starting the first line with #. The title will be printed before the random quote:
# Murphy's Laws
%
Anything that can go wrong will go wrong.
%
If there's a possibility of several things going wrong, the one that will cause the most damage will be the one to go wrong.
%
This project is licensed under the MIT License.
Β© 2025 Alessandro Maestri
Pull requests are welcome! If youβd like to add support for more languages, improve performance, or fix bugs, feel free to fork the repo and contribute.
Inspired by the classic BSD fortune program. Built with β€οΈ in Rust.