29 releases (17 breaking)

new 0.18.2 Apr 16, 2025
0.18.1 Feb 21, 2025
0.18.0 Jan 7, 2025
0.17.3 Dec 5, 2024
0.2.0 Sep 9, 2019

#314 in Command line utilities

Download history 91/week @ 2025-01-03 31/week @ 2025-01-10 3/week @ 2025-01-17 2/week @ 2025-02-14 146/week @ 2025-02-21 26/week @ 2025-02-28 1/week @ 2025-03-07 128/week @ 2025-04-11

128 downloads per month

MIT license

130KB
993 lines

About

xkcd-style password generator

xkcd #936: Password Strength

Usage

$ xpg -h
xpg 0.18.2 <https://crates.io/crates/xpg>

xkcd-style password generator

Usage: xpg [OPTIONS] [PATTERNS]...

Arguments:
  [PATTERNS]...  Pattern(s) (see note 1) [default: `wwww`, `-L`: `{a}`]

Options:
  -s, --shuffle             Shuffle characters
  -c, --count <NUMBER>      Number of passwords (0:∞ ) [default: 1]
  -l, --length <NUMBER>     Length
  -m, --minimum <NUMBER>    Minimum length
  -M, --maximum <NUMBER>    Maximum length
  -a, --attempts <NUMBER>   Attempts (see note 2) [default: 10]
  -C, --config <PATH>       Configuration file
  -e, --extended            Merge extended words (see note 3)
  -A, --apply-case <STYLE>  Apply case style [possible values: upper, lower,
                            title, toggle, camel, pascal, upper-camel, snake,
                            constant, upper-snake, screaming-snake, kebab,
                            cobol, upper-kebab, train, flat, upper-flat,
                            alternating, random, pseudo-random, sentence]
  -L, --list                List words in `{sub}`(s)
  -d, --dump-config         Print configuration
  -r, --readme              Print readme
  -h, --help                Print help
  -V, --version             Print version

---

Notes

1. Patterns
    * Words
        * `W`: WORD
        * `w`: word
        * `T`: Word
        * `k`: `shuffle(cccc(c|d)(C|c))`
        * `{sub}`: see `WordKind`s section in readme
    * Characters
        * `C`: A-Z
        * `c`: a-z
        * `d`: 0-9
        * `s`: `~!@#$%^&*-_=+;:,./?()[]{}<>`
        * `a`: `C` | `c` | `d` | `s`
    * Special
        * `keychain`
        * `codename`
        * `codename-series`
        * `haiku--` | `haiku-condensed`
        * `haiku-` | `haiku-with-syllables-condensed`
        * `haiku`
        * `haiku+` | `haiku-with-syllables`
        * `haiku++` | `haiku-full`
        * `haiku+++` | `haiku-full-with-syllables`

2. Ten attempts are made to satisfy the given length requirements by default;
   use `-a N` and set `N` to the number of attempts to increase chances.
   It will exit with an error if unable to satisfy requirements; some
   configurations will always produce an error.

3. Extended words are only available in exclusively extended word kinds by
   default; however, with `-e`, they are merged with regular word kinds; use
   with the `-L` option to see its effect.
$ xpg -V
xpg 0.18.2

See also the Configuration section below.

Examples

$ xpg
greecemothergravejoined

Generate 10 passwords

$ xpg -c 10
pulledprocessmomentgeneral
untildetailsfriendsattempt
horsewifestopmatter
burningchangedarktrade
datephraseclothsettle
aprilbottombeatgrave
againstbusinesslaughtergone
angertillhappensubject
characterinsidecountryloud
birdbothquitetwelve

Generate passwords forever

or until Ctrl+C / SIGINT

$ xpg -c 0
morningstartpoundsform
strangeschoolmembernecessary
sorrytowntimealso
againstcoldmeetturn
periodworkersbroughtenjoy
necessaryindiagraverest
goodalaskasundayguess
heavyveryreachterms
friendburnthancanada
capitalyourreadyrush
^C

Generate a password with 8 words

$ xpg wwwwwwww
factorscovervenusoftencorrectcallcostgreen

Generate 10 passwords with 8 words

