xkcd-style password generator
$ xpg -h
xpg 0.19.6 <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, camel, pascal, upper-camel, snake, constant,
upper-snake, screaming-snake, kebab, cobol,
upper-kebab, train, flat, upper-flat, 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.19.6
See also the Configuration section below.
$ xpg
dividedlistbottlespell
$ xpg -c 10
aprilfirstalongindustry
leaddecimalgravebicycle
touchsupposebothpounds
meetsymbolsthosefirst
southplutorecordfoot
headfactorsjudgefence
supplywisefurtherinstead
problemhugecellslife
hurtdifferencewheelsbeautiful
whomrepeatedmovementfarmers
or until Ctrl+C / SIGINT
$ xpg -c 0
busygoodbyedollarthin
shorebringholepretty
writehalfhallgold
hersgrainlineenjoy
desertgateclocklight
drieddeadsailanswer
doubtstatebridgenature
wooddrinkminutebroke
indeedgamecigarettecompare
degreelargetakestop
^C
$ xpg wwwwwwww
villagestoptastefavorbreakbotswanaforeignboard
$ xpg wwwwwwww -c 10
tiedfishhallgirlbrazilproductswednesdaylaughter
maltaguessviewlostraisewavecloththerefore
chairsmellnecessarywrongniecepressfloridasugar
givewelcomewillsubjectdublinstickfacesuddenly
hangmeetnationwildfillmisterlevelcorner
dublinanimalreturnringkoreabearexplainoctober
attemptsignalscoreratherclasshimselfamongworn
describelessdoespullsymbolsfenceconsiderableapple
provideearthbuilttrackyourpeacetuesdayperson
paperroadcharttoldpieceactuallydrawtraining
$ xpg wwddd
thousandsspoke072
$ xpg wwss
believecuba!+
$ xpg wwds
burninghappy0_
$ xpg wwwwcc
beyonddecidedcaliforniaromefd
$ xpg wwwwCC
understandfinallythousandthanII
$ xpg TTTT
WarsawTypeEnglishSeed
$ xpg WWWW
GROWNNEWSSTEPSHOULD
An "any" character can be a lowercase letter, uppercase letter, digit, or symbol.
$ xpg wwwwaaaaa
wholeindiacoolangrysq+=O
$ xpg www -m 15
someonepullmodern
$ xpg www -M 20
equalwouldnear
$ xpg www -m 20 -M 25 -a 1000
buildingprocesslittle
See also Usage note 2.
$ xpg wwddds -l 16 -a 1000
whoseaustria277/
See also Usage note 2.
$ xpg '1TT!'
1GroupTiny!
$ xpg 's{adj}{adj}{n}dd'
>afterthosethirteen79
$ xpg 'ww{ext}'
aloneintoeuanthe
$ xpg 'ww{T:ext}'
heatcollegeOregon
$ xpg 'ww{W:ext}'
falllongARCHE
$ xpg -ec 10 TTTT
ShouldDutyDoubleCentury
EveryoneIocasteFriendMatter
DecemberCakeDecidedWire
BecauseParisColorWater
NineSaturnStringClass
CircleOrderWishLysithea
StarsStatementDishNewmexico
BoardCapitalStarsGlossary
WelcomeNorwayNorthamericaColombia
PhraseBlueFlierSaid
$ xpg keychain
cbkpqh-kamdoR-5jipfu
$ xpg codename
JUST MOMENT
$ xpg codename-series
RIDDENPASS FOURSEVEN
RIDDENPASS KINDANIMAL
RIDDENPASS CURRENTFLOWER
RIDDENPASS EXPRESSEXPERIENCE
RIDDENPASS INDIANTREE
RIDDENPASS THICKPRESENT
RIDDENPASS DISTANTCURRENT
RIDDENPASS AFRAIDTONE
RIDDENPASS EARLYBUILD
RIDDENPASS REALDIFFERENCE
$ xpg codename-series -c 20
MAJORWONDER ENTIRESOLDIERS
MAJORWONDER ONLYFRUIT
MAJORWONDER GREATFOOL
MAJORWONDER PLANERECORD
MAJORWONDER FELTKEEP
MAJORWONDER MORESUIT
MAJORWONDER LIGHTWORTH
MAJORWONDER PROBABLEWHOLE
MAJORWONDER CERTAINSYLLABLES
MAJORWONDER HEAVYACTION
MAJORWONDER BROKEJULY
MAJORWONDER WHOLEPRESS
MAJORWONDER EASYSTATE
MAJORWONDER VERYDISH
MAJORWONDER BROKENHAND
MAJORWONDER FIRMMERCURY
MAJORWONDER EASTTEAM
MAJORWONDER NOTHINGBREAD
MAJORWONDER KINDRAIN
MAJORWONDER SEVENTROUBLE
$ xpg haiku
Arizona need / Break Barbados borrow lord / Experience rush
$ xpg haiku+
Nice America (1,4) / Shall land considerable (1,1,5) / September wild speak (3,1,1)
$ xpg haiku-
Fear-perhaps-state-wall(1,2,1,1)/Reason-considerable(2,5)/Difficult-which-feel(3,1,1)
$ xpg haiku--
America-worth/Easy-succeed-mayor-trip/Colour-Berlin-face
$ xpg haiku++
Require happy
Especially another
Malta prepared cent
$ xpg haiku+++
Considerable (5)
Else electricity built (1,5,1)
Miss boat would along (1,1,1,2)
$ xpg -e haiku
South Carolina / Elara solution kind / North America
$ xpg aaaaaaaaaaaaaaaaaaaa
TK&/ZVFoJjx4/Y#Sx-{T
This works because a character-only pattern is padded to the minimum length with the last character.
$ xpg a -m 20
yN:LG;PTF#Qq*YpO#vjm
$ xpg cccccCds
xexdqC3$
$ xpg -s cccccCds
;eelTd3o
This works because a character-only pattern is padded to the minimum length with the last character.
$ xpg -sm 8 Cdsc
rxoe-r6V
$ xpg wwww WWWW TTTT
finallycallpositioncorrect
BESTAPPEARMONTHSEVER
LakePartialInstrumentsObserve
$ xpg -A upper 'T T T T'
QUICK WING DAMASCUS LOWER
$ xpg -A lower 'T T T T'
report continued sick slept
$ xpg -A title 'T T T T'
Against Weight Blood Listen
$ xpg -A camel 'T T T T'
netherlandsNearlyContainJust
$ xpg -A pascal 'T T T T'
SeedFearRingDaily
$ xpg -A upper-camel 'T T T T'
JoinedSeasonLiftTotal
$ xpg -A snake 'T T T T'
touch_daughter_home_something
$ xpg -A upper-snake 'T T T T'
NOTHING_GALAXY_THEREFORE_CENT
$ xpg -A screaming-snake 'T T T T'
LEVEL_WINTER_BULGARIA_DIVIDE
$ xpg -A kebab 'T T T T'
lower-broke-wheat-forget
$ xpg -A cobol 'T T T T'
FIRM-BREAD-NEWS-METAL
$ xpg -A upper-kebab 'T T T T'
TEACH-THING-EVENING-LEGS
$ xpg -A train 'T T T T'
February-Story-Finger-Glass
$ xpg -A flat 'T T T T'
scientistsballdarkhowever
$ xpg -A upper-flat 'T T T T'
DIFFICULTWHICHPEOPLECLOTHES
$ xpg '{a:1}-{W:a:2}-{T:a:3}-{olympian:4}-{T:ext:5}'
nine-IRON-Tomorrow-dionysus-Philophrosyne
$ xpg -L '{color}'
black
blue
brown
gray
green
white
yellow
$ xpg -L '{W:color}'
BLACK
BLUE
BROWN
GRAY
GREEN
WHITE
YELLOW
$ xpg -L '{T:color}'
Black
Blue
Brown
Gray
Green
White
Yellow
$ xpg -L '{color}' |wc -l
7
$ xpg -L '{color}' '{W:el}'
black
blue
brown
gray
green
white
yellow
GOLD
IRON
LEAD
MERCURY
OXYGEN
SILVER
$ xpg -L |wc -l
1257
$ xpg -Le |wc -l
1403
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
- AllExtended /
{a.ext}- All /
{a}- Adjective /
{adj}- Color* /
{color} - Nationality /
{nat}
- Color* /
- Adverb /
{adv} - Conjunction /
{conj} - Interjection /
{i} - Noun /
{n}- PluralNoun /
{n.pl} - Pronoun /
{n.pro} - SingularNoun /
{n.s}- Astronomy /
{ast}- Moon /
{moon} - Planet /
{planet}
- Moon /
- Color* /
{color} - Day /
{day} - Month /
{mon} - ProperNoun /
{n.prop}- Element /
{el} - Name /
{name}- FemaleName /
{fname} - MaleName /
{mname}
- FemaleName /
- Place /
{place}- City /
{city} - Continent /
{cont} - Country /
{country} - UsState /
{us-state}
- City /
- Mythology /
{myth}- GreekMyth /
{greekmyth}- Olympian /
{olympian} - Chthonic /
{chthonic}
- Olympian /
- RomanMyth /
{romanmyth}
- GreekMyth /
- Element /
- Astronomy /
- PluralNoun /
- Preposition /
{prep} - Verb /
{v}- AuxiliaryVerb /
{v.aux} - IntransitiveVerb /
{v.int} - TransitiveVerb /
{v.tr} - VerbPast /
{v.past}
- AuxiliaryVerb /
- Adjective /
- Extended /
{ext}- Noun /
{n}- SingularNoun /
{n.s}- Astronomy /
{ast}- Moon /
{moon}- MarsMoon /
{marsmoon} - JupiterMoon /
{jupitermoon} - SaturnMoon /
{saturnmoon} - UranusMoon /
{uranusmoon} - NeptuneMoon /
{neptunemoon}
- MarsMoon /
- Moon /
- Astronomy /
- SingularNoun /
- Noun /
- All /
Notes
-
WordKind /
{sub} -
It is only necessary to set the most descriptive
WordKind(s) since they are automatically included in the larger word kinds. -
The
charactersobject value must contain theC,c, anddkeys with non-empty values. Additional keys/values can be added and used. -
{sub}s produce lowercase words by default, but if prefixed withW:orT:words will be uppercase or title case, respectively: i.e.{W:sub}or{T:sub}(replacesubwith an actual{sub}name above). -
{sub}s include all words by default, but if suffixed with:NwhereNis a number, it will only include words with that number of syllables: i.e.{sub:N}(replacesubwith an actual{sub}name above andNwith the desired number of syllables ~1-5).
Please find the CHANGELOG.md in the repository.
- Word list originated from Bart Busschots' HSXKPasswd Perl module (GitHub, CPAN: Crypt::HSXKPasswd), specifically lib/Crypt/HSXKPasswd/Dictionary/EN.pm@1d88564:38
