motdmaker/README.md
2025-07-10 20:36:32 -04:00

5.1 KiB
Raw Blame History

MOTD Maker - motd

motd is a command line utility which outputs a (semi) intelligible, randomly generated message to your standard output.

Build and Install

Requirements

git, rust/rustup/cargo

Arch Linux

sudo pacman -S git rust

Ubuntu/Debian

sudo apt install git rust

Install

git clone https://code.lampnet.io/candle/motdmaker
cd motdmaker && cargo build --release
sudo mv target/release/motd /usr/local/bin/

You may remove the cloned directory.

Usage

motd is best when customized with your own word pools and templates.

motd will look for a $HOME/.motdrc, $XDG_CONFIG_HOME/.motdrc, or $XDG_CONFIG_HOME/motd/motdrc file and use the settings there as defaults when running motd with no flags. If somehow motd is configured in a way that would result in an empty word list, it will fallback to the built in defaults.

# Example motdrc
# This file can be placed at:
#   ~/.motdrc
#   $XDG_CONFIG_HOME/.motdrc
#   $XDG_CONFIG_HOME/motd/motdrc
#   (or ~/.config/motd/motdrc if XDG_CONFIG_HOME is not set)

# Word lists - add custom words to the defaults
adjective = ["mystical", "ancient", "shimmering", "ethereal"]
noun = ["artifact", "prophecy", "wanderer", "sanctuary"]
verb = ["whispers", "echoes", "illuminates", "beckons"]
adverb = ["mysteriously", "gracefully", "eternally", "silently"]
location = ["in the forgotten realm", "beneath the starlit sky", "within the crystal caves"]

# Template customization
# template = "The {adjective} {noun} {verb} {adverb} {location}."

# Behavior settings
# Set to true to replace default word lists instead of extending them
replace = false
# Convert output to lowercase
lowercase = false
# Convert output to uppercase
uppercase = false

# Text processing
# Words to remove from output
strip = [".", ":"]
# Delimiter between words (default is space)
delimiter = "."
# Maximum length of generated message
cut_off = 100

# Write output to file instead of stdout, WARNING: will overwrite
# output = "$HOME/.MOTD"

# Note: CLI arguments will override these RC file settings 

Word Files

You can also create custom word files inside of $XDG_CONFIG_HOME/motd/:

$XDG_CONFIG_HOME/motd/
|-nouns
|-adjectives
|-adverbs
|-locations
|-templates

You can dump the default word banks into their respectice word file and disable/add entries individually:

mkdir -p $XDG_CONFIG_HOME/motd
motd -p templates > $XDG_CONFIG_HOME/motd/templates
motd -p nouns > $XDG_CONFIG_HOME/motd/nouns
motd -p adjectives > $XDG_CONFIG_HOME/motd/adjectives
motd -p adverbs > $XDG_CONFIG_HOME/motd/adverbs
motd -p locations > $XDG_CONFIG_HOME/motd/locations

Words are separated by line, meaning you can have multiple words treated as a single unit.
Re-defining a word will not add an additional entry to the word pool. Lines beginning with a ! are actively removed from their respective word pool.
Lines beginning with a # are ignored as comments. Lines with the format $() can be bash expressions which are evaluated at runtime.
Example: nouns file

# I'm really scared of these
!ocean
ocean
# The previous ocean will still not be added to the word pool
$(date +%H:%M)

Now running motd will remove 'ocean' from the noun word pool, while also adding the possibilty of running date +%H:%M when replacing a template's noun, which will give the current time of day.

motd -r # -r is to force the added nouns to be used, for this example
When the moon rises, the mighty 19:58 shines in the misty valley.

Word files don't have to live in your configuration directory, you can pass motd a custom --configdir/-c.

Templates

Templates are separated by line. They can have as many or as few word types as you'd like.

  • {noun} or {n}
  • {adjective} or {a}
  • {verb} or {v}
  • {adverb} or {d}
  • {location} or {l}

Bash expressions ($() form) in the templates file are evaluate at runtime.

Examples

 motd -U -s . -s : -s , -D .
THE.ETERNAL.PHOENIX.BLOOMS.SILENTLY.WHERE.SHADOWS.DANCE

-U: Capitalizes output
-s: Strips given character from generation
-D: Change delimiter from space
Note that the stripping of characters occurs first, then the delimiter is replaced with the argument.

 motd -v opens --noun book -n chair -d weirdly -t "A {n} {v} the {noun} {d}" -r
A chair opens the book weirdly

--noun\-n\-v\-d: Single word by type, to add to the word pool. Can be specified multiple times.
-t: The template to base the message off. Using -t will force the template used to be argument given.
-r: Only new words, passed as arguments, or from configuration files, will be used.

 motd -t "The {n} and the {noun} and the {n}."
The wizard and the knight and the ocean.

-t: Force template to be used.
--noun/-n: Adding multiple noun positions and nothing else.

 motd -C 20 2>output.txt
 echo $?
1
 cat output.txt
Error: CutOffExceeded { attempts: 100, cut_off: 20 }

-C: Specify a max amount of characters the message can be. motd exits with 1 when it is unable to generate a valid message. Either the template pool is too diluted, or you create a valid template within the confines you want.