$ xpg wwwwwwww -c 10
determinenearlycottonropeinformationhuntingsignalyesterday
becameplainspokenetherlandsrussiafillelselift
mountainpartygibraltartiedclothwarmexperimenttill
leftlaughinformationarmyunderdoesthentree
aroundoceandatesomeonewholecropsrepeatednoun
smalldancesaturdayliftedscenedescribenoonobserve
valleyearlysweetrightfinishentirecompletescience
cattleorderlyshoutedjumpedswedencirclefoothorse
probablesuddencareshoutdifferenceseptemberconditionstherefore
nextraisedfractiongreenthoughttoolsvalueeven

Generate a password with 2 words followed by 3 digits

$ xpg wwddd
begandown355

Generate a password with 2 words followed by 2 symbols

$ xpg wwss
aboutstars~{

Generate a password with 2 words followed by a digit and a symbol

$ xpg wwds
damascusthin7<

Generate a password with 4 words followed by 2 lowercase letters

$ xpg wwwwcc
guardthoughtemperatureslowlycb

Generate a password with 4 words followed by 2 uppercase letters

$ xpg wwwwCC
whosecasefijiwaveWI

Generate a password with 4 title case words

$ xpg TTTT
LakeSingaporeAustraliaEscape

Generate a password with 4 uppercase words

$ xpg WWWW
MISTERCOUNTRYRUSSIATRIED

Generate a password with 4 words followed by 5 any characters

An "any" character can be a lowercase letter, uppercase letter, digit, or symbol.

$ xpg wwwwaaaaa
forgetmoleculesperustatemwRma

Generate a password with 3 words and at least 15 characters

$ xpg www -m 15
choosedegreetraining

Generate a password with 3 words and no more than 20 characters

$ xpg www -M 20
russiarisecool

Generate a password with 4 words and between 20 and 25 characters

$ xpg www -m 20 -M 25 -a 1000
withoutthemselvescase

See also Usage note 2.

Generate a password with 2 words, 3 digits, 1 symbol, and exactly 16 characters

$ xpg wwddds -l 16 -a 1000
behindchance208=

See also Usage note 2.

Generate a password with a 1, 2 title case words, and !

$ xpg '1TT!'
1DivideOrder!

Generate a password with 1 symbol, 2 adjectives, 1 noun, and 2 digits

$ xpg 's{adj}{adj}{n}dd'
[deepsuddenwhere89

Generate a password with 2 words and 1 extended word

$ xpg 'ww{ext}'
beganforeverorthosie

Generate a password with 2 words and 1 title case extended word

$ xpg 'ww{T:ext}'
darefailIapetus

Generate a password with 2 words and 1 uppercase extended word

$ xpg 'ww{W:ext}'
sharpmatchSAO

Generate 10 passwords with 4 title case words and extended words merged

$ xpg -ec 10 TTTT
WyomingConsiderableCarrySharp
CallistoVerbMinuteDusk
CakeFloorBrazilFood
ChildhoodNothingApolloSound
SpaceChairDistanceAcross
BurningMilkShoreFeel
HerseShakeRiseBest
FloorForeignCrowdBlack
FractionFranceOrderAmount
BeingBuildRiddenStaple

Generate a keychain-style password

$ xpg keychain
suqvJe-kwz8mf-igtsqb

Generate a code name

$ xpg codename
SAFE BIRDS

Generate a code name series

$ xpg codename-series
FRENCHMERCURY LATERCHANCE
FRENCHMERCURY DECIDEDSHIP
FRENCHMERCURY PARTIALTUESDAY
FRENCHMERCURY DISTANTFAIR
FRENCHMERCURY PRETTYLETTER
FRENCHMERCURY LEASTTEAM
FRENCHMERCURY THINLIAR
FRENCHMERCURY JAPANESEMONTH
FRENCHMERCURY SUCHDEEP
FRENCHMERCURY MAJORSOUND

Generate a code name series with 20 code names

$ xpg codename-series -c 20
SIMPLENOTICE OPENINSIDE
SIMPLENOTICE WILDGROUND
SIMPLENOTICE SHALLTRIANGLE
SIMPLENOTICE CORRECTSHOW
SIMPLENOTICE FEELINGWEIGHT
SIMPLENOTICE SICKFIRE
SIMPLENOTICE EXCITINGLIGHT
SIMPLENOTICE FAMOUSWEDNESDAY
SIMPLENOTICE LEFTCAUSE
SIMPLENOTICE SILENTFORTY
SIMPLENOTICE EASYJUPITER
SIMPLENOTICE DEVELOPEDDUSK
SIMPLENOTICE TRUEMOLECULES
SIMPLENOTICE HUGEDROP
SIMPLENOTICE FULLFOOD
SIMPLENOTICE WHOLEWILD
SIMPLENOTICE BROKEPLAY
SIMPLENOTICE CURRENTSTREET
SIMPLENOTICE COOLCORN
SIMPLENOTICE INDIANCHARGE

Generate a haiku

$ xpg haiku
Animal engine / Side Bulgaria upon / Shape experiment

Generate a haiku with syllable pattern

$ xpg haiku+
Saturday hair round (3,1,1) / Burning second solution (2,2,3) / Scotland slowly seeds (2,2,1)

Generate a condensed haiku with syllable pattern

$ xpg haiku-
Considerable(5)/Anything-Arizona(3,4)/Short-orderly-church(1,3,1)

Generate a condensed haiku

$ xpg haiku--
English-galaxy/Sudden-history-skin-cloud/California-reach

Generate a haiku with newlines

$ xpg haiku++
Similar winter
February honor bill
Wire Amsterdam strong

Generate a haiku with syllable pattern and newlines

$ xpg haiku+++
Material wise (4,1)
Electricity name walk (5,1,1)
Period paid said (3,1,1)

Generate a haiku with extended words

$ xpg -e haiku
Harpalyke plain / Difference Triton garden / Forward titania

Generate a password with 20 any characters

$ xpg aaaaaaaaaaaaaaaaaaaa
P%f*KDk]5>a]J$DCtZdE

Same as the previous example, but shorter

This works because a character-only pattern is padded to the minimum length with the last character.

$ xpg a -m 20
ZG1K0vb=&^n)#R9J2h?=

Generate a password with 5 lowercase, 1 uppercase, 1 digit, and 1 symbol

$ xpg cccccCds
cqduoS3^

Generate a password with 5 lowercase, 1 uppercase, 1 digit, and 1 symbol and shuffle the characters

$ xpg -s cccccCds
7S?axqcx

Same as the previous example, but shorter

This works because a character-only pattern is padded to the minimum length with the last character.

$ xpg -sm 8 Cdsc
Qz=wx8po

Generate 3 passwords each from a different pattern

$ xpg wwww WWWW TTTT
strikenovemberwaterniece
DEEPUSUALBELGIUMBRITAIN
CoverDanceCaughtDiscovered

Apply upper casing

$ xpg -A upper 'T T T T'
DESIGN COST SHOULDER CALL

Apply lower casing

$ xpg -A lower 'T T T T'
says galaxy ahead discovered

Apply title casing

$ xpg -A title 'T T T T'
Cool Represent Asia Apple

Apply toggle casing

$ xpg -A toggle 'T T T T'
fISH tHIS sHALL fRIDAY

Apply camel casing

$ xpg -A camel 'T T T T'
meanMaybeHusbandMatch

Apply pascal casing

$ xpg -A pascal 'T T T T'
MainRollSweetWith

Apply upper-camel casing

$ xpg -A upper-camel 'T T T T'
FireNoseSailFeed

Apply snake casing

$ xpg -A snake 'T T T T'
dublin_true_burning_happen

Apply upper-snake casing

$ xpg -A upper-snake 'T T T T'
THEN_INSTRUMENTS_STUDY_SENSE

Apply screaming-snake casing

$ xpg -A screaming-snake 'T T T T'
CURRENT_FOOT_LAUGHED_MINE

Apply kebab casing

$ xpg -A kebab 'T T T T'
anything-front-straight-soldiers

Apply cobol casing

$ xpg -A cobol 'T T T T'
WHERE-FIFTEEN-EDGE-ROOM

Apply upper-kebab casing

$ xpg -A upper-kebab 'T T T T'
MAYBE-SLEEP-ANYTHING-PLUTO

Apply train casing

$ xpg -A train 'T T T T'
Gave-Easy-Color-Proud

Apply flat casing

$ xpg -A flat 'T T T T'
donechildhoodaheadpluto

Apply upper-flat casing

$ xpg -A upper-flat 'T T T T'
PARISSTRAIGHTJULYANYTHING

Apply alternating casing

$ xpg -A alternating 'T T T T'
lEvEl PaPeR cOlOmBiA tOtAl

Apply random casing

$ xpg -A random 'T T T T'
faIr MErCURy WOmaN rEAd

Apply pseudo-random casing

$ xpg -A pseudo-random 'T T T T'
FrEsh CoTtON hiSToRy dOuBT

Generate a password with words with 1, 2, 3, 4, and 5 syllables

$ xpg '{a:1}-{W:a:2}-{T:a:3}-{olympian:4}-{T:ext:5}'
wheat-HUNDRED-Korea-aphrodite-Southamerica

List the words in Color / {color}

$ xpg -L '{color}'
black
blue
brown
gray
green
white
yellow

List the words in Color / {color} in uppercase

$ xpg -L '{W:color}'
BLACK
BLUE
BROWN
GRAY
GREEN
WHITE
YELLOW

List the words in Color / {color} in title case

$ xpg -L '{T:color}'
Black
Blue
Brown
Gray
Green
White
Yellow

Count the words in Color / {color}

$ xpg -L '{color}' |wc -l
7

List the words in Color / {color} and Element / {W:el}

$ xpg -L '{color}' '{W:el}'
black
blue
brown
gray
green
white
yellow
GOLD
IRON
LEAD
MERCURY
OXYGEN
SILVER

Count words

$ xpg -L |wc -l
1257

Count words with extended

$ xpg -Le |wc -l
1403

Configuration

See config.json or use -d for the default configuration compiled into the binary executable.

If another file is placed at any of the following locations or the path provided via the -C option at runtime, it will be used instead.

  • Linux: /home/username/.config/xpg/config.json
  • Windows: C:\Users\username\AppData\Roaming\qtfkwk\xpg\config\config.json
  • macOS: /Users/username/Library/Application Support/com.qtfkwk.xpg/config.json

WordKinds

  • AllExtended / {a.ext}
    • All / {a}
      • Adjective / {adj}
        • Color* / {color}
        • Nationality / {nat}
      • Adverb / {adv}
      • Conjunction / {conj}
      • Interjection / {i}
      • Noun / {n}
        • PluralNoun / {n.pl}
        • Pronoun / {n.pro}
        • SingularNoun / {n.s}
          • Astronomy / {ast}
            • Moon / {moon}
            • Planet / {planet}
          • Color* / {color}
          • Day / {day}
          • Month / {mon}
          • ProperNoun / {n.prop}
            • Element / {el}
            • Name / {name}
              • FemaleName / {fname}
              • MaleName / {mname}
            • Place / {place}
              • City / {city}
              • Continent / {cont}
              • Country / {country}
              • UsState / {us-state}
            • Mythology / {myth}
              • GreekMyth / {greekmyth}
                • Olympian / {olympian}
                • Chthonic / {chthonic}
              • RomanMyth / {romanmyth}
      • Preposition / {prep}
      • Verb / {v}
        • AuxiliaryVerb / {v.aux}
        • IntransitiveVerb / {v.int}
        • TransitiveVerb / {v.tr}
        • VerbPast / {v.past}
    • Extended / {ext}
      • Noun / {n}
        • SingularNoun / {n.s}
          • Astronomy / {ast}
            • Moon / {moon}
              • MarsMoon / {marsmoon}
              • JupiterMoon / {jupitermoon}
              • SaturnMoon / {saturnmoon}
              • UranusMoon / {uranusmoon}
              • NeptuneMoon / {neptunemoon}

Notes

  1. WordKind / {sub}

  2. It is only necessary to set the most descriptive WordKind(s) since they are automatically included in the larger word kinds.

  3. The characters object value must contain the C, c, and d keys with non-empty values. Additional keys/values can be added and used.

  4. {sub}s produce lowercase words by default, but if prefixed with W: or T: words will be uppercase or title case, respectively: i.e. {W:sub} or {T:sub} (replace sub with an actual {sub} name above).

  5. {sub}s include all words by default, but if suffixed with :N where N is a number, it will only include words with that number of syllables: i.e. {sub:N} (replace sub with an actual {sub} name above and N with the desired number of syllables ~1-5).

Changelog

Please find the CHANGELOG.md in the repository.

References

Dependencies

~4–14MB
~191K SLoC